1. 程式人生 > 其它 >演算法(2)---演算法複雜度理論

演算法(2)---演算法複雜度理論

演算法複雜度:分為時間複雜度空間複雜度,一個好的演算法應該具體執行時間短,所需空間少的特點。

結論: 複雜度與時間效率的關係

C < log2n< n < n*log2n< n2< n3< 2n< 3n< n! (c是一個常量,n是一個變數且比c大)

|-----------------|--------|-------------|
    較好             一般          較差

下面舉例說明。

一、概述

1、常量階O(1)

O(1)常量級複雜度,我們平時在分析時,只要程式碼不存在迴圈、遞迴語句,程式碼再多,也可以算是O(1)複雜度。

2、對數階O(logn)

O(logn)對數階複雜度,比如下面這樣的程式碼:

int i = 1;
while(i <= n){
    i = i*2;
}

它的執行次數是2x=n中的x,如果n=8,那麼x=3,代表只執行3次。如果n=9,同樣也執行3次。

上面說過分析複雜度時常數可以去掉不算,推導下來還是會算回以2為底時一樣的複雜度,因此,我們可以將對數的底忽略掉,統一用O(logn)表示。

二分查詢就是O(logn)的演算法,每找一次排除一半的可能,256個數據中查詢只要找8次就可以找到目標。

3、線性階O(n)

O(n):代表資料量增大幾倍,耗時也增大幾倍。比如常見的for迴圈遍歷演算法。

4、線性對數階 n*log2n

n*log2n線性對數階,比如下面這樣的程式碼

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

第一個for迴圈為O(n),第二個for迴圈為O(logn),那麼它們一相乘就是nlogn

5、N次方臺階O(n^N)

O(n^N)N次方臺階在我們實際開發也會經常遇到,比如兩個for迴圈:

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

那麼它的複雜度就為O(n2),常量都用變數來代替,也就是O(nN)。

6、指數階O(2^n)

O(2^n)指數階,在什麼情況會用到呢,比較常用的有求子集。比如{a,b} 的子集有{空},{a},{b},{a,b} 共4個。如果求{a,b,c}那麼子集有{空},{a},{b},{c},{a,b},{a,c},{b,c},{a,b,c}共8個。

所以求子集複雜度為:O(2^n)

7、階乘階O(n!)

這個意思懂,不過還沒想到什麼情況會是O(n!)。

總結