基本概念
并查集,在一些有N个元素的集合应用问题中,我们通常是在开始时让每个元素构成一个单元素的集合,然后按一定顺序将属于同一组的元素所在的集合合并,其间要反复查找一个元素在哪个集合中。
并查集是一种树型的数据结构,用于处理一些不相交集合(Disjoint Sets)的合并及查询问题。常常在使用中以森林来表示。
实现原理
通过更新维护父亲节点使得,合并后的集合最终拥有同一个点根节点,拥有相同根节点即为同类。
- Search 查找自己的根节点;(红圈标记为根节点)
- Merge 合并两个节点在一个集合;(假设寻找合并节点5和2)
- 压缩路径;压缩路径可以使得在多次查询时,查询时间得到优化,具体过程是优化其结构,使得查询点的父亲节点为根节点。(上图压缩路径后得到)
代码实现
1 void init(){ // 初始化自己祖先就是自己 2 for(int i = 1 ; i<= n; i++){ 3 pre[i] = i; 4 } 5 } 6 7 int Search(int x){ // 递归寻找自己的祖先 8 return x == pre[x] ? x : pre[x] = Search(pre[x]); 9 } 10 11 void Merge(int x, int y){ // 合并两个节点 12 int fx = Search(x); 13 int fy = Search(y); 14 if(fx != fy) pre[fx] = fy; // 把x合并到y即把x祖先设置为y的祖先 15 }