一个找爸爸的数据结构:并查集详解,附上python模板及例题(完整版、压缩版找爸爸写法都有)

本文详细介绍了并查集这一数据结构,包括其概念、构成、作用,以及Python的完整版和压缩版实现。通过具体门派和石头移除问题的示例,展示了并查集在解决连通性问题上的应用。此外,提供了力扣题目的解题思路,利用并查集解决石头移除和字符串元素交换的问题。
摘要由CSDN通过智能技术生成

一、概念

并查集是一种树型的数据结构,用于处理一些不相交集合的合并及查询问题(即所谓的并、查)。比如说,我们可以用并查集来判断一个森林中有几棵树、某个节点是否属于某棵树等。

主要构成:
并查集主要由一个整型数组pre[ ]和两个函数find( )、join( )构成。
数组 pre[ ] 记录了每个点的前驱节点是谁(一般理解为该点的爸爸是谁),函数 find(x) 用于查找指定节点 x 属于哪个集合(可以理解为找祖先),函数 join(x,y) 用于合并两个节点 x 和 y(一般是将x认作是y的爸爸) 。

作用:
并查集的主要作用是求连通分支数(如果一个图中所有点都存在可达关系(直接或间接相连),则此图的连通分支数为1;如果此图有两大子图各自全部可达,则此图的连通分支数为2……)。

举例:
例如一个大陆有天、地、玄、黄四个门派,每个门派有不同级别的弟子若干,pre[ ] 数组就是记录每个弟子的上司名字,而find() 方法就是找到该弟子上司的上司的上司…即所属门派的掌门人,join(A, B) 方法就是将A弟子设置为B弟子的上司。

二、python实现完整版代码

完整版的并查集数据结构有初始化、find、merge等方法,主要是方便理解,一般解题是不用完整版,因为代码量冗余增加时间空间复杂度。

class UnionFind:
    def __init__(self):
        self.father = {
   }    ##记录每个节点的父节点
 
    def find(self, x):
        root = x
        while self.father[root] != root:    #寻找根节点
            root = self.father[root]
        while root != x:                    #路径压缩
            preFather = self.father[x]
            self.father[x] = root
            x = preFather
        return root
 
    def merge(self, x, y):              #合并节点
        root_x, root_y = self.find(x), self.find(y)
        if root_x != root_y:
            self.father[root_x] = root_y
 
    def is_connected(self, x, y):       #判断联通性
        return self.find(x) == self.find(y)
 
    def add(self
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值