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

并查集(未压缩未按秩合并)

并查集(Union-Find)是一种用于处理不相交集合(disjoint-set)的数据结构,主要用于处理连通性问题。并查集支持两种操作:

  1. 查找(Find):确定元素所属的集合。
  2. 合并(Union):将两个集合合并为一个集合。

并查集通常应用于图的连通性问题,例如判断图中两点是否连通、计算连通分量等。

动画描述

将(1,2),(2,3),(2,4)union后的图例,可以观察到不带压缩的情况下树的高度在持续增长。

问题描述

下面是一个不带路径压缩的并查集(Union-Find)。这个版本仅使用基本的查找和合并操作:

代码实现

public class SimpleUnionFind {private int[] parent;// 初始化并查集public SimpleUnionFind(int size) {parent = new int[size];for (int i = 0; i < size; i++) {parent[i] = i;}}// 查找操作,不带路径压缩public int find(int p) {while (p != parent[p]) {p = parent[p];}return p;}// 合并操作,不带按秩合并public void union(int p, int q) {int rootP = find(p);int rootQ = find(q);if (rootP != rootQ) {parent[rootP] = rootQ;}}// 判断两个节点是否连通public boolean connected(int p, int q) {return find(p) == find(q);}public static void main(String[] args) {int size = 10; // 假设有10个元素SimpleUnionFind uf = new SimpleUnionFind(size);uf.union(1, 2);uf.union(2, 3);uf.union(4, 5);uf.union(6, 7);uf.union(5, 6);System.out.println("1 和 3 是否连通: " + uf.connected(1, 3)); // trueSystem.out.println("1 和 4 是否连通: " + uf.connected(1, 4)); // falseSystem.out.println("4 和 7 是否连通: " + uf.connected(4, 7)); // trueuf.union(1, 4);System.out.println("1 和 4 是否连通: " + uf.connected(1, 4)); // true}
}

解释

  1. 初始化:

    • parent数组用于存储每个元素的父节点,初始时每个元素的父节点是它自己。
  2. 查找操作(find):

    • 查找元素所属的集合,通过不断访问父节点来找到根节点。因为没有路径压缩,树的高度可能会很高,查找的时间复杂度是O(n)(n是元素个数)。
  3. 合并操作(union):

    • 合并两个集合,将一个集合的根节点指向另一个集合的根节点。因为没有按秩合并,树的高度可能会很高,合并的时间复杂度也是O(n)。
  4. 连通性检查(connected):

    • 判断两个元素是否属于同一个集合,即查找它们的根节点是否相同。

这个实现是并查集的基础版本,没有进行路径压缩和按秩合并的优化,因此在处理较大的数据集时效率较低。路径压缩和按秩合并的优化可以显著提高并查集的性能。

http://www.lryc.cn/news/411510.html

相关文章:

  • 读书其实并没有那么大的作用
  • 微信小程序/vue将金额/数字转为千分位显示在页面上
  • 如何查看树莓派的 OS 和内核版本
  • php的mysql操作可实现简单登录功能
  • c#复制窗体Form方法
  • C:图案打印
  • WebLogic:弱口令,木马反弹连接
  • 深度学习图像处理环境搭建
  • 这几个高级爬虫软件和插件真的强!
  • 【实战】机器学习Kaggle比赛—House Prices - Advanced Regression Techniques
  • 【前端面试题】前端工程化、Webpack、Vite、Git项目管理相关问题
  • 【号外】「省点时间」新功能暖心上线!
  • Python面试题:如何使用WebSocket实现实时Web应用
  • 公交信息在线查询小程序的设计
  • Airtest实施手机精准截图
  • 前端面试宝典【设计模式】【2】
  • 技术汇总笔记7:条件分支相关内容
  • 一文让你学会python:面向对象
  • mac电脑安装 docker镜像 btpanel/baota
  • Python写UI自动化--playwright(pytest.ini配置)
  • java实现序列化操作
  • 视频帧的概念
  • 卫星导航系统的应用领域与发展前景
  • FPGA开发——数码管的使用(二)
  • 技术汇总记录笔记5:在 C++ 中,如何使用正则表达式来验证一个字符串是否只包含数字?
  • ai模特换装软件哪个好用?不知道怎么穿搭就用这几个
  • HCL实验2:VLAN
  • 输出总分题目
  • 自定义协议(应用层协议)——网络版计算机基于TCP传输协议
  • 在jmeter中使用javascript脚本