代碼的時間和空間復雜度


如何評估代碼的復雜度

代碼具有兩種復雜度衡量方向,一個是時間復雜度,一個是空間復雜度

一,時間復雜度
定義:如果一個問題的規模是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


免責聲明!

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



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