1. 程式人生 > >常用資料結構與演算法時間複雜度求解

常用資料結構與演算法時間複雜度求解

1.0 資料結構的相關概念

2.0 一些基本演算法的時間複雜度

O(1):

int x=1;

O(n):

for(int i = 0; i < n; i++){
    printf("%d",i);
}

O(log2n):

int n = 8,count = 0;
for(int i = 1; i <= n; i*=2){
    count++;
}

O(n2):

int n = 8,count = 0;
for(int i = 1; i <= n; i++){
    for(int j = 1;  j <= n; j++){
        count
++; } }

O(nlog2n):

int n = 8,count = 0;
for(int i = 1; i <= n; i*=2){
    for(int j = 1;  j <= n; j++){
        count++;
    }
}

2.1 求解時間複雜度的基本步驟

(1)找出演算法中的基本語句:演算法中執行次數最多的,通常是內層迴圈的迴圈體; (2)計算基本語句的執行次數的數量級; (3)用大O記號表示演算法的時間效能,將基本語句執行次數的數量級放入大O記號中。

2.1.0 例題解析

eg1:

#include <stdio.h>
int main(){ int i, j, x = 0, sum = 0, n = 100; //執行了1次 for( i = 1; i <= n; i++){ //執行了n+1次 sum = sum +i; //執行了n次 for(j = 1; j <= n; j++){ //執行了n*(n+1)次 x++; //執行了n*n次 sum =sum + x; //執行了n*n次
} } printf("%d",sum); //執行了1次 }

很顯然,一共執行了 1+(n+1)+n+n*(n+1)+ n* n +n*n =3n2 +3n +2次,去掉常數,保留最高階,化最高階係數為1,得到數量級O(n2)。即時間複雜度為:T(n)=O(n2)。

eg2:計算 1+2+3+4+······+100

#include <stdio.h>

int main(){
    int i , sum = 0,n = 100;        //執行了1次
    for(i = 1; i <= n; i++){        //執行了n+1次
        sum +=i;                    //執行了n次
    }
    printf("%d",sum);               //執行了1次
}

顯然的,演算法所用時間(語句執行頻度)為:1+n+1+n+1 = 2n+3次,故時間複雜度為:O(n)。

eg3:計算 1+2+3+4+······+100 (高斯演算法)

#include <stdio.h>

int main(){
    int sum = 0, n = 100;           //執行了1次
    sum =(1+n)*n/2;                 //執行了1次
    printf("%d",sum);               //執行了1次
}

時間複雜度為:O(3),記為O(1)。

eg4: 求兩個n階方陣C=A * B的乘積,演算法如下

void MatrixMultiply(int A[n][n], int B[n][n], int C[n][n]){
    for(int i = 0; i < n; i++){                         //執行了n+1次
        for(j = 0; j < n; j++){                         //執行了n*(n+1)次
            C[i][j] = 0;                                //執行了n^2^次
            for(k = 0; k < n; k++){                     //執行了n^2^*(n+1)次
                C[i][j] = C[i][j] + A[i][k] *B[k][j];    //執行了n^3^次
            }
        }
    }
}

則T(n)=2n3+3n2+2n+1,故時間複雜度為O(n3)。

eg5:

void test(int n){
    i = 1,k = 100;
    while(i < n){
        k = k+1;
        i = i+2;
    }
}

==求解步驟:==

假設迴圈體執行了T(n)次,
當迴圈體(i=i+2)執行了1次時,i = 1 + 2;
當迴圈體(i=i+2)執行了2次時,i = 2 + 2;
``````
以此類推,很顯然,i =2T(n) +1,又迴圈條件為 i < n,
即 2T(n) +1 <= n-1,解得T(n) <= n/2 -1,故時間複雜度為O(n)。

2.1.1 常見時間複雜及其效率高低比較(由高到低)

O(1) > O(logn) > O(n) > O(nlogn) > O(n2) > O(n3) > O(2n) > O(n!) > O(nn)。如果你設計的演算法時間複雜度為O(2n)以後的,那麼你必須修改你的演算法了。很顯然,常數階(O(1))效率最高,比如高斯演算法。

3.0 總結

資料結構與演算法是計算機專業必修課程,也是計算機專業考研的重點,更是一個程式設計師必備技能,必須學好。

參考:隨心而碼 紫羅蘭