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

本文介绍了并查集(Union-Find Sets)的基本概念及其在程序设计中的应用。并查集是一种用于处理一些不相交集合合并及查询问题的数据结构,文中详细讲解了其核心操作:make_set、union_set 和 find_set,并提供了具体的实现代码。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

转载于:https://www.cnblogs.com/mikelin/archive/2010/08/11/1797556.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值