能否找到一个保证线性时间性能的算法,这个问题非常难。还有一些改进加权快速合并算法的简单方法。理想情况下,我们希望每个结点直接连到其树根,但又不想像快速合并算法那样改变大量连线。我们可以简单地把所检查的所有结点连到根上,从而接近理想情况。我们可以很容易地实现此方法,方法名为压缩路径,在合并操作时,经过每条路径就加一条连线,也就是把一路上遇到的对应于每个顶点的id数组值都设为连到树根上。净结果就是几乎完全把树变平坦了,逼近快速查找法所获得的理想状态。
还有其他许多方法来实现路径压缩下面程序实现路径压缩的方法是:使在通向树根的路中的每条连线都指向路径的下一个结点,此方法比全路径压缩要简单些,并能获得同样的净结果。我们把此算法称为“折半路径压缩的加权快速合并”。
public class QuickUW { public static void main(String[] args) { int N=Integer.parseInt(args[0]); int id[]=new int[N],sz[]=new int[N]; for(int i=0;i<N;i++) { id[i]=i; sz[i]=1; } for(In.init();!In.empty();) { int i,j,p=In.getInt(),q=In.getInt(); for(i=p;i!=id[i];i=id[i]) id[i]=id[id[i]]; for(j=q;j!=id[i];j=id[j]) id[j]=id[id[j]]; if(i==j) continue; if(sz[i]<sz[j]) { id[i]=j; sz[j]+=sz[i]; } else { id[j]=i; sz[j]+=sz[j]; } } }
本文出自 “飞鱼技术” 博客,请务必保留此出处http://flyingfish.blog.51cto.com/9580339/1622754
原文地址:http://flyingfish.blog.51cto.com/9580339/1622754