我们考虑的下一个算法是与快速查找算法互补的快速合并算法。它基于相同的数据结构——以对象名作为索引的数组——但由于它对元素值的解释与快速查找算法不同,因此导致了更复杂的抽象结构。在一个无循环的结构中,每个对象都与同一集合中的另一个对象有连接。要判断两个对象是否在同一个集合中,我们分别沿着每一个对象的连线走,知道到达某一个有到自身连接的对象。两个对象在同一个集合中,当且仅当他们的终点是同一个对象。如果两个对象不在同一个集合中,则分别循着他们的连线往前走,终点将不是同一个对象。那么,要实现合并操作,我们只需要把一个集合连到另一个集合,这就是快速合并的由来。
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; } } }
上述程序是解决连通性问题的快速合并算法中合并和查找操作的实现。由于快速合并算法不比对每一个输入对都扫描整个数组,因此它似乎比快速查找算法要运行的快一些。目前,因为它取出了快速查找算法的主要缺点,因此我们可以把快速合并算法看成是快速查找算法的改进。
快速合并和快速查找算法的这个区别当然代表着一种进步,但是快速合并算法还有一个缺点是:我们不能保证它在任何情况下都比快速查找算法快很多,因为输入数据可能会使查找操作变慢。
本文出自 “飞鱼技术” 博客,请务必保留此出处http://flyingfish.blog.51cto.com/9580339/1622553
原文地址:http://flyingfish.blog.51cto.com/9580339/1622553