第21章 用于不相交集合的数据结构
21.1 不相交集合的操作
用一个对象表示一个集合的每个元素,设x表示一个对象,希望支持以下三个操作:
- MAKE-SET(x):建立一个新的集合,它的唯一成员(因而为代表)是x。因为各个集合是不相交的,故x不会出现在别的某个集合中。
- UNION(x,y):将包含x和y的两个动态集合(表示为 Sx,Sy )合并成一个新的集合,即这两个集合的并集。
- FIND-SET(x):返回一个指针,这个指针指向包含x的(唯一)集合的代表。
不相交集合数据结构的许多应用之一是确定无向图的连通分量。下面伪代码中,图G的顶点集用G.V表示,边集用G.E表示
CONNECTED-COMPONENTS(G){
for each vextex v in G.V
MAKE-SET(v)
for each edge(u,v) in G.E
if FIND-SET(u) != FIND-SET(v)
UNION(u,v)
}
SAME-COMPONENT(u,v){
if FIND-SET(u) == FIND-SET(v)
return TRUE
else
return FALSE
}
21.2 不相交集合的链表表示
每个集合用一个自己的链表来表示。每个集合的对象包含head属性和tail属性,head属性指向表的第一个对象,tail属性指向表的最后一个对象。链表中的每个对象都包括一个集合成员、一个指向链表中下一个对象的指针和一个指回到集合对象的指针。
21.3 不相交集合森林
MAKE-SET(v){
x.p = x
x.rank = 0
}
UNION(u,v){
LINK(FIND-SET(u),== FIND-SET(v))
}
LINK(x,y){
if x.rank > y.rank
y.p = x
else
x.p = y
if x.rank == y.rank
y.rank++
}
FIND-SET(x){
if x != x.p
x.p = FIND-SET(x.p)
return x.p
}