终极Windows窗口调整指南:三步强制修改任意应用程序窗口大小
2026/6/14 18:53:54
并查集(Disjoint Set Union,简称 DSU)是一种用于高效管理和合并不相交集合的数据结构,核心支持两种操作:
并查集的设计目标是在近乎常数时间内完成这两种操作,通过路径压缩和按秩合并两种优化策略,可将时间复杂度降低到近似O(1)O(1)O(1)(严格来说是阿克曼函数的反函数,增长极慢)。
资料:https://pan.quark.cn/s/43d906ddfa1b、https://pan.quark.cn/s/90ad8fba8347、https://pan.quark.cn/s/d9d72152d3cf
并查集采用树形结构表示集合,每个集合对应一棵树,树的根节点是该集合的代表元素。
1←2←3(根为 1),集合{4,5}\{4,5\}{4,5}可表示为树4←5(根为 4)。| 操作 | 描述 | 未优化时间复杂度 |
|---|---|---|
| 查找(Find) | 从元素x出发,沿父节点指针向上遍历,直到找到根节点(集合代表) | O(h)O(h)O(h)(hhh为树的高度) |
| 合并(Union) | 找到元素x和y所在集合的根节点,若根不同,则将其中一棵树的根节点指向另一棵树的根节点 | O(h)O(h)O(h) |
| 查询连通性 | 判断x和y是否属于同一集合(即 Find(x) == Find(y)) | O(h)O(h)O(h) |
未优化的并查集在最坏情况下会退化为链表(如连续合并1-2, 2-3, 3-4...),导致操作时间复杂度升至O(n)O(n)O(n)。两种优化策略可解决该问题:
在执行Find 操作时,将路径上所有节点的父节点直接指向根节点,扁平化树结构,减少后续查找的次数。
1←2←3优化为1←2、1←3,下次查找 2 或 3 可直接找到根 1。在执行Union 操作时,比较两棵树的“秩”(可以是树的高度或节点数量),将秩较小的树的根指向秩较大的树的根,避免树的高度过度增长。
classUnionFind:def__init__(self,size):"""初始化并查集,size 为元素总数(元素编号从 0 到 size-1)"""self.parent=list(range(size))# 父节点数组,parent[i] 表示 i 的父节点self.rank=[1]*size# 按大小合并:rank[i] 表示以 i 为根的集合的大小deffind(self,x):"""查找元素 x 的根节点,带路径压缩"""ifself.parent[x]!=x:# 路径压缩:将 x 的父节点直接指向根节点self.parent[x]=self.find(self.parent[x])returnself.parent[x]defunion(self,x,y):"""合并元素 x 和 y 所在的集合,按秩合并"""root_x=self.find(x)root_y=self.find(y)ifroot_x==root_y:return# 已在同一集合,无需合并# 按大小合并:小树合并到大树下ifself.rank[root_x]<self.rank[root_y]:self.parent[root_x]=root_y self.rank[root_y]+=self.rank[root_x]else:self.parent[root_y]=root_x self.rank[root_x]+=self.rank[root_y]defis_connected(self,x,y):"""判断 x 和 y 是否连通"""returnself.find(x)==self.find(y)defget_set_size(self,x):"""获取元素 x 所在集合的大小"""root=self.find(x)returnself.rank[root]# 使用示例if__name__=="__main__":# 初始化 5 个元素的并查集(0-4)uf=UnionFind(5)# 合并集合uf.union(0,1)uf.union(1,2)uf.union(3,4)# 查询连通性print(uf.is_connected(0,2))# True(0、1、2 连通)print(uf.is_connected(0,3))# False(0 和 3 分属不同集合)# 合并两个集合uf.union(2,3)print(uf.is_connected(0,3))# True(所有元素连通)# 查询集合大小print(uf.get_set_size(0))# 5(所有元素在一个集合中)并查集是解决连通性问题的利器,广泛应用于图论、算法竞赛和工程场景:
图的连通分量统计
最小生成树算法(Kruskal 算法)
检测图中的环
动态连通性问题
岛屿数量问题(LeetCode 经典题)
区间合并问题
带权并查集
a到b的距离、a和b的大小关系等。可持久化并查集
| 数据结构 | 核心功能 | 优势 | 劣势 |
|---|---|---|---|
| 并查集 | 高效管理集合的合并与查询 | 时间复杂度近似 O(1),实现简单 | 不支持删除元素(拆分集合) |
| 邻接表 | 存储图的结构,支持遍历 | 适合图的遍历(DFS/BFS) | 连通性查询效率低(O(n)) |
| 哈希表 | 存储键值对,支持查找 | 支持任意类型的键,查找快 | 无法高效维护集合的合并 |
并查集是针对连通性问题的专用数据结构,在处理动态合并和查询的场景下,效率远超其他结构。