數據結構學習筆記(一)--時間復雜度


數據結構學習筆記(一)--時間復雜度

時間復雜度章節簡單,所以並不詳細講述。

時間復雜度的定義

事先預估算法時間開銷 T(n) 與問題規模 n 的關系(T表示"Time")。

時間復雜度的具體計算

用c語言代碼舉例:

//算法1—— 逐步遞增型愛你
void loveYou(int n){ //n為問題規模
    //語句1
    int i = 1; //愛你的程度
    //語句2
    while(i<=n){
        //語句3
        i++;
        //語句4
        printf("I Love You %d\n",i);
    }
    //語句5
    printf("I Love You More Than %d\n",n);
}

語句頻度:

  1. 一次
  2. 3001次
  3. 3000次
  4. 3000次
  5. 1次

時間開銷與問題規模n的關系為:

T(n) = 3n+3

即每行代碼執行一次便加1

時間復雜度通用計算

一個算法的時間開銷表達式可以只需考慮階數高的部分(高階部分的系數也化為1),只需考慮循環內的一個基本操作分析他的執行次數和問題規模n的關系。

例如:

T(n) = 3n+3; T(n) = O(n)

T(n) = n²+3n+10000; T(n) = O(n²)

加法規則

H87UV8~4PD3ZVHNIEQYP_JI.png

乘法規則

8NBKQPD0SH0_A4_3BE9_@_A.png

時間復雜度的大小排序

從小到大排序

W__O4S__RW__KS_L_`_U_AL.png

口訣:常對冪指階

圖形顯示

`X7_W_9ZZ~O@R42_U5QP0OP.png

嵌套循環的時間復雜度

利用加法規則與乘法規則,用c語言代碼舉例:

//算法2—— 嵌套循環型愛你
void loveYou(int n){ //n為問題規模
    int i = 1; //愛你的程度
    //外層循環執行n次
    while(i<=n){
        i++; //每次+1
        printf("I Love You %d\n",i);
        //嵌套兩層循環
        for(int j=1;j<=n;j++){
            //內層循環共執行n²次
            printf("I am Iron Man\n");
        }
    }
    //語句5
    printf("I Love You More Than %d\n",n);
}

時間開銷與問題規模n的關系:

T(n) = O(n) + O(n²) = O(n²)

結論: 如有多層嵌套循環,只需考慮最深層循環的循環次數與n的關系

分情況討論時間復雜度

討論最好情況,最壞情況與平均情況的時間復雜度,一般只考慮最壞時間復雜度與平均時間復雜度。

用c語言代碼舉例:

//算法4—— 搜索數字型愛你
void loveYou(int flag[],int n){ //flag數組中亂序存放了1~n這些數字,n為問題規模
    printf("I Am Iron Man\n");
    for(int i=0;i<n;i++){//從第一個元素開始查找
        if(flag[i]==n){//找到元素n
            printf("I Love You %d\n",n);
            break;//找到后立即跳出循環
        }
    }
}

計算上述算法的時間復雜度T(n)

  • 最好情況:元素n在第一個位置 ---最好時間復雜度 T(n) = O(1)
  • 最壞情況:元素n在最后一個位置 ---最壞時間復雜度 T(n) = O(n)
  • 平均情況:假設元素n在任意一個位置的概率相同為1/n ---平均時間復雜度T(n) = (1+2+3+...+n)(1/n) = (1+n)/2 =O(n)

點擊進入下一篇:數據結構學習筆記(二)--空間復雜度


免責聲明!

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



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