在學習分治的時候,通常都會遇到通用分治演算法遞推式:
其中 t(n)代表了分治演算法的時間複雜度,n代表了問題的輸入規模,a和b分別代表n個輸入例項劃分為b個子問題,其中a個需要被處理;最後f(n)代表最後合併處理後的結果所需要的時間複雜度。顯而易見,t(n)的增長次數取決於a,b已經f(n)。通常會直接給出如下的主定理來描述t(n):
其實對於這個公式所表示的意思,我不是很明白。比如我當時就有幾個問題:
f(n) 為什麼是屬於n的d次方的複雜度?
三個等式是怎麼算出來的,成立條件表示的是什麼意思?
為了解決我的疑惑,查閱了不少的資料,也想明白了問題。因此特此在本文中記錄下。
第乙個問題 - f(n) 為什麼是屬於n的d次方的複雜度?
對於這個問題我的理解是,對於劃分的b個子問題,不管是否需要處理最後都需要合併。那麼合併這些子問題的結構,至少是o(n)的複雜度。如果複雜一點還有可能是o(n ^ 2)這樣子(比如2個結果集,還要在排序下,然後又使用了o(n ^ 2)的演算法)
第二個問題 - 主定理如何計算出來的?
主定理的計算有著兩種方法:遞推求解法和遞迴樹求解法。對於遞迴求解法,要求較高的數學方法而且比較抽象(簡單的來說就是我不懂哈哈哈),所以不打算記錄下。這裡主要談談我對遞迴樹求解法的理解。通過遞迴樹可以把t(n)的各個遞迴的部分畫出來。
遞迴的最後規模是1,因此可以得出如下的幾個結論:
遞迴樹的高度
葉子節點的個數是:
成本和(表示了合併所有結果的成本):
這裡解釋下a/b^d 這個部分是怎麼來的。如下的推倒,當把t(n/b)替換之後,則可得到a/b^d 這個部分。(原本b^d是在o()中,因為算是常數項,所以可以提出來)
來看下兩個比較重要的部分:
a.第一層的成本是:
b. 最後一層的成本是:
根據上面的遞迴樹圖,我們可以知道時間複雜度 = 成本和,所以會出現以下這三種情況:
如果a/b^d < 1 既每一層的成本和都是遞減的,則時間複雜度可以按第一層計算,既t(n) = o(n^d)
如果a/b^d = 1 既每一層的成本和是一樣的,那麼總成本就是把第一層的成本乘以樹高,既:
如果a/b^d > 1 既每一層的成本和都是遞增的,則只計算最後一層的成本和即可:
所以可以通過a/b^d 和1的關係,可以得出不同的時間複雜度度。也就最後得到了這個公式:
參考文獻
1.分治法(一).
2.分治法時間複雜度求解秘籍.
分治演算法的學習筆記
分治演算法應用一 漢諾塔問題 問題描述 漢諾塔問題 於乙個古老的傳說,世界剛被建立的時候,有一座鑽石寶塔,上面有64個金碟,所有碟子按照從大到小的順序從塔底堆到塔頂,從世界創世開始,牧師們一直在努力將塔a的碟子借助b移到c上,每次只能移動乙個,而且不能讓小的放在大的下面 原理 對漢諾塔問題的求解簡化...
演算法分析 快速排序 主定理分析遞迴的複雜度
快速排序對於初學者而言算是實現較為困難的一種排序方法,而其 的實現方法也有多種,本文採用其中一種方法實現快排,並採用主定理對其複雜度進行分析。對於乙個已經排序好的陣列,一定有該特性 任取乙個數字,其左邊的數字 若存在 全部小於該數字,其右邊的數字 若存在 一定大於該數字。那麼我們便可以對乙個未排序陣...
NFL定理和演算法的優劣性
希望大家能自己去了解一下 歸納偏好 欠擬合 過擬合 奧卡姆剃刀 原則以及nfl定理。nfl no free lunch theorem 定理,經過推導後得出結論 無論演算法多聰明或笨拙,它們的期望效能是相同的。不要氣餒,因為nfl定理有乙個重要前提 所有 問題 出現的機會或所有問題同等重要。但實際情...