当前位置: 首页 > news >正文

并查集结构

文章目录

  • 并查集特点
  • 构建过程
    • 查找两个元素是否是同一集合
      • 优化查找领头元素
    • 设置两个元素为同一集合
  • 构建结构
  • 应用场景
    • 并行计算集合问题

并查集特点

  • 对于使用并查集构建的结构,可以使得查询两个元素是否在同一集合,以及合并集合的操作无限接近O(1)

构建过程

查找两个元素是否是同一集合

  • 并查集结构会让每个元素合并后,挂在一个领头元素上,可能呈现下面的结构,要判断d和f是否是同一集合,就判断顶部的零头元素是否一样,因为a和e不一样,所以不是同一集合

在这里插入图片描述

优化查找领头元素

  • 如上图的结构,当要查找d的领头元素时,需要一直往上遍历,当节点深度很深时,也会带来负担
  • 优化方式是,当某个元素查找到领头元素后,将元素路径上所经过的所有节点的领头元素设置成查找的节点,比如d查找到a后,将b的领头元素设置成a
  • 通过上面的优化手段可以看出,当使用并查集查询查询领头元素的次数越多,查找的效率就越好

设置两个元素为同一集合

  • 将两个元素的领头元素设置成同一个即可,即将挂载节点少的领头元素挂载到挂载节点多的领头元素下,比如上图将e挂载到a下,因为查找元素是否在同一集合是根据领头元素是否相同来的

构建结构

class Element {value;constructor(value) {this.value = value;}
}class Union {// 给定元素对应的修饰对象elementMap;// 元素对应的父元素fatherMap;// 领头元素下挂载的元素个数sizeMap;constructor(list) {this.elementMap = new Map();this.fatherMap = new Map();this.sizeMap = new Map();list.forEach((value) => {const element = new Element(value);this.elementMap.set(value, element);// 初始将所有元素都领头元素设置成自身this.fatherMap.set(element, element);// 初始所有领头元素下挂载的元素个数为1this.sizeMap.set(element, 1);});}// 查找领头元素findHead(element) {const path = [];// 找到领头元素while (element !== this.fatherMap.get(element)) {path.push(element);element = this.fatherMap.get(element);}// 优化操作:将路径上的元素的父元素,都更新成领头元素while (path.length) {this.fatherMap.set(path.pop(), element);}return element;}// 判断是否同一集合isSameSet(value1, value2) {if (this.elementMap.has(value1) && this.elementMap.has(value2)) {return (this.findHead(this.elementMap.get(value1)) ===this.findHead(this.elementMap.get(value2)));}return false;}// 设置两个元素为同一集合setUnion(value1, value2) {if (this.elementMap.has(value1) && this.elementMap.has(value2)) {const head1 = this.findHead(this.elementMap.get(value1));const head2 = this.findHead(this.elementMap.get(value2));if (head1 !== head2) {const bigOne =this.sizeMap(head1) > this.sizeMap(head2) ? head1 : head2;const smallOne = bigOne === head1 ? head2 : head1;this.fatherMap.set(smallOne, bigOne);this.sizeMap.set(bigOne,this.sizeMap.get(bigOne) + this.sizeMap.get(smallOne));this.sizeMap.delete(smallOne);}}}
}

应用场景

并行计算集合问题

初始问题和解法
在这里插入图片描述
通过多线程计算,将整个内容分成左右两个区域,通过多线程分别求出左右两个面积的岛屿数量为:1个和2个,总和为3,但实际岛屿答案为2个,所以还要计算左右两个是否有岛屿是属于同一个集合

  • 首先判断每一行分割的位置左右相邻节点是否都为1,是1说明为同一集合,通过并查集设置为同一集合,将总岛屿数量-1,同理后续相邻1节点只需要先通过并查集结构判断是否在同一集合,如果没有则设置为同一集合,然后岛屿数量-1的操作即可
  • 因为查询和合并的代价都很低,所以再通过多线程带来的提速更快了

相关文章:

并查集结构

文章目录并查集特点构建过程查找两个元素是否是同一集合优化查找领头元素设置两个元素为同一集合构建结构应用场景并行计算集合问题并查集特点 对于使用并查集构建的结构,可以使得查询两个元素是否在同一集合,以及合并集合的操作无限接近O(1) 构建过程…...

全国CSM敏捷教练认证将于2023年3月25-26开班,报名从速!

CSM,即Certified Scrum Master,是Scrum联盟发起的Scrum认证。 CSM可以帮助团队正确使用Scrum,从而提高项目整体成功的可能性。 CSM深刻理解Scrum的价值观、实践以及Scrum框架。 CSM是“服务型领导”,帮助Scrum团队一起紧密合作。 …...

JavaEE进阶第六课:SpringBoot ⽇志⽂件

上篇文章介绍了SpringBoot配置文件,这篇文章我们将会介绍SpringBoot ⽇志⽂件 荔枝1.日志有什么用2.自定义日志输出2.1获取程序日志对象2.2使用相关方法输出日志2.3日志级别2.3.1日志级别的作用2.3.2日志级别如何设置2.4日志格式3.持久化日志4.更简单的日志输出4.1使…...

外置MOS管平均电流型LED降压恒流驱动器

产品描述 AP5125 是一款外围电路简单的 Buck 型平均电 流检测模式的 LED 恒流驱动器,适用于 8-100V 电压 范围的非隔离式大功率恒流 LED 驱动领域。芯片采用 固定频率 140kHz 的 PWM 工作模式, 利用平均电 流检测模式,因此具有优异的负载调整…...

python+pytest接口自动化(6)-请求参数格式的确定

我们在做接口测试之前,先需要根据接口文档或抓包接口数据,搞清楚被测接口的详细内容,其中就包含请求参数的编码格式,从而使用对应的参数格式发送请求。例如某个接口规定的请求主体的编码方式为 application/json,那么在…...

开发手册——一、编程规约_3.代码格式

这篇文章主要梳理了在java的实际开发过程中的编程规范问题。本篇文章主要借鉴于《阿里巴巴java开发手册终极版》 下面我们一起来看一下吧。 1. 【强制】大括号的使用约定。如果是大括号内为空,则简洁地写成{}即可,不需要换行;如果是非空代码…...

十七、Django-restframework之序列化器(二)

1. 序列化器 REST framework提供了一个serializer类,它可以非常方便的序列化模型实例和查询集为JSON或者其他内容形式。它还提供反序列化,允许在验证传入数据后将解析的数据转换回复杂类型。 2. 定义序列化器 在crm应用目录下创建serializers.py文件&a…...

python GUI图形化编程-----wxpython

一、python gui(图形化)模块介绍: Tkinter :是python最简单的图形化模块,总共只有14种组建 Pyqt :是python最复杂也是使用最广泛的图形化 Wx :是python当中居中的一个图形化,学习结构很清晰 Pywin :是pyth…...

【Python 】yyyy-MM-dd HH:mm:ss 时间格式 时间戳 全面解读超详细

时间格式 时间格式(协议)描述gg时期或纪元。y不包含纪元的年份。不具有前导零。yy不包含纪元的年份。具有前导零。yyyy包含纪元的四位数的年份。M月份数字。一位数的月份没有前导零。MM月份数字。一位数的月份有一个前导零。MMM月份的缩写名称,在AbbreviatedMonthN…...

【C++】C++11 异常

目录 1. C语言传统的处理错误的方式 2. C异常概念 3. 异常的使用 3.1. 异常的抛出和捕获 3.2. 在函数调用链中异常栈展开匹配原则 3.3. 异常的重新抛出 3.4. 异常安全 3.5. 异常规范 4.自定义异常体系 5. C标准库的异常体系 6. 异常的优缺点 6.1. C异常的优点&…...

关于Thread.start()后的困惑、imap

在for循环中,接着开thread,开完就start,当时有个困惑,就是比如开的一个thread的这个start执行完,但是这个for循环还没执行完,那程序会跑到for循环的后面逻辑吗?比如下面13行for循环开始开第一个…...

qml学习之qwidget与qml结合使用并调用信号槽交互

学习qml系列之一说明: 学习qml系列之qwiget和qml信号槽的交互使用,并在qwidget中显示qml界面 在qml中发送信号到qwidget里 在qwidget里发送信号给qml 在qwidget里面调用qml界面方式 方式一:使用QQuickView 这个是Qt5.0中提供的一个类&…...

【 华为OD机试 2023】 组装新的数组(C++ Java JavaScript Python)

文章目录 题目描述输入描述输出描述备注用例题目解析C++JavaScriptJavaPython题目描述 给你一个整数M和数组N,N中的元素为连续整数,要求根据N中的元素组装成新的数组R,组装规则: R中元素总和加起来等于MR中的元素可以从N中重复选取R中的元素最多只能有1个不在N中,且比N中…...

【洛谷 P2089】烤鸡(循环枚举)

烤鸡 题目背景 猪猪 Hanke 得到了一只鸡。 题目描述 猪猪 Hanke 特别喜欢吃烤鸡(本是同畜牲,相煎何太急!)Hanke 吃鸡很特别,为什么特别呢?因为他有 101010 种配料(芥末、孜然等)…...

windows10安装ubantu双系统

windows10安装ubantu双系统 文章目录windows10安装ubantu双系统一、安装前准备1.前期说明2.制作U盘启动器3.设置硬盘分区相关4.设置给ubantu系统的硬盘大小,设置为未分配(删除卷)二、进行安装1.设置bios相关2.进入bios启动界面选择U盘安装3.进…...

【华为OD机试 2023】 人数最多的站点/小火车最多人时所在园区站点(C++ Java JavaScript Python)

文章目录 题目描述输入描述输出描述用例题目解析C++JavaScriptJavaPython励志做全网最全、解法最多的华为OD机考算法题库,帮助你上岸华为。提供C++/Java、JavaScript、Python四种语言的解法。每篇文章都有详细的结题步骤。有问题,随时解答。😁😁😁😁 目前为了造福广大…...

2024届暑期实习实录(阿里云大数据研发平台)

1. 项目介绍(介绍一下你觉得有挑战的项目 (1)项目的痛点需求(配置变更的痛点、你做的目的是什么?) 思考方向:业务背景,用户需求;产品发展,产品现有局限问题…...

空口协议probe req和probe rsp 、auth req和auth rsp 、assoc req和assoc rsp讲解

我们经常可以看到抓到的报文主要有三种:probe req和probe rsp 、auth req和auth rsp 、assoc req和assoc rsp 。 建立联结的三个阶段 相互发现阶段:probe req和probe rsp probe是探测的意思 相互了解阶段:auth req和auth rsp auth是认证的缩写 建立关…...

vscode ssh一直卡在wget的解决方案

vscode ssh一直卡在wget的解决方案找到commit_id 在服务器下点进该目录 .vscode-server\bin 一般日期最新的那一串就是我们需要的commit_id下载vscode-server-linux-x64.tar https://update.code.visualstudio.com/commit:${commit_id}/server-linux-x64/stable 将加粗部分替换…...

【Python学习笔记】第二十五节 Python MySQL

Python 连接到 MySQL 数据库有几种不同的连接方法,而且不是所有的方法都能与不同的操作系统很好地配合.MySQL connector/Python模块是Oracle支持的官方驱动,用于通过Python连接MySQL。该连接器完全是Python语言,而mysqlclient是用C语言编写的…...

折叠屏手机自带的屏幕表面层为什么不能自己撕?

计划入手折叠屏手机的小伙伴看过来,因为折叠屏手机外观的特殊形态,在日常使用中与普通直板手机屏幕的养护还是有着很大的不同,比如直板机入手后新机开箱撕膜这个操作,对于折叠屏手机来说,万万不可!除此之外…...

20.hadoop系列之Yarn资源调度器

Yarn是一个资源调度平台,负责为运算程序提供服务器运算资源,相当于一个分布式的操作系统,而MapReduce等运算程序则相当于运行于操作系统之上的应用程序 1.Yarn基础架构 Yarn主要由ResourceManager、NodeManager、ApplicationMaster和Contai…...

206页16万字城市运行“一网统管”体系建设项目需求报告

本资料来源网络,知识分享,仅供个人学习,请勿商用。完整资料领取见文末,部分资料内容: 第 一 章 应用场景示例 一.1 一卡通人员管理针对企业厂区、办公楼等场所人员出入频繁、安保问题多样化、管理环节复杂等现状&#…...

【JS】数组Array的使用

arr.length 3 通过设置数组长度,实现截取数组,改变原数组 map 循环遍历数组,不改变原数组,返回一个新的数组(可用变量接收) forEach 循环遍历数组,不改变原数组 join 把数组转化为字符串&…...

2023年,软件测试怎么样?

2022年因为各种不可抗力原因,大厂裁员,失业等等频频受到关注。 不解释,确实存在,各行各业都很难,但是,说软件测试行业不吃香,我还真不认同(不是为培训机构说好话,大环境…...

【学习笔记】NOMURA Programming Competition 2020

C - Folia 不难想到自底向上确定树的形态。可能要多尝试一下 一开始想错了好几个地方,服了 假设某一层有XXX个节点,那么上一层可能有⌈X2⌉,⌈X2⌉1,...,X\lceil\frac{X}{2}\rceil,\lceil\frac{X}{2}\rceil1,...,X⌈2X​⌉,⌈2X​⌉1,...,X个节点&…...

iis下常用程序的伪静态规则列表(包括wordpress、thinkphp)

shopex discuz2.0 discuz2.5 discuz3.x 淘宝客 ecshop phpwind参照http://www.west.cn/faq/list.asp?unid797通过主机面板设置即可 wordpress设置: 第一步: 1.新建一个“chineseurl.php”文件:在里面写入以下代码上传到wordpress安装目录。…...

【Python语言基础】——Python Select From

Python语言基础——Python Select From 文章目录 Python语言基础——Python Select From一、Python Select From一、Python Select From 从表中选取 如需从 MySQL 中的表中进行选择,请使用 “SELECT” 语句: 实例 从表 “customers” 中选取所有记录,并显示结果: import m…...

数据增广真有那么神奇吗?

作者:皮皮雷 来源:投稿 编辑:学姐 论文题目 How Effective is Task-Agnostic Data Augmentation for Pretrained Transformers? 论文作者 S. Longpre, Y. Wang, and C. DuBois 论文发表于 2020 EMNLP findings 摘要 任务无关的数据增广…...

常用基础硬件知识 - 判断MOS管导通

目录1. 概述2. 判断MOS管的导通1. 概述 本文主要记录下基础的硬件知识,方便自己查阅。 2. 判断MOS管的导通 在产品硬件设计中,有时需要程序控制一些电源使能。 1.原理图已经标出了G极(gate)—栅极、S极(source)—源极、D极(drain)—漏极。 如果没有标…...

wordpress 伪静态原理/石家庄网站建设

日志库简介 最重要的一点是 区分日志系统和日志门面;其次是日志库的使用, 包含配置与API使用;配置侧重于日志系统的配置,API使用侧重于日志门面;最后是选型,改造和最佳实践等 日志库之日志系统 java.util.logging (JUL) JDK1.4 …...

代理 网站前置审批/b站推广网站2024

Android 瀑布流照片墙实现,体验不规则的美感。 这是一个大牛写的瀑布流的一个Demo,我研究了一下,给大家分享出来,有需要的可以直接用。。。 实现效果图: 源代码示例: 布局文件:activity_main:…...

郑州做网站托管/漯河搜狗关键词优化排名软件

我现在无法对其进行严格测试,但是从我发现的结果来看,以下方法可能有效:SQL语句SELECT rownum : rownum 1 rownum, t.*FROM ((SELECT t.id, t.name, c.company AS owner, t.creation_date AS date, t.notesFROM tool t, client cWHERE t.id_customer 15AND t.tras…...

制作企业网站公司排名/自媒体营销

1.模糊查询前导不会走索引 select id,user_name,price_code from user_activity_info where user_name like %zhang; 如果非要使用前导索引的话可以借助Apache的Lucence索引工具 2.字段默认值不要设置成null 如果可以请设置为 not null 3.不要在SQL中对字段进行计算&#…...

濮阳住房和城乡建设部网站/网络营销工程师

也许是龙芯名称中的“龙”字,承载着太多国人的希望,自诞生之初就处于社会舆论的风口浪尖。有人说龙芯是骗经费的项目,也有人说龙芯的科研人员是为理想而奋斗的志士,还有人说龙芯的科研人员“太天真”,是土八路斗美械师…...

太原手机网站建设/今日军事新闻头条打仗

首先申明标题党! 前几天,有一张图片访问404(从第三方站点拉去),后来查到原因是下载超过5s(wget带了超时参数--timeout5),所以下载失败。但是直接访问原图又是非常快,基本…...