应用于对序列时快速联合算法的困惑:1-2,2-3,3-4

时间:2017-05-06 05:56:22

标签: c algorithm union-find

据我所知,在快速联合算法中,当要处理一对时,我们首先进行FIND操作并检查这些对象所在的树的根是否相等。 如果它们不相等,我们通过链接2个不同的根来执行UNION操作。

  

在Sedgewick pg-15属性中:1.2-“假设输入对按1-2的顺序排列,然后是2-3,然后是3-4,依此类推。在N-1这样的对之后,我们有N个对象全押   相同的集合,由快速联合算法形成的树是一条直线,N指向N-1,指向N-2,指向N-3,依此类推。“

据我说,形成的树有根1,所有其他对象从2到N是它的孩子 - 当我们扫描1-2时,有根本身所以我们链接它们,当我们扫描2-3,根2是1,3的根是3本身所以我们链接1和3而不是2和3。

在这种情况下,树如何成为一条直线?

#include <stdio.h> 

#define N 10000 

main() 

{   int i, p, q, t, id[NJ; 

for (i = 0; i < N; i++) id[i] = i; 

while (scanfC"%d %d\n", &p, &q)==2)
{

for(i=p;i!=id[i];i=id[i]);

for(j=q;j!=id[j];j=id[j]);

if(i==j) continue;

id[i]=j;

printf("%d%d\n",p,q);

}
} 

1 个答案:

答案 0 :(得分:0)

有一种情况可以形成一条直线:

1-2  leads to 1->2
2-3  the root of 2 is 2 and the root of 3 is 3 so link 2 to 3: 1->2->3
3-4  the roots are 3 and 4 so link 3 to 4: 1->2->3->4
...

然而,链接将与所描述的方向相反。