眾所周知,遞歸是算法的一個重要表現形式,不僅作用大,而且其復雜度的分析也比其他方式要繁雜。
但是,如果拋開某些很NB,很強大,很邪惡的遞歸式不談,如果不能有效的確定普通遞歸式和一些典型算法遞歸式的復雜度,那么這個人顯然不是合格的Coder。
由於遞歸式復雜度的難以確定,所以目前常用的方法有這么幾種:代換猜測法、遞歸樹法、主定理、直接數學分析法
代換猜測法通常和遞歸樹法合用,利用遞歸樹法得到一個大概正確的結果,然后利用數學歸納法對其驗證。
直接的數學分析法相對很直接,很強悍,但是對數學要求很高,尤其是碰到一些BT的表達式
其中,主定理是最常用的方法。
在算法分析中,主定理(master theorem)提供了用漸近符號表示許多由分治法得到的遞推關系式的方法。
主定理通常可以解決如下的遞歸表達式:
T(n)=a*T(n/b)+f(n)
上面的遞歸式描述的是將規模為n的問題划分為a個子問題,並且每個子問題的規模是n/b,這里a和b是正常數。划分原問題和合並結果的代價有函數f(n)描述。
主定理有三種情況,不同的情況有不同的用法。

一些非正常情況
在某些情況下,存在一些特殊情況,比如明顯不滿足主定理形式,或經過乍看之下不滿足,但是經過變形之后可以應用主定理。
甚至在某些情況下,看上去符合主定理的遞歸式是無法應用主定理求解的,因為主定理不覆蓋所有情況,即遞歸式不滿足上面三條中的任意一條
我們逐一來看看這些特殊情況

這種形式的條件顯然不符合主定理的口味,但是我們可以簡單的通過遞歸樹加上一點點的數學分析可知,總共有n層,每層都是n的代價,所以總代價應該是O(n2)

n帶了根號,乍看之下是無法應用主定理的,但是我們可以通過換元等trick將遞歸式轉化成可以用主定理求解的式子

而對於某些式子,如上面所說,看着似乎可以用MM求解,但是實際上不滿足3條中的任何一條,比如下面的:


常見遞歸算法的復雜度
我們經常碰到的算法中,很多都是基於遞歸的,比如快速排序、歸並排序、二分查找等等,甚至你也可以把求Fibonaci數列的遞歸算法也算入
而這些遞歸式都是很容易分析的,分析的過程就留給大家了~
