演算法(2)---演算法複雜度理論
阿新 • • 發佈:2022-02-23
演算法複雜度
:分為時間複雜度和空間複雜度,一個好的演算法應該具體執行時間短,所需空間少的特點。
結論
: 複雜度與時間效率的關係
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!)。