在并查集1中,我们说了,find操作的操作步数是跟树节点的平均深度相关的,所以我们渴望树节点的平均深度尽量小,在并查集1中,我们给出来rank小的树接在rank大的树上的方法,但是这还是不够优,在一些时间要求较严的题通不过去,那有没有更优的方法呢,请看下文。
原来的未路径压缩代码
int find(int x){
int r=x;
while(pre[r]!=r){
r=pre[r]; //当r不是根节点,指向它的父节点
}
return r;
}
接下来提供两个路径压缩方法,就不用rank了。
其中的一种路径压缩方法是在find时,如果r不是根节点,就让pre[r]=pre[pre[r]]。什么意思,就是r的父节点变成r的爷爷节