【LeetCode】十七、并查集

文章目录

  • 1、并查集Union Find
  • 2、并查集find的优化:路径压缩 Quick find
  • 3、并查集union的优化:权重标记

1、并查集Union Find

并查集,一种树形的数据结构,处理不相交的两个集合的合并与查询问题。

【参考:📕经典解释】

引用上面文章的经典解释并查集:

  • 一个集合就像一个江湖门派,他们有一个教主(代表元),集合中每个元素只需要记住自己的上级,而不是教主
  • find即查询某个元素的代表元(教主)
  • union即把两个门派(集合),合并成一个,认一个教主

在这里插入图片描述

例子:

在这里插入图片描述

查find(x)

有个数组array,长度为10,若array[1] = 6,说明1号元素的上级是6号元素。array[6] = 6,说明6号元素的上级是6号元素,即6号是教主。并查集的查:find(x),即找x元素的教主

public int find(int x ) {
	// 如果x位置的值,等于x,说明x就是教主
	if (x == array[x]) {
		return array[x];
	}
	// 如果不是,查x位置的值的上级
	return find(array[x]);
}

也可不用递归:

public int find(int x ) {
	while(x != array[x]) {
		// 查x位置的元素自己的上级
		x = array[x];
	}
	return x;
}

并union(x,y)

两个集合合并,或者说两个门派合并,看似改动很大,其实只要让一个门派的教主给另一个门派的教主当上级即可。因为只关注两个集合的连通性。

// 传入两个门派的元素
public void union(int x, int y) {
	//查教主
	int rootX = find(x);
	int rootY = find(y);
	if (rootX != rootY) {
		// 让Y门派的教主当X门派教主的上级
		array[rootX] = rootY;
	}
}

如下树形,

在这里插入图片描述

对应的数组:数组索引代表元素,数组的值,代表这个位置的元素的上级

在这里插入图片描述
在这里插入图片描述
合并后,比如让第一个集合的教主做合并后新集合的教主:5号的上级不再是自己,变成了1

在这里插入图片描述

2、并查集find的优化:路径压缩 Quick find

用开头引用文章的形象例子,现在要做的就是,防止树形结构过于深,导致查询效率变低,将结果压缩成,只要查一次,就能知道教主是谁:

在这里插入图片描述

总之一句话,防止树太高,期待右边,而不是左边

在这里插入图片描述

想实现这个效果,可以:查询到x元素的根节点(教主)后,直接将x元素的上级改成根节点。

public int QuickFind(int x ) {
	// 如果x位置的值,等于x,说明x就是教主
	if (x == array[x]) {
		return array[x];
	}
	// 如果不是,查x位置的值的上级,等递归回退的时候,把x的上级改成根节点
	return array[x] = find(array[x]);
}

也就是说,第一次find元素x,是没有压缩路径的,第二次才是优化后的效果

3、并查集union的优化:权重标记

和find优化属于同一思想,union两个集合时,防止树过高,比如合并:

在这里插入图片描述
如果这么连,树过高:

在这里插入图片描述
比较两棵树的高度,左边为2,右边为3,因此,高的树原地不动,继续做老大,低的树靠过去,union后的效果:

在这里插入图片描述

核心思想:

在这里插入图片描述

整体代码如下,带权重的union参考:

public class UnionFind {

	const int  N=1005					//指定并查集所能包含元素的个数(由题意决定)
	int pre[N];     					//存储每个结点的前驱结点的数组 
	int rank[N];    					//树的高度,权重
	
	void init(int n) {     				//初始化函数,对录入的 n个结点进行初始化 
	    for(int i = 0; i < n; i++){
	        pre[i] = i;     			//每个结点的上级都是自己 
	        rank[i] = 1;    			//每个结点构成的树的高度为 1 
	    } 
	}

	int find(int x) {
     	//查找结点 x的根结点 
		if (pre[x] == x) { 
			return x ;					//递归出口:x的上级为 x本身,则 x为根结点 
		}  		
	    return find(pre[x]); 			//递归查找 
	} 
	 
	int findQucik(int x) {     			//改进查找算法:完成路径压缩,将 x的上级直接变为根结点,那么树的高度就会大大降低 
	    if (pre[x] == x) {
	    	return x;					//递归出口:x的上级为 x本身,即 x为根结点 
	    }
	    return pre[x] = find(pre[x]);   //此代码相当于先找到根结点 rootx,然后 pre[x]=rootx 
	} 
	
	bool isSame(int x, int y) {     	//判断两个结点是否连通 
	    return find(x) == find(y);  	//判断两个结点的根结点(即代表元)是否相同 
	}
	
	void union(int x,int y) {
	    int rootx = find(x);			//寻找 x的代表元
	    int rooty = find(y);			//寻找 y的代表元
	    if(rootx != rooty) {			//如果 x和 y的代表元一致,说明他们共属同一集合,则不需要合并
		    if(rank[rootx] > rank[rooty]) {		//如果 x的高度大于 y,则令 y的上级为 x
		    	pre[rooty] = rootx;
		    } else if (rank[rootx] < rank[rooty]) {
		    	pre[rootx] = rooty;		//让 x的上级为 y
		    } else {
		    	pre[rooty] = rootx;	    								
		        rank[rootx] += 1;				//如果 x的高度和 y的高度相同,则令 y的高度加1					
			}
		}
	}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/802638.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

优化 Java 数据结构选择与使用,提升程序性能与可维护性

优化 Java 数据结构选择与使用&#xff0c;提升程序性能与可维护性 引言 在软件开发中&#xff0c;数据结构的选择是影响程序性能、内存使用以及代码可维护性的关键因素之一。Java 作为一门广泛使用的编程语言&#xff0c;提供了丰富的内置数据结构&#xff0c;如数组、链表、…

python用selenium网页模拟时xpath无法定位元素解决方法2

有时我们在使用python selenium xpath时&#xff0c;无法定位元素&#xff0c;红字显示no such element。上一篇文章写了1种情况&#xff0c;是包含iframe的&#xff0c;详见https://blog.csdn.net/Sixth5/article/details/140342929。 本篇写第2种情况&#xff0c;就是xpath定…

嵌入式人工智能(9-基于树莓派4B的PWM-LED呼吸灯)

1、PWM简介 (1)、什么是PWM 脉冲宽度调制(PWM)&#xff0c;是英文“Pulse Width Modulation”的缩写&#xff0c;简称脉宽调制&#xff0c;是在具有惯性的系统中利用微处理器的数字输出来对模拟电路进行控制的一种非常有效的技术&#xff0c;广泛应用在从测量、通信到功率控制…

Open3D 最小二乘法拟合点云平面

目录 一、概述 1.1最小二乘法原理 1.2实现步骤 1.3应用场景 二、代码实现 2.1关键函数 2.2完整代码 三、实现效果 3.1原始点云 3.2matplotlib可视化 3.3平面拟合方程 前期试读&#xff0c;后续会将博客加入该专栏&#xff0c;欢迎订阅 Open3D点云算法与点云深度学习…

【内网穿透】打洞笔记

文章目录 前言原理阐述公网sshfrp转发服务 实现前提第一步&#xff1a;第二步第三步第四步 补充第五步&#xff08;希望隧道一直开着&#xff09;sftp传数据&#xff08;嫌云服务器上的网太慢&#xff09; 前言 租了一个云服务器&#xff0c;想用vscode的ssh远程连接&#xff…

Java面试八股之简述redis常见的性能问题和解决方案

简述redis常见的性能问题和解决方案 Redis作为一款高性能的键值存储系统&#xff0c;虽然设计用于提供低延迟的读写操作&#xff0c;但在特定场景下仍可能出现性能瓶颈。下面列出了一些常见的Redis性能问题及其解决方案&#xff1a; 常见性能问题 内存使用过高 Redis是内存…

支付宝低代码搭建电商小程序,无需编程,可视化操作

大家好&#xff0c;我是小悟 在数字化浪潮的推动下&#xff0c;为了更快速、高效地搭建电商小程序&#xff0c;支付宝低代码平台凭借其独特优势&#xff0c;为商家提供了便捷的解决方案。 支付宝低代码平台犹如一座精心打造的智慧工坊&#xff0c;让电商小程序的搭建变得轻而易…

生成树(STP)协议

一、生成树的技术背景 1、交换机单线路上链,存在单点故障,上行线路及设备都不具备冗余性,一旦链路或上行设备发生故障,网络将面临断网。 总结:以下网络不够健壮,不具备冗余性。 2、因此引入如下网络拓扑结构: 上述冗余拓扑能够解决单点故障问题,但同时冗拓扑也带来了…

多级表头固定列问题

父级的width&#xff0c;是需要固定的列的width的总和 参考&#xff1a; el-table 多级表头下对应列的固定

国产麒麟、uos在线编辑word文件并控制编辑区域(局部编辑)

windows系统也适用&#xff0c;该插件可同时支持windows和国产系统 在实际项目开发中&#xff0c;以下场景可能会用到Word局部编辑功能&#xff1a; 合同审批公文流转策划设计报告汇签单招投标&#xff08;标书文件&#xff09;其他&#xff0c;有模板且需要不同人员协作编辑…

OpenGL笔记十三之Uniform向量数据传输、使用glUniform3f和glUniform3fv

OpenGL笔记十三之Uniform向量数据传输、使用glUniform3f和glUniform3fv —— 2024-07-14 晚上 bilibili赵新政老师的教程看后笔记 code review! 文章目录 OpenGL笔记十三之Uniform向量数据传输、使用glUniform3f和glUniform3fv1.glUniform3f1.1.运行1.2.vs1.3.fs1.4.shader.…

<数据集>竹子缺陷检测数据集<目标检测>

数据集格式&#xff1a;VOCYOLO格式 图片数量&#xff1a;2953张 标注数量(xml文件个数)&#xff1a;2953 标注数量(txt文件个数)&#xff1a;2953 标注类别数&#xff1a;3 标注类别名称&#xff1a;[Bud, Sprouted_Bud, Damage_Bud] 序号类别名称图片数框数1Bud2288229…

LintcCode 468 · 对称二叉树【简单 二叉树 递归 Java】

题目 题目链接&#xff1a; https://www.lintcode.com/problem/468/description?showListFetrue&page1&problemTypeId2&tagIds371&orderingid&pageSize50 思路 递归 Java代码 /*** Definition of TreeNode:* public class TreeNode {* public int…

推送Prometheus数据到N9E并通过Grafana展示

小编在上篇文章中已经通过安装jenkins并构建自动化测试项目并发送了消息通知&#xff0c;但是这只是群内的通知&#xff0c;如何通过大盘展示呢&#xff1f;经过讨论&#xff0c;暂时选择采用的实现思路&#xff1a;通过jenkins自动化执行结果来推送Prometheus数据到N9E&#x…

opencv学习:图像视频的读取截取部分图像数据颜色通道提取合并颜色通道边界填充数值计算图像融合

一、计算机眼中的图像 1.图像操作 构成像素点的数字在0~255之间 RGB叫做图像的颜色通道 h500&#xff0c;w500 2.灰度图像 3. 彩色图像 4.图像的读取 5.视频的读取 cv2.VideoCapture()--在OpenCV中&#xff0c;可以使用VideoCapture来读取视频文件&#xff0c;或是摄像头数…

专业电脑硬盘修复教程,教你轻松搞定!

电脑硬盘作为电脑存储系统的重要组成部分&#xff0c;其健康状态直接影响到数据的安全和系统的运行速度。硬盘出现问题可能导致数据丢失、系统崩溃&#xff0c;甚至无法启动。及时进行硬盘修复&#xff0c;不仅可以恢复数据&#xff0c;还能延长硬盘的使用寿命。本文将详细介绍…

【经验分享】关于静态分析工具排查 Bug 的方法

文章目录 编译器的静态分析cppcheck安装 cppcheck运行 cppcheck 程序员的日常工作&#xff0c;不是摸鱼扯皮&#xff0c;就是在写 Bug。虽然这是一个梗&#xff0c;但也可以看出&#xff0c;程序员的日常一定绕不开 Bug。而花更少的时间修复软件中的 Bug&#xff0c;且不引入新…

华为USG6000V防火墙安全策略用户认证

目录 一、实验拓扑图 二、要求 三、IP地址规划 四、实验配置 1&#x1f923;防火墙FW1web服务配置 2.网络配置 要求1&#xff1a;DMZ区内的服务器&#xff0c;办公区仅能在办公时间内(9:00-18:00)可以访问&#xff0c;生产区的设备全天可以访问 要求2&#xff1a;生产区不…

(01)Unity使用在线AI大模型(使用百度千帆服务)

目录 一、概要 二、环境说明 三、申请百度千帆Key 四、使用千帆大模型 四、给大模型套壳 一、概要 在Unity中使用在线大模型分为两篇发布&#xff0c;此篇文档为在Python中使用千帆大模型&#xff0c;整体实现逻辑是&#xff1a;在Python中接入大模型—>发布为可传参的…

NSSCTF中24网安培训day2中web题目【下】

[NISACTF 2022]easyssrf 这道题目考察的是php伪协议的知识点 首先利用file协议进行flag查找 file:///flag.php 接着我们用file协议继续查找fl4g file:///fl4g 接着我们访问此文件&#xff0c;得到php代码如下 这里存在着stristr的函数&#x…