用 Java 实现并查集(支持路径压缩与按秩合并)

并查集(Union-Find)是一种用于处理不相交集合(disjoint sets)合并及查询问题的数据结构。它支持两种操作: find(查找)用于确定元素所属的集合, union(合并)用于合并两个集合。为了优化性能,通常会使用路径压缩(Path Compression)和按秩合并(Union by Rank)两种技术。

下面是一个用 Java 实现的并查集,支持路径压缩和按秩合并:

javaCopy Codepublic class UnionFind {    private int[] parent; // 存储每个节点的父节点
    private int[] rank;   // 存储每个节点的秩(用于按秩合并)
    // 初始化并查集,n 是元素的数量
    public UnionFind(int n) {
        parent = new int[n];
        rank = new int[n];        for (int i = 0; i < n; i++) {
            parent[i] = i; // 每个节点的初始父节点是自己
            rank[i] = 1;   // 每个节点的初始秩为1
        }
    }    // 查找操作,带路径压缩
    public int find(int x) {        if (parent[x] != x) {
            parent[x] = find(parent[x]); // 递归路径压缩
        }        return parent[x];
    }    // 合并操作,按秩合并
    public boolean union(int x, int y) {        int rootX = find(x);        int rootY = find(y);        if (rootX == rootY) {            return false; // x 和 y 已经在同一个集合中
        }        // 按秩合并
        if (rank[rootX] > rank[rootY]) {
            parent[rootY] = rootX;
        } else if (rank[rootX] < rank[rootY]) {
            parent[rootX] = rootY;
        } else {
            parent[rootY] = rootX;
            rank[rootX]++; // 如果秩相同,合并后根节点的秩加1
        }        return true;
    }    // 检查两个元素是否属于同一个集合
    public boolean connected(int x, int y) {        return find(x) == find(y);
    }    public static void main(String[] args) {        UnionFind uf = new UnionFind(10);
        uf.union(1, 2);
        uf.union(3, 4);
        uf.union(2, 4);
        System.out.println(uf.connected(1, 4)); // 输出 true,因为 1, 2, 3, 4 在同一个集合中
        System.out.println(uf.connected(1, 5)); // 输出 false,因为 5 不在同一个集合中
    }
}

代码说明

  1. 初始化‌:

    • parent 数组用于存储每个节点的父节点,初始时每个节点的父节点是它自己。
    • rank 数组用于存储每个节点的秩,初始时每个节点的秩为 1。
  2. 查找操作( find‌:

    • 使用路径压缩技术,使得在查找过程中将访问路径上的每个节点直接指向根节点,从而加速后续查找操作。
  3. 合并操作( union‌:

    • 使用按秩合并技术,将秩较小的树合并到秩较大的树上,以减少树的高度。
    • 如果两棵树的秩相同,则任意选择一棵作为根,并将其秩加 1。
  4. 连接性检查( connected‌:

    • 检查两个元素是否属于同一个集合,只需比较它们的根节点是否相同。

这种实现方式使得并查集的操作接近于常数时间复杂度,非常适合处理大规模的不相交集合问题。


http://www.zgjzs.org

http://www.shangpin.org

http://www.snjrw.org

http://wangluo.zgjzs.org

http://zhineng.zgjzs.org

http://gaosu.zgjzs.org

http://anquan.zgjzs.org

http://wangzhan.zgjzs.org

http://jiaoyu.zgjzs.org

http://guanggao.zgjzs.org

http://shuju.zgjzs.org

http://zhifu.zgjzs.org

http://yingyong.zgjzs.org

http://yonghu.zgjzs.org

http://houtai.zgjzs.org

http://fenxi.zgjzs.org

http://jiekou.zgjzs.org

http://fenxiang.zgjzs.org

http://neirong.zgjzs.org

http://zhuce.zgjzs.org

http://tongji.zgjzs.org

http://ditu.zgjzs.org

http://tuisong.zgjzs.org

http://gouwu.zgjzs.org

http://tuiguang.zgjzs.org

http://shejiao.zgjzs.org

http://zhongguo.zgjzs.org

http://wangguan.zgjzs.org

http://yule.zgjzs.org

http://pingtai.zgjzs.org

http://jichu.zgjzs.org

http://wangjie.zgjzs.org

http://zhishi.zgjzs.org

http://shangcheng.zgjzs.org

http://dianzi.zgjzs.org

http://yinyue.zgjzs.org

http://tupian.zgjzs.org

http://shipin.zgjzs.org

http://wuliu.zgjzs.org

http://gongju.zgjzs.org

http://anquan.zgjzs.org

http://sousuo.zgjzs.org

http://mima.zgjzs.org

http://jiankong.zgjzs.org

http://ceshi.zgjzs.org

http://wangyou.zgjzs.org

http://zixun.zgjzs.org

http://chajian.zgjzs.org

http://kuaidi.zgjzs.org

http://liuliang.zgjzs.org

http://zhengce.zgjzs.org

http://peizhi.zgjzs.org

http://baocun.zgjzs.org

http://yonghu.shangpin.org

http://houtai.shangpin.org

http://pingtai.shangpin.org

http://wangzhan.shangpin.org

http://zhifu.shangpin.org

http://guanggao.shangpin.org

http://yinyue.shangpin.org

http://zixun.shangpin.org

http://shejiao.shangpin.org

http://tuisong.shangpin.org

http://wangguan.shangpin.org

http://zhineng.shangpin.org

http://wangluo.shangpin.org

http://anquan.shangpin.org

http://zhongguo.shangpin.org

http://shuju.shangpin.org

http://jiekou.shangpin.org

http://zhishi.shangpin.org

http://gongneng.shangpin.org

http://tongji.shangpin.org

http://shipin.shangpin.org

http://jiaoyu.shangpin.org

http://ditu.shangpin.org

http://dianzi.shangpin.org

http://mima.shangpin.org

http://liuliang.shangpin.org

http://gouwu.shangpin.org

http://zhengce.shangpin.org

http://yule.shangpin.org

http://baocun.shangpin.org

http://jichu.shangpin.org

http://fenxi.shangpin.org

http://fenxiang.shangpin.org

http://shangcheng.shangpin.org

http://kuaidi.shangpin.org

http://peizhi.shangpin.org

http://wuliu.shangpin.org

http://ceshi.shangpin.org

http://tupian.shangpin.org

http://wangyou.shangpin.org

http://chajian.shangpin.org

http://tuiguang.shangpin.org

http://yingyong.shangpin.org

http://zhuce.shangpin.org

http://sousuo.shangpin.org

http://jiankong.shangpin.org

http://neirong.shangpin.org

http://gongju.shangpin.org

http://zonghe.shangpin.org

http://zhifu.snjrw.org

http://houtai.snjrw.org

http://yule.snjrw.org

http://wangluo.snjrw.org

http://guanggao.snjrw.org

http://shuju.snjrw.org

http://pingtai.snjrw.org

http://ditu.snjrw.org

http://wangzhan.snjrw.org

http://shejiao.snjrw.org

http://jiekou.snjrw.org

http://zhishi.snjrw.org

http://zhineng.snjrw.org

http://jiaoyu.snjrw.org

http://zhongguo.snjrw.org

http://yinyue.snjrw.org

http://yonghu.snjrw.org

http://tuiguang.snjrw.org

http://gouwu.snjrw.org

http://baocun.snjrw.org

http://fenxiang.snjrw.org

http://fenxi.snjrw.org

http://gongneng.snjrw.org

http://wangguan.snjrw.org

http://zixun.snjrw.org

http://dianzi.snjrw.org

http://tupian.snjrw.org

http://wangyou.snjrw.org

http://chajian.snjrw.org

http://wuliu.snjrw.org

http://mima.snjrw.org

http://liuliang.snjrw.org

http://zhuce.snjrw.org

http://zhengce.snjrw.org

http://peizhi.snjrw.org

http://shipin.snjrw.org

http://jichu.snjrw.org

http://tongji.snjrw.org

http://kuaidi.snjrw.org

http://yingyong.snjrw.org

http://sousuo.snjrw.org

http://jiankong.snjrw.org

http://neirong.snjrw.org

http://gongju.snjrw.org

http://tuisong.snjrw.org

http://shangcheng.snjrw.org

http://anli.snjrw.org

http://dianhua.snjrw.org

http://fuwu.snjrw.org

请使用浏览器的分享功能分享到微信等