并查集 ——(快速判断两个元素是否在同一个集合中)

五、并查集

0、并查集概念

并查集(Union-Find)是一种用于维护元素分组信息的数据结构。它支持以下两种基本操作:

  1. 合并(Union):将两个不同的集合合并为一个集合。
  2. 查找(Find):确定某个元素属于哪个集合。

并查集通常用于解决涉及集合合并和查询的问题,例如:

  • 连通性问题:判断两个元素是否在同一个连通分量中。
  • 图的连通性问题:判断一个无向图是否连通。
  • 基于并查集的最小生成树算法,如Kruskal算法。

并查集的实现主要有两种:
1、基于数组的并查集:使用一个数组来表示集合,数组中的每个元素代表该元素所属的集合的代表元素。
2、基于树的并查集:使用树结构来表示集合,每个集合用一棵树表示,树的根节点就是该集合的代表元素。

image.png

1、模拟实现并查集

import java.util.Arrays;

public class UnionFindSet {
   
    public int[] elem;

    public UnionFindSet(int n) {
   
        this.elem = new int[n];
        Arrays.fill(elem,-1);
    }

    /**
     * 查找数据x 的根节点
     * @param x
     * @return 下标
     */
    public int findRoot(int x) {
   
        if(x < 0) {
   
            throw new IndexOutOfBoundsException("下标不合法,是负数");
        }
        while (elem[x] >= 0 ) {
   
            x = elem[x];//1  0
        }
        return x;
    }

    /**
     * 查询x1 和 x2 是不是同一个集合
     * @param x1
     * @param x2
     * @return
     */
    public boolean isSameUnionFindSet(int x1,int x2) {
   
        int index1 = findRoot(x1);
        int index2 = findRoot(x2);
        if(index1 == index2) {
   
            return true;
        }
        return false;
    }

    /**
     * 这是合并操作
     * @param x1
     * @param x2
     */
    public void union(int x1,int x2) {
   
        int index1 = findRoot(x1);
        int index2 = findRoot(x2);
        if(index1 == index2) {
   
            retu
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值