并查集算法总结

2023-05-16

1、并查集定义

并查集是一种数据结构,常用来描述集合。 在一些应用的问题中,需将n个不同的元素划分成一组不相交的集合。开始时,每个元素自成一格单元素集合,然后按一定顺序将属于同一组的元素的集合合并。其间要反复用到查询某个元素属于哪个集合的运算。适合于描述这类问题的抽象数据类型称为并查集。

2、并查集可以解决的常规问题

(1)某个元素是否属于某个集合;

(2)某两个节点是否属于同一个集合(亲戚关系判断)

(3)判断图是否有环问题

3、并查集的分类

(1)Union-find 简单并查集

(2)Quick-union 优化的并查集

(3)加权值 quick-union(处理了方法2最坏的情况)

(4)路径压缩加权值quick-union

4、常见问题描述和并查集关键函数

常见的问题是给一堆节点之间的连接关系,要我们来判断这些节点可以划分为几个集合,或者给一堆图的节点与边的关系,问我们这个图是否有环等问题。

为了解决类如上述问题,我们采用并查集需要定义两个关键函数:

(1)find(x) :找出元素x所有集合(帮派)的老大;

(2)union(x,y):将元素x和元素y所在的两个集合合并为一个新的集合(小帮派合并为大帮派)

5、并查集的实现

5.1、并查集构建的思想

用比较通俗易懂的话来说,并查集就是一个建立帮派的过程,

1)刚开始,每一个元素各成一派,

2)然后根据给点条件的约束,存在约束的两个节点(只要存在约束,那么这两个点就要划分到同一个集合),若此时这连个节点分属于不同的集合,那么先找到各自帮派的老大,

3)然后 其中一个帮派的老大 认另一个帮派的老大 做大哥,那么这两个帮派就合并了,也就满足了有约束关系的两个节点应该划分到同一个集合(帮派),

4)以此类推,直到遍历完所有给定的约束,那么此时的帮派建立也就结束了。

5)最后,我们就可以统计总的有多少个帮派,派生问题还有判断图是不是有环、每个帮派有多少人头等子问题。

5.2、构建并查集中需考虑的几个点

1)在构建过程中,我们需要记录每个节点的老大是谁,所以涉及到初始化的问题,我们构建一个parent【i】数组,数组中存储的值表示元素 i 的老大(父亲),刚开始的时候,因为每个元素各自为王,所以初始化parent【i】= -1;

2)随着构建给定的节点约束关系,不断合并集合,每一个节点的parent【i】可能被更新为其他节点,所以当并查集构建结束后,我们统计parent数组中,还有几个“-1”,那么就说明还剩下几个超级老大,对应几个帮派集合(因为刚开始 每个"-1"对应一个集合帮派,并查集构建结束,parent【i】不是“-1”的说明被合并了,,剩下"-1"的个数就是 合并后还有几个集合帮派。)

3)判断派生问题,图是否存在环,假如当前两个节点存在边连接,根据并查集的定义,我们需要把这两个节点划分到同一个集合,所以我们先别分找这两个节点所属的各自帮派老大   [find(x)函函数功能]   如果找到这两个节点的帮派老大是同一个人,说明这两个节点本身就属于同一个集合了,两个节点可以相互联通,,,现在两节点又存在一条边直接连接,,那不就构成 环 了。

5.3、具体代码实现

如上文所述,核心的两个函数,一个是找当前节点所述帮派老大find_root(x);

一个核心函数是 合并两个集合帮派  union(int x,int y)

 public static class MyUnion {
        private int[] parent; //记录每一个节点的父节点
        private final int[] sum;//记录每一个集合(帮派)的成员数目,初始化的时候因为每个节点自成一派,所以初始每个帮派数目都是1
        public int size;//记录总的有多少个集合(帮派)
        
        //初始化
        //刚开始,假设每个数据是一个分组,然后根据遍历关系,不断修改不同数据之间的连接
        //parent[i]  表示元素i的根节点(父亲)为parent[i]
        //当遍历完所有的关系后,我们统计 parent数组中还有几个-1,那就说明这些关系有几个分组
        //假设当前关系约束的两个节点,我们要先找到两个节点的根节点,判断根节点是否相同
        //说明两个节点属于同一个集合 并且已经成环
        //若两个节点的根节点不同,然后把一个集合的帮派合并到另一个集合中
        // 1、初始化,每个节点各成一派,根节点否设置为-1
        public MyUnion(int length){
            this.parent = new int[length];
            this.size = length;
            this.sum = new int[length];
            for(int i=0;i<length;i++){
                parent[i]=-1;
                sum[i]=1;
            }
        }

        //2、 找某个节点的所属集合(帮派)的老大
        public int find_root(int i){
            if(parent[i]==-1){
                //说明自己根节点为-1,自己就是帮派老大
                return i;
            }else {
                //比如当前节点i的老大存的是2,那么我们在递归去找2的老大,如果此时2的老大是 -1,说明i
                //所述的帮派 老大就是 节点2了
                return find_root(parent[i]);//递归调用,只有parent[i]==-1,此时的i才是某个集合帮派的老大
            }
        }

        //3、合并 两个帮派(集合)
        public void union_fun(int i,int j){
            //先找到各自节点的帮派老大
            int root_i = find_root(i);
            int root_j =find_root(j);
            if(root_i !=root_j){
                //两个帮派老大不一样的时候才需要合并
                parent[root_i]=root_j; //这里相当于i所在的帮派合并到j的帮派
                sum[root_j] +=sum[root_i];//那么 i帮派人数都要算到j的帮派中去
                size--;//每合并了两个帮派,总的帮派数目减少1
            }



        }
        // 4、查询某两个节点 是否属于同一个集合(帮派)
        //即验证这两个节点的 老大(根)是否相同,相同就说明是一个帮派
        // 如果两个节点有连接,,此时又发现两个节点处于同一个集合(都是同一个老大),那么对应图 必然成环
        public boolean isconnected(int i,int j){
            int root_i = find_root(i);
            int root_j =find_root(j);
            return root_i == root_j;  //true  or false
        }
    }

优秀博客

Java实现并查集_TheSevenSky的博客-CSDN博客_java并查集

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

并查集算法总结 的相关文章

  • 年薪30w+,为啥大数据工程师才是真正的高富帅?

    前言 大家有没有过这样的经历 xff1a 朋友圈推送的广告越来越频繁 xff0c 恰恰还是前几天想买的 xff1f 在某宝搜了款键盘 xff0c 结果往后很多天一直精准推送键盘 xff0c 还一个比一个贵 刷视频手滑点赞美食视频 xff0c
  • 这才是最适合新手的python基础教程,640页超详细

    前言 python入门虽然简单 xff0c 很多新手依然卡在基础安装阶段 xff0c 大部分教程对一些基础内容都是一带而过 xff0c 好多新手朋友 xff0c 对一些基础知识常常一知半解 xff0c 需要在网上查询很久 扎实的基础知识 x
  • python数据预测——学习数据分析需要多少python基础?

    前言 工欲善其事 必先利其器 xff0c 搭建Python环境 学习Python语言 理解数据分析工作是入行Python数据分析最基本的三要素 但是还要有个最重要的前提是经验和思维 这个过程就好比做日料 xff0c 首先要有厨具 xff0c
  • python副业介绍以及渠道推荐,接单注意事项

    这是本文的目录 前言Python为什么会大受欢迎python副业有哪些1 兼职处理数据2 兼职查询资料3 兼职P图4 爬虫类5 平台接单 Python赚外快的一些其它方式1 xff09 自媒体也是个风口2 xff09 知识付费分享3 xff
  • python的未来前景,超详细根据好多资料总结出来的

    这是本文的目录 前言一 Python语言广泛二 Python发展前景二 Python选择方向四 Python就业情况五 薪资待遇好零基础Python学习资源介绍 x1f449 Python学习路线汇总 x1f448 x1f449 Pytho
  • 如何将python程序打包成apk?

    前言 如果想使用 Python 语言编写图形界面程序 xff0c 那么有不少的框架可以提供支持 xff0c 比如 Tkinter Qt for Python WxPython等等 不过 这些框架都是只能创建桌面图形界面程序 xff0c 比如
  • 容联云短信python接口单例封装

    容联云短信python接口单例封装 安装pip3 install ronglian sms sdk 注意 xff1a 免费开发测试使用的模板ID为1 xff0c 具体内容 xff1a 云通讯 您的验证码是 1 xff0c 请于 2 分钟内正
  • mac 更新终端命令行显示信息

    mac下自定义终端显示内容 xff0c 如自定义 xff0c 显示名称 xff0c 隐藏计算机名 xff0c 用户名 1 编辑 etc bashrc xff0c 使用如下命令 sudo vi etc bashrc 2 打开文件后 xff0c
  • React Fragment 用途说明-节点片段,不创建额外DOM

    一 React 节点片段解决的问题 由于React 组件只能有一个根标签 xff0c 例如以下片段无效 xff1a ReactDOM render lt div gt Row1 lt div gt lt div gt Row2 lt div
  • 分布式延迟消息队列asynq

    asynq分布式延迟消息队列源码分析 设计思路 延迟队列设计思路 xff1a zset的分值为时间消息有状态 xff1a 活跃 xff0c 计划中 xff0c 重试 xff0c 已完成等 xff0c 状态迁移使用list xff0c 如果状
  • jmeter设置为中文的两种方法

    jmeter默认是英语环境 xff0c 但是可以通过设置来显示为中文 方法一 xff1a 在jmeter面板上选择Options gt Choose Language gt Chinese 但是这种方法设置的只能在当前界面生效 xff0c
  • requests常用方法 之 post请求

    post方法 xff1a 作用 xff1a 提交资源 新增资源 步骤 xff1a 1 导包 xff1a import requests 2 参数 3 调用post方法 xff1a r 61 requests post url json da
  • postman全局变量设置

    postman全局变量的设置 xff1a 设置的全局变量可以供postman所有的工程使用 xff0c 即所有接口都可以调用全局变量 示例1 xff1a 对手机号码归属地查询的手机号码设置为全局变量 xff0c 并调用 步骤1 点击Envi
  • postman使用(读取)json文件做批量测试

    postman json文件参数化 xff1a 步骤 xff1a 1 准备json文件 xff1b 2 接口中引用变量 xff1b 3 测试集中导入数据文件 xff1b 4 点击 Run用户 xff0c 进行运行 xff1b 5 查看运行结
  • selenium 八种定位元素的方式

    八种定位方式 xff1a id xff0c name xff0c class name xff0c tag name xff0c link text xff0c partial link text xff0c xpath xff0c css
  • selenium之滑块操作

    滑块作为安全验证机制的一种 xff0c 经常在登录或者注册时涉及 但是在自动化测试时 xff0c 需要想办法用代码的方式来处理滑块 selenium中对滑块的操作基本是采用元素拖曳的方式 xff0c 而这种方式需要用到selenium的Ac
  • HTML + CSS 实现猫眼电影静态页面

    HTML 43 CSS 实现猫眼电影静态页面 效果图 xff1a HTML代码 xff1a span class token doctype span class token punctuation lt span span class t
  • HTML + CSS 实现豆瓣首页

    HTML 43 CSS 实现豆瓣首页 效果图 xff1a 整个首页效果图 xff1a 部分 HTML代码 xff1a span class token doctype span class token punctuation lt span
  • python实现加减乘除计算

    python实现加减乘除计算 xff1a span class token comment coding 61 utf 8 span span class token keyword def span span class token fu
  • python获取浏览器Chrome/Edge的收藏夹,历史记录(搜索记录,访问记录,下载记录),密码数据

    文章目录 1 获取思路2 获取书签收藏夹3 获取历史记录3 获取浏览器保存的密码数据3 1 读取数据库文件Login Data3 2 获取密钥 4 完整代码获取 1 获取思路 浏览器的这些数据是保存在我们本地的磁盘中 xff0c 所以我们需

随机推荐

  • django框架初体验 --- 在web页面中返回文本

    django框架初体验 在web页面中返回文本hello django 效果图 xff1a 在views py中新建函数 xff1a span class token keyword from span django span class
  • django框架初体验 --- 返回静态页面

    django框架初体验 返回静态页面 效果图 xff1a 1 在templates中新建html xff1a span class token doctype span class token punctuation lt span spa
  • django框架初体验 --- 返回动态页面

    django框架初体验 返回动态页面 效果图 xff1a 1 在templates中新建music html xff1a span class token doctype span class token punctuation lt sp
  • Linux系统下etc/profile文件配置多个环境变量

    小白也能懂的Linux系统下etc profile文件配置多个环境变量操作 1 su root进入管理员操作 2 vi etc profile 3 找到export path xff1b 按 i 在下面输入环境变量信息 xff08 一定要输
  • 如何查询电脑本机出厂序列号

    WIN 43 R 快捷键输入 cmd 回车 xff0c 输入 wmic bios get serialnumber 回车 xff0c 可以查看产品序列号Serial Number
  • C++变长参数解包与std::tuple的遍历输出

    介绍几种常用的变长参数解包的方法 xff1a 递归解包 span class token keyword template span span class token operator lt span span class token ke
  • docker-compose的安装及使用

    1 简介 Compose 是用于定义和运行多容器 Docker 应用程序的工具 通过 Compose xff0c 您可以使用 YML 文件来配置应用程序需要的所有服务 然后 xff0c 使用一个命令 xff0c 就可以从 YML 文件配置中
  • copilot插件使用介绍

    copilot xff08 副驾驶 xff09 是OpenAI和GitHub联合构建的一个基于AI的编程辅助工具 官网地址 xff1a https copilot github com 利用网络中的数十亿行公共代码 xff08 尤其是开源在
  • SQL的分组查询

    一 在SQL中Group By从字面的意思上理解就是根据 By 指定的规则对数据进行分组 xff0c 所谓的分组就是将一个 数据集 划分成若干个 小区域 xff0c 然后针对若干个 小区域 进行数据处理 在此语法中group by子句为列中
  • windows环境下安装配置hadoop

    xff08 需要提前安装好JDK xff0c 否则会出错 xff09 1 进入 https archive apache org dist hadoop 下载所需要的hadoop版本 xff08 演示 xff1a hadoop 2 9 1
  • Idea 2021.1启动提示 找不到com/intellij/idea/main

    Idea 2021 1启动提示 找不到com intellij idea main 背景 xff1a 问题描述 xff1a 原因分析 xff1a 解决方案 xff1a 简单的说就是一句话安装JDK11 并配置环境变量IDEA JDK 64指
  • 线性表的顺序表示及其基本函数操作

    线性表 xff1a 线性表是零个或多个数据元素构成的线性序列 xff0c 可以记为a0 a1 a2 an 1 注 xff1a n表示的是线性表的长度 xff0c 当n 61 0的时候并不是表示线性表不存在 xff0c 而是表示表为空 相关概
  • 无计算机基础一文看懂炉石脚本(炉石兄弟)配置多开使用流程-修订版

    为了更多人能够减少重复劳动的无意义游戏时间 xff0c 把更多时间用在享受生活上 xff0c 我为大家写一个炉石兄弟的使用流程 本文将尽量为没有基础或经验的小白提供一个完整的炉石传说挂机方案 xff0c 能多开 xff0c win amp
  • 树莓派3B 底层io驱动开发(实现火灾警报器)

    树莓派3B 底层io驱动开发 xff08 实现火灾警报器 xff09 编写驱动代码前的必要准备工作BCM2835芯片手册部分的简单解读GPIO寄存器一览 xff08 位于手册的90 91页 xff09 注意 xff1a 芯片手册左边列表所列
  • “有未能满足的依赖关系。请尝试不指明软件包的名字来运行“apt --fix-broken install”(也可以指定一个解决办法)“的问题解决

    1 出现错误的命令 xff1a sudo apt get install dpkg 2 出现的错误信息 xff1a 您可能需要运行 apt get f install 来纠正下列错误 xff1a 下列软件包有未满足的依赖关系 xff1a c
  • Pytorch安装(Windows + Python环境)

    目录 下载地址版本选择可能的报错和解决方法检查是否安装成功参考 下载地址 pytorch 的安装可以直接查看官网教程 xff0c 如下图所示 官网地址 xff1a Pytorch官网 版本选择 Package xff1a 这里推荐采用 Co
  • 超简单地输出所有水仙花数(Java实现)

    今天打算将以前简单又基础的练习题拿出来分享以下 xff0c 虽然很简单 xff0c 但也很适合刚入门的小白练练手 xff0c 熟悉熟悉以下 x1f431 x1f3cd 开场还是得简单以下水仙花数是一种什么样的数 水仙花数 xff1a 水仙花
  • YBTOJ通讯问题(强连通分量)

    YBTOJ通讯问题 xff08 强连通分量 xff09 思路 xff1a 以上纯属水博客 有强连通分量这个算法提示 xff0c 思路应该不难想 但是有一个小细节 我们枚举入边的时候要缩点之后反向建图 xff0c 然后枚举出边 我没建反图调了
  • 基于51单片机的倒计时系统

    具体实现功能 系统由STC89C52单片机 43 按键电路 43 复位电路 43 晶振电路 43 LCD1602显示模块构成 具体功能 xff1a xff08 1 xff09 六位LED显示 xff0c 从59分59秒99开始倒计时 xff
  • 并查集算法总结

    1 并查集定义 并查集是一种数据结构 xff0c 常用来描述集合 在一些应用的问题中 xff0c 需将n个不同的元素划分成一组不相交的集合 开始时 xff0c 每个元素自成一格单元素集合 xff0c 然后按一定顺序将属于同一组的元素的集合合