1. 程式人生 > >c++ 演算法複雜度分析

c++ 演算法複雜度分析

1.案例比較

2.複雜度的漸進表示法

3. 函式時間比較和影象

4.複雜度判斷小竅門

加減法不考慮,只考慮乘除

舉例子:

// 技巧,先找執行次數,然後用t*(每次的複雜度)
//O(1)複雜度
int aFunc(void) {
    printf("Hello, World!\n");      //  需要執行 1 次
    return 0;       // 需要執行 1 次
}

//O(n)複雜度
int aFunc(int n) {
    for(int i = 0; i<n; i++) {         // 需要執行 (n + 1) 次
        printf("Hello, World!\n");      // 需要執行 n 次
    }
    return 0;       // 需要執行 1 次
}

//O(n^2)複雜度
void aFunc(int n) {
    for(int i = 0; i < n; i++) {         // 迴圈次數為 n
        for(int j = 0; j < n; j++) {       // 迴圈次數為 n
            printf("Hello, World!\n");      // 迴圈體時間複雜度為 O(1)
        }
    }
}

//這個也是O(n^2) T(n)=n+(n-1)+(n-2)+...+1 = n(n+1)/2
void aFunc(int n) {
    for (int i = 0; i < n; i++) {
        for (int j = i; j < n; j++) {
            printf("Hello World\n");
        }
    }
}

// 條件判斷語句,這個是O(n^2) 取最大的
void aFunc(int n) {
    if (n >= 0) {
        // 第一條路徑時間複雜度為 O(n^2)
        for(int i = 0; i < n; i++) {
            for(int j = 0; j < n; j++) {
                printf("輸入資料大於等於零\n");
            }
        }
    } else {
        // 第二條路徑時間複雜度為 O(n)
        for(int j = 0; j < n; j++) {
            printf("輸入資料小於零\n");
        }
    }
}

// O(logn)複雜度,設迴圈次數為t,則 2^t<n -> t=log(2)(n)
void aFunc(int n) {
    for (int i = 2; i < n; ;) {
        i *= 2;
        printf("%i\n", i);
    }
}

// O(2^n)
long aFunc(int n) {
    if (n <= 1) {
        return 1;
    } else {
        return aFunc(n - 1) + aFunc(n - 2);
    }
}

解釋:顯然執行次數,T(0) = T(1) = 1,同時 T(n) = T(n - 1) + T(n - 2) + 1,這裡的 1 是其中的加法算一次執行。
顯然 T(n) = T(n - 1) + T(n - 2) 是一個斐波那契數列,通過歸納證明法可以證明,當 n >= 1 時 T(n) < (5/3)^n,同時當 n > 4 時 T(n) >= (3/2)^n。
所以該方法的時間複雜度可以表示為 O((5/3)^n),簡化後為 O(2^n)。
可見這個方法所需的執行時間是以指數的速度增長的。如果大家感興趣,可以試下分別用 1,10,100 的輸入大小來測試下演算法的執行時間,相信大家會感受到時間複雜度的無窮魅力


5、級數級別