大O表示法和时间复杂度
學(xué)數(shù)據(jù)結(jié)構(gòu)和算法的目的 =>?實(shí)現(xiàn)程序的高速運(yùn)行,那么必然要了解復(fù)雜度。
復(fù)雜度分為兩個(gè)維度:時(shí)間、空間。在開(kāi)發(fā)過(guò)程中,我們希望時(shí)間和內(nèi)存消耗都越少越好,但很多時(shí)候無(wú)法做到兼顧,需要在時(shí)間和空間之間做出取舍已達(dá)到最佳狀態(tài)。
對(duì)復(fù)雜度的計(jì)算一般采用事前分析估算的方法,即大O表示法。
接下來(lái)讓我們進(jìn)入復(fù)雜度的學(xué)習(xí)!
大O表示法——概念
由保羅·巴赫曼在《解析數(shù)論》中首先引入。它描述的是一個(gè)函數(shù)數(shù)量級(jí)的漸進(jìn)上界,即算法最壞的情況。
某個(gè)算法的復(fù)雜度達(dá)到了這個(gè)問(wèn)題復(fù)雜度的下界,即為最佳算法。
比如:從大小為100的存放數(shù)字的數(shù)組中找到10,我們需要從頭到尾遍歷,那么這個(gè)是時(shí)間復(fù)雜度就為?Ο(n),(這里n=100,下面講解為何為Ο(n))。若10不是數(shù)組最后一項(xiàng),我們?cè)?lt;100次的時(shí)候就找到 ,可跳出循環(huán),所以,大O表示法描述的是最壞的情況。
說(shuō)明:1. 決定算法復(fù)雜度的,是執(zhí)行次數(shù)最多的語(yǔ)句;
? ? ? ? ? ?2. 復(fù)雜度的得出,忽略了常量,低次冪和最高次冪的系數(shù);
? ? ? ? ? ?3. 加法法則:總復(fù)雜度量級(jí)最大的那段代碼的時(shí)間復(fù)雜度;
? ? ? ? ? ?3. 乘法法則:嵌套代碼的復(fù)雜度等于內(nèi)外代碼復(fù)雜度的乘積。
大O表示法——四種常用的時(shí)間復(fù)雜度
度量一個(gè)程序片段的執(zhí)行時(shí)間?
度量一個(gè)程序的執(zhí)行時(shí)間通常有兩種方法
-
事后統(tǒng)計(jì)的方法
-
事前分析估算的方法? =>?O?
Ο(1)<Ο(log2(n))<Ο(n)<Ο(n^2)<Ο(n^3)<…<Ο(2^n)?
我們可以用 console.time(''mark)? console.timeEnd(''mark) 來(lái)查看執(zhí)行時(shí)間
1. Ο(1):(常數(shù)階)如果算法的執(zhí)行時(shí)間不隨著問(wèn)題規(guī)模n的增加而增長(zhǎng),即使算法中有上千條語(yǔ)句,其執(zhí)行時(shí)間也不過(guò)是一個(gè)較大的常數(shù);
let a = 1; let b = 2; let temp = a;a = b; b = temp;?2. Ο(logn):(對(duì)數(shù)階)(以2為底n的對(duì)數(shù))當(dāng)數(shù)據(jù)增大 n 倍時(shí),耗時(shí)增大 logn 倍(比如,當(dāng)數(shù)據(jù)增大 256 倍時(shí),耗時(shí)只增大 8 倍);
例子:二分查找就是 O(logn)的算法,每找一次排除一半的可能。
let i = 1;while(i <= n) {i *= 2; // 每次循環(huán),i變大2倍,即排除一半可能 }3. Ο(n):(線性階)數(shù)據(jù)量的增大幾倍,耗時(shí)也增大幾倍;
for(i = 1; i <= n; i++) {... }4.? Ο(n^2):(平方階)數(shù)據(jù)量增大 n 倍時(shí),耗時(shí)增大 n 的平方倍;
for(i = 1; i <= n; i++) {for(j = 1; j <= n; j++) {...} }?
本文章持續(xù)完善中......
總結(jié)
以上是生活随笔為你收集整理的大O表示法和时间复杂度的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: linux php7.4,PHP 7.4
- 下一篇: hackmyvm-bunny walkt