博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Algs4-1.5.24适用于Erdos-Renyi模型的快速算
阅读量:7037 次
发布时间:2019-06-28

本文共 2680 字,大约阅读时间需要 8 分钟。

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",  N,  T,QuickFindTime,QuickUnionTime,WeightedQuickUnionTime,CompressPathQuickUnionTime,QuickFindTime/QuickUnionTime,QuickFindTime/WeightedQuickUnionTime,QuickFindTime/CompressPathQuickUnionTime);
       }
       
    }
}

转载于:https://www.cnblogs.com/longjin2018/p/9859995.html

你可能感兴趣的文章
sshd问题:A protocol error occurred. Change of username or service not allowed
查看>>
jQuery开发者眼中的AngularJS
查看>>
【DAY9】 关于多线程熊吃蜜Demo1的作业实验
查看>>
Python实现多属性排序
查看>>
nginx 访问日志分析
查看>>
RabbitMQ之消息确认机制(事务+Confirm)
查看>>
给出一个数组,计算数组中少了哪个数据的实现
查看>>
USB-232卡 配置
查看>>
C#窗体程序皮肤设置
查看>>
T-SQL.字符串函数
查看>>
mysql慢查询
查看>>
offices文件打开乱码问题如何处理
查看>>
抓屏程序
查看>>
many-to-many出现的问题
查看>>
第5章 配置邮箱服务
查看>>
node.js的一个简单框架
查看>>
PPT如何保存还原已剪裁图片的原始版本
查看>>
lnmp一键安装之-php
查看>>
ajax 同步和异步的区别
查看>>
linux shell单引号、双引号及无引号区别(考试题答案系列)--看到这篇文章之后我豁然开朗...
查看>>