文章目录
如果想了解并查集基础推荐去看左程云大神的算法讲解,非常不错,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: