• Algs4-1.5.24适用于Erdos-Renyi模型的快速算


    1.5.24适用于Erdos-Renyi模型的快速算法。在练习1.5.23的测试中增加加权quick-union算法和使用路径压缩的加权quick-union算法。你能分辨出这两种算法的区别吗?
    答:加权quick-union最坏情况下树深度为lgN,N为节点数,路径压缩的加权quick-union算法最坏情况下树深度为1。
    图片

    public class E1d5d24
    {
         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 double WeightedQuickUnionElapsedTime(int[][] cnns,int T,int N)
       {
            Stopwatch timer=new Stopwatch();
            for (int t=1;t<=T;t++)
            {
                 WeightedQuickUnionUF uf=new WeightedQuickUnionUF(N);
                 int i=0;
                 while(uf.count()>1)
                 {
                     uf.union(cnns[i][0],cnns[i][1]);
                     i++;
                 }
            }
             return timer.elapsedTime();
       }
       
            public static double CompressPathQuickUnionElapsedTime(int[][] cnns,int T,int N)
       {
            Stopwatch timer=new Stopwatch();
            for (int t=1;t<=T;t++)
            {
                 E1d5d12 uf=new E1d5d12(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,15);N=N+N)
            {
                int[][] cnns=Generate(N);
                double QuickFindTime=QuickFindElapsedTime(cnns,T,N);
                double QuickUnionTime= QuickUnionElapsedTime(cnns,T,N);
                double WeightedQuickUnionTime=WeightedQuickUnionElapsedTime(cnns,T,N);
                double CompressPathQuickUnionTime=CompressPathQuickUnionElapsedTime(cnns,T,N);
                 StdOut.printf("N=%6d T=%3d  QF=%6.2f QU=%6.2f WQU=%6.2f  CPQU=%6.2f QF/QU=%10.2f QF/WQU=%10.2f QF/CPQU=%10.2f ",  N,  T,QuickFindTime,QuickUnionTime,WeightedQuickUnionTime,CompressPathQuickUnionTime,QuickFindTime/QuickUnionTime,QuickFindTime/WeightedQuickUnionTime,QuickFindTime/CompressPathQuickUnionTime);
           }
           
        }
    }



  • 相关阅读:
    HDU 5977 Garden of Eden(点分治求点对路径颜色数为K)
    HDU 5828 Rikka with Sequence(线段树区间加开根求和)
    TZOJ 1689 Building A New Barn(求平面上有几个其它点求到n个点的曼哈顿距离最小)
    HDU 5734 Acperience(数学推导)
    POJ 1741 Tree(点分治点对<=k)
    HDU 5723 Abandoned country(kruskal+dp树上任意两点距离和)
    HDU 5988 Coding Contest(最小费用最大流变形)
    TZOJ 1693 Silver Cow Party(最短路+思维)
    TZOJ 4602 高桥和低桥(二分或树状数组+二分)
    TZOJ 2099 Sightseeing tour(网络流判混合图欧拉回路)
  • 原文地址:https://www.cnblogs.com/longjin2018/p/9859995.html
Copyright © 2020-2023  润新知