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