并查集路径压缩_并查集(UnionFind)入门

      咳咳,刚看完海贼更新,马上呼哧呼哧写下这篇文章,这周的目标就是出一篇并查集相关的文章,真的是时间咻咻一下就没了。      本文阅读大概需要3分钟。      好了,并查集呢,英文叫Union-Find , 并查集是一种树型的数据结构,通常来用于处理一些不相交集合的合并(Union)问题,以及查询(Find)问题。      如下:       1 : 有两个区域 Area 1 和 Area 2       2 :  每个区域里面,每个子节点只可以给父节点打电话,根节点给自己打电话. 例如Area1中,D可以打给B,B可以打给A,A可以打给自己 (A:我就是要自己打自己 ^-^ )       那么问题来了,如果D要给E通信,要经过多少步呢?        

bcb50996427b1c7538c08eb13bba688f.png

       既然只能打给父节点,那么D需要先找到根节点A, 然后由A发送给E。所以可以先声明一个 find 函数来查找根节点,结束条件为: 当节点NodeA的父节点是本身的时候,那么这个节点就是根节点root :       
int maxNum = ...;// 存储每个节点的父节点,例如 nodeA 的父节点就是pre[NodeA]Node pre[maxNum];// find 函数,查找根节点// 递归版本private Node find(Node node){  if(pre[node] == node) return node;  return find(pre[node]);}// 循环版本private Node find(Node node){   while(node != pre[node])      node = pre[node];   return node;}
       find 函数比较简单,当然一般还会伴随有路径压缩 。举个栗子,当你的手机非常多的时候,树的深度就会非常深,那么查找耗时会比较大。路径压缩指的是: 让每个子节点的父节点都直接是根节点 , 如下:       

1d4595fa224e5862b4b01eb45bf187dd.png

      我们稍微修改下find函数达到路径压缩的效果:      
private Node find(Node node){   Node root;   Node temp = node;   while(node != pre[node])      node = pre[node];   root = node; // 找到 root 了   while(temp != root) { // 开始路径压缩      Node k = pre[temp];  // 将temp的父节点赋值给临时变量      pre[temp] = root; // 将temp的父节点变成根节点root      temp = k; // 对 temp 的父节点继续路径压缩   }   return root; // 返回根节点}
      既然可以找到根节点了,那么根节点A要给E通信就简单了,那就是合并(Union)了 :
// A:根节点A  E:根节点 Eprivate void join(Node A,Node E) {   pre[A] = E;}
      对的,就是这么一步,将 Area1 和 Area2 连接起来,所以D就可以和E通信了。换一下另一个场景,村庄A里面的某一户要到村庄B,那么这一户到村庄A的村头之后,只需要再修一条路到B,就可以到B了。      回到上面的问题,A到E通信需要多少步呢? 如果每到一个节点算一步,那么就是查找以及合并的步数加起来就是啦,这里就不给出代码了。     并查集操作作为比较常见的算法,在geeksforgeeks上也挺多相关的问题,例如 岛屿问题字符串转换等,更多可以在这里学习巩固下:
https://www.geeksforgeeks.org/tag/union-find/
当然在leetcode上也是挺多的,搜索对应的tag就能找到,好了水文到此结束,很简单的一篇文章,over .  周末愉快。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值