簡體   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