1. 简介
- 并查集(Union Find)也叫做不相交集合
- 并查集有两个核心操作
- 查找(Find):查找元素所在集合
- 合并(Union):将两个元素所在集合合并为一个集合
- 两种常见实现思路
- QuickFind:查找 —— O(1),合并 —— O(n)
- QuickUnion(常用):查找 —— O(logn)可优化至O(5),合并 —— O(logn)可优化至O(5)
2. 并查集如何存储数据
以存储整形数据为例,可以用数组实现并查集。比如数组的索引表示数据,值代表所属集合。
3. 实现
3.1 初始化
private int[] parents;
public UnionFind(int capacity){
parents = new int[capacity];
//每个数据单独属于一个集合
for(int i=0;i<parents.length;i++){
parents[i] = i;
}
}
3.2 基于QuickFind的Union、Find操作
union(1,0)是指将1的父结点改为0的父结点,即将1所在集合并入0所在集合。
public void union(int v1, int v2){
int p1 = find(v1);
int p2 = find(v2);
if(p1 == p2){
return;
}
for (int i = 0; i < parents.length; i++) {