0

0

不相交集合数据结构或并查集算法介绍

WBOY

WBOY

发布时间:2023-09-11 15:13:02

|

1505人浏览过

|

来源于tutorialspoint

转载

不相交集合数据结构或并查集算法介绍

不相交集信息结构,也称为并查算法,可能是计算机科学中的一个基本概念,它为解决与分配和网络相关的问题提供了有效的方法。它对于解决包括组件集和确定它们的连接在内的问题特别有价值。在本文中,我们将研究语言结构、算法以及在 C++ 中执行不相交集合信息结构的两种独特方法。我们还将提供完全可执行的代码示例来说明这些方法。

语法

在深入研究算法之前,让我们先熟悉一下以下代码示例中使用的语法 -

// Create a disjoint set
DisjointSet ds(n);

// Perform union operation
ds.unionSets(a, b);

// Find the representative of a set
ds.findSet(x);

算法

处理多个不关联的集合时,利用不相交的数据结构可能非常有用。每个单独的分组都指定有一个特定的代表来表征它。起点涉及每个组件形成其自己的隔离集,该隔离集与其各自的代表相对应(也恰好是其自身)。对不相交集执行的两个主要操作是并集和查找。

联合操作

  • 找到要合并的两个集合的代表。

  • 如果代表不同,则使一个代表指向另一个代表,有效地合并集合。

  • 如果代表是相同的,则集合已经合并,不需要进一步操作。

查找操作

  • 给定一个元素,找到它所属集合的代表。

  • 跟随父指针直到达到代表节点。

  • 将代表作为结果返回。

方法一:基于排名的按秩合并和路径压缩

实现不相交集数据结构的一种有效方法是使用按等级并集和路径压缩技术。

社研通
社研通

文科研究生的学术加速器

下载

在此方法中,每个集合都有一个关联的排名,最初设置为 0。

在两个集合之间执行并集运算时,优先考虑排名较高的集合,并合并排名较低的集合。如果两个集合具有相似的等级,则必须任意选择哪个集合包含谁。在任何一种情况下,一旦合并到新集合中,其排名都会增加 1。此外,为了加快查找操作并降低时间复杂度,路径压缩有助于在这些操作期间压平树结构。

Example

的中文翻译为:

示例

#include 
#include 

class DisjointSet {
   std::vector parent;
   std::vector rank;
    
public:
   DisjointSet(int n) {
      parent.resize(n);
      rank.resize(n, 0);
      for (int i = 0; i < n; ++i)
         parent[i] = i;
   }
    
   int findSet(int x) {
      if (parent[x] != x)
         parent[x] = findSet(parent[x]);
      return parent[x];
   }
    
   void unionSets(int x, int y) {
      int xRoot = findSet(x);
      int yRoot = findSet(y);
        
      if (xRoot == yRoot)
         return;
        
      if (rank[xRoot] < rank[yRoot])
         parent[xRoot] = yRoot;
      else if (rank[xRoot] > rank[yRoot])
         parent[yRoot] = xRoot;
      else {
         parent[yRoot] = xRoot;
         rank[xRoot]++;
      }
   }
};

int main() {
   // Example usage of DisjointSet
   int n = 5;  // Number of elements

   DisjointSet ds(n);

   ds.unionSets(0, 1);
   ds.unionSets(2, 3);
   ds.unionSets(3, 4);

   std::cout << ds.findSet(0) << std::endl;  
   std::cout << ds.findSet(2) << std::endl;  

   return 0;
}

输出

0
2

方法 2:通过大小和路径压缩进行基于大小的合并

另一种处理不相交集合数据结构的方法是使用按大小合并和路径压缩技术。

  • 在此方法中,每个集合都有一个关联的大小,最初设置为 1。

  • 在并集操作中,较小的集合被合并到较大的集合中。

  • 结果集的大小会相应更新。

  • 在查找操作期间应用路径压缩以展平树结构,类似于之前的方法。

Example

的中文翻译为:

示例

#include 
#include 

class DisjointSet {
   std::vector parent;
   std::vector size;
    
public:
   DisjointSet(int n) {
      parent.resize(n);
      size.resize(n, 1);
      for (int i = 0; i < n; ++i)
         parent[i] = i;
   }
    
   int findSet(int x) {
      if (parent[x] != x)
         parent[x] = findSet(parent[x]);
      return parent[x];
   }
    
   void unionSets(int x, int y) {
      int xRoot = findSet(x);
      int yRoot = findSet(y);
        
      if (xRoot == yRoot)
         return;
        
      if (size[xRoot] < size[yRoot]) {
         parent[xRoot] = yRoot;
         size[yRoot] += size[xRoot];
      }
      else {
         parent[yRoot] = xRoot;
         size[xRoot] += size[yRoot];
      }
   }
};

int main() {
   // Example usage of DisjointSet
   int n = 5;  // Number of elements

   DisjointSet ds(n);

   ds.unionSets(0, 1);
   ds.unionSets(2, 3);
   ds.unionSets(3, 4);

   std::cout << ds.findSet(0) << std::endl;  
   std::cout << ds.findSet(2) << std::endl;  
   return 0;
}

输出

0
2

结论

不相交集合数据结构或并查算法是解决涉及集合和连通性问题的强大工具。本文广泛研究了 C++ 的不相交集数据结构语法及其算法。为了扩展我们的理解,我们为读者提供了两种独特的方法 - 基于排名的并集与路径压缩相结合,以及通过大小加路径压缩进行基于大小的并集。通过理解和实现这些方法,您可以有效地解决需要跟踪不相交集的各种问题。

相关专题

更多
treenode的用法
treenode的用法

​在计算机编程领域,TreeNode是一种常见的数据结构,通常用于构建树形结构。在不同的编程语言中,TreeNode可能有不同的实现方式和用法,通常用于表示树的节点信息。更多关于treenode相关问题详情请看本专题下面的文章。php中文网欢迎大家前来学习。

533

2023.12.01

C++ 高效算法与数据结构
C++ 高效算法与数据结构

本专题讲解 C++ 中常用算法与数据结构的实现与优化,涵盖排序算法(快速排序、归并排序)、查找算法、图算法、动态规划、贪心算法等,并结合实际案例分析如何选择最优算法来提高程序效率。通过深入理解数据结构(链表、树、堆、哈希表等),帮助开发者提升 在复杂应用中的算法设计与性能优化能力。

17

2025.12.22

深入理解算法:高效算法与数据结构专题
深入理解算法:高效算法与数据结构专题

本专题专注于算法与数据结构的核心概念,适合想深入理解并提升编程能力的开发者。专题内容包括常见数据结构的实现与应用,如数组、链表、栈、队列、哈希表、树、图等;以及高效的排序算法、搜索算法、动态规划等经典算法。通过详细的讲解与复杂度分析,帮助开发者不仅能熟练运用这些基础知识,还能在实际编程中优化性能,提高代码的执行效率。本专题适合准备面试的开发者,也适合希望提高算法思维的编程爱好者。

13

2026.01.06

页面置换算法
页面置换算法

页面置换算法是操作系统中用来决定在内存中哪些页面应该被换出以便为新的页面提供空间的算法。本专题为大家提供页面置换算法的相关文章,大家可以免费体验。

399

2023.08.14

c++主流开发框架汇总
c++主流开发框架汇总

本专题整合了c++开发框架推荐,阅读专题下面的文章了解更多详细内容。

78

2026.01.09

c++框架学习教程汇总
c++框架学习教程汇总

本专题整合了c++框架学习教程汇总,阅读专题下面的文章了解更多详细内容。

46

2026.01.09

学python好用的网站推荐
学python好用的网站推荐

本专题整合了python学习教程汇总,阅读专题下面的文章了解更多详细内容。

121

2026.01.09

学python网站汇总
学python网站汇总

本专题整合了学python网站汇总,阅读专题下面的文章了解更多详细内容。

12

2026.01.09

python学习网站
python学习网站

本专题整合了python学习相关推荐汇总,阅读专题下面的文章了解更多详细内容。

15

2026.01.09

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
PostgreSQL 教程
PostgreSQL 教程

共48课时 | 7万人学习

Django 教程
Django 教程

共28课时 | 3万人学习

Excel 教程
Excel 教程

共162课时 | 11.4万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号