我在回顧一些面試的大O表示法,並且遇到了這個問題。簡單的時間複雜度O(nlogn)
for i = 1 to n do:
j = i
while j < n do:
j = 2 * j
簡單吧?外循環提供了n個步驟。並且這些步驟中的每一個我們執行分配j=i
的單個步驟O(1),然後從j = i
步進while循環的log(n-j)或log(n-i)。我認爲時間複雜度是O(nlogn),但答案是O(n)。
這裏是答案:
的運行時間大約是以下之和:Σ 1 + 日誌(N/I),其中i從1到n,其是Θ(n)中。
現在它已經有一段時間了,所以我有點生疏。 log(n/i)
從哪裏來?我知道log(n) - log(i) = log(n/i)
但是我認爲我們記錄(n-i)不是log(n) - log(i)。時間複雜度不是O(nlogn)?我相信我錯過了一些簡單的東西,但我現在已經盯着這個小時了,現在我開始失去理智了。
來源:這裏是源這個問題Berkeley CS 170, Fall 2009, HW 1
編輯:經過考慮之後多一點是非常有意義的內部循環的時間複雜度是log(N/I)。導致每個內部循環運行n-i次,但是我將每個循環加倍。如果內部循環總是從0開始,我們有log(n),但是要考慮循環的數量,我們不必循環log(i)。 log(n) - log(i)是log(n/i)。
要添加到所提供的答案[見這裏](HTTPS://數學。stackexchange.com/questions/74412/how-to-show-sum-limits-i-1n-log-left-fracni-right-thetan)這個數字如何是O(n) – RSon1234
謝謝@ RSon1234這正是我所知尋找! –