并查集(union-find set)

并查集:

并查集(union-find set)是一种维护各个不相交集合之间的关系的数据

结构,可以用于维护图的连通分量或是变量之间的关系。

通常用森林表示法实现并查集,即为每个元素,维护一个F[i]表示它的父节点,初始时每个结点自成一棵树,每棵树中的元素表示当前集合中的元素。


操作:

(1)union(x,y):即将x所在树的根节点与y所在树的根节点合并,合并两个集合。

(2)find(x):查找x所在树的根节点。


优化:

(1)路径压缩:由于原始重复查找会浪费大量不必要时间,我们在查找

结点x时,将它的所有祖先结点的父节点全部指向根节点,这样对这些结

点就做到了O(1)查找。

(2)启发式合并:合并两棵树时,为了让新树深度减小,应该把矮的树

的根节点指向高的根节点。

基于rank的合并方法:

对于每个结点,维护一个rank,初始为0。当两棵rank相等的树合并时,随意合并,将根节点不变的那棵rank+1,否则将rank小的接到rank大的上去


带权并查集:

通常维护结点的父节点是不够的,有时候题目会给出一些额外条件让我们维护。

我们可以给每个结点额外维护一个权值(到根节点的距离,与根节点的关系云云之类)

在查找时父节点顺带维护(通常是在已经查找完父节点后再维护)

posted @ 2016-05-27 21:59  Krew  阅读(257)  评论(0)    收藏  举报