Union Find原理及模板

实质:多叉树

功能:快速合并和查找

时间复杂度:Union - O(1) Find - O(1)

核心思想:连接根

底层数据结构:

父亲表示法——用一个Array/HashTable来记录每个节点的父亲是谁

father[A] =  B

查询所在集合:

用所在集合最顶层的老大哥节点来代表这个集合

合并两个集合:

找到两个集合中最顶层的两个老大哥节点A和B

father[A] = B  or  father[B] = A

Python模板:

f = {} #初始化父亲表

for ele in list:

    f[ele] = ele #最开始,所有的父亲节点都指向自己,也可以指向空

#路径压缩——在找到老大哥以后,还需要把一路上经过的点都指向老大哥。

def find(x,f):

    j = x

    while f[j] != j :

        j = f[j]

   while x != j:

       fx = f[x]

       f[x] = j

       x = fx

    return j

#集合合并——找到两个元素所在集合的老大哥A和B,将其中一个老大哥的父指针指向另一个老大哥

def merge(x,y,f):

    fx = find(x,f)

    fy = find(y,f)

    if fx != fy:

        f[fx] = fy

时间复杂度 O(log *n) 约等于O(1)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值