關於for循環的時間復雜度


  今天在看算法時,遇見了一些問題,想了很久,現總結如下,關於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;

如果你覺得哪里不對,可以指出,歡迎評論,本文將不定期更新。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM