遞迴關係式與主定理

分治遞迴式(divide-and-conquer recurrence)

大多數「切開、各自解、再拼回去」的遞迴演算法,都共用同一族遞迴關係式,值得學會一眼認出這一族。故事永遠一樣:把問題拆成幾塊規模相等且較小的子問題,各自遞迴解出,再花一些額外功夫把答案組合起來。

標準的分治遞迴式形如 T(n) = a T(n/b) + f(n)。其中 a 是子問題的數量(遞迴呼叫幾次),b 是規模縮小的倍數(每個子問題規模為 n/b),而 f(n) 是這一層切割輸入與合併結果的成本——也就是「不屬於遞迴呼叫」的一切。對合併排序而言 a = 2、b = 2、f(n) = Theta(n)(合併步驟);對二分搜尋而言 a = 1、b = 2、f(n) = Theta(1);對卡拉楚巴乘法而言 a = 3、b = 2、f(n) = Theta(n)。注意 a 與 b 各自獨立:a 可以比 b 大也可以比 b 小,而正是這個大小比較決定了答案。

這一個模板正是主定理直接求解的對象,因此你遇到的幾乎每一個分治執行時間都只是「代入」而已。關鍵直覺是一場拉鋸戰:每往下一層,遞迴呼叫把工作量乘上 a 倍,而規模縮小 b 倍,所以總量取決於工作量沿著樹往下是增加、持平還是減少。當切割不均或不相等(同一個呼叫裡出現 n/3 與 2n/3 這種規模)時,這個精確形式便不再適用,這時要改用阿克拉-巴齊(Akra-Bazzi)方法。

史特拉森(Strassen)矩陣乘法對半維度矩陣做 7 次遞迴乘法,外加 Theta(n^2) 的加法,所以 a = 7、b = 2、f(n) = Theta(n^2),得到 T(n) = 7 T(n/2) + Theta(n^2)。

找出 a(呼叫次數)、b(縮小倍數)、f(n)(非遞迴工作),就能命名這個遞迴式。

a 是子問題數量,不是樹的深度;b 是規模的除數,不是時間的除數。常見錯誤是「因為切成兩半」就設 a = b——合併排序確實如此(2 次呼叫、規模減半),但二分搜尋的 a = 1,儘管 b = 2。

又稱
D&C recurrenceaT(n/b)+f(n) form分治遞迴關係式