并查集(Data Structure for Disjoint Sets)
Posted GoldenaArcher
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了并查集(Data Structure for Disjoint Sets)相关的知识,希望对你有一定的参考价值。
并查集(Data Structure for Disjoint Sets)
为算法导论 v4 的 p520-545,p520-531 为算法内容本身,p531-541 为论证,p541-544 是题目,p544-545 则是章节笔记。
Disjoint Sets 的曾用名为 Union Find,二者指的都是一个东西。
这篇笔记主要是 p530-531 部分内容。
算法方面,Disjoint Sets 主要应用是 Minimum Spanning Tree 中的 Kruskal 算法,当然,其应用范围也就包括各种动态连接的问题。直接的应用不算多,但是使用 Disjoint Sets 为核心的拓展不少。
并查集操作
并查集的定义:
-
一个并查集维护一个由 S = S 1 , S 2 , . . . , S n S=\\S_1, S_2, ..., S_n\\ S=S1,S2,...,Sn 集合组成的,动态不相连集
-
每一组集合中选出一个代表用以标识
在一些应用案例中,挑选代表需要花费一些额外的功夫,比如说挑选最大最小值等
每一个元素(set) 都用一个对象 x x x 来表示,并查集中主要有下面三个操作:
-
Make-Set( x x x)
Make-Set 中的 x x x 不能存在于其他任何集合中
-
Union( x x x, y y y)
集合两个不相关的,包括 x x x 与 y y y 的集合。
理论上来说,集合 S x S_x Sx 和 S y S_y Sy 应该会移除两个集合并创建一个新的 S x ⋃ S y S_x \\bigcup S_y Sx⋃Sy,不过实际操作来说,基本会将一个集合并入到另一个集合中。
-
Find-Set( x x x)
返回包含 x x x 元素集合的代表指针。
书中提供了一个集合图的伪代码:
基本上这个就是并查集的基本逻辑。
上面的伪代码是以并查一个图为例,并查集最初表现为: a , b , c , d , e , f , g , h , i , j \\a\\, \\b\\, \\c\\, \\d\\, \\e\\, \\f\\, \\g\\, \\h\\, \\i\\, \\j\\ a,b,c,d,e,f,g,h,i,j 10 个结点,边包括 ( b , d ) , ( e , f ) , ( a , c ) , ( h , i ) , ( a , b ) , ( f , g ) , ( b , c ) (b,d), (e,f), (a,c), (h,i), (a,b), (f,g), (b,c) (b,d),(e,f),(a,c),(h,i),(a,b),(f,g),(b,c)。
第一步先连接 ( b , d ) (b,d) (b,d):
此时的并查集为:
a
,
b
,
d
,
c
,
e
,
f
,
g
,
h
,
i
,
j
\\a\\, \\b, d\\, \\c\\, \\e\\, \\f\\, \\g\\, \\h\\, \\i\\, \\j\\
a,b,d,c,e,f,g,h,i,j。集
b
,
d
\\b, d\\
b,d 中的代表应一致,这样 Find-Set(b)
与 Find-Set(d)
就会返回同样的结果。
第二步连接 ( e , f ) (e,f) (e,f):
此时的并查集为: a , b , d , c , e , f , g , h , i , j \\a\\, \\b, d\\, \\c\\, \\e, f\\, \\g\\, \\h\\, \\i\\, \\j\\ a,b,d,c,e,f,g,h,i,j。同理集 e , f \\e, f\\ e,f 中的代表也应一致。
第二步连接 ( a , c ) (a,c) (a,c):
此时的并查集为:
a
,
c
以上是关于并查集(Data Structure for Disjoint Sets)的主要内容,如果未能解决你的问题,请参考以下文章