不相交集合森林的啟發式策略

2021-09-22 10:37:46 字數 2823 閱讀 6368

在文章《union-find 操作檢測無向圖有無環演算法》中介紹了 union-find 演算法的乙個簡單實現,使用一維陣列來處理不相交集合資料結構(disjoint-set data structure)

union-find 演算法為該資料結構提供了兩種非常有用的操作:

1

private

int find(int parent, inti)2

78private

void union(int parent, int x, inty)9

上述演算法的實現的執行時間是o(n)

另一種實現方式是使用有根樹來表示集合,樹中的每個節點都包含集合的乙個成員,每棵樹表示乙個集合,形成不相交集合森林(disjoint-set forest)。每棵樹的根包含了集合的代表,並且是它自己的父節點。

如上圖中,(a) 中兩棵樹表示兩個集合 和 ,其中 c 和 f 是代表。(b) 為 union(e, g) 的結果。

實際上,上面這種樹的表示法不會比採用鍊錶表示的演算法更快。但是,通過引入兩種啟發式策略,可以獲得目前已知的、漸進意義上最快的不想交集合資料結構。

如上圖中,(a) 為執行 find 操作之前的表示集合的樹;(b) 為執行 find(a) 操作後的樹,查詢路徑上的每個節點都直接指向了根。

通過兩種啟發式策略對執行時間的改進,新的演算法的執行時間為o(logn)

1

using

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的 唯一 集合的代表。按秩合併 秩表示該...