数据结构 - 并查集路径压缩

news2024/11/16 9:50:28

💝💝💝首先,欢迎各位来到我的博客,很高兴能够在这里和您见面!希望您在这里不仅可以有所收获,同时也能感受到一份轻松欢乐的氛围,祝你生活愉快!

文章目录

      • 引言
      • 一、并查集的基本概念
      • 二、并查集路径压缩的方法
      • 三、并查集路径压缩的实现
        • 1. 并查集节点类
        • 2. Java 示例代码
      • 四、并查集路径压缩的总结
      • 五、总结

引言

并查集是一种用于管理一组不相交集合的数据结构,常用于解决连通性问题。在并查集中,路径压缩是一种重要的优化技术,它能够显著提高查找操作的效率。本文将深入探讨并查集路径压缩的基本原理,并通过具体的Java代码详细说明如何实现高效的路径压缩。

一、并查集的基本概念

并查集是一种用于管理一组不相交集合的数据结构。它的主要特点如下:

  1. 查找操作(Find):确定一个元素所在的集合。
  2. 合并操作(Union):将两个集合合并成一个集合。
  3. 路径压缩:一种优化技术,用于提高查找操作的效率。
  4. 按秩合并:另一种优化技术,用于平衡树的高度,减少合并操作的深度。

二、并查集路径压缩的方法

路径压缩是通过在查找操作中将路径上的每个节点的父节点直接指向根节点来减少查找操作的深度。这种方法能够显著减少未来查找操作的时间复杂度。
在这里插入图片描述

三、并查集路径压缩的实现

接下来,我们将通过一个示例来详细了解并查集路径压缩的实现步骤。

1. 并查集节点类

定义并查集的节点类,用于存储每个元素的父节点:

public class DisjointSet {
    private int[] parent;

    public DisjointSet(int size) {
        parent = new int[size];

        // 初始化每个元素的父节点为其自身
        for (int i = 0; i < size; i++) {
            parent[i] = i;
        }
    }

    public int find(int x) {
        // 路径压缩
        if (parent[x] != x) {
            parent[x] = find(parent[x]);  // Path compression
        }
        return parent[x];
    }

    public void union(int x, int y) {
        int rootX = find(x);
        int rootY = find(y);

        if (rootX != rootY) {
            parent[rootY] = rootX;  // Merge by setting one root as the parent of another
        }
    }

    public boolean isConnected(int x, int y) {
        return find(x) == find(y);
    }
}
2. Java 示例代码

创建并查集并执行操作:

public class Main {
    public static void main(String[] args) {
        DisjointSet dsu = new DisjointSet(10);

        // 连接元素
        dsu.union(1, 2);
        dsu.union(2, 3);
        dsu.union(4, 5);
        dsu.union(6, 7);
        dsu.union(7, 8);

        // 检查连接性
        System.out.println("Is 1 connected to 3? " + dsu.isConnected(1, 3));
        System.out.println("Is 4 connected to 5? " + dsu.isConnected(4, 5));
        System.out.println("Is 1 connected to 4? " + dsu.isConnected(1, 4));

        // 连接更多元素
        dsu.union(3, 5);

        // 再次检查连接性
        System.out.println("Is 1 connected to 5 after union? " + dsu.isConnected(1, 5));
    }
}

四、并查集路径压缩的总结

通过在查找操作中实施路径压缩,我们可以显著减少未来查找操作的时间复杂度。下面是并查集路径压缩的关键点:

  1. 初始化:为每个集合分配一个初始父节点,即每个元素的父节点为其自身。
  2. 查找操作:在查找元素所属集合的过程中,将路径上的每个节点的父节点直接指向根节点。
  3. 合并操作:在合并两个集合时,将一个根节点设置为另一个根节点的子节点。

五、总结

并查集是一种非常实用的数据结构,尤其适用于需要频繁进行集合合并和查询的应用场景。在实际编程中,并查集可以用于解决各种连通性问题,例如在图论、网络设计等领域有着广泛的应用。


喜欢博主的同学,请给博主一丢丢打赏吧↓↓↓您的支持是我不断创作的最大动力哟!感谢您的支持哦😘😘😘
打赏下吧

💝💝💝如有需要请大家订阅我的专栏【数据结构与算法】哟!我会定期更新相关系列的文章
💝💝💝关注!关注!!请关注!!!请大家关注下博主,您的支持是我不断创作的最大动力!!!

数据结构与算法相关文章索引文章链接
数据结构与算法-插入排序数据结构与算法-插入排序
数据结构与算法-希尔排序数据结构与算法-希尔排序
数据结构与算法-归并排序数据结构与算法-归并排序
数据结构与算法-随机快速排序数据结构与算法-随机快速排序
数据结构与算法-双路快速排序数据结构与算法-双路快速排序
数据结构与算法-三路排序数据结构与算法-三路排序
数据结构与算法-关于堆的基本存储介绍数据结构与算法-关于堆的基本存储介绍
数据结构与算法-关于堆的基本排序介绍数据结构与算法-关于堆的基本排序介绍
数据结构与算法-索引堆及其优化数据结构与算法-索引堆及其优化
数据结构与算法-二分搜索树数据结构与算法-二分搜索树
数据结构与算法-二分搜索树链表节点的插入数据结构与算法-二分搜索树链表节点的插入
数据结构与算法-二分搜索树节点的查找数据结构与算法-二分搜索树节点的查找
数据结构与算法-二分搜索树遍历数据结构与算法-二分搜索树遍历
数据结构与算法-二分搜索树层序遍历数据结构与算法-二分搜索树层序遍历
数据结构与算法-二分搜索树节点删除历数据结构与算法-二分搜索树节点删除
数据结构 - 并查集基础数据结构 - 并查集基础
数据结构 - 并查集 size 的优化 数据结构 - 并查集 size 的优化
数据结构 - 并查集 rank 的优化 数据结构 - 并查集 rank 的优化

❤️❤️❤️觉得有用的话点个赞 👍🏻 呗。
❤️❤️❤️本人水平有限,如有纰漏,欢迎各位大佬评论批评指正!😄😄😄
💘💘💘如果觉得这篇文对你有帮助的话,也请给个点赞、收藏下吧,非常感谢!👍 👍 👍
🔥🔥🔥Stay Hungry Stay Foolish 道阻且长,行则将至,让我们一起加油吧!🌙🌙🌙

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

第37届百花奖采用8K技术直播颁奖典礼

8月2日至4日&#xff0c;由中国文学艺术界联合会、中国电影家协会、中共四川省委宣传部、成都市人民政府共同主办第37届大众电影百花奖在成都隆重举行。作为“中国电影三大奖”之一&#xff0c;百花奖汇聚国内优秀的电影作品与电影人&#xff0c;向全球展示中国电影产业技术蓬勃…

渗透小游戏,各个关卡的渗透实例---步骤简单(含代码)

文章目录 Less-1Less-2Less-5updatexml报错注入&#xff1a; Less-6Less-7Less-8Less-9Less-11Less-13Less-15 Less-1 首先&#xff0c;可以看见该界面&#xff0c;该关卡主要是SQL注入&#xff0c;由于对用户的输入没有做过滤&#xff0c;使查询语句进入到了数据库中&#xff…

苹果照片删除了如何恢复回来?大家都会用的4个方法

随着我们频繁地使用手机拍照&#xff0c;意外删除照片的情况也屡见不鲜。好在&#xff0c;苹果手机提供了一系列实用的功能和工具&#xff0c;可以最大程度上帮助我们解决苹果照片删除了如何恢复回来的问题。接下来&#xff0c;就让我们一起了解一下这4个好用的技巧吧。 方法一…

JavaEE 第5节 死锁产生的原因

目录 一、死锁场景 场景1&#xff1a;1个线程1个锁 场景2&#xff1a;2个线程2个锁 场景3&#xff1a;N个线程M个锁 二、出现死锁的四个必要条件 1&#xff09;锁的互斥性&#xff08;Mutual Exclusion&#xff09; 2&#xff09;锁的不可抢占性&#xff08;Non-preempt…

容器跨主机通信:Flannel网络实现机制分析

Docker与Kubernetes系列 容器跨主机通信&#xff1a;Flannel网络实现机制分析 - 文章信息 - Author: 李俊才 (jcLee95) Visit me at CSDN: https://jclee95.blog.csdn.netMy WebSite&#xff1a;http://thispage.tech/Email: 291148484163.com. Shenzhen ChinaAddress of thi…

NLP——文本预处理

本文思维导图 文本预处理及其作用 文本语料在输送给模型前一般需要一系列的预处理工作, 才能符合模型输入的要求, 如: 将文本转化成模型需要的张量, 规范张量的尺寸等, 而且科学的文本预处理环节还将有效指导模型超参数的选择, 提升模型的评估指标. 一、文本处理的基本方法 1…

职业院校工业互联网平台应用实训室解决方案

摘要&#xff1a;随着“中国制造2025”战略的深入实施&#xff0c;工业互联网作为新一代信息技术与制造业深度融合的关键支撑&#xff0c;对我国产业升级和经济转型具有重要意义。为培养适应未来工业发展需求的技术技能人才&#xff0c;职业院校需要建立工业互联网平台应用实训…

Python爬虫新手指南及简单实战

网络爬虫是自动化获取网络信息的高效工具&#xff0c;Python因其强大的库支持和简洁的语法成为编写网络爬虫的首选语言。本教程将通过一个具体的案例&#xff08;基于Microsoft Edge浏览器的简单爬取&#xff09;&#xff0c;指导你使用Python实现一个完整的网络爬虫&#xff0…

群晖出现grub-editenv:error:environment block too small

起因&#xff1a; 想修改一下东西&#xff0c;结果找到配置修改后出现grub2-editenv: error: environment block too small. ,然后就不能启动了 原因是&#xff1a; 修改的部分导致启动环境检测到内存分配的较小 解决 1.切换管理用户 sudo -i 2.找文件并备份 find / -name gru…

基于C#调用文心一言大模型制作桌面软件(可改装接口)

目录 开发前的准备账号注册应用创建应用接入 开始开发创建项目设计界面使用 AK&#xff0c;SK 生成鉴权签名窗体代码 百度智能云千帆大模型平台什么是百度智能云千帆大模型平台模型更新记录 开发前的准备 账号注册 访问百度智能云平台&#xff0c;通过百度账号登录或手机号验证…

边缘计算在智能交通系统中的应用探究

随着社会的进步和科技的不断发展&#xff0c;智能交通系统正逐渐成为现代城市交通管理的重要组成部分。边缘计算作为一种新兴的计算模式&#xff0c;被广泛应用于智能交通系统中&#xff0c;为其带来了巨大的变革和改进。本文将从边缘计算的原理、优势以及在智能交通系统中的应…

61监听器

监听器 概念 监听器用于监听web应用中某些对象信息的创建、销毁、增加&#xff0c;修改&#xff0c;删除等动作的 发生&#xff0c;然后作出相应的响应处理。当范围对象的状态发生变化的时候&#xff0c;服务器自动调用 监听器对象中的方法。 常用于统计在线人数和在线用户&am…

Hbase 综合实验

1、设计表保存通话记录信息&#xff0c;实现相关查询功能 创建ua50tel表&#xff0c;并插入数据&#xff08;实训报告中‘&#xff1a;’存在于表中但会识别为语法所以在此不使用&#xff09; 依次重复上面的过程按实际输入&#xff0c;并查看表的内容 查询某人当月通话记录 …

内网电脑如何通过外网IP访问内网的服务器

内网的电脑&#xff0c;如何使用公网IP访问内网的服务器&#xff1f;写下这个标题&#xff0c;连我自己都学得拗口&#xff0c;可是又想不到更合适的标题。 正常来说&#xff0c;内网的电脑访问内网的服务器&#xff0c;当然是使用服务器的内网IP地址和端口&#xff0c;比如说&…

建立的Qsys系统变成Symbol Files

1.Platform Designer下&#xff0c;点击Generate 2.

C++数组全面讲解

文章目录 数组介绍数组的特点数组的优缺点数组和其他数据结构的比较 静态数组与动态数组的详细讲解一、静态数组1. 一维数组声明与初始化注意事项特点 2. 二维数组声明与初始化注意事项特点 3. 三维数组声明与初始化注意事项特点 二、动态数组1. 一维数组声明与初始化注意事项特…

HarmonyOS鸿蒙开发学习:鸿蒙基础-基础环境-ArkTS-组件-样式

鸿蒙基础-基础环境-ArkTS-组件-样式 DevEcoStudio编辑器下载链接 链接: https://pan.baidu.com/s/18C9i35YPh4GsHpbSif8KQw?pwdd6e9 提取码: d6e9 安装教程 下载对应的版本 windowsmac英特尔mac Arm API12 的编辑器 API12的模拟器(mac英特尔安装API11) Mac Arm芯片版本安装…

CCPC 2024, Shanghai

2024.8.5 12:00————17:00 CCPC 2024, Shanghai [A - 无线网络整点栅格统计](https://atcoder.jp/contests/math-and-algorithm/tasks/abc204_d?langen)[E - 无线软件日](https://atcoder.jp/contests/abc265/tasks/abc265_a?langen)[J - 极简合数序列](https://atcoder.…

【面试题】合井K个升序链表

合井K个升序链表 仅供面试学习 给定一个链表数组&#xff0c;每个链表都已经按升序排列。将所有链表合并到一个升序链表中&#xff0c;并返回合并后的链表。以下是详细的解题步骤和 Python 代码示例。 一、问题描述 将多个升序链表合并为一个升序链表。要求算法能有效处理链表…

Codeforces Round 871 (Div. 4)(A~H)

比赛链接 Dashboard - Codeforces Round 871 (Div. 4) - Codeforces A. Love Story 找到与codeforces 有多少个不同的字符。 #include<bits/stdc.h> #define int long long #define TEST int T; cin >> T; while (T--) #define ios ios::sync_with_stdio(fals…