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

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

public class QuickFind
{
    public static void main(String[] args)
    {
        int N=Integer.parseInt(args[0]);
        int id[]=new int[N];
        for(int i=0;i<N;i++)
        id[i]=i;
        for(In.init();!In.empty();)
        {    
            int i,j,p=In.getInt(),q=In.get();
            for(i=p;i!=id[i];i=id[i]);
            for(j=q;j!=id[j];j=id[j])
            if(i==j)
            {
                System.out.println("p与q是连通的!");
                continue;
                
            }
            id[i]=j;
            
            
        }
    }
}

上述程序是解决连通性问题的快速合并算法中合并和查找操作的实现。由于快速合并算法不比对每一个输入对都扫描整个数组,因此它似乎比快速查找算法要运行的快一些。目前,因为它取出了快速查找算法的主要缺点,因此我们可以把快速合并算法看成是快速查找算法的改进。

快速合并和快速查找算法的这个区别当然代表着一种进步,但是快速合并算法还有一个缺点是:我们不能保证它在任何情况下都比快速查找算法快很多,因为输入数据可能会使查找操作变慢。

时间: 2024-10-24 21:21:33

JAVA算法2——连通性问题之快速合并算法的相关文章

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

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

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

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

能否找到一个保证线性时间性能的算法,这个问题非常难.还有一些改进加权快速合并算法的简单方法.理想情况下,我们希望每个结点直接连到其树根,但又不想像快速合并算法那样改变大量连线.我们可以简单地把所检查的所有结点连到根上,从而接近理想情况.我们可以很容易地实现此方法,方法名为压缩路径,在合并操作时,经过每条路径就加一条连线,也就是把一路上遇到的对应于每个顶点的id数组值都设为连到树根上.净结果就是几乎完全把树变平坦了,逼近快速查找法所获得的理想状态. 还有其他许多方法来实现路径压缩下面程序实现路径压

《算法C语言实现》————快速-查找算法(quick-find algorithm)

算法基础是一个整型数组,当且仅当第p个元素和第q个元素相等时,p和q时连通的.初始时,数组中的第i个元素的值为i,0<=i<N,为实现p与q的合并操作,我们遍历数组,把所有名为p的元素值改为q.我们也可以选择另外一种方式,把所有名为q的元素改为p. 这个程序从标准输入读取小于N的非负整数对序列(对p-q表示"把对象β 连接到q"),并且输出还未连通的输入对.程序中使用数组id,每个元素表示一个对象,且具有以下性质,当且仅当p和q时连通的,id[p]和id[q]想等.为简化起

普林斯顿公开课 算法1-10:并查集-优化的快速合并方法

应用 渗透问题 游戏中会用到. 动态连接 最近共同祖先 等价有限状态机 物理学Hoshen-Kopelman算法:就是对网格中的像素进行分块 Hinley-Milner多态类型推断 Kruskai最小生成树 Fortran等价语句编译 形态学开闭属性 Matlab中关于图像处理的bwlabel函数 渗透问题 一个N×N的矩阵,判断顶部和底部是否连通就是渗透问题. 下图中左侧的矩阵能渗透,右侧矩阵不能渗透. 渗透问题在电学.流体力学.社会交际中都有应用. 在游戏中可能需要生成一张地图,但是作为地图

普林斯顿公开课 算法1-9:并查集-快速合并

本节讲的是并查集的另外一种实现方法.这种方法的合并操作开销很小,但是查找操作开销很大. 数据结构 这种算法的数据结构和快速查找方法的数据结构是一样的,也是N个整数组成的数组. 数组中每个元素id[i]的含义是指i的上级是id[i]. 根节点 一个节点的根节点就是id[id[id[...id[i]....]]],一直循环直到数值不再变化为止.由于算法的特性,这种循环永远不会造成死循环. 查找操作 查找操作就是判断两个节点的根节点是否相同. 合并操作 合并节点p和节点q就是将p节点的根节点的父节点设

Java中Map相关的快速查找算法与唯一性(转载)

原文地址:http://blog.csdn.net/chuyuqing/article/details/19629229 在对<Set和hashCode()>的一篇原创文章写完后,由于对自己的一些论断产生了模糊和怀疑,因此又对Set进行了一些研究,形成本篇. 在Set的使用场景中,我们不外乎看中了她存储数据的唯一性,即不能存储重复值,这在某些应用场合下是很必要的一个特性.那么从更深一层来考虑,Set究竟如何使数据不重复的呢?从另一个层面来考虑,她又如何确保在验证数据是否重复过程中的快速性呢?假

Java密码学原型算法实现——第一部分:标准Hash算法

题注 从博客中看出来我是个比较钟爱Java的应用密码学研究者.虽然C在密码学中有不可替代的优势:速度快,但是,Java的可移植性使得开发人员可以很快地将代码移植到各个平台,这比C实现要方便的多.尤其是Android平台的出现,Java的应用也就越来越广.因此,我本人在密码学研究过程中实际上也在逐渐使用和封装一些知名的Java密码学库,主要是方便自己使用. Java JDK实际上自带了密码学库,支持几乎所有通用密码学原型的实现.然而,自带密码库有几个缺点:第一,由于版权问题,其并不支持全部的密码学

Java进阶(五十七)-基于感知哈希算法的图像配准

Java进阶(五十七)-基于感知哈希算法的pHash图像配准算法 ??毕业论文提交之后,老师交给自己一项任务:图像配准,也就是给你两幅图像,通过系统来判定两幅图像是否为同一副图像.自己作为这一方面的小白,先去网上搜索一下相应的检测方法,当然有现成的API调用最好,花钱也无所谓. ??我们这里采用的基础关键技术叫做 "感知哈希算法"(Perceptual hash algorithm),它的作用是对每张图片生成一个"指纹"(fingerprint)字符串,然后比较不同