簡體   English   中英

包含嵌套循環的代碼的時間復雜性

[英]Time-complexity of code containing nested loops

i := n;
WHILE i > 1
    FOR j := i to n DO
        X;
    END
    FOR j := 3*i to 3*n DO
        X;
    END
    DEC(i); (* i decrement *)
END

對於此偽代碼,我必須根據n計算函數f:N->N。 我第一次做這樣的事情,所以我什至不知道我的方法是否正確。 因此,在第一行中,我有1個固定時間。 while循環運行n-1次+ n次比較和n-1個恆定時間遞減。 第一個for循環運行n-i + 1次。 第二個for循環運行3n-3i + 1次。 所以(我認為)將是公式:f(n)= 1 +((n-1)+ n +(n-1))*((n-i + 1)+(3n-3i + 1))那將是f(n)= 12n ^ 2 -12ni -2n + 8i -3

但是現在我有ni變量了嗎? 我如何擺脫i

假設“ to n”表示“最后一個值是n-1”(就時間復雜度而言並不重要-請參見最終解釋)。

讓我們假設f(X) =運行X的時間復雜度。

總時間為:

1 +
0 + 0 +                   // i=n
f(X) + 3*f(X) +           // i=n-1
2*f(X) + 6*f(X) +         // i=n-2
3*f(X) + 9*f(X) +         // i=n-3
...
(n-2)*f(X) + 3*(n-2)*f(X) // i=2
------------------------------
1 + 4*f(X) + 8*f(X) + 12*f(X) + ... + 4*(n-2)*f(X)

這個總和等於:

1 + 4*f(X)*(1+2+3+...+n-2) = 1 + 4*f(X)*(n-2)*(n-1)/2 

但是常量不影響該函數的趨勢=>結果是:

O(2*f(X)*(n-2)(n-1)) = O(f(X)*(n^2))

如果X只是一個簡單的運算( O(1) ),則為O(n^2) )。

PS

如果不確定這些常量不會影響最終結果,請嘗試計算:

          1 + 4*f(X)*(n-2)*(n-1)/2 
   lim  ---------------------------
n->infinite      f(X)*n^2

並且您將獲得一個有限的數字(這意味着分子和分母是相似的)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM