并查集的介绍

  • 并查集(Union-find)数据结构也称作合并查找集(Merge-find set)或者不相交集数据结构(disjoint-set data structure),它是一种记录了由一个或多个元素组成的不连续的分组的集合。并查集提供常数量的复杂度来添加、合并以及确定两个元素是否属于同一个集合。
  • 并查集除了能够实现这些快速便利的操作,它在Krukal算法中寻找最小生成树的图也起着关键的作用

    并查集结构
    并查集是一种树形数据结构,但是它和二叉树、红黑树、B树不同,它对树形结构的要求十分简单:

    1. 同一个数据组中的元素对应在同一颗树(判断两个元素是否在同一颗树时,可以判断根结点是否相同)
    2. 同一数据组中的每一个元素对应树中的一个结点
    3. 不同数据组之间不存在任何相关的联系,可以看做多个数据组成一个森林(合并数据组时,只需要将一棵树的根结点指向另一颗树的根结点即可)
    4. 树中的结点不存在硬性的顺序/父子关系

并查集的功能实现

方法设计

  1. self.groups 是一个列表,其索引代表传入的元素的值,其元素代表传入元素所在分组
  2. count_groups() 返回并查集中组的数量
  3. which_group(item) 判断传入的元素item属于哪一个群组
  4. in_the_same_group(item1, item2) 判断传入的两个元素是否在同一个分组
  5. merge(item1, item2) 将两个元素各自所在的分组合并到一个组,合并后的分组为后者所在的组

Python代码实现

class UnionFind:def __init__(self, n):self.num_groups = nself.groups = [i for i in range(n)]  # Let the indices be the elements, and the elements be the group numbersdef count_groups(self):return self.num_groupsdef which_group(self, item):"""The indices are items, the elements are group numbers"""return self.groups[item]def in_the_same_group(self, item1, item2):return self.which_group(item1) == self.which_group(item2)def merge(self, item1, item2):group1 = self.which_group(item1)group2 = self.which_group(item2)if group1 == group2:returnfor i in range(len(self.groups)):if self.groups[i] == group1:self.groups[i] = group2self.num_groups -= 1

代码测试

if __name__ == '__main__':UF = UnionFind(5)print(f"The initial number of groups is {UF.num_groups}")print(f"The initial groups is {UF.groups}")while True:p = int(input(f'Input the to-be-merge element: '))q = int(input(f"Merge to the target element's group: "))if UF.in_the_same_group(p, q):print(f"They are already in the same group")continueUF.merge(p, q)print(f"The number of groups now is {UF.count_groups()}")print(UF.groups)

测试结果

The initial number of groups is 5
The initial groups is [0, 1, 2, 3, 4]
Input the to-be-merge element: 0
Merge to the target element's group: 1
The number of groups now is 4
[1, 1, 2, 3, 4]
Input the to-be-merge element: 1
Merge to the target element's group: 2
The number of groups now is 3
[2, 2, 2, 3, 4]
Input the to-be-merge element: 2
Merge to the target element's group: 3
The number of groups now is 2
[3, 3, 3, 3, 4]
Input the to-be-merge element: 3
Merge to the target element's group: 4
The number of groups now is 1
[4, 4, 4, 4, 4]
Input the to-be-merge element:

最少需要n-1 = 4 次合并,就可以将所有元素都合并到一个分组到一个组。

数据结构之并查集:并查集的介绍与Python代码实现——18相关推荐

  1. 数据结构之平衡树:红黑树的介绍与Python代码实现——17

    红黑树的介绍与Python代码实现 红黑树的介绍 红黑树(Red-Black Tree)是一种平衡二叉查找树,它是一种以比较简单的方式实现的2-3查找树 红黑树基于2-3查找树的表现 红链接:将两个2 ...

  2. 数据结构--队列、双端队列实际举例详解(Python代码)

    https://blog.csdn.net/hanhanwanghaha宝藏女孩 欢迎您的关注! 欢迎关注微信公众号:宝藏女孩的成长日记 让这个可爱的宝藏女孩在努力的道路上与你一起同行! 如有转载,请 ...

  3. 【数据结构】动态规划——找零钱问题解析(含c++和python代码)

    一个具体的找零钱问题: 参考:程序员面试再也不怕动态规划了,看动画,学DP,找零钱 (LeetCode 322) 硬币面值:1,2,5,7,10 找零金额:14 step1:定义长度为15的dp数组 ...

  4. 基础数据结构(二):字典树、并查集、堆、哈希表、字符串的哈希方式、STL的常见容器及其接口

    文章目录 一.字典树Trie 1 原理 2 Trie字符串统计 3 [LeetCode 208. 实现 Trie (前缀树)](https://leetcode-cn.com/problems/imp ...

  5. 数据结构(八):并查集详解 (多图+动图)

    目录 一.什么是并查集 二.并查集的存储结构 三.并查集的基本操作 (一)初始化 (二)Find操作 (三)Union操作 四.并查集的优化 (一)Union操作优化(小树并入大树) (二)Find操 ...

  6. 并查集(python代码实现)

    并查集 并查集是一种树型的数据结构,用于处理一些不相交集合的合并与查询问题.主要两种操作(合并和查询): 根据两个元素的关系合并两个集合: 查询两个元素是否存在关系(是否在同一个集合中)和查询节点的根 ...

  7. 绿建科技加密图纸查看器安装_施工图看不懂?1.1G工程施工图纸详解,253页图文合集一查就清楚...

    施工图看不懂?1.1G工程施工图纸详解,253页图文合集一查就清楚 只要是对建筑行业,有所了解的朋友都清楚,钢筋施工图纸对于建筑物,有着举足轻重的地位!一点都不得马虎大意,接触建筑行业,第一步还是需 ...

  8. 洛谷 P1892 [BOI2003]团伙(并查集变种 反集)

    [BOI2003]团伙 题目描述 现在有 n n n 个人,他们之间有两种关系:朋友和敌人.我们知道: 一个人的朋友的朋友是朋友 一个人的敌人的敌人是朋友 现在要对这些人进行组团.两个人在一个团体内当 ...

  9. Redis数据结构、持久化、缓存技术和集群详解

    redis 是什么? 是完全开源免费的,用c语言编写的,是一个单线程,高性能的(key/value)内存数据库,基于内存运行并支持持久化的nosql数据库 能干嘛? 主要是用来做缓存,但不仅仅只能做缓 ...

最新文章

  1. 使用Powershell将PST导入Exchange 2007
  2. wpf 客户端【JDAgent桌面助手】开发详解(四) popup控件的win8.0的bug
  3. 比特币官方客户端钱包是用什么语言开发的_『学概念找员外』比特币网络(三)...
  4. 怎么判断程序运行的当前目录在哪?关键词:根目录
  5. 计算机一级单元格公式设置错误是什么原因,excel表格公式出错怎么解决,电子表格求和出错...
  6. jquery --- 控制元素的隐藏/显示
  7. 从明面上学习ASP.NET Core
  8. Qt笔记-QTcpSocket跨线程调用(官方推荐方法,非百度烂大街方法)
  9. [转]这才是真正的3D显示!Leap Motion推出次毫米级3D手动控制技术,让人手和影像融为一体...
  10. Python18行代码做出来这样有点浪漫,又有点极客的“内涵”图
  11. Python 连接开放航空交通数据,轻松构建航班跟踪应用!
  12. 使用VLC Media Player 在Mac上修剪视频
  13. spring mvc入门案例
  14. 使用miniSipServer为中小企业搭建VOIP服务器
  15. Fiddler抓取雷电模拟器数据包,模拟器代理设置
  16. 前后端分离之Web前端架构设计
  17. Android虚拟机参数
  18. Ubuntu系统配置win10双系统
  19. 博士申请 | 香港理工大学智能计算实验室招收机器学习方向全奖博士/RA/博后
  20. 【乐逍遥网站设计】玻璃拟态: 为网站设计带来维度效果

热门文章

  1. java 线程池 初始大小_为什么tomcat的默认线程池大小如此之大? - java
  2. Ubuntu17.04 之 systemd 设置开机启动
  3. vuex webpack 配置_vue+webpack切换环境和打包之后服务器配置
  4. 【教程分享】Jmeter入门教程
  5. 关于在软件中添加扫描二维码功能的详细步骤及对应的资源。
  6. 车流检测之halcon光流法算法实现
  7. 第五季1:AP模式USB-WIFI网卡移植与测试
  8. ubuntu14.04上网问题
  9. MySQL和Mariadb都启动不了了_linux centos7mariadb安装成功启动不了 解决思路
  10. Dart中的mixins