码迷,mamicode.com
首页 > 编程语言 > 详细

JAVA算法4——连通性问题之路径压缩的加权快速合并算法

时间:2015-03-21 21:33:46      阅读:180      评论:0      收藏:0      [点我收藏+]

标签:java算法   路径压缩   折半路径压缩   

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

JAVA算法4——连通性问题之路径压缩的加权快速合并算法

标签:java算法   路径压缩   折半路径压缩   

原文地址:http://flyingfish.blog.51cto.com/9580339/1622754

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!