0. 核心思想
擬陣問題的核心是找到具體問題中獨立性的表現形式,然后找到一個能快速判斷當前子集是否滿足獨立性的算法F,F的復雜度將會直接影響整個算法的復雜度
1. 觀前提示:
每個人的思路不同,自然思考時遇到的困難那就不同,我這里僅僅是記錄了自己思考過程中的困難以及理解思路,所以敘事的詳略也只是根據我個人的思路而言,至於能否幫到讀者就不好說了,當然我還是希望我的解釋過程能對你的理解產生幫助。文章內容部分來源網絡,僅當作個人備忘。
2. 擬陣的定義及性質
擬陣是一個滿足如下條件的序偶 M = (S , I)
1. S是一個有限集
2. I 是S的子集的一個非空集族,這些子集稱為S的獨立子集,使得如果B∈I,且A包含於B,則A∈I,如果I滿足此性質,則稱之為遺傳的。空集必然是I的成員
3. 如果A∈I,B∈I 且A比B元素數更少,那么存在某個元素x屬於B-A使得A∪{x}∈I,則稱擬陣M滿足交換性質
(關於第三條交換性的個人理解:擬陣具有膨脹性,總是可以膨脹(或者說,擴展)成為極大獨立集,這能解釋為什么給定一個擬陣,這個擬陣中的所有基,具有同樣的大小)
下面以圖擬陣為例進行分析,首先給出圖擬陣的概念
3. 圖擬陣
首先給出圖擬陣的定義
圖擬陣(記為M_G = S_G , I_G)定義在一個給定的無向圖G = (V , E)上,滿足下列條件
1. S_G定義為 E,也就是G的邊集
2. A 是 E 的子集,則A ∈ I_G 當且僅當A是無圈的。換而言之,A是獨立的當且僅當G_A形成一個森林
結合圖擬陣說明擬陣的三條性質
首先非空有限集,顯然邊集S_G滿足條件
其次遺傳性,考慮B ∈ I,且A包含於B。A,B根據定義,顯然是森林,森林的自己也還是森林,所以A ∈ I 也成立,遺傳性得證
最后考慮交換性,我們按照性質構造兩個森林,分別記作A和B,他們的頂點集相同,這里不妨假設B比A包含有更多的邊,於是,計算他們連通塊的個數,根據圖論里的公式,連通塊個數 = 點數 - 邊數(可以自己畫個圖感受一下,三個點,一條邊,兩個分量),於是B由於邊更多,所以連通塊數量就更少,整體上感受就是B是整塊的,而A更加零碎
更進一步,一定會有 B 中的一條邊 e 連接 A 中的兩個分量。可以這么來理解,A和B一人拿一個連通塊,B總是盡可能地不讓自己的塊包含兩個A的塊,怎么做,很簡單,跟A選擇一樣的塊就行了,這樣直到B耗盡了自己所有的塊,它仍然一直保持着沒有鏈接兩個A的小塊,但是由於它的塊數更少,無法繼續進行操作了。
現在考慮A,A為了增加自己的連通塊數應該怎么做?任何鏈接兩個連通塊的操作都會降低連通塊個數,例如連接兩個點,所以A只能將自己已經存在的連通塊進行拆分,而這樣,我們的假設也就得證了,因為此時在A中被破壞的邊,不正是我們要找的鏈接A中兩個分量的邊嗎?
這樣我們就找到了一條邊e,它來自B的邊集,連接了A的兩個連通塊,根據森林的性質,把兩個數合並為一個樹自然是不會生成圈的,此時的A∪{e} 仍然是滿足圖擬陣的性質的,交換性得證
上述分析過程可以看出,一個序偶是否為擬陣,我們的主要目標是證明其是否具有交換性,而一般的思路也是構造兩個大小不同的序偶,將其中較大序偶中的一個獨有的元素,一般稱之為邊,加入另一個較小的序偶中,接下來只需要考察這個序偶+新加入的邊是否仍然滿足集族的性質即可。
3.1. 可表出
這里涉及到了另一種擬陣,線性擬陣,簡而言之就是一組基底,我們在研究線性擬陣的時候實際上實在研究對應的矩陣的性質,類似的,如果定義一個矩陣M,它可以用列向量來表示擬陣 M = (S , I) 中S的每一個邊,那么我們就稱此擬陣 M 是可表出的,矩陣M為其表出
簡單說,判斷一個擬陣能不能被表出,問能不能找到一個矩陣,使得矩陣的列向量的獨立性能和擬陣的獨立性對應起來。
3.2. 定理:在任何域下,圖擬陣都是可表出的。
證明:首先我們對一個圖G構造矩陣M,首先對無向圖的每一條邊隨意賦予一個方向,對於這個有向邊,記為e = (u , v) 對於除了u v以外的所有分量,也就是與它無關的其他節點,我們都賦值0,對於節點u我們賦值為1,與之相對v賦值為-1。這樣,問題就等價為證明矩陣M上的列向量是線性無關(即,可表出),當且僅當這組向量表示的邊集是無圈的 (即,是圖擬陣)
上圖展示了如何用向量表示圖
先證必要性,假設圖中是包含圈的,我們對於這個圈C上的每一條邊e都讓他對應到一個值a,當我們按照順序遍歷這個圈上的所有邊是,如果它的方向和我們便=遍歷的方向相反,我們將這個值賦值為-1,反之如果同方向則賦值為+1,這樣,對於這個圈上的每一個點,他都出現了兩次,一次進一次出,這時,我們對這個圈上的所有邊乘上我們剛剛賦的值a,求和結果一定是0,這就跟線性無關這個條件矛盾了,所以圖中無圈
再證充分性,同樣反證,假設我們得到的向量組不滿足線性無關,同樣假設每條邊對應一個值a,既然不獨立,那么必然會有一組非零的a使得v*a求和結果為零,隊與那些a≠0的邊集,至少有一個點之鏈接了一條邊,而這就是的v*a求和結果不可能為零,矛盾,所以得到的向量組滿足線性無關。
證明結論過程中,我們沒有用到任何對條件的假設,所以我們可以得出結論,任何域下,圖擬陣都是可以表出的。
4. 擬陣與貪心算法
很多可以用貪心算法得到最優解的問題都可以形式化為在一個加權擬陣中尋找最大權重獨立子集的問題
下面為了證明整個過程通過貪心法選出的最大權重解的確是整個問題的最優解
4.1. 擬陣具有貪心選擇性
引理4.1
假設M = (S , I) 是一個加權擬陣,加權函數為 w ,且已經按照權值進行排序,令x是 S 中第一個滿足 { x } 獨立的元素,如果存在這樣的 x ,那么存在S的一個最優解子集 A 包含 x。
這個引理是什么意思?我們為何要先證明這個引理?因為貪心選擇性的定義就是若一個問題的全局最優解可以通過局部最優解得到,那么稱其具有貪心選擇性。這就要求我們通過歸納法進行證明。而這個引理就是作為遞歸基礎的!所以必須先證明之。
引理4.1證明
假設不存在這樣的 x 那么唯一的獨立子集就是空集,滿足引力;若存在這樣的 x,則假設一個同樣是最優子集的 B 存在且不包含 x ,因為如果包含 x ,那我們就不用證了
現在我們構造一個子集 A ,初始時只包含 x ,即 A = { x } ,由於擬陣具有交換性,我們可以不斷地從 B 中選出新元素加入 A ,而且由於 { x } 是滿足獨立性的,A將始終保持獨立性,直到 | A | = | B |,這時,A B二者之間唯一的差別就在A 中包含x,而B中不包含x而包含一個別的元素y,由於x是第一個滿足獨立性的元素且處於最大權值隊列的隊首,所以x的權重必然 ≧ y的權值,因為B是最優子集,所以A也是最優子集,因為A至少不會比B更差。這樣我們的引理就證明完畢,也就確保了擬陣貪心選擇性證明的歸納基礎。以此為基礎,我們可以進行迭代調用。
現在又有一個問題,x是怎么選出來的?那些沒選的邊是應該繼續放回隊列嗎?
引理4.2
M = (S , I) 是一個擬陣,如果 x 是 S 中的一個元素,而且是S的某個獨立子集A的一個擴展,則x也是空集的一個擴展
這個引理的目的性並不明確,先證明出來一會再研究
引理4.2證明
由於x是A的擴展,可知A∪{x}是獨立的,根據遺傳性,{x}也是獨立的,所以x是空集的一個擴展
推論4.3
M = (S , I) 是一個擬陣,如果 x 是 S 中的一個元素,如果x不是空集的擴展,那么他也不是S的任意獨立子集A的一個擴展
這個推論是不是感覺有點意思?沒錯,證明上面那個不知所以的引理就是為了證明這個推論。推論指出,任何元素如果在首次出現時不能用於構造獨立集,那他之后永遠都不可能被用到了。換句話說,如果一個元素在初始時不是最優,那他隨后也不會被加入到最優解集合中。
這就使得我們需要在構建最優解的過程中,每一步都選擇當前的最優解而無需考慮其他子問題,貪心選擇性得證。
4.2. 擬陣具有最優子結構
引理4.4
M = (S , I) 是一個擬陣,如果 x 是 S 中通過貪心法選擇出的的第一個元素,那么接下來尋找包含x的最大權重獨立子集的問題轉化為尋找 M’ = (S’ , I‘) 的最大權重獨立子集的問題
用剪枝法證明,如果子問題不是最優的則可以通過剪切的方式得到一個更好的解
於是,綜合上面兩部分,我們可以知道,在最開始的時候選擇一個當前的最優解是沒有錯誤的,必然會包含在一個最優解之中,而之后原問題等價為刪除此次選擇以及此次選擇過程中放棄的選擇的一個子問題,由在此應用貪心選擇策略,循環上述過程,解決尋找 M = (S , I) 的最大權重獨立子集的問題
結論 擬陣上的貪心算法具有正確性
參考文章鏈接:https://zhuanlan.zhihu.com/p/54072907
參考教材:算法導論(第三版)第16章