*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 ",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(" ");
          for (int k=0;k<id.length;k++)
              StdOut.printf("%3d",hi[k]);
          StdOut.printf(" ");
      }
      
       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

原文地址:https://www.cnblogs.com/longjin2018/p/9854782.html