前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >利用Python实现Union-Find算法

利用Python实现Union-Find算法

原创
作者头像
华科云商小徐
发布于 2025-01-10 03:34:02
发布于 2025-01-10 03:34:02
10200
代码可运行
举报
文章被收录于专栏:小徐学爬虫小徐学爬虫
运行总次数:0
代码可运行

Union-Find(又称 并查集)是一种高效解决 动态连通性问题 的算法。它主要提供两种操作:

  1. Union(x, y):将元素 xy 连接。
  2. Find(x):找到元素 x 所属的集合的标识符(通常是集合的根节点)。

常用的优化策略:

  • 路径压缩(Path Compression):Find 操作中,将访问的节点直接连接到根节点,从而加速后续操作。
  • 按秩合并(Union by Rank):Union 操作中,总是将较小的树合并到较大的树中,以减少树的高度。

1、问题背景

Union-Find 算法又称不交并集算法,是一种用于维护一组元素之间不相交集合的算法。在实际应用中,Union-Find 算法可以用来解决多种问题,例如判断两个元素是否属于同一个集合、将两个集合合并为一个集合等。

在 Union-Find 算法中,每个元素都由一个父节点表示,父节点指向该元素所属的集合的根节点。如果两个元素的父节点相同,则这两个元素属于同一个集合。如果两个元素的父节点不同,则这两个元素不属于同一个集合。

2、解决方案

Python 中 Union-Find 算法有两种实现方法:使用数组和使用字典。

使用数组实现 Union-Find 算法时,每个元素的父节点存储在一个数组中。如果两个元素的父节点相同,则这两个元素属于同一个集合。否则,这两个元素不属于同一个集合。

使用字典实现 Union-Find 算法时,每个元素的父节点存储在一个字典中。字典的键是元素,字典的值是该元素的父节点。如果两个元素的父节点相同,则这两个元素属于同一个集合。否则,这两个元素不属于同一个集合。

下面是使用 Python 实现 Union-Find 算法的示例代码:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
def union_find_array(lis):
    """
    使用数组实现 Union-Find 算法。
​
    参数:
        lis: 一组元素。
​
    返回:
        一个列表,其中每个元素的父节点存储在一个数组中。
    """
​
    # 创建一个数组,将每个元素的父节点初始化为其自身。
    parents = [i for i in range(len(lis))]
​
    def find(x):
        """
        查找元素 x 的父节点。
​
        参数:
            x: 一个元素。
​
        返回:
            元素 x 的父节点。
        """
​
        # 如果元素 x 的父节点不是其自身,则继续查找元素 x 的父节点。
        if parents[x] != x:
            parents[x] = find(parents[x])
​
        # 返回元素 x 的父节点。
        return parents[x]
​
    def union(x, y):
        """
        将元素 x 和元素 y 所属的集合合并为一个集合。
​
        参数:
            x: 一个元素。
            y: 一个元素。
        """
​
        # 查找元素 x 的父节点。
        x_parent = find(x)
​
        # 查找元素 y 的父节点。
        y_parent = find(y)
​
        # 如果元素 x 和元素 y 所属的集合不是同一个集合,
        # 则将元素 x 和元素 y 所属的集合合并为一个集合。
        if x_parent != y_parent:
            parents[y_parent] = x_parent
​
    # 返回父节点数组。
    return parents
​
​
def union_find_dict(lis):
    """
    使用字典实现 Union-Find 算法。
​
    参数:
        lis: 一组元素。
​
    返回:
        一个字典,其中每个元素的父节点存储在一个字典中。
    """
​
    # 创建一个字典,将每个元素的父节点初始化为其自身。
    parents = {i: i for i in lis}
​
    def find(x):
        """
        查找元素 x 的父节点。
​
        参数:
            x: 一个元素。
​
        返回:
            元素 x 的父节点。
        """
​
        # 如果元素 x 的父节点不是其自身,则继续查找元素 x 的父节点。
        if parents[x] != x:
            parents[x] = find(parents[x])
​
        # 返回元素 x 的父节点。
        return parents[x]
​
    def union(x, y):
        """
        将元素 x 和元素 y 所属的集合合并为一个集合。
​
        参数:
            x: 一个元素。
            y: 一个元素。
        """
​
        # 查找元素 x 的父节点。
        x_parent = find(x)
​
        # 查找元素 y 的父节点。
        y_parent = find(y)
​
        # 如果元素 x 和元素 y 所属的集合不是同一个集合,
        # 则将元素 x 和元素 y 所属的集合合并为一个集合。
        if x_parent != y_parent:
            parents[y_parent] = x_parent
​
    # 返回父节点字典。
    return parents
​
​
# 测试代码。
lis = [[1, 2], [2, 3], [4, 5], [6, 7], [1, 7]]
parents_array = union_find_array(lis)
parents_dict = union_find_dict(lis)
print(parents_array)
print(parents_dict)

上述代码中,union_find_array() 函数和 union_find_dict() 函数分别使用数组和字典实现了 Union-Find 算法。find() 函数和 union() 函数分别是 Union-Find 算法中查找元素父节点和将两个集合合并为一个集合的函数。

使用数组实现 Union-Find 算法的代码如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
def union_find_array(lis):
​
    # 创建一个数组,将每个元素的父节点初始化为其自身。
    parents = [i for i in range(len(lis))]
​
    def find(x):
​
        # 如果元素 x 的父节点不是其自身,则继续查找元素 x 的父节点。
        if parents[x] != x:
            parents[x] = find(parents[x])
​
        # 返回元素 x 的父节点。
        return parents[x]
​
    def union(x, y):
​
        # 查找元素 x 的父节点。
        x_parent = find(x)
​
        # 查找元素 y 的父节点。
        y_parent = find(y)
​
        # 如果元素 x 和元素 y 所属的集合不是同一个集合,
        # 则将元素 x 和元素 y 所属的集合合并为一个集合。
        if x_parent != y_parent:
            parents[y_parent] = x_parent
​
    # 返回父节点数组。
    return parents
​
​
# 测试代码。
lis = [[1, 2], [2, 3], [4, 5], [6, 7], [1, 7]]
parents_array = union_find_array(lis)
print(parents_array)

输出结果为:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
[2, 2, 2, 6, 2]

使用字典实现 Union-Find 算法的代码如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
def union_find_dict(lis):
​
    # 创建一个字典,将每个元素的父节点初始化为其自身。
    parents = {i: i for i in lis}
​
    def find(x):
​
        # 如果元素 x 的父节点不是其自身,则继续查找元素 x 的父节点。
        if parents[x] != x:
            parents[x] = find(parents[x])
​
        # 返回元素 x 的父节点。
        return parents[x]
​
    def union(x, y):
​
        # 查找元素 x 的父节点。
        x_parent = find(x)
​
        # 查找元素 y 的父节点。
        y_parent = find(y)
​
        # 如果元素 x 和元素 y 所属的集合不是同一个集合,
        # 则将元素 x 和元素 y 所属的集合合并为一个集合。
        if x_parent != y_parent:
            parents[y_parent] = x_parent
​
    # 返回父节点字典。
    return parents
​
​
# 测试代码。
lis = [[1, 2], [2, 3], [4, 5], [6, 7], [1, 7]]
parents_dict = union_find_dict(lis)
print(parents_dict)

输出结果为:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
{1: 2, 2: 2, 3: 2, 4: 6, 5: 6, 6: 6, 7: 2}

基本的 Union-Find 非常适合处理动态连通性问题。优化版本结合路径压缩和按秩合并,使其在实际应用中非常高效。可以扩展实现更多功能,如连通性查询、连通分量计数等。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
暂无评论
推荐阅读
基于jQuery.i18n.properties 实现前端页面的资源国际化
哎_小羊
2018/01/02
4K0
基于jQuery.i18n.properties 实现前端页面的资源国际化
四种方式解决页面国际化问题——步骤详解
最近在做公司的网站,但是有一个是比较麻烦的事情就是需要做的一个国际化,我们都知道后端其实做国际化的话是直接可以配置的,相对来说是比较简单的,但是前端做国际化的话是很麻烦的一件事情,但是不是说不可以做,我之前呢是准备直接做两套网站,这样一样可以实现国际化的效果,其实这也是过去网站国际化的一个做法,包括现在也有人这样做,这个办法我们就不具体的写了,因为很简单,直接一模一样的写两份,一份是中文的一份是英文的就行了!其实我没写之前看了很多的资料,关于国际化的,很多的大神提供了很多的办法,但是都不是很详细,写的很模糊,所以我查看很多资料以后决定写这篇博客,总结一下自己的想法,同时希望可以帮助很多的人解决这个问题!
何处锦绣不灰堆
2020/05/29
1.4K0
jquery/vue/react前端多语言国际化翻译方案指南
每个开发者能希望编写的程序可以让全世界的用户使用,它要求从产品中抽离所有地域语言,国家/地区和文化相关的元素。换种说法,「应用程序」的功能和「代码设计」时考虑在不同地区运行的需要,其代码适应不同区域要求。开发这样的的过程,就称为国际化( internationalization),简称i18n。
Tz一号
2021/09/08
2.8K0
web项目实现国际化
2.资源文件:以.properties文件的key-value的特性,设置key和value,一般一个语种要写一个文件。
Mshu
2018/10/31
1.2K0
Spring i18n国际化
随着互联网的发展,越来越多的企业和个人开始关注全球化的需求。在这个背景下,多语言支持成为了一个重要的课题。Spring框架作为一款优秀的Java开发框架,提供了丰富的i18N支持,能帮助搬砖工快速实现多语言应用。
鱼找水需要时间
2023/06/20
3370
Spring i18n国际化
springboot-i18n国际化
In computing, internationalization and localization are means of adapting computer software to different languages, regional peculiarities and technical requirements of a target locale.
用户2146693
2019/08/08
1.3K0
springboot-i18n国际化
公司国际化笔记
国际化原因 为了更加方便切换版本,让代码应该一次完成,多国使用,除了使用英语外,还要可以进行单独语言包的一个添加,文章就是这样的一个例子. 公司接到一个国外的项目,需要法文版本的,但是公司通晓法文的基本没有,于是商量降低要求之后开始国际化采用英文展示就行,于是任务就开始了. 目录 [TOC] 需求分析 项目的代码全部国际化任务量不小,公司基本没有用什么框架,基本采用的是js,html实现数据的展示,没有采用框架,只是有一些简单的逻辑分层,加大了不少国际化的难度. 但是针对java部分的代码,虽说稍微熟悉一些
@坤的
2018/06/29
1.2K0
Spring之 国际化:i18n
国际化也称作i18n,其来源是英文单词 internationalization的首末字符i和n,18为中间的字符数。由于软件发行可能面向多个国家,对于不同国家的用户,软件显示不同语言的过程就是国际化。通常来讲,软件中的国际化是通过配置文件来实现的,假设要支撑两种语言,那么就需要两个版本的配置文件。
叫我阿杰好了
2024/01/04
7300
Spring之 国际化:i18n
Web---JSTL(Java标准标签库)-Core核心标签库、I18N国际化、函数库
JSTL(Java Standard Tag Library) –Java标准标签库。 SUN公司制定的一套标准标签库的规范。 JSTL标签库,是由一些Java类组成的。
谙忆
2021/01/21
1K0
Web---JSTL(Java标准标签库)-Core核心标签库、I18N国际化、函数库
i18next-页面层语言国际化js框架介绍
    因为工作需要,最近研究了下网站语言国际化的问题,根据当前项目架构,寻求一种较好的解决方案。 首先总结下项目中语言切换实现方式大概有以下几种: 1,一种语言一套页面,如:index_CN.html,index_TN.html,index_EN.html    根据用户当前使用语言来展示对应的页面。    这种方式比较常用,也比较理想,性能不错,但是开发使用的时间就多,每个页面要多做几遍。 2,后台定义变量,根据当前语言返回对应语言信息    这种方式不好使,麻烦,页面所有静态显示文本处都需要定义变
deepcc
2018/05/16
2K0
在struts中使用国际化(i18n)
在struts中使用国际化(i18n)     i18n可以满足对系统的国际化,它的原理就是将页面上的所有标志都放到一个消息资源文件中,不同的语言要提供不同的消息资源文件,当用户登录系统是,系统就是根据你登录的语言,选择不同的消息资源文件显示出来,这样你就可以看到不同的效果了。     一、配置文件的设置     其实i18n的使用还是比较简单的,首先你要在struts-config.xml配置文件中配置消息资源文件的路径,如下所示: ------------------------------------
源哥
2018/08/28
4040
从源码看Spring的i18n·优雅的国际化实战
互联网业务出海,将已有的业务Copy to Global,并且开始对各个国家精细化,本土化的运营。对于开发人员来说,国际化很重要,在实际项目中所要承担的职责是按照客户指定的语言让服务端返回相应语言的内容。本文基于spring的国际化支持,实现国际化的开箱即用,静态文件配置刷新生效以及全局异常国际化处理。
简熵
2023/03/06
3.2K0
从源码看Spring的i18n·优雅的国际化实战
flea-common使用之本地国际化实现
本地国际化,它是指应用程序根据所处语言环境的不同【如 Java 中可用 国际化标识类 java.util.Locale 区分不同语言环境】,自动匹配应用内置的相应的语言环境下的资源配置【如 Java 中可用 资源包类 java.util.ResourceBundle 来匹配】,从而获取并对外展示相应的语言环境下的资源信息。
huazie
2024/08/14
2500
flea-common使用之本地国际化实现
Java国际化/本地化实战
开发一个支持多国语言的Web应用程序,要求系统能够根据客户端的系统的语言类型返回对应的界面:英文的操作系统返回英文界面,而中文的操作系统则返回中文界面——这便是典型的i18n国际化问题。
JavaEdge
2020/05/27
2.4K0
Java国际化/本地化实战
如何使用Spring Boot轻松实现国际化和本地化
国际化(Internationalization) 是指为了适应不同语言、文化和地区的用户,使软件能够方便地进行本地化修改的过程。国际化(Internationalization) 简称i18n,其中 “i” 是Internationalization的首字母 ,“n” 是最后一个字母 , “18” 代表了中间省略的18个字母。
索码理
2024/02/22
3.1K1
如何使用Spring Boot轻松实现国际化和本地化
Spring-国际化信息01-基础知识
假设我们开发一个支持多国语言的Web应用系统,要求能够根据客户端系统的语言类型返回对应的界面。
小小工匠
2021/08/16
5780
SpringMVC-国际化
SpringMVC 根据 Accept-Language 参数判断客户端的本地化类型,这个参数在请求头中,当接受到请求时,SpringMVC 会在上下文中查找一个本地化解析器(LocalResolver)找到后使用它获取请求所对应的本地化类型信息,就是会找到对应类型信息的 properties 的内容给加载到页面当中进行展示
程序员NEO
2023/10/01
2090
SpringMVC-国际化
Spring-国际化信息02-MessageSource接口
spring定义了访问国际化信息的MessageSource接口,并提供了几个易用的实现类.
小小工匠
2021/08/16
1.1K0
Spring核心——MessageSource实现国际化
在上下文与IoC对ApplicationContext以及Context相关的设计模式进行了介绍。ApplicationContext作为一个Context在应用的运行层提供了IoC容器、事件、国际化等功能接口。
随风溜达的向日葵
2018/08/15
5K0
python国际化(i18n)和中英文切
Python通过gettext模块支持国际化(i18n),可以实现程序的多语言界面的支持,下面是我的多语言支持实现:
py3study
2020/01/06
1.2K0
相关推荐
基于jQuery.i18n.properties 实现前端页面的资源国际化
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档