【图论】并查集(Union-find Sets)

文章目录

  • 前言
  • 一、并查集(Union-find Sets)
    • 基本概念
    • 基本操作步骤
  • 二、并查集的操作步骤
    • 1. 初始化 `init`
    • 2. 查询 `find`、合并 `union`(未进行路径压缩)
    • 3. 查询 `find`、合并 `union`(路径压缩)
  • 三、Kruskal 算法中 `环` 的判断
    • 并查集的使用
  • 总结


前言

在使用 Kruskal 算法求解最小生成树的时候,需要用到并查集(Union-find Sets),所以记录下并查集的操作与代码。

并查集在最小生成树算法中的使用

并查集的基本概念和基本代码

这两个视频讲解的比较清楚。

一、并查集(Union-find Sets)

基本概念

  • 并查集(Union-find Sets)是一种非常精巧而实用的数据结构,它主要用于处理一些不相交集合的合并问题。一些常见的用途有求连通子图、求最小生成树的 Kruskal 算法和求最近公共祖先(LCA)等。
  • 在无向图中,判断一条边加入后是否形成环可以通过检查该边连接的两个节点是否已经连通来实现。如果这两个节点在加入这条边之前已经是连通的,那么加入这条边后就会形成环。
  • 使用并查集(Union-Find)数据结构来高效地判断两个节点是否连通。并查集支持两种操作:查找(Find)和合并(Union)。查找操作可以确定一个元素属于哪个子集,合并操作可以将两个子集合并成一个子集。

基本操作步骤

  1. 初始化 init
  2. 查询 find
  3. 合并 union

二、并查集的操作步骤

1. 初始化 init

一般初始化时都将每个节点的父亲节点设置为自己

fa = []
def init(n):for i in range (1,n+1):fa[i]= i

假如有编号为 1 , 2 , 3 , … , n 1,2,3,…, n 1,2,3,,n n n n 个元素,我们用一个数组 f a [ ] fa[ ] fa[] 来存储每个元素的父节点。一开始,我们先将它们的父节点设为自己。

在这里插入图片描述

2. 查询 find、合并 union(未进行路径压缩)

找到 i i i 的父亲节点直接返回,未进行路径压缩:

查询 find

def find(fa, i):if fa[i] == i:return ireturn find(fa, fa[i])

这是一个递归函数,递归出口是:到达父亲节点位置,就返回父亲节点,否则不断地往上查找父亲节点。

合并 union

def union(fa, i, j):# 查找两个节点的父亲节点root1 = find(fa, i)  # 找到 i 的父亲节点root2 = find(fa, j)  # 找到 j 的父亲节点fa[root1] = root2    # 将 i 的父亲节点指向 j 的父亲节点

运行以下代码:

union(4,3)    # 将 4 的父亲节点指向 3 的父亲节点
union(3,2)    # 将 3 的父亲节点指向 2 的父亲节点
union(2,1)    # 将 2 的父亲节点指向 1 的父亲节点

得到:
在这里插入图片描述
若运行union(4,5),意思是将 4 的父亲节点指向 5 的父亲节点。代码中需要不断地 find,查找 4 的父亲节点,直到查找到 4 的父亲节点为 1 ,才将 1 的父亲节点指向 5。

类似于:
在这里插入图片描述
需要查找 3 次,才能查找到父亲节点。

union(4,6) ——— 需要查找 4 次;
union(4,7) ——— 需要查找 5 次;
.
.
union(4,10000) ——— 需要查找 9998 次;

时间复杂度较高。

3. 查询 find、合并 union(路径压缩)

找到 i i i 的父亲节点后,更新 i i i 的父亲节点,进行了路径压缩:

查询 find

def find(fa, i):if fa[i] == i:return ielse:fa[i] = find(fa, fa[i])    # 路径压缩return fa[i]

合并 union

def union(fa, i, j):# 查找两个节点的父亲节点root1 = find(fa, i)  # 找到 i 的父亲节点root2 = find(fa, j)  # 找到 j 的父亲节点fa[root1] = root2    # 将 i 的父亲节点指向 j 的父亲节点

运行以下代码:

union(4,3)    # 将 4 的父亲节点指向 3 的父亲节点
union(3,2)    # 将 3 的父亲节点指向 2 的父亲节点
union(2,1)    # 将 2 的父亲节点指向 1 的父亲节点

得到:

在这里插入图片描述
若运行union(4,5),意思是将 4 的父亲节点指向 5 的父亲节点。因为在之前的代码中已经将 4 的父亲节点更新为 1,所以直接将 1 的父亲节点指向 5 ,代码就运行结束了。

三、Kruskal 算法中 的判断

  • 在 Kruskal 算法中,初始化每个节点为一个独立的树(父亲节点都是自己,互不相同)。

  • 那么如何判断加入一条边后会不会形成环呢?

    • 如果这条边的两个节点属于两棵不同的树,那么加入后一定不会形成环(父亲节点不相等,就不会形成环);
    • 如果这条边的两个节点属于同一棵树,那么加入后就会形成环(父亲节点相等,就会形成环)。
  • 所以判断加入一条边后会不会形成环,只需要判断这条边的两个节点的父亲节点是否相等即可。

并查集的使用

  1. 初始化所有节点的父亲节点
  2. 查找其两个节点的父亲节点
  3. 若父亲节点不相等,则将该边加入;若相等,则舍去

总结

本文介绍了并查集(Union-find Sets)的基本概念和用法,并且解释了为什么要在 find 函数中进行路径压缩。简单介绍了如何使用并查集判断是否形成 “环”。

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

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

相关文章

宝塔面板屏蔽 Censys,防止源站 IP 泄露

Censys 搜索引擎很强大。Censys 每天都会扫描 IPv4 地址空间,以搜索所有联网设备并收集相关的信息,并返回一份有关资源(如设备、网站和证书)配置和部署信息的总体报告。 在 IP 前加上 https 访问时,Nginx 会自动返回该…

Redis缓存——缓存更新策略和常见的缓存问题

一.什么是缓存? 前言:什么是缓存? 缓存(Cache),就是数据交换的缓冲区,俗称的缓存就是缓冲区内的数据,一般从数据库中获取,存储于本地代码 前言:为什么要使用缓存? 一句话:因为速度快,好用 缓存数据存储于代码中,而代码运行在内存…

Unity新输入系统 之 InputAction(输入配置文件最基本的单位)

本文仅作笔记学习和分享,不用做任何商业用途 本文包括但不限于unity官方手册,unity唐老狮等教程知识,如有不足还请斧正​ 首先你应该了解新输入系统的构成结构:Unity新输入系统结构概览-CSDN博客 Input System - Unity 手册 1.In…

【SpringCloud】RabbitMQ——五种方式实现发送和接收消息

SpringAMQP SpringAMQP是基于RabbitMQ封装的一套模板,并且还利用SpringBoot对其实现了自动装配。 SpringAmqp的官方地址:https://spring.io/projects/spring-amqp SpringAMQP提供了三个功能: 自动声明队列、交换机及其绑定关系基于注解的…

【CONDA】库冲突解决办法

如今,使用PYTHON作为开发语言时,或多或少都会使用到conda。安装Annaconda时一般都会选择在启动终端时进入conda的base环境。该操作,实际上是在~/.bashrc中添加如下脚本: # >>> conda initialize >>> # !! Cont…

Java基础之循环嵌套

循环嵌套 在一个循环内部可以嵌套另一个或多个循环。 外部循环每执行1次,内层循环会执行1轮(全部)。 案例1: 连续3天,每天都要表白5次。 package com.briup.chap03;public class Test03_Nest {public static void main(String[] args) {…

XMGoat:一款针对Azure的环境安全检测工具

关于XMGoat XMGoat是一款针对Azure的环境安全检测工具,XM Goat 由 XM Cyber Terraform 模板组成,可帮助您了解常见的 Azure 安全问题。每个模板都是一个用于安全技术学习的靶机环境,包含了一些严重的配置错误。 在该工具的帮助下&#xff0c…

File的概述和构造方法

一.路径: 相对路径开头不带盘符。 二.File: 1.File对象: File对象就表示一个路径,可以是文件的路径,也可以是文件夹的路径, 这个路径可以是存在的,也可以是不存在的。 2.File对象常见的构造…

SpringCloud完整教程

一下内容为本人在听黑马程序员的课程时整理的 微服务技术栈 ⎛⎝≥⏝⏝≤⎛⎝ ⎛⎝≥⏝⏝≤⎛⎝ ⎛⎝≥⏝⏝≤⎛⎝ ⎛⎝≥⏝⏝≤⎛⎝ 1、微服务框架 1.1、认识微服务 1.1.1、服务架构演变 **单体架构:**将业务的所有功能集中在一个项目中开发,打包成…

华为云Api调用怎么生成Authorization鉴权信息,StringToSign拼接流程

请求示例 Authorization 为了安全,华为云的 Api 调用都是需要在请求的 Header 中携带 Authorization 鉴权的,这个鉴权15分钟内有效,超过15分钟就不能用了,而且是需要调用方自己手动拼接的。 Authorization的格式为 OBS 用户AK:…

Linux系统移植——开发板烧写

目录: 目录: 一、什么是EMMC分区? 1.1 eMMC分区 1.2 分区的管理 二、相关命令介绍: 2.1 mmc 2.1.1 主要功能 2.1.2 示例用法 2.2 fdisk 2.2.1 基本功能 2.2.2 交互模式常用命令 2.2.3 注意事项 三、U-BOOT烧写 3.1 mmc命令 3.2 f…

【Linux入门】Linux环境搭建

目录 前言 一、发行版本 二、搭建Linux环境 1.Linux环境搭建方式 2.虚拟机安装Ubuntu 22.02.4 1)安装VMWare 2)下载镜像源 3)添加虚拟机 4)换源 5)安装VM Tools 6)添加快照 总结 前言 Linux是一款自由和开放…

JAVA集中学习第五周学习记录(二)

系列文章目录 第一章 JAVA集中学习第一周学习记录(一) 第二章 JAVA集中学习第一周项目实践 第三章 JAVA集中学习第一周学习记录(二) 第四章 JAVA集中学习第一周课后习题 第五章 JAVA集中学习第二周学习记录(一) 第六章 JAVA集中学习第二周项目实践 第七章 JAVA集中学习第二周学…

RCE远程命令执行

命令执行的常用函数 system():能将字符串作为系统命令执行,且返回命令执行结果。 #system(string $command, int &$result_code null): string|false system(whoami); exec():能将字符串作为系统命令执行,但是只返回执行结果…

MySQL 的 InnoDB 缓冲池里有什么?--InnoDB存储梳理(二)

文章目录 缓冲池的配置介绍一张表 INNODB_BUFFER_POOL_PAGES字段解释 缓冲池的配置 以下配置的意思,缓冲池在内存中的大小为20M;只有1个缓冲池实例;每一块的大小,插入缓冲占的百分比 # InnoDB 缓存池配置 innodb_buffer_pool_si…

Python之循环语句

这是《Python入门经典以解决计算问题为导向的Python编程实践》中58-65的内容,主要将了while循环语句和for循环语句。 循环 一、while循环语句语法:工作原理:案例解读要点 二、for循环语句语法工作原理、案例:寻找完全数 三、whil…

学习记录——day30 网络编程 端口号port 套接字socket TCP实现网络通信

目录 一、端口号 port 二、套接字 socket 1、原理 2、socket函数介绍 三、TCP实现网络通信 1、原理 2、TCP通信原理图 3、TCP相关函数 1)bind 绑定 2)listen 监听 3)accept 接收连接请求 4)recv 接收 5)sen…

Ubuntu系统中安装ffmpeg工具(详细图文教程)

💪 专业从事且热爱图像处理,图像处理专栏更新如下👇: 📝《图像去噪》 📝《超分辨率重建》 📝《语义分割》 📝《风格迁移》 📝《目标检测》 📝《暗光增强》 &a…

RAG:系统评估,以RAGAS为例

面试的时候经常会问到,模型和系统是怎么评估的,尤其是RAG,这么多组件,还有端到端,每部分有哪些指标评估,怎么实现的。今天整理下 目前最通用的是RAGAS框架,已经在langchain集成了。在看它之前&…

Java面试--设计模式

设计模式 目录 设计模式1.单例模式?2.代理模式?3.策略模式?4.工厂模式? 1.单例模式? 单例模式是Java的一种设计思想,用此模式下,某个对象在jvm只允许有一个实例,防止这个对象多次引…