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

并查集(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/

posted @ 2010-08-11 18:50  MikeLin  阅读(1388)  评论(0)    收藏  举报