数据结构之并查集

本文详细介绍了一种高效的数据结构——并查集(Union-Find Sets),包括其基本概念、实现方式及核心操作。并查集利用有根树表示集合,通过按秩合并和路径压缩策略优化性能。

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

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

 

static int MAXN = 100; /*结点数目上线*/

int pa[MAXN];    /*p[x]表示x的父节点*/

int rank[MAXN];    /*rank[x]是x的秩:x的高度的一个上界*/  

 

public void make_set(int x)   {  /*创建一个单元集*/     

        pa[x] = x;     

        rank[x] = 0;

 } 

 

public 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]++;     

     }

}






 

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值