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

路径压缩继续优化并查集

在实现的并查集中,在合并操作merge(item1, item2)时,会不管两个元素所在的分组大小,总是将item
1的分组合并到item2的分组,这样可能会导致树的深度无必要地增加:
在这里插入图片描述
如果是大树合并到小树上,会导致树的深度增加,进而造成增删改查等操作的代价增大
因此我们要对并查集的合并操作进行优化。

优化合并方式

  • 每次合并时,都将小分组的元素往大分组合并,由于本例初始化都是一个元素,对应一个分组,它合并的情况可能会变成如下这样(箭头代表分组之间的edge),类似一颗星状的树:
    在这里插入图片描述

属性和方法说明

  1. self.num_groups 分组数量
  2. self.groups 一个数组,索引代表传入的item的值,元素代表分组编号
  3. nums_in_each_group 一个数组,索引代表分组编号,元素代表每个分组的元素个数
  4. count_groups() 获取当前总共分数的数量
  5. in_the_same_group(item1, item2) 判断两个传入的item是否在同一分组
  6. which_group(item) 获取传入的item的所在分组
  7. unite(item1, item2) 合并两个元素到同一分组,小的分组总是会往大的分组合并

Python代码实现及测试

class UF_Tree_Weighted:def __init__(self, n):self.num_groups = nself.groups = [i for i in range(n)]self.nums_in_each_group = [1 for _ in range(n)]def count_groups(self):return self.num_groupsdef in_the_same_group(self, item1, item2):return self.which_group(item1) == self.which_group(item2)def which_group(self, item):"""Find item's root------>groups[groups[groups[...groups[item]...]]]"""while self.groups[item] != item:item = self.groups[item]return itemdef unite(self, item1, item2):p = self.which_group(item1)q = self.which_group(item2)if p == q:returnif self.nums_in_each_group[p] <= self.nums_in_each_group[q]:# Merge the smaller group into the bigger'sself.nums_in_each_group[q] += self.nums_in_each_group[p]self.nums_in_each_group[p] = 0# Change the smaller group-number to the bigger's group-numberself.groups[p] = self.groups[q]else:# Merge the smaller group into the bigger'sself.nums_in_each_group[p] += self.nums_in_each_group[q]self.nums_in_each_group[q] = 0self.groups[q] = self.groups[p]# Numbers of group subtract 1self.num_groups -= 1if __name__ == '__main__':UF = UF_Tree_Weighted(5)print(f"The initial number of groups is {UF.num_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.unite(p, q)print(f"The number of groups now is {UF.count_groups()}")print(UF.groups)print(f"Elements in each group: {UF.nums_in_each_group}")

运行结果

The initial number of groups is 5
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]
Elements in each group: [0, 2, 1, 1, 1]
Input the to-be-merge element: 1
Merge to the target element's group: 2
The number of groups now is 3
[1, 1, 1, 3, 4]
Elements in each group: [0, 3, 0, 1, 1]
Input the to-be-merge element: 3
Merge to the target element's group: 2
The number of groups now is 2
[1, 1, 1, 1, 4]
Elements in each group: [0, 4, 0, 0, 1]
Input the to-be-merge element: 2
Merge to the target element's group: 4
The number of groups now is 1
[1, 1, 1, 1, 1]
Elements in each group: [0, 5, 0, 0, 0]
Input the to-be-merge element: 

当调用unite()合并时,合并时不考虑参数的先后位置,而是考虑分组的大小,总是会有小的分组合并到大的分组

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

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

相关文章

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;这些关键字参数在函数内部…

视频操作_02视频追踪:meanshift算法+Camshift算法

1.meanshift 1.1原理 meanshift算法的原理很简单。假设你有一堆点集&#xff0c;还有一个小的窗口&#xff0c;这个窗口可能是圆形的&#xff0c;现在你可能要移动这个窗口到点集密度最大的区域当中。 如下图&#xff1a; 最开始的窗口是蓝色圆环的区域&#xff0c;命名为C1…

数据结构之图:图的搜索,Python代码实现——23

图的搜索 深度优先搜索(Depth First Search) 定义 从例子出发理解 DFS是一种用于遍历或搜寻树类或图类数据结构的算法&#xff0c;这种算法从根结点出发&#xff08;如果是图&#xff0c;则任意选择一个顶点作为根结点&#xff09;&#xff0c;在回溯之前会尽可能地遍历每一…

dynamic_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(work, str…

PythonR语言-python和r相遇

前言 如果你是数据分析领域的新兵&#xff0c;那么你一定很难抉择——在进行数据分析时&#xff0c;到底应该使用哪个语言&#xff0c;R还是Python&#xff1f;在网络上&#xff0c;也经常出现诸如“我想学习机器语言&#xff0c;我应该用哪个编程语言”或者“我想快速解决问题…

人脸识别案例:【实战】opencv人脸检测+Haar特征分类器

1 基础 我们使用机器学习的方法完成人脸检测&#xff0c;首先需要大量的正样本图像&#xff08;面部图像&#xff09;和负样本图像&#xff08;不含面部的图像&#xff09;来训练分类器。我们需要从其中提取特征。下图中的 Haar 特征会被使用&#xff0c;就像我们的卷积核&…

Android input 子设备adb 调试命令

adb shell getevent 查看input设备属于哪一个event adb shell getevent dev/input/event1 与input event 对应的信息 rootandroid:/ # cat/proc/bus/input/devices 查看TP上报的速率&#xff1a; getevent -r /dev/input/event1 查看TP上报的键值&#xff1a;getevent -l…

数据结构之图:用图解决案例,Python代码实现——24

用图解决畅通工程案例与途径查找 代码中需要引入的类方法代码链接&#xff1a; 无向图Undigraph深度优先搜索DFS与广度优先搜索BFS 畅通工程-续 介绍 案例和之前并查集中实现的一样&#xff0c;但问题略有改动&#xff0c;需要判断9-10城市是否相通&#xff0c;9-8城市是否…

【在虚拟环境下完美解决】1698: error: (-215:Assertion failed) empty() in function cv::CascadeClassifier

问题描述 官方文档做的Demo发现遇到了错误提示如下&#xff1a; error: (-215:Assertion failed) !empty() in function ‘cv::CascadeClassifier::detectMultiScale’ 错误的原因&#xff1a; 出现 error: (-215:Assertion failed) !empty() in function ‘cv::CascadeClassif…

在线生成大全(这里真的什么都有)

粉丝身份证&#xff1a;http://id.igogo8.com/ 制作印章&#xff1a;http://www.makepic.com/print.php 邮址图片生成&#xff1a;http://www.makepic.com/email.php条形码生成&#xff1a;http://www.makepic.com/barcode.phpKiss学堂 颁发结业证&#xff1a;http://www.makep…