1. 程式人生 > 其它 >資料結構學習筆記(一)--時間複雜度

資料結構學習筆記(一)--時間複雜度

資料結構學習筆記(一)--時間複雜度

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

時間複雜度的定義

事先預估演算法時間開銷 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²)

加法規則

乘法規則

時間複雜度的大小排序

從小到大排序

口訣:常對冪指階

圖形顯示

巢狀迴圈的時間複雜度

利用加法規則與乘法規則,用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)