并查集python实现及题目练习

如果想了解并查集基础推荐去看左程云大神的算法讲解,非常不错,b站和油管上都有它的视频

1. 并查集概念

1.1 理解并查集:简介与应用场景

概述:
并查集(Disjoint Set)是一种用于处理集合合并和查询等问题的数据结构。

并查集的作用:

  • 解决元素分组与连接问题
  • 用于图论中的最小生成树算法、连通性问题、网络分区等

1.2 Python 实现并查集及优化策略

class UnionFind:
    def __init__(self, n):
        # 初始化时,每个元素的父节点为自己
        self.parent = list(range(n))
        # 初始化时每个树的深度为0(也可以设置为1)
        self.rank = [0] * n

    # 查找操作(扁平化)
    def find(self, x):
        if self.parent[x] != x:  # 如果当前节点的父节点不是自己,说明不是根节点
            # 路径压缩,将当前节点直接连接到根节点
            self.parent[x] = self.find(self.parent[x])
        return self.parent[x]  # 返回根节点的索引

    # 合并操作(小挂大)
    def union(self, x, y):
        root_x = self.find(x)  # 找到元素 x 的根节点
        root_y = self.find(y)  # 找到元素 y 的根节点

        if root_x != root_y:  # 如果两个元素不在同一个集合中
            if self.rank[root_x] < self.rank[root_y]:  # 如果树的深度(秩)小于另一个树
                # 将较浅的树的根节点连接到较深的树的根节点
                self.parent[root_x] = root_y
            elif self.rank[root_x] > self.rank[root_y]:
                self.parent[root_y] = root_x
            else:  # 如果两个树深度相同,则任意连接一个到另一个,并将深度加一
                self.parent[root_y] = root_x
                self.rank[root_x] += 1

优化策略:

  • 路径压缩优化(扁平化):在查找操作中,将节点直接连接到根节点,降低树的深度
  • 按秩合并优化(小集合挂大集合):将深度较浅的树挂在深度较深的树下,保持树的平衡

1.3 扁平化栈实现

def find(self, x):
    # 使用栈记录路径
    path = []
    # 找到根节点
    while self.parent[x] != x:
        path.append(x)
        x = self.parent[x]

    # 路径压缩:将路径上的所有节点直接连接到根节点
    for node in path:
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值