今天在看算法時,遇見了一些問題,想了很久,現總結如下,關於for循環的時間復雜度。我們知道當一重for循環時
package Suanfa; public class Fortest { public static void main(String[] args) { int n=100,count=0; for(int i=0;i<n;i++) { if(true) { count++; } } } }
這是最簡單的for循環,count執行n次,時間復雜度是N;
如果是for的二重循環呢
package Suanfa; public class Fortest { public static void main(String[] args) { int k=100 ,count=0; for(int i=0;i<k;i++) for(int j=i+1;j<k;j++) { if(true) count++; } System.out.println("k值為:"+k); System.out.println("count值為 :"+count); } }
可以看見count輸出4950;一般剛接觸時,就會覺得這事件復雜度是n的平方,當然一般這樣說也沒錯,但是你有沒想過,為什么k輸入是100時,count輸出是4950,如果k是其他值呢,
count又會是什么,兩者之間有什么關系?如果for是三重循環又會是怎樣呢?
三重循環的情況如下:
package Suanfa; public class Test { public static void main(String[] args) { int k=100 ,count=0; for(int i=0;i<k;i++) for(int j=i+1;j<k;j++) for(int x=j+1;x<k;x++) { if(true) count++; } System.out.println("k值為:"+k); System.out.println("count值為 :"+count); } }
可以看見count輸出為161700,當然你也可以試着把k改小一點,當然你要試着探究k和count的關系,在二重for循環、三重for循環、甚至
更多for的情況下,現在我們先討論二重for循環下 的情況:假定k值為n;那么要使if語句能夠執行;需滿足
i 0 1 2 3 ...... n-2 n-1
j 1 2 3 4 ...... n-1.
當i為0時,j可取1到n-1,使得if語句能夠有效執行;同理i=1時,j可取2到n-1;
i=0; j = 1,2,3,4.....n-1;(if語句執行 (n-1)-1+1 次 即 n-1次)
i =1 ,j =2,3,4....n-1; (if語句執行 (n-1)-2+1 次 即n-2次)
i=2 , j =3,4,5...n-1;
...
i=n-2,j =n-1 (if語句執行一次)
可得if語句執行的總次數為: (n-1+1)(n-1-1+1)/2 = (n-1)*n/2,你也可以理解為C(2 n)(姑且這樣表示吧),這個東東不知道怎么表示,就是和二項式系數有關的那個,2是上角標,n是下角標;
C(2 n)=n*(n-1)/(2*1);
三重循環時:假定k值為n;那么要使if語句能夠執行;需滿足:
i 0 1 2 3 ...... n-3
j 1 2 3 4 ...... n-2.
x 2 3 4 5 ........ n-1
經過如上推算,可得 if語句執行總次數為 C(3 n) = n*(n-1)*(n-2)/(3*2*1)=n*(n-1)*(n-2)/6;
四重for循環 , 可得 if語句執行總次數為 C(3 n) = n*(n-1)*(n-2)*(n-4)/(4*3*2*1)=n*(n-1)*(n-2)/24;
如果你覺得哪里不對,可以指出,歡迎評論,本文將不定期更新。