分析递归函数的时间复杂度
遞歸算法的時(shí)間復(fù)雜度表達(dá)式:
O(T) = R * O(s)
O(T)表示時(shí)間復(fù)雜度
R表示遞歸調(diào)用的次數(shù)
O(s)每次遞歸調(diào)用計(jì)算的時(shí)間復(fù)雜度
想想斐波那契函數(shù),它的遞歸關(guān)系是f(n) = f(n-1) + f(n-2);乍一看,我們會(huì)發(fā)現(xiàn),在斐波那契函數(shù)執(zhí)行期間來(lái)計(jì)算遞歸調(diào)用的次數(shù)似乎并不那么的容易。
解釋:這種情況下,我們最好是可以借助執(zhí)行樹,它是一顆被用來(lái)表示遞歸函數(shù)執(zhí)行流程的數(shù)。樹中的每一個(gè)節(jié)點(diǎn)代表遞歸函數(shù)的一次調(diào)用。所以,樹中節(jié)點(diǎn)的總數(shù)與執(zhí)行期間遞歸調(diào)用的數(shù)量相對(duì)應(yīng)。
遞歸函數(shù)的執(zhí)行樹將形成一個(gè)n叉樹,這個(gè)n就是遞歸在遞歸關(guān)系中出現(xiàn)的 次數(shù)。 還拿斐波那契函數(shù)來(lái)說事,那它會(huì)形成一個(gè)二叉樹。具體可參考下圖。
在深度為n的完全二叉樹中,所有節(jié)點(diǎn)的數(shù)量可以達(dá)到2n-1。那么在遞歸函數(shù)f(n)的遞歸次數(shù)的上界也就是2n-1。所以,我們可以估算出f(n)的時(shí)間復(fù)雜度就是O(2n)
備忘錄
備忘錄技術(shù)是用來(lái)優(yōu)化遞歸算法時(shí)間復(fù)雜度的技術(shù)。通過緩存和重用中間結(jié)果的方式,備忘錄可以極大地減少遞歸調(diào)用的次數(shù),也就是減少執(zhí)行樹中分枝的數(shù)量。所以,當(dāng)我們使用備忘錄來(lái)分析遞歸算法的時(shí)間復(fù)雜度時(shí)候應(yīng)該把這減少的部分考慮到。
再把斐波那契函數(shù)拎出來(lái)說事。通過備忘錄技術(shù),我們會(huì)對(duì)每一個(gè)下標(biāo)n進(jìn)行斐波那契數(shù)進(jìn)行保存操作。我們也能夠確信的是每一個(gè)斐波那契數(shù)的計(jì)算也僅僅出現(xiàn)一次。眾所周知的是根據(jù)遞歸關(guān)系,一個(gè)斐波那契數(shù)f(n)依賴于所有n-1在前的斐波那契數(shù)。結(jié)果就是,計(jì)算f(n)遞歸將調(diào)用n-1次,以計(jì)算它所依賴的所有先前的數(shù)。
現(xiàn)在我們就可以利用文章開頭列出的公式來(lái)計(jì)算備忘錄技術(shù)應(yīng)用后的時(shí)間復(fù)雜度:O(1)n=O(n)。
結(jié)論
備忘錄不僅優(yōu)化算法的時(shí)間復(fù)雜度,而且還可以簡(jiǎn)化時(shí)間復(fù)雜度的計(jì)算。
希望能給大家?guī)?lái)一定的幫助,歡迎一鍵三連,謝謝。?
總結(jié)
以上是生活随笔為你收集整理的分析递归函数的时间复杂度的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Git下载与使用(Git地址由CSDN提
- 下一篇: spark环境搭建(idea版本)