教材:算法 C语言实现(Algorithms In C)Third Edition
引言部分
快速-查找算法(quick-find algorithm):
该算法可用于求解连通问题。
算法思路:
在从输入读取一个新的对p-q后,对于对中的每个数执行查找操作。如果对的成员在同一集合中,那么考虑下一对;如果不在同一集合中,则执行合并操作,并输出这个对。
以下是其简单实现:
//quick find algorithm version 1.0
#include <stdio.h>
#define N 10000
int main(int argc, char *argv[])
{
int i,p,q,t,id[N];
for (i=0;i<N;i++)
id[i]=i;//初始化数组
while(scanf("%d,%d\n",&p,&q)==2){
if (id[p]==id[q]) continue;//查找操作
for(t=id[p],i=0;i<N;i++)
if(id[i]==t) id[i]=id[q];//合并操作
printf("%d %d\n",p,q);
}
return 0;
}
很显然,对于N个对象的连通性问题,在执行M次合并操作的情况下,快速查找算法至少执行M*N条指令。
算法效率太低,面对大量对象和输入时不可行。
基于同一数据结构,考虑快速合并(quick-union)算法。
算法思路:
在一个没有环的结构中,每个对象指向同一集合中的另一个对象,要确定两个对象是否在同一个集合中,只需跟随每个对象的指针,直到到达指向自身的一个对象。当且仅当这个过程使两个对象到达同一个对象时,这两个对象在同一集合中。如果两个对象不在同一个集合中,最终一定到达不同对象(每个对象都指向自身)。
快速合并算法将相互连通的数据元素放入同一集合,也就是将其放入同一树中,利用了有着同一根节点的元素最终都将指向同一根节点的性质。
快速查找树中,所有节点仅需一个连接就可到达树根。而在快速合并树中,可能要经过几个链接才能到达树根。
代码实现:
这里写代码片