并查集算法中的等级合并和路径压缩

并查集算法中的等级合并和路径压缩

称为并查集(或不相交集)的算法负责维护不同的集合,并提供操作来验证集合中的成员资格并将集合组合在一起。它熟练地处理并集和查找操作,这对于维护元素之间的当前连接信息至关重要。

语法

为了确保清晰度,让我们首先理解即将在接下来的代码示例中使用的方法的语法。

// Method to perform Union operationvoid Union(int x, int y);// Method to find the representative element of a setint Find(int x);

算法

并查算法由两个基本操作组成 – 并集和查找。并集运算合并两个集合,查找运算确定集合的代表元素。通过迭代应用并查运算,我们可以构建高效的并查数据结构。

按等级联合

按等级联合技术用于通过确保较小的树始终附加到较大的树的根来优化联合操作。这种方法可以防止树变得过于不平衡,从而导致查找操作效率低下。

按等级联合的算法如下 –

查找包含元素 x 和 y 的集合的代表(根元素)。

如果代表相同,则返回。

如果x的代表的等级大于y的代表的等级,则使y的代表指向x的代表,并更新x的代表的等级。

否则,使 x 的代表指向 y 的代表,并在必要时更新 y 的代表的排名。

路径压缩

路径压缩是另一种优化技术,可降低并查数据结构中树的高度。它的目的是在查找操作期间压平路径,从而为后续操作提供更短的路径。

路径压缩的算法如下 –

查找包含元素 x 的集合的代表(根元素)。

在遍历从x到其代表的路径时,使每个访问过的元素直接指向代表。

方法

现在我们已经了解了按等级并集和路径压缩的基本概念,让我们讨论在 C++ 中实现并查算法的两种不同方法。

方法一:基于数组的实现

在这种方法中,我们将每个集合表示为一个数组。每个索引处的值代表元素的父元素。最初,每个元素都是其自己的父元素,表明它是其集合的代表。

算法

让我们开始父数组的初始化过程。每个元素都将被分配其自己的父元素。

使用路径压缩实现查找操作。

使用 Union by Rank 实现 Union 运算。

示例

#include #define MAX_SIZE 100// Initialize parent arrayint parent[MAX_SIZE];int rank[MAX_SIZE];void makeSet(int n) {   for (int i = 0; i < n; i++) {      parent[i] = i;      rank[i] = 0;   }}int find(int x) {   if (parent[x] != x) {      parent[x] = find(parent[x]); // Path compression   }   return parent[x];}void Union(int x, int y) {   int xRoot = find(x);   int yRoot = find(y);       if (xRoot == yRoot) {      return;   }       // Union by rank   if (rank[xRoot]  rank[yRoot]) {      parent[yRoot] = xRoot;   } else {      parent[yRoot] = xRoot;      rank[xRoot]++;   }}int main() {   // Usage example   makeSet(10); // Assuming 10 elements in the set   Union(1, 2);   Union(3, 4);       // Print parent array   for (int i = 0; i < 10; i++) {      std::cout << "Element " << i << " Parent: " << parent[i] << std::endl;   }       return 0;}

输出

Element 0 Parent: 0Element 1 Parent: 1Element 2 Parent: 1Element 3 Parent: 3Element 4 Parent: 3Element 5 Parent: 5Element 6 Parent: 6Element 7 Parent: 7Element 8 Parent: 8Element 9 Parent: 9

方法 2:基于树的实现

为了描述我们研究中的集合,我们使用了基于树的方法。组中的每个项目都与其各自的父节点关联,同时我们指定根节点来表示该特定集合。

算法

初始化父数组,其中每个元素都是其自己的父元素。

使用路径压缩和递归树遍历来实现查找操作。

使用 Union by Rank 实现 Union 运算。

完整的可执行代码

示例

#include #define MAX_SIZE 100// Initialize parent arrayint parent[MAX_SIZE];int rank[MAX_SIZE];void makeSet(int n) {   for (int i = 0; i < n; i++) {      parent[i] = i;      rank[i] = 0;   }}int find(int x) {   if (parent[x] != x) {      parent[x] = find(parent[x]); // Path compression   }   return parent[x];}void Union(int x, int y) {   int xRoot = find(x);   int yRoot = find(y);      if (xRoot == yRoot) {      return;   }       // Union by rank   if (rank[xRoot]  rank[yRoot]) {      parent[yRoot] = xRoot;   } else {      parent[yRoot] = xRoot;      rank[xRoot]++;   }}int main() {   // Usage example   makeSet(10); // Assuming 10 elements in the set   Union(1, 2);   Union(3, 4);       // Print parent array   for (int i = 0; i < 10; i++) {      std::cout << "Element " << i << " Parent: " << parent[i] << std::endl;   }       return 0;}

输出

Element 0 Parent: 0Element 1 Parent: 1Element 2 Parent: 1Element 3 Parent: 3Element 4 Parent: 3Element 5 Parent: 5Element 6 Parent: 6Element 7 Parent: 7Element 8 Parent: 8Element 9 Parent: 9

结论

总而言之,按等级并集和路径压缩是并查算法中的关键技术。它们分别优化了联合和查找操作,从而提高了性能并实现了高效的连接信息管理。通过在 C++ 中实现这些技术,我们可以有效地解决与集合、连通性和图相关的问题。

总而言之,我们介绍了语法、分步算法,并提供了两个真实的 C++ 可执行代码示例。通过理解和应用按等级并集和路径压缩,您可以增强算法技能并更有效地解决复杂问题。

以上就是并查集算法中的等级合并和路径压缩的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1444033.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2025年12月17日 20:54:59
下一篇 2025年12月17日 20:55:08

相关推荐

  • 并查集是什么?并查集的路径压缩

    并查集是一种用于管理元素分组的树形数据结构,支持高效的合并(union)和查找(find)操作,判断两元素是否同属一个集合;初始化时每个元素自成集合,通过parent数组记录父节点,初始时parent[i]=i;查找操作通过递归找到根节点,路径压缩在查找过程中将沿途节点直接连接到根节点,显著降低后续…

    2025年12月20日
    000
  • JS如何实现并查集?并查集的优化

    并查集的时间复杂度经过路径压缩和按秩合并优化后接近o(α(n)),其中α(n)是反阿克曼函数,在实际应用中可视为常数,因此可近似认为是o(1),未优化时最坏情况为o(n);其核心优化方法包括路径压缩和按秩合并;主要应用场景有判断图的连通性、kruskal算法中的环检测、动态连通性维护、图像处理中的区…

    2025年12月20日
    000
  • c++怎么实现一个并查集(Disjoint Set Union)_C++实现Union-Find并查集算法详解

    并查集通过Find和Union操作管理分组,支持路径压缩与按秩合并优化,用于高效处理连通性问题。 并查集(Disjoint Set Union,简称 DSU 或 Union-Find)是一种高效管理元素分组的数据结构,支持快速合并集合与查询元素所属集合。它常用于处理无向图的连通性问题,比如判断两个节…

    2025年12月19日
    000
  • C++如何实现并查集 C++并查集的数据结构与实现

    并查集是一种高效的集合合并与查询数据结构,主要用于判断元素是否属于同一集合或进行集合合并。其核心操作包括:1. makeset(x)创建包含元素x的集合;2. find(x)查找x所属集合的代表;3. union(x, y)合并x和y所在的集合。实现上使用数组存储父节点和秩,初始化时每个元素自成一集…

    2025年12月18日 好文分享
    000

发表回复

登录后才能评论
关注微信