算法的时间和空间复杂度
算法定義
? ?算法由控制結(jié)構(gòu)(順序、分支和循環(huán)3種)和原操作(指固有數(shù)據(jù)類型的操作)構(gòu)成的,則算法時(shí)間取決于兩者的綜合效果。為了便于比較同一個(gè)問(wèn)題的不同算法,通常的做法是,從算法中選取一種對(duì)于所研究的問(wèn)題(或算法類型)來(lái)說(shuō)是基本操作的原操作,以該基本操作的重復(fù)執(zhí)行的次數(shù)作為算法的時(shí)間量度。不同的算法可能用不同的時(shí)間、空間或效率來(lái)完成同樣的任務(wù),一個(gè)算法的優(yōu)劣可以用空間復(fù)雜度與時(shí)間復(fù)雜度來(lái)衡量.
時(shí)間復(fù)雜度
1、時(shí)間頻度:一個(gè)算法執(zhí)行所耗費(fèi)的時(shí)間,在理論上是不能算出來(lái)的,必須上機(jī)運(yùn)行測(cè)試才能知道。但我們不可能也沒(méi)有必要對(duì)每個(gè)算法都上機(jī)測(cè)試,只需知道哪個(gè)算法花費(fèi)的時(shí)間多,哪個(gè)算法花費(fèi)的時(shí)間少就可以了。并且一個(gè)算法花費(fèi)的時(shí)間與算法中語(yǔ)句的執(zhí)行次數(shù)成正比例,哪個(gè)算法中語(yǔ)句執(zhí)行次數(shù)多,它花費(fèi)時(shí)間就多。一個(gè)算法中的語(yǔ)句執(zhí)行次數(shù)稱為語(yǔ)句頻度或時(shí)間頻度。記為T(n)。
2、時(shí)間復(fù)雜度:在時(shí)間頻度中,n稱為問(wèn)題的規(guī)模,當(dāng)n不斷變化時(shí),時(shí)間頻度T(n)也會(huì)不斷變化。但有時(shí)我們想知道它變化時(shí)呈現(xiàn)什么規(guī)律。為此,我們引入時(shí)間復(fù)雜度概念。 一般情況下,算法中基本操作重復(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ù)雜度,簡(jiǎn)稱時(shí)間復(fù)雜度。此外,T (n) = Ο(f (n))?表示存在一個(gè)常數(shù)C,使得在當(dāng)n趨于正無(wú)窮時(shí)總有?T (n) ≤ C * f(n)。簡(jiǎn)單來(lái)說(shuō),就是T(n)在n趨于正無(wú)窮時(shí)最大也就跟f(n)差不多大。也就是說(shuō)當(dāng)n趨于正無(wú)窮時(shí)T (n)的上界是C * f(n)。其雖然對(duì)f(n)沒(méi)有規(guī)定,但是一般都是取盡可能簡(jiǎn)單的函數(shù)。例如,O(2n2+n +1) = O (3n2+n+3) = O (7n2?+ n) =?O (?n2?)?,一般都只用O(n2)表示就可以了。注意到大O符號(hào)里隱藏著一個(gè)常數(shù)C,所以f(n)里一般不加系數(shù)。如果把T(n)當(dāng)做一棵樹(shù),那么O(f(n))所表達(dá)的就是樹(shù)干,只關(guān)心其中的主干,其他的細(xì)枝末節(jié)全都拋棄不管。
常見(jiàn)的數(shù)量級(jí)大小:O(1)<O(logn)<O(n)<O(nlogn)<O(n2n2)<O(n3n3)<O(2n2n)<O(n!)
| O(1) | 任意 | 直接輸出結(jié)果 |
| O(logn) | 任意 | 二分查找、快速冪 |
| O(n) | 以百萬(wàn)計(jì)(五六百萬(wàn)) | 貪心算法、掃描和遍歷 |
| O(nlogn) | 以十萬(wàn)計(jì)(三四十萬(wàn)) | 帶有分治思想的算法,如二分法 |
| O(n2) | 以千計(jì)數(shù)(兩千) | 枚舉、動(dòng)態(tài)規(guī)劃 |
| O(n3) | 不到兩百 | 動(dòng)態(tài)規(guī)劃 |
| O(2n) | 24 | 搜索 |
| O(n!) | 10 | 產(chǎn)生全排列 |
| O(nn) | 8 | 暴力法破解密碼 |
O(1)叫常數(shù)時(shí)間;O(n)、O(n2)、O(n3)、O(n4)……叫做多項(xiàng)式時(shí)間;O(2n)、O(3n)……叫做指數(shù)時(shí)間。
3、算法的時(shí)間復(fù)雜度的具體步驟:
⑴ 找出算法中的基本語(yǔ)句;
算法中執(zhí)行次數(shù)最多的那條語(yǔ)句就是基本語(yǔ)句,通常是最內(nèi)層循環(huán)的循環(huán)體。
⑵ 計(jì)算基本語(yǔ)句的執(zhí)行次數(shù)的數(shù)量級(jí);
只需計(jì)算基本語(yǔ)句執(zhí)行次數(shù)的數(shù)量級(jí),這就意味著只要保證基本語(yǔ)句執(zhí)行次數(shù)的函數(shù)中的最高次冪正確即可,可以忽略所有低次冪和最高次冪的系數(shù)。這樣能夠簡(jiǎn)化算法分析,并且使注意力集中在最重要的一點(diǎn)上:增長(zhǎng)率。
⑶ 用大Ο記號(hào)表示算法的時(shí)間性能。
將基本語(yǔ)句執(zhí)行次數(shù)的數(shù)量級(jí)放入大Ο記號(hào)中。
如果算法中包含嵌套的循環(huán),則基本語(yǔ)句通常是最內(nèi)層的循環(huán)體,如果算法中包含并列的循環(huán),則將并列循環(huán)的時(shí)間復(fù)雜度相加。舉個(gè)例子:第一個(gè)for循環(huán)的時(shí)間復(fù)雜度為Ο(n),第二個(gè)for循環(huán)的時(shí)間復(fù)雜度為Ο(n2),則整個(gè)算法的時(shí)間復(fù)雜度為Ο(n+n2)=Ο(n2)。
let x =1; let y = 1; for (let i=1; i<=n; i++) {x++; } for (let j=1; j<=m; i++){for (let k=1; k<=m; j++) {y++; } }4、常見(jiàn)的時(shí)間復(fù)雜度進(jìn)行示例
(1)O(1)
let x=1;
? (2) O(n)
sum=0; (1次) for(i=1;i<=n;i++) { (n+1次) sum++; (n+1次) }
Θ(2n+2)=n? (Θ即:去低階項(xiàng),去掉常數(shù)項(xiàng),去掉高階項(xiàng)的常參得到),所以
?
?
let sum=0; (1次) for(let i=1;i<=n;i++) (n+1次) for(let j=1;j<=n;j++) ((n+1)(n+1)次) sum++; ((n+1)(n+1)次)
Θ(2n2+5n+3)=n2?T(n)=O(n2);
? ? 一般情況下,對(duì)步進(jìn)循環(huán)語(yǔ)句只需考慮循環(huán)體中語(yǔ)句的執(zhí)行次數(shù),忽略該語(yǔ)句中步長(zhǎng)加1、終值判別、控制轉(zhuǎn)移等成分,當(dāng)有若干個(gè)循環(huán)語(yǔ)句時(shí),算法的時(shí)間復(fù)雜度是由嵌套層數(shù)最多的循環(huán)語(yǔ)句中最內(nèi)層語(yǔ)句的頻度f(wàn)(n)決定的。
? (4)O(log2n)??
i = 1; while(i<=n){i = i*2; }
i = 2, 4, 8,?16 ,32,64,128? => i = 2x,?假設(shè)x次(時(shí)間頻度)后跳出循環(huán),因?yàn)?i<=n ,所以2x <= n => x = log2n
? ? 所以 T(n) = O(?log2n)
while(n){n = n/2; }
128,64,32,16,8,4,2,...
? ?=> 2x? = n => x =?log2n
? ?(5)O(n3)?
for(i=0;i<n;i++) { for(j=0;j<i;j++) { for(k=0;k<j;k++) x=x+2; } }
O(n3)
?
?
?
?
轉(zhuǎn)載于:https://www.cnblogs.com/xiaosongJiang/p/10003399.html
總結(jié)
以上是生活随笔為你收集整理的算法的时间和空间复杂度的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: Office 365:如何管理Offic
- 下一篇: js数组笔记