主题:[讨论]关于带权的快速合并算法
带权的快速合并算法将执行至少顺着指针走lgN步
我想问这的lgN是如何得来的?
算法实现如下:
static const int N = 10000;
int main(){
int i, j,p,q,id[N],sz[N];
for(i=0;i<N;i++){
id[i]=i;sz[i]=1;}
while(cin>>p>>q)
{
for (i=p; i!=id[i]; i=id[i]); //寻找p所属集合的根
for (j=q; j!=id[j]; j=id[j]) //寻找q所属集合的根
;
if (i == j) //已经连通
return true;
if ( sz[i] > sz[j]) //合并p,q,即二者指向同一个根,并且总是将小的树连接到大的树上
{
id[j] = i;
sz[i] += sz[j];
}
else
{
id[i] = j;
sz[j] += sz[i];
}
cout<<" "<<p<<" "<<q<<endl;
}
}
我想问这的lgN是如何得来的?
算法实现如下:
static const int N = 10000;
int main(){
int i, j,p,q,id[N],sz[N];
for(i=0;i<N;i++){
id[i]=i;sz[i]=1;}
while(cin>>p>>q)
{
for (i=p; i!=id[i]; i=id[i]); //寻找p所属集合的根
for (j=q; j!=id[j]; j=id[j]) //寻找q所属集合的根
;
if (i == j) //已经连通
return true;
if ( sz[i] > sz[j]) //合并p,q,即二者指向同一个根,并且总是将小的树连接到大的树上
{
id[j] = i;
sz[i] += sz[j];
}
else
{
id[i] = j;
sz[j] += sz[i];
}
cout<<" "<<p<<" "<<q<<endl;
}
}