并查集(不相交集合数据结构)
2010-08-11 18:50
435 查看
并查集(union-find sets)也称不相交集合数据结构(disjoint-set data structure),它保持一组不相交的动态集合S = { S1,S2,…Sk }.每个集合通过一个代表来识别,该代表是集合中的某个成员.并查集能够实现较快地合并集合和判断元素所在集合的操作.
通过引用两种启发式策略(按秩合并和路径压缩)就可以达到渐进意义上最快的不相交集合数据结构.
它的三种操作如下所示:
1.make_set(x)建立一个新的集合,其中集合只有唯一的一个元素x
2.union_set(x,y) 按秩合并x,y所在的集合
3.find_set(x)返回x所在的集合的代表
用有根数表示集合实现并查集:
参考资料:
1.《算法导论》
2.http://kb.cnblogs.com/a/1620043/
通过引用两种启发式策略(按秩合并和路径压缩)就可以达到渐进意义上最快的不相交集合数据结构.
它的三种操作如下所示:
1.make_set(x)建立一个新的集合,其中集合只有唯一的一个元素x
2.union_set(x,y) 按秩合并x,y所在的集合
3.find_set(x)返回x所在的集合的代表
用有根数表示集合实现并查集:
#include <stdio.h> const int MAXN = 100; /*结点数目上线*/ int pa[MAXN]; /*p[x]表示x的父节点*/ int rank[MAXN]; /*rank[x]是x的秩:x的高度的一个上界*/ void make_set(int x) {/*创建一个单元集*/ pa[x] = x; rank[x] = 0; } int find_set(int x) {/*带路径压缩的查找*/ if(x != pa[x]) pa[x] = find_set(p[x]); return pa[x]; } /*按秩合并x,y所在的集合*/ void union_set(int x, int y) { x = find_set(x); y = find_set(y); if(rank[x] > rank[y])/*让rank比较高的作为父结点*/ pa[y] = x; else { pa[x] = y; if(rank[x] == rank[y]) rank[y]++; } }
参考资料:
1.《算法导论》
2.http://kb.cnblogs.com/a/1620043/
相关文章推荐
- 用于不相交集合的数据结构(算法导论第21章-并查集)
- 用于不相交集合的数据结构(并查集)
- 并查集(用于不相交集合的数据结构)
- 并查集——用于不相交集合的数据结构
- 算法起步之并查集(不相交集合数据结构)
- 【算法与数据结构】不相交集合——并查集
- [算法导论读书笔记]用于不相交集合的数据结构(并查集)
- 不相交集合的数据结构-并查集
- 不相交集合 - 并查集
- ccsu1359 木棒相交 (叉积线段判交,并查集判断是否属于同一个集合)
- 并查集(不相交集合)
- 用于不相交集合的数据结构——查并集
- 并查集(不相交集合)基础知识详解
- [算法系列之二十八]并查集(不相交集合)
- 并查集及其链表与不相交集合森林实现
- 并查集(不相交集合)
- 用于不相交集合的数据结构——查并集
- 不相交集合-并查集
- 用于不相交集合的数据操作——并查集
- 数据结构_不相交集合_绘制迷宫