Algs4-1.5.23在Erdos-Renyi模型下比较quick-find算法和quick-union算法

1.5.23在Erdos-Renyi模型下比较quick-find算法和quick-union算法。开发一个性能测试用例,从命令行接受一个int值T并进行T次以下实验:使用练习1.5.17的用例生成随机连接。保存这些连接并和我们的开发用例一样分别用quikc-find算法和quick-union算法检查触点的连通性,不断循环直到所有触点均相互连通。对于每个N,打印出N值和两种算法的运行时间的比值。
答:
图片
public class E1d5d23
{
     public static class Connection
    {
        int p;
        int q;
        public Connection(int p,int q)
        {this.p=p; this.q=q;}
       
        public int P()
        {return p;}
   
        public int Q()
        {return q;}
    }
        //
    public static int[][]  Generate(int N)
    {
        Queue<Connection> cnns=new Queue();
        WeightedQuickUnionUF uf=new WeightedQuickUnionUF(N);
         while (uf.count()>1)
           {
               int p=StdRandom.uniform(N);
               int q=StdRandom.uniform(N);
               uf.union(p,q);
               cnns.enqueue(new Connection(p,q));
            }//end while
       //
         int[][] cnnsOfArray=new int[cnns.size()][2];
         int i=0;
         while(!cnns.isEmpty())
         {
             Connection item=cnns.dequeue();
             cnnsOfArray[i][0]=item.P();
             cnnsOfArray[i][1]=item.Q();
             i++;
         }
         return cnnsOfArray;
    }
   

   public static double QuickFindElapsedTime(int[][] cnns,int T,int N)
   {
        Stopwatch timer=new Stopwatch();
        for (int t=1;t<=T;t++)
        {
             QuickFindUF uf=new QuickFindUF(N);
             int i=0;
             while(uf.count()>1)
             {
                 uf.union(cnns[i][0],cnns[i][1]);
                 i++;
             }
        }
         return timer.elapsedTime();
   }
     
     
  public static double QuickUnionElapsedTime(int[][] cnns,int T,int N)
   {
        Stopwatch timer=new Stopwatch();
        for (int t=1;t<=T;t++)
        {
             QuickUnionUF uf=new QuickUnionUF(N);
             int i=0;
             while(uf.count()>1)
             {
                 uf.union(cnns[i][0],cnns[i][1]);
                 i++;
             }
        }
         return timer.elapsedTime();
   }
   

      
    public static void main(String[] args)
    {
        int T=Integer.parseInt(args[0]);
        for (int N=2;N<=Math.pow(2,32);N=N+N)
        {
            int[][] cnns=Generate(N);
            double QuickFindTime=QuickFindElapsedTime(cnns,T,N);
            double QuickUnionTime= QuickUnionElapsedTime(cnns,T,N);
           
            StdOut.printf("N=%6d T=%3d  QF=%7.2f QU=%7.2f   QF/QU=%5.2f \n",N,T,QuickFindTime,QuickUnionTime,QuickFindTime/QuickUnionTime);
        }
       
    }
}

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