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

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

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

JAVA算法2——连通性问题之快速合并算法

我们考虑的下一个算法是与快速查找算法互补的快速合并算法.它基于相同的数据结构--以对象名作为索引的数组--但由于它对元素值的解释与快速查找算法不同,因此导致了更复杂的抽象结构.在一个无循环的结构中,每个对象都与同一集合中的另一个对象有连接.要判断两个对象是否在同一个集合中,我们分别沿着每一个对象的连线走,知道到达某一个有到自身连接的对象.两个对象在同一个集合中,当且仅当他们的终点是同一个对象.如果两个对象不在同一个集合中,则分别循着他们的连线往前走,终点将不是同一个对象.那么,要实现合并操作,我

JAVA算法3——连通性问题之快速合并算法的加权版本

在进行合并操作的时候,我们不是随意的把第二棵树连接到第一棵树,而是记下每棵树的节点数,合并的时候,总是要把结点数较少的树连接到节点数较大的数上.这个改变需要修改的代码稍微多一点,而且还需要一个数组来存放节点数,但是使程序的效率提高不少,我们把这个算法称为"加权快速合并算法". public class QuickUW {     public static void main(String[] args)     {         int N=Integer.parseInt(arg

hdu oj 1061 Rightmost Digit (快速幂算法)

这里首先要讲解一下快速幂算法: 快速幂取模算法 在网站上一直没有找到有关于快速幂算法的一个详细的描述和解释,这里,我给出快速幂算法的完整解释,用的是C语言,不同语言的读者只好换个位啦,毕竟读C的人较多~ 所谓的快速幂,实际上是快速幂取模的缩写,简单的说,就是快速的求一个幂式的模(余).在程序设计过程中,经常要去求一些大数对于某个数的余数,为了得到更快.计算范围更大的算法,产生了快速幂取模算法.[有读者反映在讲快速幂部分时有点含糊,所以在这里对本文进行了修改,作了更详细的补充,争取让更多的读者一目

【转】并查集算法和路径压缩

并查集是我暑假从高手那里学到的一招,觉得真是太精妙的设计了.以前我无法解决的一类问题竟然可以用如此简单高效的方法搞定.不分享出来真是对不起party了.(party:我靠,关我嘛事啊?我跟你很熟么?) 来看一个实例,杭电1232畅通工程 首先在地图上给你若干个城镇,这些城镇都可以看作点,然后告诉你哪些对城镇之间是有道路直接相连的.最后要解决的是整幅图的连通性问题.比如随意给你两个点,让你判断它们是否连通,或者问你整幅图一共有几个连通分支,也就是被分成了几个互相独立的块.像畅通工程这题,问还需要修

JAVA算法1——连通性问题之快速查找算法

假设现在有一个整数对序列,每个整数对代表某周类型的对象,我们用P-Q对表示"P链接到Q".我们假设这种关系具有传递性,即如果p链接到q,而q又连接到r,则p连接到r. 下面的程序是一个简单算法的实现,这个算法是解决连通性问题的快速查找算法.该算法的基础是一个整数数组,当且仅当第p个数组元素和第q个数组元素是相等的,则p与q是相连的.我们把第i个元素初始化为i(0 ≤i≤N).要完成p和q的合并操作,需要搜索整个数组,把所有与第p个数组元素相同的元素全部改为第q个数组元素的值. publ

poj 2513 Colored Sticks(欧拉回路 并查集 路径压缩 字典树)(困难)

Colored Sticks Time Limit: 5000MS   Memory Limit: 128000K Total Submissions: 32545   Accepted: 8585 Description You are given a bunch of wooden sticks. Each endpoint of each stick is colored with some color. Is it possible to align the sticks in a st

算法-动态连通性

动态连通性直接听起来会稍微绕口一点,简单的说就是输入一列整数对,其中每个整数都表示某种类型的对象,假设输入的的整数对是p和q,我们可以理解p和q是相连的,假设相连是一种等价关系,一般具有三种特性自反性,对称性,传递性,根据上面的特性,如果整数对不存在某种等价关系,那么直接输出,如果存在就不输出.简单的举几个例子,计算机网络中判断两个计算机是否需要建立新的连接通信,如果可以通过一个或某几个节点能通信,那么我们就不需要建立新的连接,数学中可以将p 和q看成集合,跑题了,看下如何实现的吧,四种方式依次

hdu 1558 线段相交+并查集路径压缩

Segment set Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 3457    Accepted Submission(s): 1290 Problem Description A segment and all segments which are connected with it compose a segment set.

hadoop对于压缩文件的支持及算法优缺点

hadoop对于压缩文件的支持及算法优缺点   hadoop对于压缩格式的是透明识别,我们的MapReduce任务的执行是透明的,hadoop能够自动为我们 将压缩的文件解压,而不用我们去关心. 如果我们压缩的文件有相应压缩格式的扩展名(比如lzo,gz,bzip2等),hadoop就会根据扩展名去选择解码器解压. 压缩格式 工具 算法 文件扩展名 多文件 可分割性 DEFLATE 无 DEFLATE .deflate 不 不 gzip gzip DEFLATE .gz 不 不 ZIP zip