您的位置:首页 > 理论基础 > 数据结构算法

并查集(不相交集合数据结构)

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所在的集合的代表

用有根数表示集合实现并查集:

#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/
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: