据我所知,在快速联合算法中,当要处理一对时,我们首先进行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);
}
}
答案 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
...
然而,链接将与所描述的方向相反。