我正在練習算法的複雜性,我在網上找到了這個代碼,但我無法弄清楚它的增長順序。有任何想法嗎?循環的三倍增長順序
int counter= 0;
for (int i = 0; i*i < N; i++)
for (int j = 0; j*j < 4*N; j++)
for (int k = 0; k < N*N; k++)
counter++;
我正在練習算法的複雜性,我在網上找到了這個代碼,但我無法弄清楚它的增長順序。有任何想法嗎?循環的三倍增長順序
int counter= 0;
for (int i = 0; i*i < N; i++)
for (int j = 0; j*j < 4*N; j++)
for (int k = 0; k < N*N; k++)
counter++;
在一個時間把它一個步驟(或在這種情況下,循環):
第一環路增量i
只要它的平方比N
較低,所以這必須O(sqrt N)
,因爲int(sqrt(N))
或int(sqrt(N)) - 1
是平方值小於N
的最大整數值;
對於第二個循環也是如此。我們可以忽略4
,因爲它是一個常數,在處理大哦符號時我們不關心這些。所以前兩個循環一起是O(sqrt N)*O(sqrt N) = O(sqrt(N)^2) = O(N)
。由於循環是嵌套的,因此可以乘以複雜度,所以第二個循環將完全執行第一個循環的每個迭代;
第三個循環顯然是O(N^2)
,因爲k
上升到了N
的平方。
所以整個事情必須是O(N) * O(N^2) = O(N^3)
。通常可以通過計算第一個循環的複雜性,然後第二個,然後是前兩個等來解決這樣的問題。
謝謝你的詳細解釋。它現在確實更有意義。 – JVTura