演算法導論筆記 21用於不相交集合的資料結構

2021-07-02 08:02:42 字數 2527 閱讀 2212

在某些應用中,要將

n個不同的元素分成一組不相交的集合。不相交集合上有兩個重要操作,即找出給定的元素所屬的集合和合併兩個集合。

一:不相交集合的操作

不相交集合教據結構維護一組不相交的動態集合的集合s=。每個集合通過乙個代表來識別,代表是集合中的某個成員,在某些應用中,哪乙個成員被選作代表是無所謂的,但是必須保證在兩次尋找某一集合的代表兩次,得到的答案應該是相同的。在另一些應用中,關於如何選擇代表可能存在著預先說明的規則,例如選擇集合中的最小元素(當然假定集合中的元素是可以排序的)。

集合中的每乙個元素是由乙個物件表示。設x表示乙個物件,希望支援以下操作:

make-set(x):建立乙個新的集合,其唯一成員(因而其代表)就是x。因為各集合是不相交的,故x不會出現在其他集合中。

union(x,y):將包含x和y的動態集合sx和sy合併為乙個新的集合(即這兩個集合的並集)。在經過此操作後,原來的集合sx和 sy需要從總集合s中刪除。

find-set(x):返回乙個指標,指向包含x的(唯一)集合的代表。

不相交集合資料結構有多種應用,其中之一是用於確定乙個無向圖中連通子圖,如下圖:

求聯通子圖**如下,計算過程見上圖:

connected-components對圖形進行預處理,然後same-component回答兩個頂點是否在同乙個連通分量。

二:不相交集合的鍊錶表示

下圖給出了實現不相交集合資料結構的簡單方法:每個集合用乙個自己的鍊錶來表示,每個集合的物件包含head屬性和tail屬性,head屬性指向表的第乙個物件,tail指向表的最後乙個物件。鍊錶中的每個物件包含乙個集合成員,乙個指向鍊錶中下乙個物件的指標和乙個指回到集合物件的指標。鍊錶中的物件以任意的次序出現。

在鍊錶的實現方法中,make-set操作需要o(1)的時間,只需要創造乙個只有x物件的新的鍊錶即可。find-set需要o(1)的時間,僅沿著x物件的返回指標返回到集合物件,然後返回head指向物件的成員。比如在上圖(a)中,find-set(g)返回f。

在上圖(b)中,體現了union(x,y)的結果。利用x所在鍊錶的tail指標,可以迅速的找到拼接y所在的位置,之後,刪除y鍊錶即可。但是對於y中的每個物件,需要更新指向集合物件的指標,花費的時間與y所在的鍊錶長度呈線性關係。

如果知道每個表的長度,並且拼接次序可以任意的話,可以總是把較短的表拼接到較長的表中。這叫做加權合併啟發式策略。

三:不相交集合森林

在不相交集合的另一種更快的實現中,用有根樹來表示集合,樹中的每個結點都包含集合的乙個成員,每棵樹表示乙個集合。在乙個不相交集合森林中,每個成員僅指向其父結點。每棵樹的根包含了集合的代表,並且是它自己的父結點。如下圖:

雖然採用了這種表示的演算法並不比採用鍊錶表示的演算法更快,但是,通過引人兩種啟發式策略:「按秩合併」和「路徑壓縮」。就可以獲得目前己知的、漸近意義上最快的不相交集合資料結構了。通過同時使用這兩種啟發式策略,可以獲得乙個幾乎與總的運算元m成線性關係的執行時間。

第一種啟發式策略是按秩合併:它與我們用於鍊錶表示中的加權合併啟發式是相似的。其思想是使包含較少結點的樹的根指向包含較多結點的樹的根。我們並不顯式地記錄每個結點為根的子樹的大小,而是對每個結點,用秩表示結點高度的乙個上界。在按秩合井中。具有較小秩的根在

union

操作中要指向具有較大秩的根。

第二種啟發式即路徑壓縮。在

find-set

操作中,利用這種啟發式策略,來使查詢路徑上的每個結點都直接指向根結點。路徑壓縮並不改變結點的秩。如下圖;

為了實現乙個按秩合併啟發式的不相交集合森林,要記錄下秩的變化。對每個結點x,維護乙個屬性x.rank表示x的高度的乙個上界。

當由make-set建立了乙個單元素集合時,對應的樹中唯一結點的初始秩為0。每個find-set操作不改變任何秩。當對兩棵樹應用union時,有兩種情況,具體取決於根是否有相等的秩。當兩個秩不相等時,我們使具有較高秩的根成為具有較低秩的根的父結點。但秩本身保持不變。兩個秩相同時.任選乙個根作為父結點,並增加其秩的值。**如下:

過程find-set

是一種兩越方法,執行完

find-set

操作後,查詢路徑上每個結點都直接指向了根。

演算法導論習題解 第21章用於不相交集合的資料結構

習題編號以第3版為準 解 a 根據第7行和第9行,檢查pair總是在其中乙個節點被加黑的時候進行。對於,會在v1被加黑的時候檢查一次,在v2被加黑的時候檢查一次,對於先加黑的節點而言此時另乙個節點尚未加黑,故第10行只會輸出一次。b 對於節點u,lca u 執行完畢時,以u為根的子樹都在同乙個集合裡...

演算法導論 用於不相交集合的資料結構

一些應用涉及將n個不同元素分成一組不相交的集合,常進行兩種操作 尋找包含制定元素的唯一集合以及合併兩個集合。操作進行以下定於 make set x 建立乙個新的集合,僅含有x union x,y 將包含x和y的兩個集合合併成乙個新的集合,刪除原本的集合 find set x 返回乙個指向包含唯一x的...

演算法導論第21章 不相交集合 鍊錶表示

乙個不相交資料結構維護了乙個不相交動態集的集合s 用乙個代表來標示每個集合,這個代表是集合中的任意乙個元素。支援一下三種操作 1 makeset x 建立乙個新的集合,成員為x,因為各個集合是不相交的,故不出現在任何其他集合中。2 uinon x,y 將包含x和y的兩個集合合併成乙個新的集合,即為這...