遞歸時(shí)間復(fù)雜度 推演計(jì)算

遞歸的時(shí)間復(fù)雜度計(jì)算較為麻煩。以下我們使用歸并排序的例子,對(duì)遞歸復(fù)雜度進(jìn)行推演。

假設(shè)現(xiàn)在有一個(gè)歸并排序。他的運(yùn)行總時(shí)間是 T(n)
我們通過將其分解成 2 個(gè)計(jì)算式,即 :2 * (T(n/2))+ n,為什么加 n 呢?因?yàn)?n/2 只是遞歸計(jì)算的時(shí)間,實(shí)際還有合并的時(shí)間,在大部分遞歸中,不但有子任務(wù)的時(shí)間,還有合并子任務(wù)的時(shí)間也要計(jì)算(在遞歸計(jì)算中,子問題消耗的時(shí)間需要統(tǒng)計(jì),合并子問題的結(jié)果所消耗的時(shí)間也要統(tǒng)計(jì))。

現(xiàn)在,我們的公式是 2 * (T(n/2))+ n,表達(dá)的是一顆高度是 1 的遞歸樹:

image.png

如上圖,我們需要把這顆遞歸樹的 3 個(gè)節(jié)點(diǎn)的所有耗時(shí)都加上,最終的結(jié)果就是 T(N);
再看上圖,我們遞歸了 1 層,如果遞歸 2 層、3層呢?

2 層

遞歸 2 層,表達(dá)式變?yōu)?4 *(T(n/4))+ 2n.

3 層

遞歸 3 層,表達(dá)式變?yōu)?8 * (T(n/8))+ 3n.

我們總結(jié)一下:

遞歸 2 層:4(T(n/4))+ 2n
遞歸 3 層:8(T(n/8))+ 3n
遞歸 4 層:16(T(n/16))+ 4n
······
遞歸 k 層:2^k (T(n/2^k))+ kn

假設(shè)我們最終遞歸的結(jié)果是 1,那么:

T(n/2^k) = 1
·····反推 2^k = n
····· 那么 k = log2n

k 等于log2N,我們帶入 k 到上面的公式:2^k (T(n/2^k))+ kn

n + log2n * n

使用大 O 表達(dá)式,去除常數(shù),低階,系數(shù),遞歸的時(shí)間復(fù)雜度為 O(nlogn);

最后

關(guān)于遞歸樹的推演,推薦觀看一個(gè)視頻,講的很詳細(xì),地址:https://www.youtube.com/watch?v=bQi9BHCiusg

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。