j
不應該在您的公式中,因爲j
也是n
的函數。
每當你有一個依賴外循環變量的循環時,我覺得最容易看看求和公式來找到複雜性。
所以外層循環肯定運行n
次,而最內層循環肯定運行n/2
次,但一般來說n/2 ∈ O(n)
。
讓我們來看看中間循環。
中間循環在第一次迭代中運行(n-1)
次,然後在第二次迭代中運行(n-2)
次,一直到(n-n)
,這等於0次。您可以將這些術語重新排列爲0到n之和。我們知道這個總和等於n(n+1)/2
。
由於該公式表示外層和中層循環的組合,因此您可以簡單地乘以最內層循環以獲得最終公式n(n+1)n/(2*2) == n^2(n+1)/4
。
你應該認識到的一個概念上的事情是,因爲c
只是一個計數器,並且在每次迭代時遞增,所以可以認爲c
是該算法的運行時複雜度的直接表示。
您可以通過計算c
來驗證此結果。下面是C語言編寫的證明這種算法的示例程序:
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char *argv[]) {
int c = 0;
int n = 10;
if (argc > 1) {
n = atoi(argv[1]);
}
for (int i = 1; i <= n; ++i) {
for (int j = i; j <= n; ++j) {
/* Note that I've changed k to run from 0 to n/2 instead of n
down to n/2, but this doesn't change the result. */
for (int k = 0; k < n/2; ++k) {
++c;
}
}
}
printf("c == %d; n^2(n+1)/4 == %d\n", c, n*n*(n+1)/4);
}
這裏的從上述程序的輸出爲輸入2,4,8,32和64:
c == 3; n^2(n+1)/4 == 3
c == 20; n^2(n+1)/4 == 20
c == 144; n^2(n+1)/4 == 144
c == 8448; n^2(n+1)/4 == 8448
c == 66560; n^2(n+1)/4 == 66560
試着把它寫成外層循環'(n^2/2 +(n-1)* n/2 + ...)的操作總和' – RishiG 2014-09-29 16:05:57