算法中基本操作重復(fù)執(zhí)行的次數(shù)是問(wèn)題規(guī)模n的某個(gè)函數(shù),用T(n)表示,若有某個(gè)輔助函數(shù)f(n),使得當(dāng)n趨近于無(wú)窮大時(shí),T(n)/f(n)的極限值為不等于零的常數(shù),則稱f(n)是T(n)的同數(shù)量級(jí)函數(shù)。記作T(n)=O(f(n)),稱O(f(n))為算法的漸進(jìn)時(shí)間復(fù)雜度(O是數(shù)量級(jí)的符號(hào) ),簡(jiǎn)稱時(shí)間復(fù)雜度。
計(jì)算步驟可以分解為:
- 找到執(zhí)行次數(shù)最多的語(yǔ)句
- 計(jì)算語(yǔ)句執(zhí)行次數(shù)的數(shù)量級(jí)
- 用大O來(lái)表示結(jié)果
一、O(n)
function getSum (n) {
let sum = 0;
for(let i = 0; i <= n; i++) {
sum += i;
}
return sum;
}
只有可運(yùn)行的語(yǔ)句才會(huì)增加時(shí)間復(fù)雜度,因此,上面方法里的內(nèi)容除了循環(huán)之外,其余的可運(yùn)行語(yǔ)句的復(fù)雜度都是O(1)。
時(shí)間復(fù)雜度 = for的O(n)+O(1) = 忽略常量 = O(n)。
二、O(log2n)
function makeDouble(n) {
let i= 1;
while(i<n){
i = i*2;
}
return i;
}
設(shè)while循環(huán)里面的頻度為t,2^t(2的t次方)<=n; 兩邊去對(duì)數(shù)t<=log2n,考慮最壞情況,取最大值t=log2n。
T(n) = O(log2n)。
排序算法的復(fù)雜度可以參見(jiàn)排序算法。