在文章《union-find 操作檢測無向圖有無環演算法》中介紹了 union-find 演算法的乙個簡單實現,使用一維陣列來處理不相交集合資料結構(disjoint-set data structure)。
union-find 演算法為該資料結構提供了兩種非常有用的操作:
1上述演算法的實現的執行時間是o(n)。private
int find(int parent, inti)2
78private
void union(int parent, int x, inty)9
另一種實現方式是使用有根樹來表示集合,樹中的每個節點都包含集合的乙個成員,每棵樹表示乙個集合,形成不相交集合森林(disjoint-set forest)。每棵樹的根包含了集合的代表,並且是它自己的父節點。
如上圖中,(a) 中兩棵樹表示兩個集合 和 ,其中 c 和 f 是代表。(b) 為 union(e, g) 的結果。
實際上,上面這種樹的表示法不會比採用鍊錶表示的演算法更快。但是,通過引入兩種啟發式策略,可以獲得目前已知的、漸進意義上最快的不想交集合資料結構。
如上圖中,(a) 為執行 find 操作之前的表示集合的樹;(b) 為執行 find(a) 操作後的樹,查詢路徑上的每個節點都直接指向了根。
通過兩種啟發式策略對執行時間的改進,新的演算法的執行時間為o(logn)。
1using
system;
2using
system.collections.generic;
3using
system.linq;45
namespace
graphalgorithmtesting6"
, g.vertexcount);
25 console.writeline("
graph edge count :
", g.edgecount);
26console.writeline();
2728 console.writeline("
is there cycle in graph:
", g.hascycle());
2930
console.readkey();31}
3233
class
edge
3441
42public
int begin
43public
int end
44public
int weight
4546
public
override
string
tostring()
47], end, weight",
50begin, end, weight);51}
52}5354
class
subset
5557
public
int rank 58}
5960
class
graph
6169
70public
int vertexcount
7172
public ienumerable vertices }
7374
public ienumerableedges
7577}78
79public
int edgecount }
8081
public
void addedge(int begin, int end, int
weight)
8288
89 _adjacentedges[begin].add(new
edge(begin, end, weight));90}
9192
private
int find(subset subsets, int
i)93
100101
private
void union(subset subsets, int x, int
y)102
120}
121122
public
bool
hascycle()
123131
132//
iterate through all edges of graph, find subset of both
133//
vertices of every edge, if both subsets are same,
134//
then there is cycle in graph.
135foreach (var edge in
this
.edges)
136144
145union(subsets, x, y);
146}
147148
return
false
;149
}150
}151
}152 }
演算法之不相交集合森林
package com.eshore.sweetop.exdataframe public class disjointsetforest public void link disjointsetnode nodex,disjointsetnode nodey else public void un...
不相交集合的學習筆記
1 乙個元素a屬於s的等價類是s的乙個子集,它包含所有與a有 等價 關係的元素。2 不相交集 n個集合的類,每個集合含有乙個元素,所有集合間的關係均為false 除自反關係外 每個集合都有乙個不同的元素,從而得到si sj 為不相交集。3 不相交集的兩種操作 1 find 返回包含給定元素的集合的名...
用於不相交集合的資料結構
make set x 建立乙個集合,它的唯一成員 因而為代表 是x。因為各個集合是不相交的,所以x不會出現在別的某個集合中 union x,y 將包含x和y的兩個集合合併。假定操作之前著兩個集合是不相交的。find set x 返回乙個指標,這個指標指向包含x的 唯一 集合的代表。按秩合併 秩表示該...