1 前言
對於一些NP-Hard問題,我們無法找到一個精確的求解方法。使用貪心思想採取貪心算法來求取近似解就成了常用的選擇。很多算法名著對貪心算法都有很明確的講解,這裏對貪心算法摘取一下重點,然後我們要引出貪心算法背後的理論依據——擬陣理論。對於擬陣理論,可以查找一些入門典籍,如劉桂真,陳慶華著《擬陣》。
2 貪心算法
也稱作貪婪算法(Greedy Algorithm),通過做一系列的選擇來給出某一問題的最優解。對算法中的每一個決策點做一個在當時看起來是最佳的選擇。這是貪心算法的核心思想。但是這種啓發式策略不是總能產生出最優解,但常常能給出最優解。貪心算法以動態規劃作爲基礎,大致遵循着這樣的步驟:
1.確定待解決問題的最優子結構;
2.設計遞歸求解方式;
3.證明在遞歸的任一階段,最優選擇之一總是貪心的。那麼做貪心選擇是合適的;
4.證明通過做貪心選擇,所有的子問題都爲空(除一個以外);
5.設計實現貪心策略的遞歸算法;
6.將設計好的遞歸算法轉換成迭代算法。
2.1 貪心選擇性
一個全局最優解可以通過局部最優(貪心)選擇來達到。換言之,當考慮做何種選擇時,我們只考慮對當前問題的選擇而不考慮子問題的結果。貪心算法不同於動態規劃之處就在於此,在動態規劃中,每一步都要做出選擇,但是這些選擇依賴於子問題的解,解動態規劃問題一般是自底向上,從小問題處理到大問題。而貪心算法中,我們所做的總是當前看似最佳的選擇,然後在解決經過貪心選擇之後所出現的子問題。其作出的當前的選擇可能要依賴於已經做出的所有選擇,但不依賴於未做出的選擇或子問題的解。貪心算法採取的貪婪策略往往是自頂向下的。核心所在就是要證明每一步所做的貪心選擇最終能產生一個全局最優解。
2.2 最優子結構
對於一個問題,如果它的一個最優解包含了其子問題的最優解,則稱該問題具有最優子結構。
2.3 設計貪心算法的一般步驟
1.將優化問題轉化爲:先做出選擇,再解決剩下的一個子問題;
2.證明原問題總是有一個最優解是做貪心選擇而得到的,從而證明貪心選擇的安全性;
3.說明做出貪心選擇之後,剩餘的子問題具有一個性質:如果將子問題的最優解和所做的貪心選擇聯合,可以得到原問題的一個最優解。
3 擬陣
首先請明確:擬陣理論不能完全覆蓋所有的貪心算法(如赫夫曼編碼問題),但它可以覆蓋大多數具有實際意義的情況。首先介紹擬陣的概念。(有些文獻也稱作矩陣胚)
3.1 定義 擬陣
擬陣(Matroid)是滿足如下條件的一個序對
1.
2.
3.
4.
3.2 擬陣的實例
集合
若
證明:
1)顯然
2)
3)具有
得證。
3.3 極大獨立子集
首先明確可擴展元素的概念
3.3.1 定義 可擴展元素
給定擬陣
3.3.2 定義 帶權擬陣
若對給定擬陣
適宜用貪心方法獲得最優解的許多問題,都可以歸結爲在加權擬陣中找出一個具有最大權值的獨立子集問題。因爲任意元素的權值都是正的,故找出的最優子集同時也是最大子集。
下面是求帶權擬陣最優子集的貪心算法。
3.4 求帶權擬陣最優子集的貪心算法
該算法排序時間複雜度爲
現證明算法返回的結果是一個最優子集。
3.4.1 引理1(擬陣具有貪心選擇性質)
假設
3.4.2 引理2
設
推論 設
3.4.3 引理3(擬陣具有最優子結構性質)
設
其中,
故可得定理,
這樣可得到一個定理 擬陣上貪心算法的正確性
3.5 定理 擬陣上貪心算法的正確性
如果給定
4 後記
擬陣提供給絕大部分貪心算法很好的理論背景,(但不能把所有的貪心算法都覆蓋全面),在我們使用貪心算法解決問題時,應該考察其是否滿足擬陣的相應約束,可否用擬陣理論的背景給予一些證明.應用擬陣的題目雖然不常見,但卻是某些貪心問題強力解法。其獨立擴充公理旺旺成爲證明模型符合擬陣條件的關鍵。
本文只介紹了擬陣的基本概念以及擬陣和貪心算法的關係,若繼續深入研究,可以參閱劉桂真,陳慶華編著的《擬陣》一書。
5 參考文獻
[1] Thomas H.Cormen Charles E.Leiserson Ronald L.Rivest Clifford, Stein introduction to algorithms
[2] 劉桂真,陳慶華,擬陣,國防科技大學出版社,1994