[英]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
但是現在我有n
和i
變量了嗎? 我如何擺脫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.