问题描述
union find:并查集
有一组点的集合${a_1,a_2,…a_n}$,定义一种连接关系,如果$a_i$连接$a_j$,则:
- 自反性:$a_i$连接$a_i$
- 对称性:$a_j$也连接$a_i$
- 传递性:如果$a_j$连接$a_k$,则$a_i$也连接$a_k$
对于上面的集合我们想实现基本的操作,包括元素的初始化,连接两个元素,找到某个元素连接的元素,判断两个元素是否连接等。具体API如下:
具体实现
可以用一维数组表示元素集合,数组下标表示元素位置,数组值表示当前元素所连接至的元素。具体实现如下:
1 | public class UF { |
采用的算法是 Weghted Quick-Union With Path Compression,对一般的 quick-union 算法做了两个改进:
- union 方法实现中,两个连通子集连接时,将根据子集树的深度来连接
- find 方法实现中,顺便压缩了子集树的深度
这样做后union 和 find 方法的算法复杂度下降到接近于 1。
具体细节见算法(第四版)的 1.5节。