算法性能分析

對(duì)于數(shù)據(jù)結(jié)構(gòu)的基本概念我們不做敘述,本節(jié)重點(diǎn)討論算法效率的度量。


性能分析的角度

一般我們從時(shí)間復(fù)雜度和空間復(fù)雜度兩個(gè)方面對(duì)算法的效率進(jìn)行分析。

一.時(shí)間復(fù)雜度(Time Complexity)

我們通常將時(shí)間復(fù)雜度記為:

T(n)=O(f(n))

我們將此式分為三個(gè)部分進(jìn)行講述。

  • T(n):算法的漸近時(shí)間復(fù)雜度,簡(jiǎn)稱時(shí)間復(fù)雜度。
  • f(n):算法中語(yǔ)句中執(zhí)行次數(shù)最多的語(yǔ)句的頻度。
  • O():計(jì)算數(shù)量級(jí)。
    數(shù)學(xué)表達(dá)式為:

存在正常數(shù)C和n0,當(dāng)n>=n0時(shí),0<=T(n)<=C*f(n)

1.三種時(shí)間復(fù)雜度
  • 最壞時(shí)間復(fù)雜度:最壞情況下的時(shí)間復(fù)雜度。
  • 平均時(shí)間復(fù)雜度:所有輸入實(shí)例等概率出現(xiàn)情況。
  • 最好時(shí)間復(fù)雜度:最好情況下時(shí)間復(fù)雜度。
    我們利用一個(gè)例子說(shuō)明:

在冒泡排序中,如果序列本有序,我們只需比較n-1次,排序完成,則為最好情況下時(shí)間復(fù)雜度為O(n)。如果序列為逆序,則需要比較(n-1)+(n-2)+....+1=n*(n-1)/2,此時(shí)時(shí)間復(fù)雜度為O(n2)。則平均復(fù)雜的也為O(n2)。

2.常見(jiàn)的時(shí)間復(fù)雜度(從小到大排列)
  • 常數(shù)階:O(1)
  • 對(duì)數(shù)階:O(log2n)
void fun(int n){
  int i=1;
  while(i<=n)
    i=i*2;
}
  • 線性階:O(n)
for(int i=0;i++;i<n)
  • 線性對(duì)數(shù)階:O(nlog2n)
count=0;
for(k=1;k<=n;k*=2)
  for(j=1;j<=n;j++)
    count++;
  • 平方階:O(n2)
for(int i=0;i<n;i++){
  for(int j=0;j<n;j++)
}
  • 立方階:O(n3)
for(int i=0;i<n;i++){
  for(int j=0;j<n;j++){
    for(int k=0;k<n;k++)
}
}
  • 指數(shù)階:O(2^n)
//Fibonacci數(shù)列的遞歸算法
int f(int n){
  if(n==1||n==0){
     return 1;
}
return f(n-1)+f(n-2);
}
  • 階乘:O(n!)
  • k次方階:O(n^k)
3.時(shí)間復(fù)雜度的計(jì)算
  • 循環(huán)條件中變量參與循環(huán)條件
 int i=1;
 while(i<=n){
 i=i*2;
} 

對(duì)于此種程序,我們?cè)O(shè)循環(huán)次數(shù)為t,則可根據(jù)循環(huán)條件得到:

2^t<=n 于是可以推出 t<=log2n,得到T(n)=log2n

  • 循環(huán)主體中變量與循環(huán)條件無(wú)關(guān)
    Ⅰ.遞歸程序:利用公式進(jìn)行遞推。
    Ⅱ.非遞歸程序

二.空間復(fù)雜度(Space Complexity)

我們通常將空間復(fù)雜度記為:

S(n)=O(f(n))

我們將此式分為三個(gè)部分進(jìn)行講述。

  • S(n):空間復(fù)雜度。
  • f(n):輔助存儲(chǔ)空間。

輔助存儲(chǔ)空間:
一般情況下, 一個(gè)程序在機(jī)器上執(zhí)行時(shí), 除了需要存儲(chǔ)本身所需要的代碼/輸入數(shù)據(jù)外, 還需要一些對(duì)數(shù)據(jù)進(jìn)行操作的輔助存儲(chǔ)空間.其中輸入數(shù)據(jù)所占用的具體空間取決于問(wèn)題本身, 與算法無(wú)關(guān). 因此我們所討論的空間復(fù)雜度只與該算法在實(shí)現(xiàn)時(shí)所需要的輔助空間單元個(gè)數(shù)相關(guān)

  • O():數(shù)量級(jí)。
1.常見(jiàn)空間復(fù)雜度
  • 常數(shù)階 O(1):冒泡排序,直接插入排序,簡(jiǎn)單選擇排序,希爾排序,堆排序。
  • 線性階 O(n):二路歸并排序。
  • 對(duì)數(shù)階 O(log2n):快速排序。

author by HengGeZhiZou

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容