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

时间:2017-07-25 00:56:32

标签: java performance time time-complexity space-complexity

我正在查看这段代码,但我很难理解它是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)。

任何解释都将不胜感激!

1 个答案:

答案 0 :(得分:2)

正如您已经猜到的,在 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)以及 max(m, n) <= m + n只要min(m, n) >= 0(但m, n >= 0已经确定)

因此两个函数都受到另一个函数(加上一个常数因子)的限制,因此O(m + n)O(max(m, n)),这些集是相等的。

以下是形式( 1维)定义(来自Wikipedia):

Definition of O-Notation

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

  

[...]总体上导致O(n)。没有提到O(n + logn)[...]

我不确定这是否是一个问题。请注意,这两个集合再次与n <= n + log(n)n + log(n) <= n + n = 2 * n相同,线性在n