吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 1577|回复: 3
收起左侧

[Java 转载] 【笔记】数据结构与算法之并查集(UnionFind)

  [复制链接]
QingYi. 发表于 2020-11-30 20:56

在计算机科学中,并查集是一种树型的数据结构,用于处理一些不交集(Disjoint Sets)的合并及查询问题。有一个联合-查找算法(Union-find Algorithm)定义了两个用于此数据结构的操作:

Find:确定元素属于哪一个子集。它可以被用来确定两个元素是否属于同一子集。
Union:将两个子集合并成同一个集合。
由于支持这两种操作,一个不相交集也常被称为联合-查找数据结构(Union-find Data Structure)或合并-查找集合(Merge-find Set)。

为了更加精确的定义这些方法,需要定义如何表示集合。一种常用的策略是为每个集合选定一个固定的元素,称为代表,以表示整个集合。接着,Find(x)Find(x)Find(x) 返回 xxx 所属集合的代表,而 Union 使用两个集合的代表作为参数。

直接上并查集代码,注释都在代码里面。

public class Main {
    // size and compress
    static class UnionFind{
        // p is parentNode
        int [] p ;
        int [] size;
        public  UnionFind(int n ){
            //空着第一个元素
            p = new int[n+1];
            size = new int[n+1];
            for (int i = 1;i<=n;i++){
                p[i] = i;
                size[i]=1;
            }
        }
        public int getSize(){
            return p.length;
        }
        public int find(int x){
            if(x != p[x])
            {
                int t = find(p[x]); //寻找根结点,找到后回溯
                p[x] = t; //路径压缩
                //上面的部分可以这写成
//                p[x] = find(p[x]);
            }
            return p[x];
        }
        public void union(int x , int y){
            int rootX = find(x);
            int rootY = find(y);
            //如果两个节点的父亲节点是一样的话 就直接return 不处理
            if (rootX==rootY){
                return;
            }
            /**
             * 把size 小的拼接到size大的树上,避免树的深度过高
             */
            if (size[rootX]<size[rootY]) {
                //rootX 的父亲节点就变成了 rootY 也就是挂接到rootY上了
                p[rootX] = rootY;
                //roorY的大小就加等于rootX的大小了
                size[rootY] +=size[rootX];
            }else {
                p[rootY] = rootX;
                size[rootX]+=size[rootY];
            }
        }
    }
}

免费评分

参与人数 1热心值 +1 收起 理由
kingaero + 1 鼓励转贴优秀软件安全工具和文档!

查看全部评分

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

 楼主| QingYi. 发表于 2020-11-30 21:01
@alittlebear 今天不学习 明天变垃圾

免费评分

参与人数 1吾爱币 +1 收起 理由
alittlebear + 1 大佬说得对!

查看全部评分

码上 发表于 2020-11-30 23:20
 楼主| QingYi. 发表于 2020-11-30 23:38
码上 发表于 2020-11-30 23:20
感谢分享,但是更喜欢c++刷题

哈哈哈,上学的时候c++没学好,哎,一大遗憾
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-25 21:21

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表