文章目錄
遞迴方程組解的漸進階的求法——迭代法
用這個方法估計遞迴方程解的漸近階不要求推測解的漸近運算式,但要求較多的代數運算。方法的思想是迭代地展開遞迴方程的右端,使之成為一個非遞迴的和式,然後通過對和式的估計來達到對方程左端即方程的解的估計。
作為一個例子,考慮遞迴方程:
接連迭代二次可將右端項展開為:
由於對地板函數有恒等式:
(6.10)式可化簡為:
這仍然是一個遞迴方程,右端項還應該繼續展開。容易看出,迭代 i 次後,將有
(6.11)
而且當
時,(6.11)不再是遞迴方程。這時:
(6.13)
又因為[a]≤a,由(6.13)可得:
而由(6.12),知i≤log4n ,從而
,
代人(6.14)得:
即方程(6.9)的解 T(n)=O(n)。
從這個例子可見迭代法導致繁雜的代數運算。但認真觀察一下,要點在於確定達到初始條件的迭代次數和抓住每次迭代產生出來的"自由項"(與T無關的項)遵循的規律。順便指出,迭代法的前幾步迭代的結果常常能啟發我們給出遞迴方程解的漸近階的正確推測。這時若換用代入法,將可免去上述繁雜的代數運算。
圖6-1 與方程(6.15)相應的遞迴樹
為了使迭代法的步驟直觀簡明、圖表化,我們引入遞迴樹。靠著遞迴樹,人們可以很快地得到遞迴方程解的漸近階。它對描述分治演算法的遞迴方程特別有效。我們以遞迴方程
T(n)=2T(n/2)+n2 (6.15)
為例加以說明。圖6-1展示出(6.15)在迭代過程中遞迴樹的演變。為了方便,我們假設n恰好是2的冪。在這裡,遞迴樹是一棵二叉樹,因為(6.15)右端的遞迴項2T(n/2)可看成T(n/2)+T(n/2)。圖6-1(a)表示T(n)集中在遞迴樹的根處,(b)表示T(n)已按(6.15)展開。也就是將組成它的自由項n2留在原處,而將2個遞迴項T(n/2)分別攤給它的2個兒子結點。(c)表示迭代被執行一次。圖6-1(d)展示出迭代的最終結果。
圖6-1中的每一棵遞迴樹的所有結點的值之和都等於T(n)。特別,已不含遞迴項的遞迴樹(d)中所有結點的值之和亦然。我們的目的是估計這個和T(n)。我們看到有一個表格化的辦法:先按橫向求出每層結點的值之和,並記錄在各相應層右端頂格處,然後從根到葉逐層地將頂格處的結果加起來便是我們要求的結果。照此,我們得到(6.15)解的漸近階為θ(n2)。
再舉一個例子。遞迴方程:
T(n)= T(n/3)+ T(2n/3)+n (6.16)
的迭代過程相應的遞迴樹6-2所示。其中,為了簡明,再一次略去地板函數和天花板函數。
圖6-2迭代法解(6.16)的遞迴樹
當我們累計遞迴樹各層的值時,得到每一層的和都等於n,從根到葉的最長路徑是
設最長路徑的長度為k,則應該有
,
得
,
於是
即T(n)=O(nlogn) 。
以上兩個例子表明,藉助於遞迴樹,迭代法變得十分簡單易行。