繁体   English   中英

如何确定时间复杂度是O(m + n)还是O(Math.max(m,n))

[英]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 + nmax(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符号的定义


直观地讲,这也是有意义的,因为这两个函数都意味着两个变量都呈线性增长,仅此而已。


导致整体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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM