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

并查集的介绍

  • 并查集(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 次合并,就可以将所有元素都合并到一个分组到一个组。

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

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

相关文章

我的合伙人

我突然想写一篇为《我的合伙人》的文章。 为什么要写这篇文章,因为我发现在我们的生活中,能找到一个人做为自己的合伙人是很困难的。 我在看《富爸爸,穷爸爸》这本书的时候发现,基米和他的朋友组成了合伙人,他们有共同…

图像特征提取与描述_角点特征01:Harris算法+Shi-Tomas算法

1 Harris角点检测 1.1 原理 Harris角点检测的思想是通过图像的局部的小窗口观察图像,角点的特征是窗口沿任意方向移动都会导致图像灰度的明显变化,如下图所示: 将上述思想转换为数学形式,即将局部窗口向各个方向移动(u,v)并计算…

canvas小程序-快跑程序员

canvas不用说html5带来的好东西,游戏什么的,么么哒 记得有一天玩手机游戏,就是一个跳跃过柱子那种,其实元素很简单啊,app能开发,借助html5 canvas也可以啊,于是就开始了。 --------------------…

数据结构之并查集:UF-Tree优化并查集——19

并查集的优化 在上一节了解到并查集的快速查询,合并,判断归属组等操作,虽然这些操作都非常方便,但是在数据量较大的情况下,并查集的效率并不算高: 上一节中实现代码中使用的合并方法(merge,AP…

图像特征提取与描述_角点特征02:SIFT算法+SURF算法

SIFT/SURF算法 1.1 SIFT原理 前面两节我们介绍了Harris和Shi-Tomasi角点检测算法,这两种算法具有旋转不变性,但不具有尺度不变性,以下图为例,在左侧小图中可以检测到角点,但是图像被放大后,在使用同样的窗…

linux内核定时器使用

//加入头文件 #include <linux/hrtimer.h> //init owen.wei modify time struct hrtimer timer_ptt; //初始化定时器 hrtimer_init(&timer_ptt, CLOCK_MONOTONIC, HRTIMER_MODE_REL); time

图像特征提取与描述_角点特征03:Fast算法+ORB算法

1 Fast算法 1.1 原理 我们前面已经介绍过几个特征检测器&#xff0c;它们的效果都很好&#xff0c;特别是SIFT和SURF算法&#xff0c;但是从实时处理的角度来看&#xff0c;效率还是太低了。为了解决这个问题&#xff0c;Edward Rosten和Tom Drummond在2006年提出了FAST算法&…

windows xp 下的putty不能使用小键盘的问题

change setting->Features->Disable application keypad mode (勾选上这个)

数据结构之并查集:路径压缩继续优化并查集——20

路径压缩继续优化并查集 在实现的并查集中&#xff0c;在合并操作merge(item1, item2)时&#xff0c;会不管两个元素所在的分组大小&#xff0c;总是将item 1的分组合并到item2的分组&#xff0c;这样可能会导致树的深度无必要地增加&#xff1a; 如果是大树合并到小树上&…

Pycharm使用matplotlib绘图时无法显示中文问题

在画图语句前&#xff0c;加上以下两行代码&#xff1a; plt.rcParams[font.sans-serif] [uSimHei] plt.rcParams[axes.unicode_minus] False

caffe各种依赖包配置

从15号配置完了云服务器的FTP服务后就一直在弄caffe。 原以为会很简单的yum install 几个依赖包。然后下载caffe并且make 编译一下就可以了。 结果万万没想到我还是too young too naive! 依赖包大部分只能靠手装,因为yum install 有很大几率装不上这些依赖包&#xff01; 以下是…

高通8X25Q wifi BT 调试文档

1、蓝牙调试 主要是蓝牙的I2C地址跟 地磁仪的I2C地址冲突&#xff0c;被地磁仪给占用了&#xff0c;改回来就好了。 --- a/android-lte/kernel/arch/arm/mach-msm/msm8x25/goso-msm7627a-bt.c b/android-lte/kernel/arch/arm/mach-msm/msm8x25/goso-msm7627a-bt.c -981,8 98…

数据结构之并查集:并查集解决案例, Python——21

并查集解决案例畅通工程 案例问题介绍&#xff1a; 某省调查城镇交通状况,得到现有城镇道路统计表,表中列出了每条道路直接连通的城镇。省政府"畅通工程”的目标是使全省任何两个城镇间都可以实现交通(但不一定有直接的道路相连,只要互相间接通过道路可达即可)。问最少还…

图像特征提取与描述_角点特征04:LBP算法+HOG特征算子

1.LBP算法 LBP(Local Binary Pattern)指局部二值模式&#xff0c;是一种用来描述图像局部特征的算子&#xff0c;LBP特征具有灰度不变性和旋转不变性等显著优点。它是由T. Ojala, M.Pietikinen, 和 D. Harwood在1994年提出&#xff0c;由于LBP特征计算简单、效果较好&#xff…

判断两个字符串是否由相同的字符组成

描述 判断两个字符串是否由相同的字符组成 分析 方法一&#xff0c;排序法。对两个字符串进行排序&#xff0c;然后在比较。 方法二&#xff0c;空间换时间。ascII字符共256个&#xff0c;对字符串1出现的字符在对应的数组里加1&#xff0c;对字符串1出现的字符在对应的数组里减…

Android input keyevent

adb shell input keyevnet 3 点击返回键操作 adb shell input keyevent 4 点击home键操作 ./frameworks/base/core/java/android/view/KeyEvent.java 这里面有的keyevent都可以用得上。

视频操作_01视频读写:视频读写+读取视频+保存视频

1 从文件中读取视频并播放 在OpenCV中我们要获取一个视频&#xff0c;需要创建一个VideoCapture对象&#xff0c;指定你要读取的视频文件&#xff1a; 1.创建读取视频的对象 cap cv.VideoCapture(filepath) 参数&#xff1a; filepath: 视频文件路径 2.视频的属性信息 2.1…

数据结构之图:无向图的介绍与功能实现,Python——22

无向图&#xff08;Undigraph&#xff09;的介绍 引入 生活中的图&#xff0c;有地图&#xff0c;集成电路板的图&#xff0c;可以看类似的看做是数据结构中的图数据有"一对一"&#xff0c;“一对多”和“多对多”的关系&#xff0c;前两种分别表示线性表和树的存储…

dynmic_debug动态控制kernel下的日志输出

1、修改代码如下: --- a/kernel/drivers/gosodrv/touchscreen/ft5x06_ts.c +++ b/kernel/drivers/gosodrv/touchscreen/ft5x06_ts.c @@ -402,6 +402,7 @@ static void ft5x0x_ts_pen_irq_work(struct work_struct *work) struct ft5x06_ts_data *data = container_of…

Python学习札记(十三) Function3 函数参数二

参考&#xff1a;函数参数 Note A.关键字参数&#xff1a; 1.关键字参数&#xff1a;**kw 可变参数允许你传入0个或任意个参数&#xff0c;这些可变参数在函数调用时自动组装为一个tuple。而关键字参数允许你传入0个或任意个含参数名的参数&#xff0c;这些关键字参数在函数内部…