2016-05-22 113 views
1

我發現很難分析算法的時間複雜度。以此算法爲例,我如何在O表示法中找到運行時間?該算法的大O運行時間

loop(n) 
i = 1 
while i ≤ n 
    j = 1 
    while j ≤ i 
     j = 2 ∗ j 
    i = i + 1 

回答

0

從你的文章我明白,你知道O符號的含義,但有一些應用它的問題。在這個簡單的例子中,確定循環執行的次數(取決於您的輸入大小)就足夠了。爲了獲得最終的價值,你必須把它結合起來。

第一步:分析每個循環的執行次數。 (非環或遞歸語句具有O(1)。)

while(i<=n) 
... 
i=i+1 

被執行n次,從而爲O(n)

內環 而(j < = I) 當J = J * 2

執行了i/2次,但我受外部循環限制了n。所以這是O(n)。

由於有在外環是內環與O(N)必須乘以asymptitics,即N * N =>爲O(n^2)

+0

您對內部循環的分析雖然在技術上是正確的,但並不是一個嚴格的界限,所以您的整體答案並不是一個嚴格的界限。 – templatetypedef

+0

實際上這個例子來自一箇舊的考試,其中所謂的正確答案是O(n * log(n)) – Trondheim

+0

是的你是對的我的回答是準確的 – sim

1

當給這樣的代碼,它通常有助於從內到外的工作。你的內循環在這裏給出:

j = 1 
While j <= i 
    j = 2 * j 

這個循環的工作原理是反覆加倍j直到它大於i。在超過i之前,您可以加倍1的次數是Θ(log i),所以每次運行內循環時,它都會運行Θ(log i)。

外環從1計數至n,所做的工作是

日誌1 +日誌2 + ... +日誌N

=日誌(1 * 2 * .. * n)(使用對數屬性)。

=的log(n!)

= Θ(N log n)的。

最後一步從Stirling's approximation開始。

因此總的來說,時間複雜度爲Θ(n log n)。