一些應用涉及將n個不同元素分成一組不相交的集合,常進行兩種操作:尋找包含制定元素的唯一集合以及合併兩個集合。操作進行以下定於:
make-set(x)建立乙個新的集合,僅含有x
union(x,y)將包含x和y的兩個集合合併成乙個新的集合,刪除原本的集合
find-set(x)返回乙個指向包含唯一x的集合的指標
無向圖的連通分量就是乙個例子。
對於如圖所示的4個連通分量,先對每乙個單獨的點建立乙個單獨的集合,然後依次根據每條邊合併對應的集合,最後形成4個不相交的集合
(a)所示的結構通過不相交集合各自形成乙個鍊錶,索引頭部包含鍊錶的頭部和尾部,鍊錶各個結點包含指向索引頭部和下個結點兩個指標。對於這種結構,make-set(x)和find-set(x)都可以在o(1)的時間完成。
(b)展示了union(x,y)的操作,需要將另乙個鍊錶連線到乙個鍊錶的末尾,然後修改索引結點的尾部,同時被合併的鍊錶每個結點指向的索引頭部都要修改,所以該操作至少要花費o(y)的時間
為了減少合併的時間,可以在頭部額外儲存每個鍊錶的大小,這樣可以將小的集合合併到大的集合中去。
使用有根樹來表示集合,書中每個節點包含乙個成員,一棵樹代表乙個集合,每個成員都指向他的父結點,根結點的父結點指向自己。
(b)是合併操作,將c的父親改為f即可。這種不相交集合森林的結構make-set和union的效率很高,但find-set收到樹高度的影響,效率較低。因此,有兩種改進的啟發式演算法。
第一種是按秩合併,對於每個結點記錄他的高度,將秩較小的結點的父親改為大的那個。若兩邊相等,則任選乙個作為父親,根結點的秩加一。
第二種是路徑壓縮,每次呼叫find-set的時候,將查詢路徑上的結點的父親直接改為根結點。
演算法導論筆記 21用於不相交集合的資料結構
在某些應用中,要將 n個不同的元素分成一組不相交的集合。不相交集合上有兩個重要操作,即找出給定的元素所屬的集合和合併兩個集合。一 不相交集合的操作 不相交集合教據結構維護一組不相交的動態集合的集合s 每個集合通過乙個代表來識別,代表是集合中的某個成員,在某些應用中,哪乙個成員被選作代表是無所謂的,但...
用於不相交集合的資料結構
make set x 建立乙個集合,它的唯一成員 因而為代表 是x。因為各個集合是不相交的,所以x不會出現在別的某個集合中 union x,y 將包含x和y的兩個集合合併。假定操作之前著兩個集合是不相交的。find set x 返回乙個指標,這個指標指向包含x的 唯一 集合的代表。按秩合併 秩表示該...
演算法導論習題解 第21章用於不相交集合的資料結構
習題編號以第3版為準 解 a 根據第7行和第9行,檢查pair總是在其中乙個節點被加黑的時候進行。對於,會在v1被加黑的時候檢查一次,在v2被加黑的時候檢查一次,對於先加黑的節點而言此時另乙個節點尚未加黑,故第10行只會輸出一次。b 對於節點u,lca u 執行完畢時,以u為根的子樹都在同乙個集合裡...