使用Python实现不相交集(Union-Find算法)入门2025年2月22日 | 阅读 5 分钟 数据结构中最基本的数据结构之一,不相交集(Disjoint Set),也称为并查集(Union-Find)方法,能够有效地处理将组件拆分成不相交集的问题。这种方法在处理涉及连通性和等价关系的问题时非常有用。其一个常见的应用是实现 Kruskal 算法来确定图的最小生成树。 本文将深入探讨不相交集(Disjoint Set),涵盖其应用、用法和 Python 实现。 不相交集基础能够将组件分组到不重叠的组中的数据结构称为不相交集数据结构。它维护一组不相交集,每个集合都有一个代表元素(也称为根元素)。集合可以通过其根元素进行识别和区分。 不相交集数据结构支持多种重要操作,包括创建新集合、合并现有集合以及确定集合的根元素。由于这些操作即使在大型集合上也能快速完成,因此不相交集数据结构适用于各种用途。 不相交集的功能是管理组件到不相交集的划分。每个集合都有一个代表元素的概念至关重要,因为它有助于确定元素之间的等价关系和连通性。不相交集主要支持以下操作:Union(合并)、Find(查找)和 MakeSet(创建集合)。 以下是不相交集的主要概念:
要创建一个新集合,只需初始化一个新元素并将其指定为其自身的代表元素。要合并两个集合,找出每个集合的根元素,然后将一个集合的根元素指定为另一个集合的父节点。可以通过沿着父指针链直到找到一个指向自身的元素来定位集合的根元素。 如何创建不相交集?如果集合没有共同的元素,即交集为空,则称它们为不相交集。不相交集的目的在于有效地管理元素到不相交集的划分,每个集合都有一个代表元素。主要目标是高效地执行合并两个集合或确定两个组件是否属于同一集合等任务。 不相交集数据结构执行以下功能:
不相交集的组成部分
此 Python 代码片段可用于定义父数组和秩数组。 创建了一个名为 Disjoint() 的类,在该类中定义了父数组和秩数组。 不相交集操作1. MakeSet(x)使用不相交集的第一步是执行 MakeSet 操作。它创建一个只包含一个元素 x 的集合。这包括将秩初始化为 0,并将 x 的父节点设置为它自身。 2. Find(x)Find 操作是 Disjoint Set 的关键组成部分,它查找包含元素 x 的集合的根(代表元素)。为了优化将来的 Find 操作,使用了路径压缩(扁平化树结构)。 3. Union(x)Union 操作将包含元素 x 和 y 的集合合并。为了创建平衡有效的结构,它使用秩将深度较小的树合并到深度较大的树上。 综合了所有结构和操作,这就是不相交集的工作原理。 Python 中的不相交集示例以下代码提供了一个解释不相交集工作原理的示例。 输出 1 在用大小为 6 初始化集合后,使用一个单独的 make_set 函数为从 0 到 5 的每个元素构建集合。然后对包含元素 0、2、1、3 和 4 的集合执行 Union 操作。为了找到包含元素 1 的集合的代表元素,最后调用 find 方法。接下来,为前五个元素创建集合。在第一个 Union 操作中合并了包含元素 0 和 2 的集合。在第二个 Union 操作中合并了包含元素 1 和 3 的集合。在第三个 Union 操作中合并了包含元素 1 和 0 的集合。在第四个 Union 操作中合并了包含元素 3 和 4 的集合。元素 0 到 3 属于同一集合。 不相交集的应用不相交集已在各个领域和子领域中使用。一些最广泛使用的应用如下:
结论并查集规则允许实现不相交集信息结构,这是一个对图算法和动态连通性问题有益的工具。由于路径压缩和按秩合并非常高效,并且可以在几乎恒定的时间内执行基本操作,因此理解和实现此算法对于解决计算机科学的各种难题至关重要。 |
TypeScript 和 Python 简介 TypeScript 和 Python 都是流行的编程语言,但用途不同。TypeScript 是一种静态类型语言,它构建在 JavaScript 之上,主要用于 Web 开发。它提供了强类型、接口和改进的工具,使代码更易于管理...(此段落未提供完整的英文原文,故翻译不完整)
阅读 12 分钟
? Python 用于数据分析、AI 和 Web 脚本,它拥有无数使处理数据库变得容易的库。然而,Python 并不原生支持 JDBC(Java 数据库连接),这是 Java 应用程序中常见的数据库访问方式。幸运的是,有办法...
7 分钟阅读
要将输入中的每个组件裁剪到 [min, max] 范围内,请调用 torch.clamp()。需要三个边界:输入张量、最小值和最大值。小于最小值的值被替换为最小值,大于最大值的值...
阅读 4 分钟
Python add() 方法向集合添加新元素。它接受一个参数,即要添加的元素。它向调用者返回 None。方法签名如下所示。签名 add(elem) 参数 elem:要添加的元素。返回它返回 None。让我们看一些 add() 方法的示例来理解其功能。...
阅读1分钟
在 Python 中,并发是指程序一次执行多个任务的能力,从而可以最大化系统资源并可能提高性能。使用线程池是处理 Python 应用程序中并发的一种典型方法。线程是轻量级执行单元...
阅读 4 分钟
惰性导入是 Pyforest 模块的一项功能,它允许用户在不向程序添加库的情况下执行任务,因为库已添加到代码片段中。它是为那些厌倦了在代码中编写 import 语句的用户而构建的...
阅读 4 分钟
Jaya 算法是一种特殊的解决问题技术,可以处理各种优化挑战,无论是否有特定限制。它不逐一处理问题,而是处理一组不同的解决方案并不断改进它们。它很...(此段落未提供完整的英文原文,故翻译不完整)
阅读 16 分钟
引言 在数字化转型时代,文件上传已成为 Web 应用程序的基本组成部分。无论是传输客户个人资料图片、提交用于处理的档案,还是在框架之间移动大型数据集,成功且安全地处理文件上传至关重要。Python,一种灵活的...
阅读 6 分钟
卡布列克常数是 6174。这个数字是独一无二的,因为对于任何四位数(但有一个限制,即所有数字不能相同,如0000、1111...),遵循特定程序总能得到它。“asc”是将四位数字按升序排列的结果...
阅读 3 分钟
为什么 C 代码比 Python 代码运行得快?了解 C 编程语言 C 是一种标准的、过程式的编程语言,由 Dennis Ritchie 于 20 世纪 70 年代初在贝尔实验室开发。它已成为有史以来使用最广泛的编程语言之一,尤其...
阅读 4 分钟
我们请求您订阅我们的新闻通讯以获取最新更新。
我们提供所有技术(如 Java 教程、Android、Java 框架)的教程和面试问题
G-13, 2nd Floor, Sec-3, Noida, UP, 201301, India