能否找到一个保证线性时间性能的算法,这个问题非常难。还有一些改进加权快速合并算法的简单方法。理想情况下,我们希望每个结点直接连到其树根,但又不想像快速合并算法那样改变大量连线。我们可以简单地把所检查的所有结点连到根上,从而接近理想情况。我们可以很容易地实现此方法,方法名为压缩路径,在合并操作时,经过每条路径就加一条连线,也就是把一路上遇到的对应于每个顶点的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];
            }
         
    }
}