优雅的数据结构,简洁的实现方式.
0 简介
并查集(disjoint-set data structure)是一种数据结构,可以查询元素所在的集合,以及合并两个不相交的集合. 其操作有: 添加集合、查询、合并.
初始化
在同一个集合中的元素,应有一个集合中的元素作为该集合的代表;而新加入的元素可以以集合中的元素为父节点,这样同一集合中的元素就在一棵树中,树的根节点为该集合的代表. 所以,用如下数组来表示:
1 | int rep[N]; |
其中,元素$i$的父节点为$\text{rep}[i]$.
1 朴素的实现
查询
1 | int find(int x) { |
合并
1 | // merge j's set with i's set |
2 高效的实现
2.1 路径压缩
修改$find$函数,在查询过程中,将$x$的父节点设置为根节点,使$x$到达根节点路径尽量短.
1 | int find(int x) { |
2.2 按秩合并
用秩($rank$)表示节点的深度,合并时,将秩较小的合并到较大的上面.
初始化
1 | int rep[N]; |
合并
1 | void merge(int i, int j) { |
参考
[1] 维基百科
[2] 知乎