![](/img/trans.png)
[英]Why is this method's time complexity 2*O(n log n) + O(m log m)?
[英]How to determine if the time complexity is O(m + n) or O(Math.max(m, n))
我正在看这段代码,但是我在努力理解它是O(m + n)而不是O(Math.max(m,n))。 还是O(Math.max(m,n))下的O(m + n)?
int i = 0, j = 0, res = 0;
while (i < houses.length) {
while (j < heaters.length - 1
&& Math.abs(heaters[j + 1] - houses[i]) <= Math.abs(heaters[j] - houses[i])) {
j++;
}
res = Math.max(res, Math.abs(heaters[j] - houses[i]));
i++;
}
在CTCI上有一个示例,其中该函数返回一个n大小的数组。 它说,由于n> logn,在计算大O时,由于堆栈调用而导致的log(n)的空间复杂度相形见,,从而总体上形成了O(n)。 在这个例子中没有提到O(n + logn)(对于那些好奇的人来说是4.4)。
任何解释将不胜感激!
正如您已经猜到的,在Big-O-Notation下,它们都是相同的 。
两个函数m + n
和max(m, n)
都是集合 O(m + n) = O(max(m, n)
元素。
让我们做一下数学:
m + n <= max(m, n) + max(m, n) = 2 * max(m, n)
并且
只要min(m, n) >= 0
max(m, n) <= m + n
(但是m, n >= 0
已经存在)
因此,两个函数都受另一个函数(加上常数)的限制,因此O(m + n)
或O(max(m, n))
的集合相等。
这是正式的( 一维 )定义(来自Wikipedia ):
直观地讲,这也是有意义的,因为这两个函数都意味着两个变量都呈线性增长,仅此而已。
导致整体O(n)。 没有提到O(n + logn)[...]
我不确定这是否是一个问题。 请注意,这两个集合又与n <= n + log(n)
,也与n + log(n) <= n + n = 2 * n
, 线性为n 。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.