文章目录
并查集(Union-Find)深度解析:从基础实现到工业级优化
并查集核心要义
定义:处理不相交集合的高效数据结构
核心操作:
- Find - 查询元素所属集合根节点
- Union - 合并两个集合
- Connected - 判断两元素是否连通
应用场景:
- 社交网络好友关系分析
- Kruskal最小生成树算法
- 图像连通区域标记
- 棋盘游戏连通性判断
一、基础实现与复杂度分析
初始版本代码实现(C++)
#include <vector>
using namespace std;
class UnionFind {
private:
vector<int> parent;
public:
UnionFind(int size) : parent(size, -1) {
} // 初始化所有节点为独立集合
// 基础Find操作
int find(int x) {
while (parent[x] >= 0) {
x = parent[x];
}
return x;
}
// 基础Union操作
void unionSets(int root1, int root2) {
if (root1 == root2) return;
parent[root2] = root1;
}
// 连通性判断
bool connected(int x, int y) {
return find(x) == find(y);
}
};
复杂度对比表
| 操作 | 时间复杂度 | 空间复杂度 |
|---|---|---|
| 基础Find | O(h) → O(n) | O(n) |
| 基础Union | O(1) | O(n) |
| 连通性判断 | O(h) → O(n) | O(n) |
h为树的高度,最坏情况下退化为链表结构
二、工业级优化策略
1. 路径压缩(Path Compression)
优化原理:将查询路径上的节点直接连接到根节点,摊平树结构
// 路径压缩优化版Find
int find(int x) {
if (parent[x] < 0) return x;
return parent

介绍&spm=1001.2101.3001.5002&articleId=140923083&d=1&t=3&u=7bbd8c59aa9349a7a1f1c98dbf440c31)
740

被折叠的 条评论
为什么被折叠?



