算法(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!)。

總結

基本復雜度的理論分析這就學完了,主要是掌握一些基礎的復雜度理論,這些理論都會貫穿整個算法學習的全部,所以要牢固掌握。



``` 只要自己變優秀了,其他的事情才會跟着好起來(少將12) ```


免責聲明!

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



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