不相交集ADT(联机算法 + 脱机算法)
【0】README
0.1)本文總結于 數據結構與算法分析, 旨在分享 不相交集ADT的相關概念;
0.2) 不相交集ADT 的知識涉及到: 等價關系、動態等價關系、不相交集ADT相關操作及其數據結構 ,還有我們最后分享的 不相交集ADT的應用;
0.3) 關于不相交集ADT的求并操作(find + union),參見 http://blog.csdn.net/pacosonswjtu/article/details/49717009 ;
0.4) 關于不相交集求并后的 路徑壓縮操作(源代碼),參見 http://blog.csdn.net/PacosonSWJTU/article/details/49717109
0.5) 注意本文給出的 聯機算法 + 脫機算法 的定義;
【1】 等價關系
1.1)若對于每一對元素(a,b), a, b ∈S, aRb 或者為true或者為false;則稱在集合S上定義關系 R; 如果aRb 是 true , 我們說 a 與 b 是有關系的;
1.2)等價關系是滿足下列三個性質的關系 R:
- (自反性): 對于所有的 a ∈S, aRa;
- (對稱性): aRb當且僅當 bRa;
- (傳遞性):若aRb且 bRC 則 aRc;
【2】 動態等價關系
2.1)給定一個等價關系“~”, 一個自然問題是對任意的 a和b, 確定是否 a~b;
- 看個荔枝: 設在5個元素的集合 {a1, a2, a3, a4, a5} 上定義了一個等價關系, 此時存在25對元素, 它們的每一對有關系或者沒有關系;
2.2)等價類:一個元素a∈S 的等價類是S 的一個子集, 它包含所有與a 有關系的元素;注意,等價類形成了對S 的一個劃分:S的每一個成員恰好出現在了 一個等價類中;
2.3)為了確定是否 a~b: 我們只需要驗證 a和b 是否都在同一個等價類中,就可以了;
2.4)不相交:初始數據最初是N個集合的類,每個集合一個元素,初始描述的是所有關系均為 false;
2.4.1)此時有兩種運算可以進行:
- find操作(Find算法):它返回包含給定元素的集合(等價類)的名字;
- 添加關系(合并操作,Union算法):如果我們想要添加關系a~b, 那么我們首先要看是否a和b已經有關系。這可以通過對a 和 b執行 find 操作來檢驗它們是否在同一個等價類中來完成;如果他們不再同一個類中, 那么我們使用 求并運算 Union, 吧含有a 和b 的兩個等價類合并成一個新的等價類;
2.5)不相交集合的 Union/Find 算法:從集合觀點來看, U的結果是建立一個新集合 Sk=Si U Sj, 去掉原來兩個集合而保持所有的集合的不相交性;由于這個原因, 我們把這個工作的算法叫做 不相交集合的 Union/Find 算法;
2.6)該算法是動態的:因為在算法執行過程中, 集合可以通過 Union 操作而發生改變;
2.7)聯機算法 + 脫機算法:
- 2.7.1)聯機算法:這個算法是聯機算法,當Find執行時, 它必須給出答案算法才能繼續進行;
- 2.7.2)脫機算法:該算法需要觀察全部的Union 和 Find 序列, 它對每個Find給出的答案必須和所有執行到該Find的Union一致, 而該算法在看到所有的問題以后再給出它的所有答案;
- 2.7.3)聯機和脫機算法的舉例說明: 這種差別類似于參加一次筆試(它一般是脫機的, 你只能在規定時間內做完) 和一次口試( 因為你必須回答當前的問題, 然后才能繼續下一個問題);
2.8)解決動態等價問題的方法有兩種:
- 2.8.1)保證指令 Find 能夠以常數最壞情況運行時間執行;
- 2.8.2)保證指令Union 能夠以常數最壞運行時間執行; 但以上二者不能同時做到;
【3】 基本數據結構
3.1)我們的問題不要求 Find 操作返回任何特定的名字,而只是要求 當且僅當兩個元素屬于相同的集合時, 作用在這兩個元素上的 Find 返回相同的名字;
3.2)對Union(X,Y) 和 Find(X)操作的約定:
- 3.2.1)我們采納了在 Union(X,Y)后的新的根是 X 的約定;
- 3.2.2)對元素X 的一次Find(X)通過返回包含 X 的樹的根而完成;執行這次操作花費的時間與表示X 的節點的深度成正比;
- 3.2.3)通過以上所定義的操作, 能夠建立一顆深度為 N-1 的樹,使得一次 Find的最壞情形運行時間為 O(N);M次連續操作在最壞情形下可能花費 O(MN)時間;
3.3)對一些列操作的二次運行時間一般是不可接受的, 有幸的是, 有幾種方法容易保證這樣的運行時間不會出現;
【4】 一個應用
4.1)出現的問題: 我們有一個計算機網絡和一個雙向連接表,每一個連接可將文件從一臺計算機傳送到另一臺計算機。那么,能否將一個文件從網絡上的任意一臺計算機發送到任意的另一臺計算機上去呢? 一個附加的限制是要求該問題必須聯機解決;因此,這個連接表要一次一個地給出,而該算法那則必須能夠在任一時刻給出答案;
4.2)解決方法:
- 4.2.1)我們要求兩臺計算機可以傳輸文件當且僅當他們在同一個集合中;可以看出,傳輸文件的能力形成一個等價關系。此時我們一次一個地讀入連接。當我們讀入某個連接如(u,v)時, 我們測試是否 u 和 v 在同一個集合中,如果他們在同一個集合中,則什么也不做;如果不在的話,那么將他們所在的兩個集合合并;
- 4.2.2)在算法的最后: 所得到的圖連通當且僅當恰好存在一個集合。 如果存在M個鏈接 和 N臺 計算機, 那么空間的需求則是 O(N);使用 按大小求并 和 路徑壓縮 的方法,我們得到最壞運行時間為 O(Mα(M,N)), 因為存在2M次Find 和 至多N-1次Union, 這個運行時間是線性的;
總結
以上是生活随笔為你收集整理的不相交集ADT(联机算法 + 脱机算法)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 受益匪浅是什么意思解释一下 受益匪浅的意
- 下一篇: 不相交集的求并算法(按集合大小求并+按高