1. 復(fù)雜度分析是整個(gè)算法學(xué)習(xí)的精髓,只要掌握了它,數(shù)據(jù)結(jié)構(gòu)和算法的內(nèi)容基本上就掌握了一半
2. 我們都知道,數(shù)據(jù)結(jié)構(gòu)和算法本身解決的是“快”和“省”的問題,即如何讓代碼運(yùn)行得更快,如何讓代碼更省存儲(chǔ)空間。所以,執(zhí)行效率是算法一個(gè)非常重要的考量指標(biāo)。那如何來衡量你編寫的算法代碼的執(zhí)行效率呢?這里就要用到我們今天要講的內(nèi)容:時(shí)間、空間復(fù)雜度分析。
3. 為什么需要復(fù)雜度分析?
你可能會(huì)有些疑惑,我把代碼跑一遍,通過統(tǒng)計(jì)、監(jiān)控,就能得到算法執(zhí)行的時(shí)間和占用的內(nèi)存大小。為什么還要做時(shí)間、空間復(fù)雜度分析呢?這種分析方法能比我實(shí)實(shí)在在跑一遍得到的數(shù)據(jù)更準(zhǔn)確嗎?(事后統(tǒng)計(jì)法-方法是正確的但是有很大的局限性)
(1)測(cè)試結(jié)果非常依賴測(cè)試環(huán)境
(2)測(cè)試結(jié)果受數(shù)據(jù)規(guī)模的影響很大
所以,我們需要一個(gè)不用具體的測(cè)試數(shù)據(jù)來測(cè)試,就可以粗略地估計(jì)算法的執(zhí)行效率的方法---時(shí)間、空間復(fù)雜度分析方法
一、大 O 復(fù)雜度表示法
總結(jié)出規(guī)律:所有代碼的執(zhí)行時(shí)間 T(n) 與每行代碼的執(zhí)行次數(shù) n 成正比
得到公式:
我來具體解釋一下這個(gè)公式。其中,T(n) 我們已經(jīng)講過了,它表示代碼執(zhí)行的時(shí)間;n 表示數(shù)據(jù)規(guī)模的大小;f(n) 表示每行代碼執(zhí)行的次數(shù)總和。因?yàn)檫@是一個(gè)公式,所以用 f(n) 來表示。公式中的 O,表示代碼的執(zhí)行時(shí)間 T(n) 與 f(n) 表達(dá)式成正比。
所以,第一個(gè)例子中的 T(n) = O(2n+2),第二個(gè)例子中的 T(n) = O()。這就是大 O 時(shí)間復(fù)雜度表示法。大 O 時(shí)間復(fù)雜度實(shí)際上并不具體表示代碼真正的執(zhí)行時(shí)間,而是表示代碼執(zhí)行時(shí)間隨數(shù)據(jù)規(guī)模增長的變化趨勢(shì),所以,也叫作漸進(jìn)時(shí)間復(fù)雜度(asymptotic time complexity),簡稱時(shí)間復(fù)雜度。
二、時(shí)間復(fù)雜度分析
時(shí)間復(fù)雜度的全稱是:漸進(jìn)時(shí)間復(fù)雜度,表示算法的執(zhí)行時(shí)間與數(shù)據(jù)規(guī)模之間的增長關(guān)系
1. 只關(guān)注循環(huán)執(zhí)行次數(shù)最多的一段代碼
2. 加法法則:總復(fù)雜度等于量級(jí)最大的那段代碼的復(fù)雜度
3. 乘法法則:嵌套代碼的復(fù)雜度等于嵌套內(nèi)外代碼復(fù)雜度的乘積
幾種常見時(shí)間復(fù)雜度實(shí)例分析
對(duì)于剛羅列的復(fù)雜度量級(jí),我們可以粗略地分為兩類,多項(xiàng)式量級(jí)和非多項(xiàng)式量級(jí)。其中,非多項(xiàng)式量級(jí)只有兩個(gè):O() 和 O(n!)。
我們把時(shí)間復(fù)雜度為非多項(xiàng)式量級(jí)的算法問題叫作 NP(Non-Deterministic Polynomial,非確定多項(xiàng)式)問題。
當(dāng)數(shù)據(jù)規(guī)模 n 越來越大時(shí),非多項(xiàng)式量級(jí)算法的執(zhí)行時(shí)間會(huì)急劇增加,求解問題的執(zhí)行時(shí)間會(huì)無限增長。所以,非多項(xiàng)式時(shí)間復(fù)雜度的算法其實(shí)是非常低效的算法。因此,關(guān)于 NP 時(shí)間復(fù)雜度我就不展開講了。
我們主要來看幾種常見的多項(xiàng)式時(shí)間復(fù)雜度
三、空間復(fù)雜度分析
空間復(fù)雜度全程是:漸進(jìn)空間復(fù)雜度(asymptotic space complexity),表示算法的存儲(chǔ)空間與數(shù)據(jù)規(guī)模之間的增長關(guān)系
我們常見的空間復(fù)雜度就是 O(1)、O(n)、O()?,像 O(logn)、O(nlogn) 這樣的對(duì)數(shù)階復(fù)雜度平時(shí)都用不到。而且,空間復(fù)雜度分析比時(shí)間復(fù)雜度分析要簡單很多。所以,對(duì)于空間復(fù)雜度,掌握剛我說的這些內(nèi)容已經(jīng)足夠了。
復(fù)雜度也叫漸進(jìn)復(fù)雜度,包括時(shí)間復(fù)雜度和空間復(fù)雜度,用來分析算法執(zhí)行效率與數(shù)據(jù)規(guī)模之間的增長關(guān)系,可以粗略地表示,越高階復(fù)雜度的算法,執(zhí)行效率越低。常見的復(fù)雜度并不多,從低階到高階有:O(1)、O(logn)、O(n)、O(nlogn)、O()?。等你學(xué)完整個(gè)專欄之后,你就會(huì)發(fā)現(xiàn)幾乎所有的數(shù)據(jù)結(jié)構(gòu)和算法的復(fù)雜度都跑不出這幾個(gè)。
感謝極客時(shí)間:https://time.geekbang.org/column/article/40036