数据结构-树(集合)

本文介绍了并查集数据结构的实现与优化方法,包括集合的存储方式、查找与合并运算,以及针对查找性能的优化策略,如按秩归并和路径压缩。通过示例展示了并查集在解决计算机网络连接问题中的应用。
摘要由CSDN通过智能技术生成

并查集

1.并查集问题中集合存储如何实现?

可以用树结构表示集合,每个节点代表一个集合元素

采用数组形式存储 

负数表示根结点;非负数表示双亲结点的下标。

 数组中每个元素的类型描述为:

typedef struct {
    ElementType Data;
    int Parent;//相当于指针,表示这个节点的父节点在集合中的位置
} SetType;

 2 .集合运算

 (1)查找某个元素所在的集合(用根结点表示)

int Find(SetType S[], ElementType X)
{   //在数组S中查找值为X的元素所属的集合
    //Maxsize是全局变量,为数组S的最大长度
    int i;
    for (i=0 ; i < Maxsize && S[i].Data != X; i++);  //当S[i].Data = X时,循环结束,i为X的位置下标
    if(i >= Maxsize)  return -1;  //未找到X,返回-1 则i为根节点的下标
    for (; S[i].Parent >= 0; i = S[i].Parent);  //如果i < Maxsize,寻找父结点,直到S[i].Parent < 0为止(根结点的Parent为-1)
    return i;  //找到X所属集合,返回树根结点在数组S中的下标
}

(2)集合的并运算
①分别找到X1和X2两个元素所在集合树的根结点;
② 如果它们不同根,则将其中一个根结点的父结点指针设置成另一个根结点的数组下标。

void Union(SetType S[ ], ElementType X1, ElementType X2)
{
    int Root1, Root2;
    Root1 = Find(S, X1);
    Root2 = ind(S, X2);
    if (Root1 != Root2)  //当x1和x2不属于同一子集时,才需要合并
       S[Root2].Parent = Root1;  
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值