Algs4-1.5.20动态生长with Array

1.5.20动态生长。使用链表或大小可变的数组实现加权quick-union算法,去掉需要预先知道对象数量的限制。为API添加一个新方法netwSite(),它应该返回一个类型为int的标识符。
public class WeightedQuickUnionUFofDynamicWithArray
{
    private int[] id;
    private int[] sz;
    private int count;
    //
    public WeightedQuickUnionUFofDynamicWithArray()
    {
        count=2;
        id=new int[2];
        id[0]=0;
        id[1]=1;
        //
        sz=new int[2];
        sz[0]=1;
        sz[1]=1;
        //
    }
   
     public int count()
     {return count;}
    
      boolean connected(int p,int q)
      {
          //is false when p or q is bigger than index of id
          if (p>id.length-1 || q>id.length-1)
              return false;
          else
             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)
      {
          if(p>id.length-1 || q>id.length-1)
          {
             // resize array id and sz length to p+1 or q+1, marksure array max index is p or q.  
              if (p>q)
                  resize(p+1);
              else
                 resize(q+1);
          }
          //
          int i=find(p);
          int j=find(q);
          if(i==j) return;
          if(sz[i]<sz[j])
          {
              id[i]=j;
              sz[j]=sz[j]+sz[i];
           }
          else
          {
              id[j]=i;
              sz[i]=sz[i]+sz[j];
          }
          count--;
         }
     
      public int newSite()
      {//with array,this method return the max index of id or sz.
          return id.length;
      }
     
      private void resize(int max)
      {
          int[] tempID=new int[max];
          for(int i=0;i<id.length;i++)
              tempID[i]=id[i];
          for(int j=id.length;j<max;j++)
              tempID[j]=j;
          id=tempID;
          //
          int[] tempSZ=new int[max];
          for(int i=0;i<sz.length;i++)
              tempSZ[i]=sz[i];
          for(int j=sz.length;j<max;j++)
              tempSZ[j]=1;
          sz=tempSZ;
      }
      
       public static void main(String[] qrgs)
       {
           WeightedQuickUnionUFofDynamicWithArray uf=new WeightedQuickUnionUFofDynamicWithArray();
           while (!StdIn.isEmpty())
           {
               int p=StdIn.readInt();
               int q=StdIn.readInt();
               StdOut.printf("p=%d  q=%d \n",p,q);
               if(uf.connected(p,q)) continue;
               uf.union(p,q);
            }//end while
        }//end main
}//end class

posted @ 2018-10-26 10:20  修电脑的龙生  阅读(247)  评论(0编辑  收藏  举报