1. 程式人生 > >最通俗易懂的------------時間複雜度

最通俗易懂的------------時間複雜度

一、時間複雜度

  1. 是什麼
    表示執行個演算法所需要的計算工作量
  2. 用什麼表示與官方定義
    漸進時間複雜度(大O表示法):若存在函式 f(n),使得當n趨近於 無窮大時,T(n)/ f(n)的極限值為不等於零的常數,則稱 f(n)是T(n)的同數量級函式。記作 T(n)= O(f(n)),稱O(f(n)) 為演算法的漸進時間複雜度,簡稱時間複雜度。
    PS:看的頭疼代表你還是個正常人,記住紅色字型內容,然後跟著下面例子走就行了。
  3. 四個通俗易懂的例子
     
  1. 吃的例子:N個香蕉2天吃一個,吃完需要幾天?
  2. void eat1(int n){
  3.   for(int i=0; i<n; i++){;
  4.     System.out.println("等待一天");    //n次
  5.     System.out.println("吃一個香蕉");  //n次
  6.   }
  7. }

執行次數:T(n)=2n

 

  1. void eat2(int n){
  2.   for(int i=1; i<n; i*=2){
  3.     System.out.println("等待一天");    //2^x≈n  -->x≈log2^n
  4.     System.out.println("等待一天");    //x≈log2^n
  5.     System.out.println("等待一天");
        //x≈log2^n
  6.     System.out.println("吃一半香蕉");  //x≈log2^n
  7.   }
  8. }

執行次數:T(n)=4*log2^n

  1. 吃的例子:N個香蕉,1個柚子,兩天吃掉一個柚子,吃完柚子需要幾天?
  2. void eat3(int n){
  3.   System.out.println("等待一天");    //1
  4.   System.out.println("吃一個柚子");  //1
  5. }

執行次數:T(n)=2

  1. 吃的例子:N個柚子,吃掉第一個柚子需要1天,第二個需要2天,一次類推,吃完需要幾天?
  2. void eat4(int n){
  3.   for(int i=0; i<n; i++){
  4.     for(int j=0; j<i; j++){
  5.       System.out.println("等待一天"); //1+2+3+4+...+n-1
  6.     }
  7.     System.out.println("吃一個柚子"); //n
  8.   }
  9. }

執行次數:T(n)= 1+2+3+......+ n-1 + n = (1+n)*n/2 = 0.5n^2 + 0.5n

       4.如何推匯出時間複雜度

             ①.如果執行時間實常數級,用常數1表示

             ②.只保留時間函式中的最高階項

             ③.如果最高階項存在,則省去最高階項前面的係數

      5.上四個例子的時間複雜度為

              ①T(n)=2n  最高階項為2n,省去係數2,轉化的時間複雜度為:T(n) = O(n)
                 圖解:

               

             ②T(n)=4*log2^n   最高階項為4*log2^n,省去係數4,轉化的時間複雜度為:T(n) = O(log2^n)
                 圖解:
                

             ③T(n)=2    只有常數量級,轉化的時間複雜度為:T(n) = O(1)

                 圖解:

                

             ④T(n) = 0.5n^2 + 0.5n      最高階項為0.5n^2,省去係數0.5,轉化的時間複雜度為T(n) = O(n^2)

                 圖解:

                

總:由上可以得出根據N值的不同,演算法的時間複雜度在不同的N值區間內會有區別,所以根據不同的情況設計不同的演算法是非常必要的。

 

 

版權宣告:本部落格為記錄本人自學感悟,內容大多從網上學習與整理所得,若侵權請告知!

https://me.csdn.net/qq_39657909