并差集-python版本

本文介绍了Python版本的并查集,包括简介、应用和基本操作。并查集常用于求连通子图、Kruskal算法及最近公共祖先等问题。在基本操作中,详细讲解了如何初始化集合、查找根节点和执行并集操作,并提到了路径压缩以优化性能。
摘要由CSDN通过智能技术生成

并差集-python版本

简介

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

应用

一些常见的用途有求连通子图、求最小生成树的 Kruskal 算法和求最近公共祖先(Least Common Ancestors, LCA)等。

基本操作

初始化

并查集的实现原理也比较简单,就是使用树来表示集合,树的每个节点就表示集合中的一个元素,树根对应的元素就是该集合的代表

dsu示意图

图中有两棵树,分别对应两个集合,其中第一个集合为$ {a,b,c,d}$,代表元素是 a a a;第二个集合为 { e , f , g } \{e,f,g\} {e,f,g},代表元素是 e e e

树的节点表示集合中的元素,指针表示指向父节点的指针,根节点的指针指向自己,表示其没有父节点。沿着每个节点的父节点不断向上查找,最终就可以找到该树的根节点,即该集合的代表元素。

# parent数组记录该元素父节点的序号,size表示该树高(以根节点计算)
class DSU:
    def __init__(self, num):
        self.parent = list(range(num))
        self.size = [1] * num

查找根节点

通过递归的方式,进行查找该树的根节点。如:find(d) -> a.

查找根节点

    def find(self, x):
        '''
        查找x的父节点
        :param x:
        :return:
        '''
        if self.parent[x] != x:
            self.parent[x] = self.find(self.parent[x])
        return self.parent[x]

求并集

在并集的时候,通过size数组记录树高,从而进行路径压缩。可以防止极端情况,如查找中的图。

交集

    def union(self, x, y):
        '''
        合并x和y的集合
        :param x:
        :param y:
        :return:
        '''
        x_root = self.find(x)
        y_root = self.find(y)
        if x_root == y_root:
            return
        # 根据树高进行计算
        if self.size[x_root] > self.size[y_root]:
            # 将y合并到x
            self.parent[y_root] = x_root
        elif self.size[x_root] < self.size[y_root]:
            self.parent[x_root] = y_root
        else:
            self.parent[x_root] = y_root  # x拼接到y上
            self.size[y_root] = self.size[y_root] + 1

参考

【算法】并查集(Disjoint Set)

并查集

924. Minimize Malware Spread

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值