并查集基础思路学习
今天的安排有学习堆排序与构建树,上午接触到了入门并查集,在学长的带领下思路尤为清晰,讲述了并查集的实现与实现的方式。
举例:若干个人,每个人都是单独的个体,一旦有人与其他人组团后这个人就会属于这个社团,他们就会建立关联。而社团与社团之间也同样会产生联系,比如一个人加入了这个社团,同时又在另一个社团,这样我们就可以理解为两个社团合并为同一个社团。
并查集实现方式一:路径压缩
思想:尽量减少树的高度,情况如下
- 一个单独的个体加入到社团
- 一个社团与另一个社团进行连接
情况一的操作我们可以直接将个体的存储空间存下社团代表的值即可
情况二的操作同样很简单,我们需要做的是找到两个社团的代表,使一个代表存储空间记录下另一个代表的值,两个社团便成为了一个社团。
并查集实现方式二:按秩合并
思想:尽量减少树的高度,高度小的连在高度高的树上,情况如下
- 两个社团人数相同,一个社团的父亲指向另一个社团的父亲,被指的父亲节点的秩加一
- 社团人数不同,导致树的高度不同,要让树高度低的连在树高度高的上,这样树的高度不会增加,查找时时间复杂度不会增加。
代码实现:
查找操作:
int find(int x){
if(x == a[x])
return x;
else return a[x] = find(a[x]);
}
合并操作
void merge(int x,int y){
int x1 = find(x);
int y1 = find(y);
a[x1] = y1;
}
此代码块为路径压缩写法,希望大家可以受到启发,自行实现按秩合并,按秩合并在算法竞赛中并不是很常见 感谢观看,一起加油!!!