并查集
1。并查集的基本操作
设想需要对不相交集合进行两种操作:(1)检索某元素属于哪个集合;(2)合并两个集合。我们最常用的数据结构是并查集的森林实现。
在一个不相交集合森林中,每个成员仅指向它的父结点。每棵树的根包含集合的代表,并且是自己的父结点。
三种不相交集合的操作:
makeSet:简单的创建一棵只有一个结点的树。
findSet:通过沿着指向父结点的指针找到根。这一通向根结点的简单路径上所访问的结点构成了查找路径。
Union:使得一棵树的根指向另外一棵树的根。
2.改进运行时间的启发式策略。
(1)按秩合并(union by rank)。使得具有较少结点的树的根指向具有较多结点的树的根。
(2)路径压缩(path compression)。可以使查找路径中的每个结点直接指向根。路径压缩不改变任何结点的秩。
3.实现不相交集合森林的伪代码
设想需要对不相交集合进行两种操作:(1)检索某元素属于哪个集合;(2)合并两个集合。我们最常用的数据结构是并查集的森林实现。
在一个不相交集合森林中,每个成员仅指向它的父结点。每棵树的根包含集合的代表,并且是自己的父结点。
三种不相交集合的操作:
makeSet:简单的创建一棵只有一个结点的树。
findSet:通过沿着指向父结点的指针找到根。这一通向根结点的简单路径上所访问的结点构成了查找路径。
Union:使得一棵树的根指向另外一棵树的根。
2.改进运行时间的启发式策略。
(1)按秩合并(union by rank)。使得具有较少结点的树的根指向具有较多结点的树的根。
(2)路径压缩(path compression)。可以使查找路径中的每个结点直接指向根。路径压缩不改变任何结点的秩。
3.实现不相交集合森林的伪代码
Make-Set(x)
x.p = x;
x.rank = 0;
Union(x, y)
Link(Find-Set(x), Find-Set(y))
Link(x, y)
if x.rank > y.rank
y.p = x
else x.p = y
if x.rank == y.rank
y.rank++
//Find-Set过程是一种两趟方法(two-pass method):当它递归时,第一趟沿着查找路径向上直到根。
//当递归回溯时,第二趟沿着搜索树向下更新每个结点,使其直接指向根。
Find-Set(x)
if x != x.p
x.p = Find-Set(x.p)
return x.p