2016-11-20 34 views
0

對於這個for循環中的Python:你如何計算第二循環的複雜性?

for(int a = 1 ; a < N ; a*=2) 
     for(int b =1 ; b <N ; b++) 

我知道代碼中O(n*log(n))完成,但如果循環是:

For(int a = 1 ; a <N ; a*=2) 
    for(int b = 1 ; b < a ; b++) 

還會否在O(n*log(n))完成?

回答

0

是(和否)。嚴格按照Big O的定義,我們將在下面看到第二個算法是O(n*log(n)),但是具有更好的界限。

首先,讓我們回顧第一個循環的想法。如果我們將每個循環迭代稱爲一個計算單位,則可以說總計算量爲sum(sum(1 from 0 to N) from 0 to log2(N)),這只是N log2(N)(可能是一個)。這個結果表明第一組循環是O(N log(N))

現在爲第二套。重複上述過程,我們有sum(sum(1 from 0 to *a*) from 0 to log2(N)) = (log2(2 N) log2(4 N)) <= k [log(N)]^2,所以第二個算法是O(log^2(N))(被稱爲多對數)。

請注意,k N log(N)(對於某些k)仍然是第二個算法的上限,所以嚴格來說它仍然是O(N log(N)

這裏是運行時的預期增長的圖像:

growth plot

紅色是第一套循環,綠色是第二組環,藍色爲2N log(N)