深入理解并查集:原理、实现与应用
创作时间:
作者:
@小白创作中心
深入理解并查集:原理、实现与应用
引用
CSDN
1.
https://blog.csdn.net/2302_77582029/article/details/146291059
并查集(Disjoint Set Union, DSU)是一种用于处理不相交集合合并与查询操作的数据结构。它广泛应用于图论、网络连接问题以及动态连通性问题。本文将详细介绍并查集的原理、实现方法、优化技巧以及典型应用场景,帮助读者全面掌握这一重要数据结构。
1. 并查集的定义与原理
1.1 定义
并查集是一种树形数据结构,用于维护一组不相交的集合,支持以下两种操作:
- 查找(Find):确定某个元素所属的集合。
- 合并(Union):将两个集合合并为一个集合。
1.2 核心思想
- 每个集合用一棵树表示,树的根节点作为集合的代表。
- 通过路径压缩和按秩合并优化操作效率。
1.3 示例
假设有5个元素:{0, 1, 2, 3, 4},初始时每个元素都是一个独立的集合:
0 1 2 3 4
执行以下操作:
- Union(0, 1):将0和1合并。
0
|
1
- Union(2, 3):将2和3合并。
2
|
3
- Union(1, 3):将1和3合并。
0
/ \
1 2
|
3
- Find(3):查找3的根节点,结果为0。
2. 并查集的实现
以下是并查集的C++实现代码,包括路径压缩和按秩合并优化。
2.1 代码实现
#include <iostream>
#include <vector>
class DSU {
private:
std::vector<int> parent; // 父节点数组
std::vector<int> rank; // 秩数组(树的高度)
public:
DSU(int n) {
parent.resize(n);
rank.resize(n, 1); // 初始时每个集合的秩为1
for (int i = 0; i < n; ++i) {
parent[i] = i; // 初始时每个节点的父节点是自己
}
}
// 查找操作(带路径压缩)
int find(int x) {
if (parent[x] != x) {
parent[x] = find(parent[x]); // 路径压缩
}
return parent[x];
}
// 合并操作(带按秩合并)
void unionSets(int x, int y) {
int rootX = find(x);
int rootY = find(y);
if (rootX == rootY) return; // 已经在同一集合中
// 按秩合并
if (rank[rootX] > rank[rootY]) {
parent[rootY] = rootX;
} else if (rank[rootX] < rank[rootY]) {
parent[rootX] = rootY;
} else {
parent[rootY] = rootX;
rank[rootX]++;
}
}
// 判断两个元素是否在同一集合中
bool isConnected(int x, int y) {
return find(x) == find(y);
}
};
int main() {
DSU dsu(10);
dsu.unionSets(1, 2);
dsu.unionSets(2, 3);
dsu.unionSets(4, 5);
std::cout << "1 和 3 是否连通: " << (dsu.isConnected(1, 3) ? "是" : "否") << std::endl;
std::cout << "1 和 4 是否连通: " << (dsu.isConnected(1, 4) ? "是" : "否") << std::endl;
return 0;
}
2.2 代码解析
- 初始化:每个元素的父节点是自己,秩为1。
- 查找操作:通过递归找到根节点,并进行路径压缩。
- 合并操作:将两个集合的根节点合并,按秩合并避免树过高。
- 连通性判断:通过查找操作判断两个元素是否在同一集合中。
3. 并查集的应用场景
3.1 图的连通性问题
- Kruskal算法:用于最小生成树中判断边是否会形成环。
- 连通分量:用于统计图中的连通分量数量。
3.2 动态连通性问题
- 网络连接:实时判断两个设备是否连通。
- 社交网络:判断两个人是否属于同一个社交圈子。
3.3 图像处理
- 像素连通性:用于图像分割中判断像素是否属于同一区域。
4. 并查集的优化
4.1 路径压缩
- 在查找操作中,将节点的父节点直接指向根节点,减少后续查找的时间。
- 示例:
查找前:
0
/ \
1 2
/ \
3 4
查找3后:
0
/ | \
1 2 3
\
4
4.2 按秩合并
- 在合并操作中,将较小的树合并到较大的树中,避免树的高度过高。
- 示例:
合并前:
0 2
/ / \
1 3 4
合并后:
0
/ | \
1 2 3
\
4
5. 并查集的时间复杂度
- 查找操作:接近O(1)。
- 合并操作:接近O(1)。
- 总体时间复杂度:O(α(n)),其中α(n)是反阿克曼函数,增长非常缓慢。
6. 总结
并查集是一种高效的数据结构,适用于处理不相交集合的合并与查询问题。通过路径压缩和按秩合并优化,其操作的时间复杂度接近常数级别。掌握并查集的原理和实现方法,可以帮助我们更好地解决实际问题。
热门推荐
中宣部、国家卫健委表彰!协和朱兰:获评2024“最美医生”!
米糊是否能作为早餐食用
冲动型人格障碍怎么治疗
成都将打造30个“世运空间”!首个“世运空间”等你来打卡→
武汉三镇是哪三镇
白手起家,3000名员工在家上班,东北姑娘狂赚60亿,成最年轻富豪
全国七成农产品通过农批市场进行分销 助力县域特色产业发展
如何有效瘦咬肌?饮食、运动与美容方法全攻略
JNCI最新研究:空气污染与绿色植被如何影响儿童癌症风险?
最新研究揭示:TP53基因突变与儿童肿瘤的关系
糖尿病患者骨折后如何饮食?专家给出五大营养建议
故意碾压致死:恶魔司机的罪行
故意碾压致死:恶魔司机的罪行分析
意甲榜首之争愈演愈烈:那不勒斯1分领跑,六强争霸战火连天!
上海社保卡激活需要什么材料
《百年孤独》爆火背后:奈飞的本土内容全球化战略
科普 | 中医药治疗失眠之芳香疗法
甲母痣可以自愈吗?专业解答与日常护理指南
科技大重置 工作景观巨变 AI时代职场的机遇与挑战
揭秘!哪些专业真正适合“普通人”选择?家长学生必看,建议收藏!
咖啡喝多了会损伤肝脏健康?过量饮用咖啡会给身体带来哪些危害?
胆结石患者可以适量饮用黑咖啡
征信逾期记录多久能消除?后果与恢复方式全解析
【市场监管】信用修复怎么“办”? 你想知道的在这里!
心律不齐能慢跑吗?医生的专业建议来了
手抓饼最好吃的十种酱料推荐 做手抓饼用什么酱最好
Signal可以多开吗?
银行的不同期限存款利率的变化趋势对投资者行为的影响?
深圳当代艺术与城市规划馆:一座展示城市发展的艺术殿堂
绿色低碳的“建筑样本”!深圳美术馆(新馆)·深圳图书馆北馆获国家级认证