python 通过字典实现的并查集按秩合并(并查集merge中size的优化) 解释及模板

并查集有两种在 merge() 中的优化

一种基于 size 的;
一种基于 rank 的,rank的优化更彻底;
并查集还有在 find() 中的优化,就是路径压缩
所有操作均基于 并查集路径压缩及实现的模板实现

基于size的优化:

这里先看一个简单的例子来理解优化过程
在这里插入图片描述

index 1 2 3 4
father None 1 1 None

首先进行合并操作

将1节点与4节点连通
相当于代码模板中的merge(1, 4)

在这里插入图片描述

index 1 2 3 4
father 4 4 4 None

可以发现,这个结构的树的层相对较高,
若此时元素数量增多,这样产生的消耗就会相对较大

解决这个问题其实很简单:
在进行具体指向操作的时候先进行判断
把元素少的集合根节点指向元素多的根节点
能更高概率的生成一个层数比较低的树。

构造并查集的时需初始化数组size为[1]
(并在添加节点操作时添加元素1,用于记录每个节点的深度)

class UnionFind:
    def __init__(self):
        """
        记录每个节点的父节点
        """
        self.father = {
   }
        self.size = [1]

在进行合并操作时
需根据两个元素所在树的元素个数不同判断合并方向
在merge中进行优化进行优化操作

具体方法
将判错功能独立出来
如果size[x]的元素个数(连通分量中的节点个数)大于size[y]中的
就将root_x, root_y进行互换再进行操作
(等价于让y的连通分量并入x为根节点的连通分量中)

    def merge(self, x, y):
        """
        合并两个节点
        """
        root_x, root_y = self.find(x), self.find(y)

        if root_x == root_y
  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值