并查集算法的详细解释

并查集算法(Disjoint Set Union,简称DSU)是一种用于处理集合合并和查询的数据结构和算法。它主要用于解决集合的不相交性和合并操作。

在并查集中,每个元素都属于一个集合,并且每个集合有一个代表元素,通常是集合中的某个特定元素。并查集的基本操作包括:

  1. 初始化: 将每个元素单独放在一个集合中,每个集合的代表元素就是该元素本身。
  2. 查找(Find): 查找元素所属的集合,通常通过查找其代表元素来实现。这个操作通常被优化,使得查找路径尽可能短,以提高效率。
  3. 合并(Union): 将两个集合合并为一个集合,通常选择其中一个集合的代表元素作为新集合的代表元素,并更新其他元素的归属关系。

并查集通常用于解决一些离散数学中的问题,例如:

  • 连通性问题:判断两个元素是否属于同一个集合,即是否连通。
  • 最小生成树算法(如Kruskal算法):按权重递增的顺序选择边,并通过并查集来检测是否形成了环。
  • 社交网络中的关系处理:如朋友圈的合并与查询。

以下是并查集(Disjoint Set Union)算法的Java实现,包括详细的注释解释:

import java.util.*;

class DisjointSet {
    private int[] parent; // 存储每个节点的父节点
    private int[] rank; // 存储每个节点的秩(用于优化)

    // 初始化并查集,每个节点都是独立的集合,父节点为自己,秩初始化为1
    public DisjointSet(int size) {
        parent = new int[size];
        rank = new int[size];
        for (int i = 0; i < size; i++) {
            parent[i] = i;
            rank[i] = 1;
        }
    }

    // 查找节点的根节点(代表元素)
    private int find(int x) {
        // 如果当前节点不是根节点,则递归向上找到根节点,并进行路径压缩
        if (parent[x] != x) {
            parent[x] = find(parent[x]); // 路径压缩,将当前节点直接指向根节点
        }
        return parent[x]; // 返回根节点
    }

    // 合并两个集合
    public void union(int x, int y) {
        int rootX = find(x); // 找到x的根节点
        int rootY = find(y); // 找到y的根节点

        // 如果根节点相同,说明它们已经在同一个集合中,无需合并
        if (rootX == rootY) return;

        // 根据秩进行合并,将秩较小的集合合并到秩较大的集合上
        if (rank[rootX] > rank[rootY]) {
            parent[rootY] = rootX;
        } else if (rank[rootX] < rank[rootY]) {
            parent[rootX] = rootY;
        } else {
            // 如果秩相等,则随意合并,并将根节点的秩加1
            parent[rootY] = rootX;
            rank[rootX]++;
        }
    }

    // 判断两个节点是否属于同一个集合
    public boolean isConnected(int x, int y) {
        return find(x) == find(y);
    }
}

public class Main {
    public static void main(String[] args) {
        int n = 5; // 节点个数
        DisjointSet dsu = new DisjointSet(n);

        // 进行一系列合并操作
        dsu.union(0, 1);
        dsu.union(1, 2);
        dsu.union(3, 4);

        // 判断节点0和节点2是否属于同一个集合
        if (dsu.isConnected(0, 2)) {
            System.out.println("节点0和节点2属于同一个集合");
        } else {
            System.out.println("节点0和节点2不属于同一个集合");
        }
    }
}

注释解释:

  1. DisjointSet 类是并查集的实现类,其中 parent 数组用于存储每个节点的父节点,rank 数组用于存储每个节点的秩(即树的高度或者节点的深度)。
  2. find(int x) 方法用于查找节点的根节点,同时进行路径压缩,以优化查找速度。
  3. union(int x, int y) 方法用于合并两个集合,首先找到两个节点的根节点,然后根据秩的大小决定将一个根节点连接到另一个根节点上。
  4. isConnected(int x, int y) 方法用于判断两个节点是否属于同一个集合,只需要比较它们的根节点是否相同。
  5. main 方法中演示了如何使用并查集进行集合合并和查询操作。

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

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

相关文章

如何评估户外LED显示屏的质量标准

随着数字媒体的不断进步&#xff0c;户外LED显示屏已经成为现代城市不可或缺的一部分&#xff0c;它们以鲜明的视觉冲击力和广泛的应用范围&#xff0c;成为了广告和公共信息传播的重要工具。然而&#xff0c;并非所有的户外LED显示屏都能满足高标准的户外使用要求。为了确保投…

MoonBit MeetUp回顾——张正、宗喆:编程语言在云原生与区块链领域的技术探索

宗喆和张正分别给我们带了 KCL 相关的最新进展&#xff0c;由蚂蚁集团开发的 Rust 编写的开源 DSL&#xff0c;目标是优化云原生策略配置和用户体验。它通过引入动态配置管理、配置校验和基础设施抽象等核心概念&#xff0c;解决开发者认知负担、配置膨胀和标准化工具缺乏的问题…

国内外主要气象卫星介绍

NOAA AVHRR介绍 美国NOAA极轨卫星从1970年12月第一颗发射以来&#xff0c;近40年连续发射了18颗&#xff0c;最新的NOAA-19也将在2009年发射升空。NOAA卫星共经历了5代&#xff0c;目前使用较多的为第五代NOAA卫星&#xff0c;包括NOAA-15—NOAA-18&#xff1b;作为备用的第四…

【STM32CubeMX(1)】开发环境搭建

1、安装STM32CubeMX 安装前言&#xff1a;软件是免费的&#xff0c;网上安装教程也是很丰富&#xff0c;我就不造轮子了。 1.1 准备java-jdk环境 参考&#xff1a;Java环境配置|菜鸟教程 1.2 下载STM32CubeMX 获取安装包&#xff1a;STM32CubeMX - STM32Cube initializati…

verilog 从入门到看得懂---verilog 的基本语法各种语句

本篇文章主要介绍verilog里面常用的语句&#xff0c; 包括条件语句、循环语句块语句和生成语句。出了块语句和生成语句&#xff0c;其他的基本和c语言或者m语言一致。 1&#xff0c;if 语句&#xff0c;在需要判断逻辑的时候可以使用if语句&#xff0c;如 从输入a&#xff0c;…

SpringCloud实用篇(一)

1.SpringCloud SpringCloud是目前国内使用最广泛的微服务框架。官网地址&#xff1a;Spring Cloud SpringCloud集成了各种微服务功能组件&#xff0c;并基于SpringBoot实现了这些组件的自动装配&#xff0c;从而提供了良好的开箱即用体验&#xff1a; SpringCloud与SpringBoo…

Python中的排序算法:归并排序,选择排序和快速排序详解

排序算法是计算机科学中的一个基础且重要的概念。它用于将一组数据&#xff08;如数字、字符串等&#xff09;按照某种顺序&#xff08;升序或降序&#xff09;重新排列。在Python中&#xff0c;我们有许多内置的函数和库可以方便地实现排序&#xff0c;但理解排序算法的基本思…

Netty对Channel事件的处理以及空轮询Bug的解决

继续上一篇Netty文章&#xff0c;这篇文章主要分析Netty对Channel事件的处理以及空轮询Bug的解决 当Netty中采用循环处理事件和提交的任务时 由于此时我在客户端建立连接&#xff0c;此时服务端没有提交任何任务 此时select方法让Selector进入无休止的阻塞等待 此时selectCnt进…

企业员工培训考试系统开发方案

一、引言 在当今知识经济时代&#xff0c;企业对员工的综合素质和专业技能有着越来越高的要求。为了适应这一趋势&#xff0c;构建一个全面而高效的企业员工培训考试系统变得尤为重要。该系统旨在通过提供多样化的培训课程和全面的考核机制&#xff0c;促进员工持续学习和能力…

24/03/28总结

抽象类&#xff1a; 将共性的方法抽取到父类之后。由于每一个子类执行的内容是不一样&#xff0c;所以&#xff0c;在父类中不能确定具体的方法体。该方法就可以定义为抽象方法。 而为什么不直接在子类中定义方法&#xff1a;项目的完成不是一个人&#xff0c;如果有时忘记写方…

【教学类-40-09】A4骰子纸模制作9.0(3.47CM嵌套骰子 一条8格便于对折,表格相连 一页3个 油墨打印A4铅画纸)

作品展示 背景需求&#xff1a; 骰子调整到第8版&#xff0c;把骰子图案作成一长条&#xff0c;便于切割裁剪。 【教学类-40-08】A4骰子纸模制作8.0&#xff08;2.97CM嵌套骰子表格相连 一页7个 油墨打印A4铅画纸&#xff09;-CSDN博客文章浏览阅读929次&#xff0c;点赞20次…

幻兽帕鲁服务器价格表_阿里云/腾讯云/京东云/华为云报价大全

2024年全网最全的幻兽帕鲁服务器租用价格表&#xff0c;阿里云幻兽帕鲁游戏服务器26元1个月、腾讯云32元一个月、京东云26元一个月、华为云24元1个月&#xff0c;阿腾云atengyun.com整理最新幻兽帕鲁专用4核16G、8核16G、8核32G游戏服务器租用价格表大全&#xff1a; 阿里云幻…

土壤有机质空间分布数据

土壤有机质&#xff08;soil organic matter&#xff09;是土壤中含碳有机化合物的总称&#xff0c;包括土壤固有的和外部加入的所有动植物残体及其分解产物和合成产物。主要来源于动植物及微生物残体&#xff0c;可分为腐殖质和非腐殖物质。一般占土壤固相总重的10%以下&#…

推荐:便宜幻兽帕鲁Palworld联机游戏服务器优惠价格表

2024年全网最全的幻兽帕鲁服务器租用价格表&#xff0c;阿里云幻兽帕鲁游戏服务器26元1个月、腾讯云32元一个月、京东云26元一个月、华为云24元1个月&#xff0c;阿腾云atengyun.com整理最新幻兽帕鲁专用4核16G、8核16G、8核32G游戏服务器租用价格表大全&#xff1a; 阿里云幻…

思维升级之路:观察思维深层,解锁认知新境界

目录 一、观察我们的思维习惯 二、人类有哪些思维方法 三、为什么要多使用归纳推理而不是演绎推理 四、转变思维的关键 - 觉察 怎么提升自身的认知水平&#xff1f;这篇文章里&#xff0c;作者尝试对思维模式这件事做出探讨&#xff0c;一起来看看&#xff0c;或许可以帮你…

2023年蓝桥杯省赛——矩形面积总和

目录 题目链接&#xff1a; 1.矩形总面积 - 蓝桥云课 (lanqiao.cn) 思路 暴力 数学杯思路 数学逻辑 难点之重合区域 代码实现 总结 题目链接&#xff1a; 1.矩形总面积 - 蓝桥云课 (lanqiao.cn) 思路 暴力 开幕雷击&#xff0c;我直接开始暴力&#xff0c;但是我暴力…

Java学习之方法

目录 方法 方法声明格式&#xff1a; 调用方式&#xff1a; 详细说明 示例 --方法的声明及调用 语句块 练习 方法的重载(overload) 构成条件 示例 --方法重载 递归结构 缺陷 方法 方法(method)&#xff1a;一段用于完成特定功能的代码片段&#xff0c;类似于其他语…

Redis命令-List命令

4.6 Redis命令-List命令 Redis中的List类型与Java中的LinkedList类似&#xff0c;可以看做是一个双向链表结构。既可以支持正向检索和也可以支持反向检索。 特征也与LinkedList类似&#xff1a; 有序元素可以重复插入和删除快查询速度一般 常用来存储一个有序数据&#xff…

算法系列--动态规划--背包问题(2)--01背包拓展题目

&#x1f495;"2024.3.28小米汽车发布"&#x1f495; 作者&#xff1a;Lvzi 文章主要内容&#xff1a;算法系列–动态规划–背包问题(2)–01背包拓展题目 大家好,今天为大家带来的是算法系列--动态规划--背包问题(2)--01背包拓展题目 1.分割等和⼦集 链接: https:/…

能够解析任何编程语言的开源语法解析树 | 开源日报 No.171

tree-sitter/tree-sitter Stars: 14.6k License: MIT tree-sitter 是一个用于编程工具的增量解析系统。 该项目的主要功能、关键特性、核心优势包括&#xff1a; 通用性&#xff0c;能够解析任何编程语言高效性&#xff0c;能够在文本编辑器中每次按键都进行解析健壮性&…