【数据结构】高效解决连通性问题的并查集详解及Python实现

文章目录

    • 1. 并查集:一种高效的数据结构
    • 2. 并查集的基本操作与优化
      • 2.1 初始化
      • 2.2 查找操作与路径压缩
      • 2.3 合并操作与按秩合并
    • 3. 并查集的应用
      • 3.1 判断连通性
      • 3.2 计算连通分量
    • 4. 并查集的实际案例
      • 4.1 图的连通性问题
      • 4.2 网络连接问题
    • 5. 并查集的优缺点
      • 5.1 优点
      • 5.2 缺点
    • 6. 结论

1. 并查集:一种高效的数据结构

并查集(Union-Find)是一种用于处理不相交集合(Disjoint Sets)的数据结构。它支持两种操作:合并(Union)和查找(Find)。这种数据结构常用于解决连通性问题,如图论中的连通分量、网络中的连通子网等。

2. 并查集的基本操作与优化

2.1 初始化

并查集通过一个数组 parent 来表示每个元素的父节点,另一个数组 rank 用于优化合并操作。以下是初始化的代码:

class UnionFind:
    def __init__(self, n):
        self.parent = list(range(n))
        self.rank = [0] * n

uf = UnionFind(10)
print(uf.parent)
print(uf.rank)

2.2 查找操作与路径压缩

查找操作用于找到某个元素所在集合的根节点。路径压缩技术通过将访问过的节点直接连接到根节点上,从而降低树的高度,提高后续查找操作的效率。以下是路径压缩的实现代码:

def find(self, p):
    if self.parent[p] != p:
        self.parent[p] = self.find(self.parent[p])  # 路径压缩
    return self.parent[p]

2.3 合并操作与按秩合并

合并操作用于将两个不相交的集合合并为一个集合。按秩合并技术确保在合并操作中总是将高度较小的树连接到高度较大的树上,从而避免增加树的高度,按秩合并还可以看看这篇:并查集(按秩合并+路径压缩)基础讲解。以下是按秩合并的实现代码:

def union(self, p, q):
    rootP = self.find(p)
    rootQ = self.find(q)

    if rootP != rootQ:
        if self.rank[rootP] < self.rank[rootQ]:
            rootP, rootQ = rootQ, rootP  # 确保rootP是秩较高的树根
        self.parent[rootQ] = rootP
        if self.rank[rootP] == self.rank[rootQ]:
            self.rank[rootP] += 1  # 更新秩

3. 并查集的应用

3.1 判断连通性

并查集可以用于判断两个节点是否连通。通过检查它们的根节点是否相同即可判断。

def connected(self, p, q):
    return self.find(p) == self.find(q)

uf = UnionFind(10)
uf.union(1, 2)
uf.union(2, 3)
print(uf.connected(1, 3))  # 输出: True
print(uf.connected(1, 4))  # 输出: False

3.2 计算连通分量

并查集还可以用于计算连通分量的数量。在初始状态下,每个节点都是一个独立的连通分量,随着合并操作的进行,连通分量的数量逐渐减少。

def count_components(self):
    root_set = set()
    for i in range(len(self.parent)):
        root_set.add(self.find(i))
    return len(root_set)

uf = UnionFind(10)
uf.union(1, 2)
uf.union(2, 3)
print(uf.count_components())  # 输出: 8

4. 并查集的实际案例

4.1 图的连通性问题

在图论中,可以用并查集解决连通分量、最小生成树等问题。例如,Kruskal算法用于寻找最小生成树,通过并查集来判断边的两个端点是否属于同一连通分量,从而避免形成环。

def kruskal(edges, n):
    edges.sort(key=lambda x: x[2])
    uf = UnionFind(n)
    mst = []
    total_weight = 0

    for u, v, weight in edges:
        if not uf.connected(u, v):
            uf.union(u, v)
            mst.append((u, v, weight))
            total_weight += weight

    return mst, total_weight

edges = [(0, 1, 1), (0, 2, 4), (1, 2, 2), (1, 3, 5), (2, 3, 3)]
n = 4
mst, total_weight = kruskal(edges, n)
print("最小生成树:", mst)
print("总权重:", total_weight)

4.2 网络连接问题

并查集可以用于解决网络连接问题,例如判断网络中两个计算机是否连通,以及在动态变化的网络中维护连通性信息。

class Network:
    def __init__(self, n):
        self.uf = UnionFind(n)

    def connect(self, p, q):
        self.uf.union(p, q)

    def is_connected(self, p, q):
        return self.uf.connected(p, q)

network = Network(5)
network.connect(0, 1)
network.connect(1, 2)
print(network.is_connected(0, 2))  # 输出: True
print(network.is_connected(0, 3))  # 输出: False

5. 并查集的优缺点

5.1 优点

  1. 高效:并查集的合并和查找操作都具有接近常数时间的复杂度,尤其是在使用路径压缩和按秩合并优化后。
  2. 简单:并查集的实现相对简单,代码量少,容易理解和维护。
  3. 实用:并查集在图论、网络等领域有广泛的应用,可以有效解决连通性问题。

5.2 缺点

  1. 适用范围有限:并查集主要适用于连通性问题,对其他类型的问题不适用。
  2. 静态结构:并查集对动态变化的集合处理较为困难,例如频繁的插入和删除操作。

6. 结论

并查集是一种简单高效的数据结构,广泛应用于图论、网络连通性等问题。通过路径压缩和按秩合并技术,可以显著提升操作效率。在解决连通性问题时,并查集是一个强大的工具。

通过本文的介绍和示例代码,希望能够帮助读者理解并查集的原理和应用。如果在实际项目中遇到连通性问题,尝试使用并查集,可能会带来意想不到的效果。


在这里插入图片描述

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

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

相关文章

如何使用ECharts和DataV.GeoAtlas创建广东省人口分布图

引言 数据可视化是数据分析中的重要环节&#xff0c;它可以帮助我们直观地理解数据。ECharts 是一个由百度团队开发的开源数据可视化库&#xff0c;它提供了丰富的图表类型和灵活的配置选项。DataV.GeoAtlas 是阿里云提供的一个地理数据可视化平台&#xff0c;它可以帮助我们获…

记录|.NET上位机开发和PLC通信的实现

本文记录源自&#xff1a;B站视频 实验结果&#xff1a;跟视频做下来是没有问题的。能运行。 自己补充做了视频中未实现的读取和写入数据部分【欢迎小伙伴指正不对的地方】 目录 前言一、项目Step1. 创建项目Step2. 创建动态图片展示Step3. 创建图片型按钮Step4. 创建下拉框Ste…

vue3表格使用拖拽排序

拖拽排序 实现效果实现步骤拖拽排序功能的完整代码 实现效果 实现步骤 先安装sortable.js库使用的vue文件中引入 import Sortablejs from ‘sortablejs’在进入页面后创建sortable实例在提交后端时可获取到排序后的最新table列表数据 sortable.js文档 拖拽排序功能的完整代码 …

SpringBoot中常用的注解及其用法

1. 常用类注解 RestController和Controller是Spring中用于定义控制器的两个类注解. 1.1 RestController RestController是一个组合类注解,是Controller和ResponseBody两个注解的组合,在使 用 RestController 注解标记的类中&#xff0c;每个方法的返回值都会以 JSON 或 XML…

4 C 语言控制流与循环结构的深入解读

目录 1 复杂表达式的计算过程 2 if-else语句 2.1 基本结构及示例 2.2 if-else if 多分支 2.3 嵌套 if-else 2.4 悬空的 else 2.5 注意事项 2.5.1 if 后面不要加分号 2.5.2 省略 else 2.5.3 省略 {} 2.5.4 注意点 3 while 循环 3.1 一般形式 3.2 流程特点 3.3 注…

语音识别概述

语音识别概述 一.什么是语音&#xff1f; 语音是语言的声学表现形式&#xff0c;是人类自然的交流工具。 图片来源&#xff1a;https://www.shenlanxueyuan.com/course/381 二.语音识别的定义 语音识别&#xff08;Automatic Speech Recognition, ASR 或 Speech to Text, ST…

智能厕所系统让厕位状态清晰可见

在当今科技飞速发展的时代&#xff0c;智能化的应用已经渗透到我们生活的方方面面&#xff0c;智能厕所系统就是其中一个令人瞩目的创新。其中&#xff0c;厕位有人无人实时显示这一功能&#xff0c;为人们带来了极大的便利和舒适。 当身处一个繁忙的公共场所&#xff0c;如商场…

嵌入式全栈设计思路:STM32G4+ChibiOS+FreeRTOS+PID控制+PFC算法构建高效智能电源管理系统(附代码示例)

智能电源管理系统是一个基于STM32G4微控制器的高性能数字电源控制解决方案。本项目旨在设计一个功能全面、高效稳定的电源管理系统,可广泛应用于工业控制、新能源、通信设备等领域。 1.1 系统主要特点 高精度数字电源控制&#xff1a;利用STM32G4的高性能ADC和定时器,实现精确…

【NLP实战】基于TextCNN的新闻文本分类

TextCNN文本分类在pytorch中的实现 基于TextCNN和transformers.BertTokenizer的新闻文本分类实现&#xff0c;包括训练、预测、数据加载和准确率评估。 目录 项目代码TextCNN网络结构相关模型仓库准备工作项目调参预测与评估 1.项目代码 https://github.com/NeoTse0622/Te…

C++相关概念和易错语法(22)(final、纯虚函数、继承多态难点)

1.final final在继承和多态中都可以使用&#xff0c;在继承中是指不想将自己被继承&#xff0c;在多态中是指不想该函数被重写&#xff0c;比较简单&#xff0c;下面是一些使用例子。 2.纯虚函数 当我们需要抽象一个类的时候&#xff0c;我们就需要用到纯虚函数。所谓抽象的类…

【微服务】Spring Cloud Config解决的问题和案例

文章目录 强烈推荐引言解决问题1. 配置管理的集中化2. 配置的版本控制3. 环境特定配置4. 配置的动态刷新5. 安全管理敏感数据6. 配置的一致性 组件1. **配置服务器&#xff08;Config Server&#xff09;**2. **配置客户端&#xff08;Config Client&#xff09;** 配置示例配置…

电脑数据恢复软件哪个好?这六款软件轻松恢复数据

随着电脑使用的日益频繁&#xff0c;数据的丢失也成为了一个不可避免的问题。在生活中&#xff0c;我们常因误删除、误格式化、分区失败、中病毒等而丢失数据。在这种情况下&#xff0c;一个好的数据恢复软件就显得尤为重要。 电脑数据恢复软件哪个好&#xff1f;本文将为大家…

Midjourney 商业实战案例(附AI学习工具教程资料)

前言 Midjourney 商业实战案例 &#xff08;附AI学习工具教程资料&#xff09; 如何把 AI 绘画应用到设计工作中&#xff1f; AI 绘画技术可以应用于设计工作中&#xff0c;帮助设计师更快速、更高效地完成设计工作&#xff0c;以下是一些常见的应用&#xff1a; **1. 快速…

对接企业微信API自建应用配置企业可信IP

前言 为了实现系统调用团队会议功能&#xff0c;组织发起企业微信会议&#xff0c;于是需要和企业微信做API对接。对接过程很难受&#xff0c;文档不清晰、没有SDK、没有技术支持甚至文档报文和实际接口报文都不匹配&#xff0c;只能说企业微信的API是从业以来见过的最难用的AP…

【数据结构与算法 经典例题】判断二叉树是否对称

&#x1f493; 博客主页&#xff1a;倔强的石头的CSDN主页 &#x1f4dd;Gitee主页&#xff1a;倔强的石头的gitee主页 ⏩ 文章专栏&#xff1a;《数据结构与算法 经典例题》C语言 期待您的关注 目录 一、问题描述 二、解题思路 三、C语言实现代码 一、问题描述 给你一个二…

ENSP中NAT的相关实验(两个私网,一个公网)

题目 实验需求 1.按照图示配置IP地址&#xff0c;公网地址100.1.1.1/24 2.私网A通过NAPT&#xff0c;使R1接入到互联网&#xff0c;私网B通过EASY IP&#xff0c;使R3接入到互联网 3.私网A配置NAT SERVER把Telnet的Telnet服务发布到公网&#xff0c;使PC2可以访问 三、实验…

Vue中使用mind-map实现在线思维导图

概述 在前面的文章Vue中实现在线画流程图实现中介绍了流程图的在线绘制&#xff0c;在本文&#xff0c;给大家分享一下基于mind-map实现在线的思维导图&#xff0c;并实现&#xff1a;1. 导图导出为图片&#xff1b;2. 打开xmind文件。 实现效果 实现 1. mind-map简介 simp…

随笔(三):CSS

一、CSS .&#xff08;类选择器&#xff09;和 #&#xff08;ID选择器&#xff09;在CSS中的主要区别在于它们的选择范围和用途&#xff1a; 1. 选择范围 类选择器&#xff08;. 开头&#xff09;&#xff1a; 类选择器用于选择具有指定类名的所有HTML元素。由于一个HTML元素…

spring boot基础知识

spring boot是整合spring 一系列的包的坐标集合 对依赖进行整合 总体介绍 spring boot是用来方便构建项目的工具 spring cloud是用来方便spring boot项目之间进行数据交互通讯和配置的 spring cloud data Flow 是用来进行数据的连接的 Spring 缺点 配置繁琐 虽然Spring的组件代…

超市管理系统 需求分析与设计 UML 方向

一、项目介绍 1.1项目背景 随着经济一体化和电子商务的迅速发展&#xff0c;网络传播信息的速度打破了传统信息传递的模式&#xff0c;互联网的高速发展和计算机应用在各个高校进展迅速&#xff0c;更多信息化产品的突飞猛进&#xff0c;让现代的管理模式也发生了巨大的变化&…