并查集小结
简单,高效的数据结构。
- 路径压缩
即把一条链上的全部点的父亲压缩成为这条链的终点
可以大大省略时间,但是会丢失一些信息
如果想知道本来的父亲以求出 LCA 等,可以使用——
- 按秩合并
此方法是非路径压缩并查集的时间补偿方法。
一个有趣的地方是,每次 merge 是只要我们把小的树安置在大的树上,而不是反着操作,可以大幅减小树深,从而减小每次一步一步查询的时间。
这里的小的有多种定义,如树深小,子树小等。
可以证明按秩合并后单次查询时间复杂度不超过
- 可删除并查集
对于每个点建立一个虚拟节点(可以形象的称之为“母亲”),默认母亲等于自己。
注意,之后我们的并查集维护的都是母亲而不是本身。
当我们需要删除一个点的时候,我们就可以“离家出走”脱离原来的母亲。
如果我们需要将这个点加入新的树,我们就可以把这个点的母亲设为新的“家庭”上的任何一个母亲。
- 可撤销并查集
该方法建立于按秩合并基础上。
其实很简单,将被合并的节点加入一个栈里面,撤销时弹出栈,将父亲设为自己即可。
- 时间戳并查集
该方法建立于按秩合并基础上。
维护一个时间戳数组,记录当前节点与它的父亲建立联系的时间。
查找
利用父亲信息,跑一遍 LCA 维护答案即可。