算法基础 - 并查集

img

🏠个人主页:尘觉主页

文章目录

  • 算法 - 并查集
    • 前言
    • Quick Find
    • Quick Union
    • 加权 Quick Union
    • 路径压缩的加权 Quick Union
    • 比较
    • 😄总结

算法 - 并查集

前言

用于解决动态连通性问题,能动态连接两个点,并且判断两个点是否连通。


方法描述
UF(int N)构造一个大小为 N 的并查集
void union(int p, int q)连接 p 和 q 节点
int find(int p)查找 p 所在的连通分量编号
boolean connected(int p, int q)判断 p 和 q 节点是否连通
public abstract class UF {protected int[] id;public UF(int N) {id = new int[N];for (int i = 0; i < N; i++) {id[i] = i;}}public boolean connected(int p, int q) {return find(p) == find(q);}public abstract int find(int p);public abstract void union(int p, int q);
}

Quick Find

可以快速进行 find 操作,也就是可以快速判断两个节点是否连通。

需要保证同一连通分量的所有节点的 id 值相等,就可以通过判断两个节点的 id 值是否相等从而判断其连通性。

但是 union 操作代价却很高,需要将其中一个连通分量中的所有节点 id 值都修改为另一个节点的 id 值。


public class QuickFindUF extends UF {public QuickFindUF(int N) {super(N);}@Overridepublic int find(int p) {return id[p];}@Overridepublic void union(int p, int q) {int pID = find(p);int qID = find(q);if (pID == qID) {return;}for (int i = 0; i < id.length; i++) {if (id[i] == pID) {id[i] = qID;}}}
}

Quick Union

可以快速进行 union 操作,只需要修改一个节点的 id 值即可。

但是 find 操作开销很大,因为同一个连通分量的节点 id 值不同,id 值只是用来指向另一个节点。因此需要一直向上查找操作,直到找到最上层的节点。


public class QuickUnionUF extends UF {public QuickUnionUF(int N) {super(N);}@Overridepublic int find(int p) {while (p != id[p]) {p = id[p];}return p;}@Overridepublic void union(int p, int q) {int pRoot = find(p);int qRoot = find(q);if (pRoot != qRoot) {id[pRoot] = qRoot;}}
}

这种方法可以快速进行 union 操作,但是 find 操作和树高成正比,最坏的情况下树的高度为节点的数目。


加权 Quick Union

为了解决 quick-union 的树通常会很高的问题,加权 quick-union 在 union 操作时会让较小的树连接较大的树上面。

理论研究证明,加权 quick-union 算法构造的树深度最多不超过 logN。


public class WeightedQuickUnionUF extends UF {// 保存节点的数量信息private int[] sz;public WeightedQuickUnionUF(int N) {super(N);this.sz = new int[N];for (int i = 0; i < N; i++) {this.sz[i] = 1;}}@Overridepublic int find(int p) {while (p != id[p]) {p = id[p];}return p;}@Overridepublic void union(int p, int q) {int i = find(p);int j = find(q);if (i == j) return;if (sz[i] < sz[j]) {id[i] = j;sz[j] += sz[i];} else {id[j] = i;sz[i] += sz[j];}}
}

路径压缩的加权 Quick Union

在检查节点的同时将它们直接链接到根节点,只需要在 find 中添加一个循环即可。

比较

算法unionfind
Quick FindN1
Quick Union树高树高
加权 Quick UnionlogNlogN
路径压缩的加权 Quick Union非常接近 1非常接近 1

😄总结

😁热门专栏推荐
想学习vue的可以看看这个

java基础合集

数据库合集

redis合集

nginx合集

linux合集

手写机制

微服务组件

spring_尘觉

springMVC

mybits

等等等还有许多优秀的合集在主页等着大家的光顾感谢大家的支持

🤔欢迎大家加入我的社区 尘觉社区

文章到这里就结束了,如果有什么疑问的地方请指出,诸佬们一起来评论区一起讨论😁
希望能和诸佬们一起努力,今后我们一起观看感谢您的阅读🍻
如果帮助到您不妨3连支持一下,创造不易您们的支持是我的动力🤞

img

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

php基于PHP的网上订餐系统的设计与开发

摘 要 快速发展的社会中&#xff0c;人们的生活水平都在提高&#xff0c;生活节奏也在逐渐加快。为了节省时间和提高工作效率&#xff0c;越来越多的人选择利用互联网进行线上打理各种事务&#xff0c;通过线上管理订餐也就相继涌现。与此同时&#xff0c;人们开始接受方便的生…

四川尚熠电子商务有限公司靠谱吗?怎么样?

在当下数字化浪潮中&#xff0c;电子商务行业正以前所未有的速度蓬勃发展。四川尚熠电子商务有限公司&#xff0c;作为专注于抖音电商服务的企业&#xff0c;凭借其敏锐的市场洞察力和创新精神&#xff0c;正成为行业内的佼佼者&#xff0c;为众多品牌打开抖音电商市场的大门。…

SpringBoot登录校验(四)过滤器Filter

JWT令牌生成后&#xff0c;客户端发的请求头中会带有JWT令牌&#xff0c;服务端需要校验每个请求的令牌&#xff0c;如果在每个controller方法中添加校验模块&#xff0c;则十分复杂且冗余&#xff0c;所以引入统一拦截模块&#xff0c;将请求拦截下来并做校验&#xff0c;这块…

DNS搭建

DNS搭建 一、DNS简介 1、概念 DNS&#xff08;Domain Name System&#xff09;是一种分布式的命名系统&#xff0c;用于将域名与其对应的IP地址相互映射。简单来说&#xff0c;DNS充当了互联网上的“电话簿”&#xff0c;帮助用户通过易于记忆的域名查找到相应的网络资源&am…

Maven--lib分离的打包方式

就是把lib包和source源码分开打包。优势就是&#xff0c;面对频繁更新的应用场景时&#xff0c;可以只更新源码包&#xff08;当然&#xff0c;前提是你的依赖没有增减&#xff09;。尤其是使用jenkins更新项目时&#xff0c;会省去很多时间吧&#xff1f; 不同项目的 lib之间不…

稀疏矩阵的三元组表表示法及其转置

1. 什么是稀疏矩阵 稀疏矩阵是指矩阵中大多数元素为零的矩阵。 从直观上讲&#xff0c;当元素个数低于总元素的30%时&#xff0c;这样的矩阵被称为稀疏矩阵。 由于该种矩阵的特点&#xff0c;我们在存储这种矩阵时&#xff0c;如果直接采用二维数组&#xff0c;就会十分浪费…

Android Monkey自动化测试

monkey一般用于压力测试&#xff0c;用户模拟用户事件 monkey 基本用法 adb shell monkey [参数] [随机事件数]monkey常用命令 -v&#xff1a;用于指定反馈信息级别&#xff0c;总共分三个等级-v -v -vadb shell mokey -v -v -v 100-s&#xff1a;用于指定伪随机数生成器的种…

JavaEE初阶-线程3

文章目录 一、线程安全问题-内存可见性二、等待通知2.1 wait()方法2.2 notify()方法 一、线程安全问题-内存可见性 import java.util.Scanner;public class Demo27 {private static int count0;//下面这段代码会出现内存的可见性问题//将从内存中读取count值的操作称为load 判…

为什么企业需要ERP帮助中心?看完你就懂了

企业资源计划&#xff08;ERP&#xff09;系统&#xff0c;这个听起来十分高大上的名词&#xff0c;实际上是许多现代企业后台运行的大脑。从财务管理、人力资源到生产操作和供应链管理&#xff0c;ERP系统如同一个企业的神经中枢&#xff0c;协调着各个部门之间的信息流。但是…

useBlocker 防止页面跳转导致的表单丢失

关于useBlocker The hook allows you to prevent the user from navigating away from the current location, and present them with a custom UI to allow them to confirm the navigation 在react-router的v6版本之前&#xff0c;我们会使用<Prompt />组件来拦截路由的…

【JAVASE】学习面向对象程序三大特性之一( 封装)

✅作者简介&#xff1a;大家好&#xff0c;我是橘橙黄又青&#xff0c;一个想要与大家共同进步的男人&#x1f609;&#x1f609;\n &#x1f34e;个人主页&#xff1a;再无B&#xff5e;U&#xff5e;G-CSDN博客 目标&#xff1a; 1.包的使用 2.static关键字的使用 3.代码…

随机生成Long全范围数

随机生成Long全范围数 前言实现思路主要代码分区随机生成过程案例&#xff1a;随机生成100个数 朴素的比较总结 前言 使用自带的Random.nextLong()函数生成Long型的长整数&#xff0c;范围比较小&#xff0c;如下图。100个随机数没看见10以内的数字。所以考虑实现随机化生成大…