并查集及Java实现

概述:
并查集(UnionFindSet)是一种树形数据结构,用于处理一些不相交集合(Disjoint Sets)的合并及查询问题,在使用中常常以森林来表示。
常见的操作有合并两个集合、查找某元素属于哪个集合、判断两个元素是否属于同一个集合。

基本操作:
初始化(makeSet):把每一个元素初始化为一个集合,即将每个元素的父结点初始化为自己

public void makeSet() {
        for (int i = 0; i < this.n; i++) {
            this.parent[i] = i;
            this.rank[i] = 0;
        }
    }

查找(findSet):查找一个元素所在的集合。在执行查找操作时,要沿着父结点指针一直找下去,直到找到树根为止

public int findSet(int x) {
        if (x == parent[x]) {
            return parent[x];
        }
        return parent[x] = findSet(parent[x]);
    }

合并两个集合(unionSet):将一个集合的祖先作为另一个集合的祖先。
两种优化策略,

  1. 按秩合并,合并的时候将集合的祖先的高度(秩)低的合并到集合的祖先的高度(秩)高的中,这样合并之后树的高度会相对较小

在这里插入图片描述

  1. 路径压缩,当经过“递推”找到祖先结点后,“回溯”的时候顺便将它的子孙结点都直接指向祖先
    在这里插入图片描述

完整代码如下,

public class UnionFindSet {

    private int n;
    private int[] parent;
    private int[] rank;

    public UnionFindSet(int n) {
        this.n = n;
        this.parent = new int[n];
        this.rank = new int[n];
    }

    public void makeSet() {
        for (int i = 0; i < this.n; i++) {
            this.parent[i] = i;
            this.rank[i] = 0;
        }
    }

    public int findSet(int x) {
        if (x == parent[x]) {
            return parent[x];
        }
        return parent[x] = findSet(parent[x]);
    }

    public void unionSet(int x, int y) {
        x = findSet(x);
        y = findSet(y);
        if (x == y) {
            return;
        }
        if (rank[x] > rank[y]) {
            parent[y] = x;
        } else {
            parent[x] = y;
            if (rank[x] == rank[y]) {
                rank[y]++;
            }
        }
    }

}
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

b17a

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值