如何評估代碼的復雜度
代碼具有兩種復雜度衡量方向,一個是時間復雜度,一個是空間復雜度
一,時間復雜度
定義:如果一個問題的規模是n,解決這一問題的某一算法所需要的時間為T(n),它是n的某一函數T(n)稱為這一算法的“時間復雜性”。
性質:
1,漸近時間復雜性:當輸入量n逐漸加大時,時間復雜性的極限情形。
T(n)=O(f(n))
T(n)表示為時間復雜度
大O記法表示該函數具有上限
f(n)表示問題本身的規模n造成的時間消耗上的函數關系
2,推導大O階方法
用常數1取代運行時間中的所有加法常數。
在修改后的運行次數函數中,只保留最高階項。
如果最高階項存在且不是1,則去除與這個項目相乘的常數。得到的結果就是大O階。
3,具體情況:
常數階:順序執行沒有循環
線性階:具有循環,時間復雜度和循環的次數有關
int i;
for(i = 0; i < n; i++){
/*時間復雜度為O(1)的程序步驟序列*/
}
//循環n次,總的時間復雜度是O(n)
對數階:由於每次count乘以2之后,就距離n更近了一分。 也就是說,有多少個2相乘后大於n,則會退出循環。 由2^x=n 得到x=logn。 所以這個循環的時間復雜度為O(logn)。
int count = 1;
while (count < n){
count = count * 2;
/*時間復雜度為O(1)的程序步驟序列*/
}
平方階:
而對於外層的循環,不過是內部這個時間復雜度為O(n)的語句,再循環n次。所以這段代碼的時間復雜度為O(n^2)。如果外循環的循環次數改為了m,時間復雜度就變為O(mXn)所以我們可以總結得出,循環的時間復雜度等於循環體的復雜度乘以該循環運行的次數。
例1:
int i, j;
for(i = 0; i < n; i++){
for(j = 0; j < n; j++){
/*時間復雜度為O(1)的程序步驟序列*/
}
}//內外循環無關,時間復雜度內外相乘
例2:
int i, j;
for(i = 0; i < n; i++){
for(j = i; j < n; j++){ /*注意j = i而不是0*/
/*時間復雜度為O(1)的程序步驟序列*/
}
}//內外循環有關系,需要逐一相加,得出關系式,並且使用大O推導,得出最終的時間復雜度:
由於當i=0時,內循環執行了n次,當i = 1時,執行了n-1次,……當i=n-1時,執行了1次。所以總的執行次數為:
用我們推導大O階的方法,第一條,沒有加法常數不予考慮;第二條,只保留最高階項,因此保留時(n^2)/2; 第三條,去除這個項相乘的常數,也就是去除1/2,最終這段代碼的時間復雜度為O(n2)。
立方階:
int i, j;
for(i = 1; i < n; i++)
for(j = 1; j < n; j++)
for(j = 1; j < n; j++){
/*時間復雜度為O(1)的程序步驟序列*/
}//時間復雜度是O(n^3)
4,常見的時間復雜度
常見的時問復雜度如表所示:
常用的時間復雜度所耗費的時間從小到大依次是:
5,最壞情況和平均情況
最壞情況運行時間是一種保證,那就是運行時間將不會再壞了。 在應用中,這是一種最重要的需求, 通常, 除非特別指定, 我們提到的運行時間都是最壞情況的運行時間。
平均運行時間是所有情況中最有意義的,因為它是期望的運行時間。
注意:一般在沒有特殊說明的情況下,都是指最壞時間復雜度。
二,空間復雜度
算法的空間復雜度通過計算算法所需的存儲空間實現,算法空間復雜度的計算公式記作:S(n)= O(f(n)),其中,n為問題的規模,f(n)為語句關於n所占存儲空間的函數。
一般情況下,一個程序在機器上執行時,除了需要存儲程序本身的指令、常數、變量和輸入數據外,還需要存儲對數據操作的存儲單元,若輸入數據所占空間只取決於問題本身,和算法無關,這樣只需要分析該算法在實現時所需的輔助單元即可。若算法執行時所需的輔助空間相對於輸入數據量而言是個常數,則稱此算法為原地工作,空間復雜度為0(1)。//即算法計算的輔助空間是已經確定分配好的固定空間。
三,時間和空間復雜度計算規則
1,加法規則
T(n,m) = T1(n) + T2(m) = O(max{f(n), g(m)})//兩個時間復雜度相加,取最大者為和
2,乘法規則
T(n,m) = T1(n) * T2(m) = O(max{f(n)*g(m)})//
3,一個經驗
復雜度與時間效率的關系:
c(常數) < logn < n < n*logn < n^2 < n^3 < 2^n < 3^n < n!
l------------------------------l--------------------------l--------------l
較好 一般 較差
四,常用算法的時間復雜度和空間復雜度
參考文章:https://www.cnblogs.com/silence-x/p/10544072.html