告别低效!Python并查集:数据结构界的超级英雄,拯救你的编程人生!

简介: 【7月更文挑战第18天】并查集,数据结构超级英雄,用于不相交集合的合并与查询。Python实现包括初始化、查找根节点和合并操作。应用广泛,如社交网络分析、图论问题、集合划分等。示例代码展示了解决岛屿数量问题,统计连通的“1”单元格数。掌握并查集,提升编程效率,解决复杂问题。

在编程的征途中,你是否曾无数次陷入数据结构的迷宫,为那些看似简单实则复杂的集合操作而苦恼?是否渴望有一位超级英雄,能够手持利剑,轻松斩断这些难题的荆棘?今天,我要向你介绍的,正是这样一位数据结构界的超级英雄——Python并查集。它以其高效、简洁的特性,将成为你编程生涯中的得力助手,拯救你于低效与困境之中。

初识并查集
并查集(Union-Find),顾名思义,是一种用于处理不相交集合合并及查询问题的数据结构。它通过维护每个集合的代表元素(也称为根节点),实现了快速的合并与查询操作。在并查集中,每个元素都直接或间接地指向其所在集合的代表元素,从而形成一个树状结构。

Python实现并查集
下面是一个简单的Python并查集实现示例,包括了初始化、查找根节点和合并集合三个基本操作:

python
class UnionFind:
def init(self, size):
self.parent = list(range(size)) # 初始化,每个元素的父节点是它自己

def find(self, x):  
    if self.parent[x] != x:  
        # 路径压缩,将x的父节点直接指向根节点  
        self.parent[x] = self.find(self.parent[x])  
    return self.parent[x]  

def union(self, x, y):  
    rootX = self.find(x)  
    rootY = self.find(y)  
    if rootX != rootY:  
        # 合并两个集合,将其中一个集合的根节点指向另一个  
        self.parent[rootX] = rootY  

示例使用

uf = UnionFind(10) # 初始化一个有10个元素的并查集
uf.union(1, 3) # 合并元素1和3所在的集合
uf.union(2, 3) # 再次合并,现在1, 2, 3都在同一个集合中
print(uf.find(1) == uf.find(2)) # 输出True,表示1和2属于同一集合
并查集的应用案例
并查集的应用场景非常广泛,包括但不限于:

社交网络分析:判断任意两个用户是否处于同一朋友圈或社交圈子中。
图论问题:如求解无向图的连通分量个数,或者动态地添加边并查询图的连通性。
集合划分:在需要频繁合并集合并查询元素所属集合的场景中,如动态集合的合并与查询。
实战演练:解决岛屿数量问题
以下是一个使用并查集解决岛屿数量问题的示例:

python
def numIslands(grid):
if not grid or not grid[0]:
return 0

rows, cols = len(grid), len(grid[0])  
uf = UnionFind(rows * cols)  
directions = [(-1, 0), (1, 0), (0, -1), (0, 1)]  

for i in range(rows):  
    for j in range(cols):  
        if grid[i][j] == '1':  
            # 将当前陆地与相邻的陆地合并  
            for dx, dy in directions:  
                ni, nj = i + dx, j + dy  
                if 0 <= ni < rows and 0 <= nj < cols and grid[ni][nj] == '1':  
                    uf.union(i * cols + j, ni * cols + nj)  

# 统计根节点的数量,即岛屿的数量  
count = sum(1 for i in range(rows * cols) if uf.find(i) == i)  
return count  

示例使用

grid = [
["1","1","0","0","0"],
["1","1","0","0","0"],
["0","0","1","0","0"],
["0","0","0","1","1"]
]
print(numIslands(grid)) # 输出岛屿数量
结语
并查集,这位数据结构界的超级英雄,以其独特的魅力和强大的功能,成为了解决复杂集合操作问题的首选工具。掌握并查集,你将告别低效,迎接更加高效、简洁的编程人生。在未来的编程征途中,让并查集成为你的得力助手,一同披荆斩棘,勇往直前!

相关文章
|
2月前
|
数据采集 安全 BI
用Python编程基础提升工作效率
一、文件处理整明白了,少加两小时班 (敲暖气管子)领导让整理100个Excel表?手都干抽筋儿了?Python就跟铲雪车似的,哗哗给你整利索!
90 11
|
4月前
|
人工智能 Java 数据安全/隐私保护
[oeasy]python081_ai编程最佳实践_ai辅助编程_提出要求_解决问题
本文介绍了如何利用AI辅助编程解决实际问题,以猫屎咖啡的购买为例,逐步实现将购买斤数换算成人民币金额的功能。文章强调了与AI协作时的三个要点:1) 去除无关信息,聚焦目标;2) 将复杂任务拆解为小步骤,逐步完成;3) 巩固已有成果后再推进。最终代码实现了输入验证、单位转换和价格计算,并保留两位小数。总结指出,在AI时代,人类负责明确目标、拆分任务和确认结果,AI则负责生成代码、解释含义和提供优化建议,编程不会被取代,而是会更广泛地融入各领域。
142 28
|
4月前
|
存储 人工智能 索引
Python数据结构:列表、元组、字典、集合
Python 中的列表、元组、字典和集合是常用数据结构。列表(List)是有序可变集合,支持增删改查操作;元组(Tuple)与列表类似但不可变,适合存储固定数据;字典(Dictionary)以键值对形式存储,无序可变,便于快速查找和修改;集合(Set)为无序不重复集合,支持高效集合运算如并集、交集等。根据需求选择合适的数据结构,可提升代码效率与可读性。
|
4月前
|
Python
[oeasy]python074_ai辅助编程_水果程序_fruits_apple_banana_加法_python之禅
本文回顾了从模块导入变量和函数的方法,并通过一个求和程序实例,讲解了Python中输入处理、类型转换及异常处理的应用。重点分析了“明了胜于晦涩”(Explicit is better than implicit)的Python之禅理念,强调代码应清晰明确。最后总结了加法运算程序的实现过程,并预告后续内容将深入探讨变量类型的隐式与显式问题。附有相关资源链接供进一步学习。
65 4
|
4月前
|
机器学习/深度学习 设计模式 API
Python 高级编程与实战:构建 RESTful API
本文深入探讨了使用 Python 构建 RESTful API 的方法,涵盖 Flask、Django REST Framework 和 FastAPI 三个主流框架。通过实战项目示例,详细讲解了如何处理 GET、POST 请求,并返回相应数据。学习这些技术将帮助你掌握构建高效、可靠的 Web API。
|
4月前
|
Java API Docker
在线编程实现!如何在Java后端通过DockerClient操作Docker生成python环境
以上内容是一个简单的实现在Java后端中通过DockerClient操作Docker生成python环境并执行代码,最后销毁的案例全过程,也是实现一个简单的在线编程后端API的完整流程,你可以在此基础上添加额外的辅助功能,比如上传文件、编辑文件、查阅文件、自定义安装等功能。 只有锻炼思维才能可持续地解决问题,只有思维才是真正值得学习和分享的核心要素。如果这篇博客能给您带来一点帮助,麻烦您点个赞支持一下,还可以收藏起来以备不时之需,有疑问和错误欢迎在评论区指出~
在线编程实现!如何在Java后端通过DockerClient操作Docker生成python环境
|
4月前
|
机器学习/深度学习 设计模式 测试技术
Python 高级编程与实战:构建自动化测试框架
本文深入探讨了Python中的自动化测试框架,包括unittest、pytest和nose2,并通过实战项目帮助读者掌握这些技术。文中详细介绍了各框架的基本用法和示例代码,助力开发者快速验证代码正确性,减少手动测试工作量。学习资源推荐包括Python官方文档及Real Python等网站。
|
4月前
|
机器学习/深度学习 设计模式 API
Python 高级编程与实战:构建微服务架构
本文深入探讨了 Python 中的微服务架构,介绍了 Flask、FastAPI 和 Nameko 三个常用框架,并通过实战项目帮助读者掌握这些技术。每个框架都提供了构建微服务的示例代码,包括简单的 API 接口实现。通过学习本文,读者将能够使用 Python 构建高效、独立的微服务。
|
8月前
|
存储 算法
非递归实现后序遍历时,如何避免栈溢出?
后序遍历的递归实现和非递归实现各有优缺点,在实际应用中需要根据具体的问题需求、二叉树的特点以及性能和空间的限制等因素来选择合适的实现方式。
186 59
|
1月前
|
编译器 C语言 C++
栈区的非法访问导致的死循环(x64)
这段内容主要分析了一段C语言代码在VS2022中形成死循环的原因,涉及栈区内存布局和数组越界问题。代码中`arr[15]`越界访问,修改了变量`i`的值,导致`for`循环条件始终为真,形成死循环。原因是VS2022栈区从低地址到高地址分配内存,`arr`数组与`i`相邻,`arr[15]`恰好覆盖`i`的地址。而在VS2019中,栈区先分配高地址再分配低地址,因此相同代码表现不同。这说明编译器对栈区内存分配顺序的实现差异会导致程序行为不一致,需避免数组越界以确保代码健壮性。
24 0
栈区的非法访问导致的死循环(x64)

推荐镜像

更多