基本概念

​ 并查集,在一些有N个元素的集合应用问题中,我们通常是在开始时让每个元素构成一个单元素的集合,然后按一定顺序将属于同一组的元素所在的集合合并,其间要反复查找一个元素在哪个集合中。

​ 并查集是一种树型的数据结构,用于处理一些不相交集合(Disjoint Sets)的合并及查询问题。常常在使用中以森林来表示。

实现原理

​ 通过更新维护父亲节点使得,合并后的集合最终拥有同一个点根节点,拥有相同根节点即为同类。

  • Search 查找自己的根节点;(红圈标记为根节点)

  并查集与带权并查集---由浅入深

  • Merge 合并两个节点在一个集合;(假设寻找合并节点5和2)

  并查集与带权并查集---由浅入深

  • 压缩路径;压缩路径可以使得在多次查询时,查询时间得到优化,具体过程是优化其结构,使得查询点的父亲节点为根节点。(上图压缩路径后得到)  

  并查集与带权并查集---由浅入深

代码实现

 1 void init(){  // 初始化自己祖先就是自己
 2     for(int i = 1 ; i<= n; i++){
 3         pre[i] = i;
 4     }
 5 }
 6 
 7 int Search(int x){  // 递归寻找自己的祖先
 8     return x == pre[x] ? x : pre[x] = Search(pre[x]);
 9 }
10 
11 void Merge(int x, int y){ // 合并两个节点
12     int fx = Search(x);
13     int fy = Search(y);
14     if(fx != fy)  pre[fx] = fy; // 把x合并到y即把x祖先设置为y的祖先
15 }
View Code

相关文章:

  • 2021-05-23
  • 2022-02-14
  • 2021-07-31
  • 2021-07-31
猜你喜欢
  • 2021-04-19
  • 2021-06-27
  • 2021-10-07
  • 2022-12-23
  • 2019-07-02
  • 2021-12-07
  • 2022-12-23
相关资源
相似解决方案