*Algs4-1.5.14根据高度加权的quick-union算法-(未解决)
1.5.14根据高度加权的quick-union算法。给出UF的一个实现,使用和加权quick-union算法相同的策略,但记录的是树的高度并不总是将较矮的树连接到较高的树上 。用算法证明N个触点的树的高度不会超过其大小的对数级别。
答:暂未证明。
public class E1d5d14
{
private int[] id;
private int[] hi;
private int count;
public E1d5d14(int N)
{
count=N;
id=new int[N];
for (int i=0;i<N;i++)
{
id[i]=i;
StdOut.printf("%3d",i);
}
StdOut.println();
//
hi=new int[N];
//
}
public int count()
{return count;}
boolean connected(int p,int q)
{return find(p)==find(q);}
public int find(int p)
{
while(p!=id[p]) p=id[p];
return p;
}
public void union(int p,int q)
{
int i=find(p);
int j=find(q);
StdOut.printf(" i=%d j=%d\n",i,j);
if(i==j) return;
if(hi[i]<hi[j])
id[i]=j;
else if(hi[i]>hi[j])
id[j]=i;
else
{
id[j]=i;
hi[j]++;
}
count--;
//
for (int k=0;k<id.length;k++)
StdOut.printf("%3d",id[k]);
StdOut.printf("\n");
for (int k=0;k<id.length;k++)
StdOut.printf("%3d",hi[k]);
StdOut.printf("\n\n");
}
public static void main(String[] qrgs)
{
int N=StdIn.readInt();
E1d5d14 uf=new E1d5d14(N);
while (!StdIn.isEmpty())
{
int p=StdIn.readInt();
int q=StdIn.readInt();
if(uf.connected(p,q)) continue;
StdOut.printf("p=%d q=%d",p,q);
uf.union(p,q);
}//end while
}//end main
}//end class