遞歸的時(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 的遞歸樹:
如上圖,我們需要把這顆遞歸樹的 3 個(gè)節(jié)點(diǎn)的所有耗時(shí)都加上,最終的結(jié)果就是 T(N)
;
再看上圖,我們遞歸了 1 層,如果遞歸 2 層、3層呢?
遞歸 2 層,表達(dá)式變?yōu)?4 *(T(n/4))+ 2n
.
遞歸 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