時(shí)間復(fù)雜度是同一問(wèn)題可用不同算法解決杖玲,而一個(gè)算法的質(zhì)量?jī)?yōu)劣將影響到算法乃至程序的效率。算法分析的目的在于選擇合適算法和改進(jìn)算法。
計(jì)算機(jī)科學(xué)中撞牢,算法的時(shí)間復(fù)雜度是一個(gè)函數(shù),它定性描述了該算法的運(yùn)行時(shí)間叔营。這是一個(gè)關(guān)于代表算法輸入值的字符串的長(zhǎng)度的函數(shù)屋彪。時(shí)間復(fù)雜度常用大O符號(hào)表述,不包括這個(gè)函數(shù)的低階項(xiàng)和首項(xiàng)系數(shù)绒尊。使用這種方式時(shí)畜挥,時(shí)間復(fù)雜度可被稱(chēng)為是漸近的,它考察當(dāng)輸入值大小趨近無(wú)窮時(shí)的情況婴谱。
1.一般情況下蟹但,算法中基本操作重復(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ù),則稱(chēng)f(n)是T(n)的同數(shù)量級(jí)函數(shù)瘟裸。記作T(n)=O(f(n)),稱(chēng)O(f(n)) 為算法的漸進(jìn)時(shí)間復(fù)雜度客叉,簡(jiǎn)稱(chēng)時(shí)間復(fù)雜度。
分析:隨著模塊n的增大话告,算法執(zhí)行的時(shí)間的增長(zhǎng)率和 f(n) 的增長(zhǎng)率成正比兼搏,所以 f(n) 越小,算法的時(shí)間復(fù)雜度越低沙郭,算法的效率越高佛呻。
2. 在計(jì)算時(shí)間復(fù)雜度的時(shí)候,先找出算法的基本操作病线,然后根據(jù)相應(yīng)的各語(yǔ)句確定它的執(zhí)行次數(shù)件相,再找出 T(n) 的同數(shù)量級(jí)(它的同數(shù)量級(jí)有以下:1再扭,log2n,n夜矗,n log2n 泛范,n的平方,n的三次方紊撕,2的n次方罢荡,n!),找出后对扶,f(n) = 該數(shù)量級(jí)区赵,若 T(n)/f(n) 求極限可得到一常數(shù)c,則時(shí)間復(fù)雜度T(n) = O(f(n))
fun1(n){
for(let i=0;i<n;i++){ //執(zhí)行n次
console.log(i); //執(zhí)行一次浪南,時(shí)間復(fù)雜度為O(1)
}
}
上面的例子的時(shí)間復(fù)雜度為O(n x 1)
func2(n){
for(let i=0;i<n;i++){ // n次
for(let j=0;j<n;j++){ //n次
console.log(i+':'+j)
}
}
}
func21(n){
for(let i=0;i<n;i++){
for(let j=i;j<n;j++){
console.log('test');
}
}
}
func22(n){
for(let i=0;i<n;i++){
for(let j=0;j<i;j++){
console.log('test2');
}
}
}
此時(shí)的時(shí)間復(fù)雜度為O(n x n x 1) 即 O(n^2)
fun3(n){
for(let i=0;i<n;i++){ //執(zhí)行n次
for(let j=0;j<n;j*=2){ //執(zhí)行次數(shù)為log(2)n
console.log('hello world');
}
}
}
此處的時(shí)間復(fù)雜度為O(n*log(2)n)
fun4(n){
for(let i=0;i<n;i++){
for(let j=i;j<n;j*=2){
console.log('hello world');
}
}
}
fun5(n){
for(let i=0;i<n;i++){
for(let j=0;j<i;j*=2){
console.log('hello world');
}
}
}