1. 并查集基础概念回顾
在正式探讨复杂版并查集之前,我们需要先夯实基础。并查集(Disjoint Set Union,DSU)是一种树型的数据结构,用于处理一些不交集合(Disjoint Sets)的合并及查询问题。它支持两种基本操作:
- Find:查询元素所属集合
- Union:合并两个元素所属集合
基础版的并查集通常使用数组或哈希表来实现,每个节点存储其父节点引用,通过路径压缩和按秩合并两种优化策略,可以将操作时间复杂度降至接近常数级别。这种数据结构在解决连通性问题时表现出色,比如判断图中两个节点是否连通、计算连通分量数量等场景。
实际工程中,基础并查集的实现往往不超过50行代码,但其算法思想却非常精妙。我在第一次实现时,花了整整三天才真正理解路径压缩的精髓。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 复杂版并查集的核心扩展
当问题场景变得更加复杂时,基础并查集就显得力不从心了。复杂版并查集主要在以下几个方面进行了扩展:
2.1 带权并查集
基础并查集只能判断元素是否属于同一集合,而带权并查集可以维护集合内元素之间的某种关系。比如在解决"食物链"问题时,我们需要记录动物之间的捕食关系。实现上,我们在每个节点除了存储父节点外,还存储与父节点之间的权值关系。
python复制class WeightedDSU:
def __init__(self, size):
self.parent = [i for i in range(size)]
self.weight = [0] * size # 存储与父节点的关系
def find(self, x):
if self.parent[x] != x:
origin_parent = self.parent[x]
self.parent[x] = self.find(self.parent[x]) # 路径压缩
self.weight[x] += self.weight[origin_parent] # 权值累积
return self.parent[x]
def union(self, x, y, w):
r
