【Python数据结构】——并查集的实现(查找、合并、集合、实例)

#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Time    : 2021/7/30 23:12
# @Author  : @linlianqin
# @Site    : 
# @File    : 并查集专题(合并、查找、集合).py
# @Software: PyCharm
# @description:'''
并查集其实就是多个数组,每一个数组都是一颗树,然后并查集相当于是一个森林
基本操作:
合并(union)
查找(find)
集合(set)
'''# 初始化:给定一系列升序连续的编号,将编号初始化为并查集,形成一个森林,每个元素的父亲结点(根节点)都是自己
def UFS_init(n):father = [i for i in range(n)]root = [i for i in range(n)]return father,root# 查找:在已经有的并查集中查找给定的元素的根节点——即通过self,father来进行查找根节点
def UFS_findroot(element,n,father):# 找到根节点时,返回根节点if element == father[element]:return element# 没有找到则继续查找return UFS_findroot(father[element],n,father)# 进行路径压缩
def UFS_ZIP(element,father,root):# 临时保存当前元素temp = element# 查找element的根节点while element != father[element]:element = father[element]# 将路径压缩while temp != father[temp]:root[temp] = elementtemp = father[temp]return element# 查找:在已经有的并查集中查找给定的元素的根节点——路径压缩,即通过self.root来进行查找根节点,时间复杂度为O(1)
def UFS_findrootzip(element,root):return root[element]# 合并:
## 当两个元素不在同一个集合的时候合并两个集合,即将其中一个集合的根节点指向另一个集合的根节点即可合并
## 当两个元素在同一个集合的时候不进行操作
def UFS_union(x,y,n,father,root):### 判断两个元素是否在同一个集合的方法是判断两个元素的根节点是否为同一个,是则在同一个集合,否则不是rootx = UFS_findroot(x,n,father)rooty = UFS_findroot(y,n,father)if rootx != rooty:root[rooty] = rootx # 将x的根节点设置为yfather[rooty] = rootx # 将x的父节点设置为yreturn root,father# 假设有编号0-10的同学
# 其中两个人为一组,一个人可以出现在多个二人组合中,问可以分为几个大组
# 输入:人数n(用于创建一定空间的父节点数组和根节点数组),组别m(用于合并同一组的人)
# 如输入:
# n = 11 , m = 6
# groups = [[0,1,2],[2,3,4],[4,6],[5,7],[8,9],[9,10]]
# 输出:
# group_num = 3 _____ 【0,1,2,3,4,6】【8,9,10】def main(m,n,groups):# 大组的个数其实就是并查集中不同根节点的个数isroot = [0 for _ in range(n)]# 初始化并查集father,root = UFS_init(n)print("初始化:")print("father:",father)print("root:",root)# 遍历组别,合并同一组别的两个集合for group in groups:for index in range(len(group)-1):UFS_union(group[index],group[index+1],n,father,root)print("合并后:")print("father:",father)print("root:",root)# 遍历self.root,查看有多少个不同的集合个数for i in range(n):isroot[root[i]] = 1print("isroot:", isroot)num_group = sum(isroot)return num_groupn = 11
m = 6
groups = [[0,1,2],[2,3,4],[4,5,6],[5,7],[8,9],[9,10]]
print(main(m,n,groups))## 其他
# todo:统计每个集合的元素个数——将isroot[root[i]] = 1改为isroot[root[i]] += 1
# todo:答应出合并集合后的最终状态——遍历所有元素,res = [[] for _ in range(n],将元素对应添加到根节点作为索引的对应小列表中即可

运行结果:

初始化:
father: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
root: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
合并后:
father: [0, 0, 0, 0, 0, 0, 0, 0, 8, 8, 8]
root: [0, 0, 0, 0, 0, 0, 0, 0, 8, 8, 8]
isroot: [1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0]
2

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

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

相关文章

如何实现ABB机器人与老式焊机的连接控制

问题: 请教一个机器人与老式焊机如何连接,如何设置。 我现在是用SET指令设DO为1再外接继电器来控制焊机工作的,用RESET指令来使焊机停止工作的。现在可 以焊接,但是如果中间停止或机器人报错停止不动,焊机始终处于工作…

gitlab 杂记

GitLab 编译部署 1,请尽量不要在国内主机上部署,中途天朝很有可能导致gem执行出现问题,以下在AWS上部署; 2,系统中必须要有swap分区,不然会出现500错误; 系统版本:CentOS 6.x x86_6…

Hadoop分布式系统的安装部署

1、关于虚拟机的复制 新建一台虚拟机,系统为CentOS7,再克隆两台,组成一个三台机器的小集群。正常情况下一般需要五台机器(一个Name节点,一个SecondName节点,三个Data节点。) 此外,为…

Windows线程调度学习(一)

前言 Windows 线程调度器的实现分散在内核各处,并且与许多组件都有关联,很难进行系统地学习,所以我打算写几篇文章来记录下自己学习过程中的思考和分析,同时也方便日后查阅,此文可以看作是《Windows内核原理与实现》中…

机器人的有效负荷

问题: 假如我想在程序里做多几个有效载荷,但在手动操纵画面上只能加一个,其它要怎样用?给个实际例子给我啊. 回答: 在搬运中,确实是有载荷发生变化的情况,如两抓(A B)的夹具,有三种载荷情况,1、A抓有载荷…

【Python生成readme文件】——Markdown语法

链接:https://www.cnblogs.com/wj-1314/p/8547763.html

编程之美2.13子数组的最大乘积

题目: 给定一个长度为N的数组,只许用乘法,不许用除法,计算任意(N-1)个数的组合中乘积最大的一个组,并写出算法的时间复杂度。 如果把所可能的乘积找出来,共有(N-1&#x…

[SceneKit专题]11-Reference-Nodes引用节点

说明 本系列文章是对<3D Apple Games by Tutorials>一书的学习记录和体会 此书对应的代码地址 SceneKit系列文章目录 本文将完成一个完整的node节点,带有完整贴图,并将其导入其他场景中,成为其中的一个引用节点.这样可以更方便的组织场景,并能复用场景中的节点,正类似于面…

scapy 安装及简单测试

关于scapy Scapy的是一个强大的交互式数据包处理程序&#xff08;使用python编写&#xff09;。它能够伪造或者解码大量的网络协议数据包&#xff0c;能够发送、捕捉、匹配请求和回复包等等。它可以很容易地处理一些典型操作&#xff0c;比如端口扫描&#xff0c;tracerouting&…

MoveAbsJ在使用时和MOVEJ有什么区别

问 题&#xff1a; MoveAbsJ在使用时和MOVEJ有什么区别 回 答&#xff1a; MoveAbsJ的目标点是用六个轴伺服电机的偏转角度值来指定的。 MOVEJ和MOVEL的目标点是用坐标系X Y Z的值来指定的。

Python中的序列操作

Python中的序列操作 分类: python undefined 官方手册&#xff1a;https://docs.python.org/3.7/library/stdtypes.html#sequence-types-list-tuple-range 序列简介 序列是指按照位置顺序来存储数据的数据结构&#xff0c;也就是说能通过数值索引进行操作。实际上&#x…

automaticallyAdjustsScrollViewInsets的作用

简单点说就是automaticallyAdjustsScrollViewInsets根据按所在界面的status bar&#xff0c;navigationbar&#xff0c;与tabbar的高度&#xff0c;自动调整scrollview的 inset,设置为no&#xff0c;不让viewController调整&#xff0c;我们自己修改布局即可~转载于:https://ww…

JavaScript 基础知识 - BOM篇

前言 本篇文章是JavaScript基础知识的BOM篇&#xff0c;如果前面的《JavaScript基础知识-DOM篇》看完了&#xff0c;现在就可以学习BOM了。 注意&#xff1a; 所有的案例都在这里链接: 提取密码密码: yvxo&#xff0c;文章中的每个案例后面都有对应的序号。 1. BOM 基本概念 B…

全球首例机器人自杀事件 因受够无聊家务

据凤凰网,一个奥地利家庭购买一小机器人,每天工作就是倒垃圾、倒垃圾。一天完工后,它竟自己启动,爬到炉边&#xff0c;推开上面的锅&#xff0c;把自己活活烧死…专家称这个机器人实在受够了无聊的家务琐事&#xff0c;才毅然选择自杀机器人也是有尊严的!为这有骨气的robot点根…

【python基础】——数据类型(列表、字典、集合)

骏马金龙——python语法基础 python基础 变量与运算 符号//%**意义整除整除取余幂次方数据种类 #mermaid-svg-7nSRRijcYFCYwTDr .label{font-family:trebuchet ms, verdana, arial;font-family:var(--mermaid-font-family);fill:#333;color:#333}#mermaid-svg-7nSRRijcYFCYw…

linux命令:mkdir命令

命令参数&#xff1a; -m, --mode模式&#xff0c;设定权限<模式> (类似 chmod)&#xff0c;而不是 rwxrwxrwx 减 umask -p, --parents 可以是一个路径名称。此时若路径中的某些目录尚不存在,加上此选项后,系统将自动建立好那些尚不存在的目录,即一次可以建立多个目录; …

js设置奇偶行数样式

$(document).ready(function () {odd { "background": "none" }; //奇数样式 even { "background": "#f3f3f3" }; //偶数样式 odd_even(".gys_xq", odd, even);});function odd_even(id, odd, even) {$(id).find("…

贝塞尔曲线切割圆角

ios 系统框架已经给我们提供了相应的切割圆角的方法, 但是如果在一个见面有很多控件切割的话会出现卡顿和个别不切的现象 ?123456789101112131415161718192021222324252627/* 创建一个Button */UIButton * button [UIButton buttonWithType:(UIButtonTypeSystem)];[button se…

机器人实现屠宰自动化

当 WESTFLEISCH 注册合作社考虑在 Coesfeld 肉类加工中心内自动化原有的人工屠宰设备过程时&#xff0c;首先在“剔除直肠”及“切开盆腔骨及腹部”两个流程中测试使用了两台库卡机器人。在此过程中&#xff0c;机器人主要以它工作的质量及经济效益说服了使用者。 实施措施/解…

DOM编程艺术12章

在submit.html中&#xff0c;代码简略成如下也行 <article><h1>Thanks!</h1><p>Thanks for contacting us. Well get back to you as soon as we can.</p></article> </body> </html> 说明了只是插入article的部分&#xff0c…