并查集

2018-03-03 16:00:40

集合运算: 交、并、补、差,判定一个元素是否属于某一集合。

并查集:集合并 、查某元素属于哪个集合。

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

1)可以用树结构表示集合,树的每个结点就是集合中的各个元素。

2)采用数组的形式进行存储

  • 查找操作

  • 集合并操作

 

这里的并操作是不加判断对的将X2所在的集合直接挂到X1上,这种操作很有可能造成X1的深度不断增加,最终导致查找效率的低下。因此可以略作改进,将集合的并操作加上一个限制,就是将规模较小的集合并到规模较大的集合中去。至于如何的到集合的规模信息,可以采用一种非常讨巧的方式,将原来的-1修改为规模的相反数。

 

Polish:

在O(1)时间复杂度完成并查操作。

int find(int[] parent, int i) {
    if (parent[i] != i) {
        parent[i] = find(parent, parent[i]);
    }
    return parent[i];
}
 
void union(int[] parent, int i, int j) {
    int i1 = find(parent, i);
    int j1 = find(parent, j);
 
    if (i1 != j1) parent[j1] = i1;
}

 

转载于:https://www.cnblogs.com/hyserendipity/p/8496965.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值