我正在查看这段代码,但我很难理解它是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大小的数组。它表示由于堆栈调用导致的log(n)的空间复杂度在计算大O时相形见绌,因为n> 1。 logn,导致整体O(n)。在这个例子中没有提到O(n + logn)(对于那些好奇的人来说是4.4)。
任何解释都将不胜感激!
答案 0 :(得分:2)
正如您已经猜到的,在 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)
以及
max(m, n) <= m + n
只要min(m, n) >= 0
(但m, n >= 0
已经确定)
因此两个函数都受到另一个函数(加上一个常数因子)的限制,因此O(m + n)
或O(max(m, n))
,这些集是相等的。
以下是形式( 1维)定义(来自Wikipedia):
直观地,它也有意义,因为这两个函数只是意味着两个变量的线性增长而已。
[...]总体上导致O(n)。没有提到O(n + logn)[...]
我不确定这是否是一个问题。请注意,这两个集合再次与n <= n + log(n)
和n + log(n) <= n + n = 2 * n
相同,线性在n 。