zoukankan      html  css  js  c++  java
  • (四)循环队列 VS 数组队列 (效率对比)

    目录


    背景

    各自完成插入 10万、20万 条随机数,然后再将这些随机数出队列 ;


    测试代码

    
    /**
    * 测试速度
    */
     public String testSpeed(Queue<Integer> queue, int num) {
            long start = System.currentTimeMillis();
            Random random = new Random(47);
            for (int i = 0; i < num; i++) {
                queue.enQueue(random.nextInt(num));
            }
            for (int i = 0; i < num; i++) {
                queue.deQueue();
            }
    
            long end = System.currentTimeMillis();
            return (end - start) / 1000.0 + " s";
        }
    
        @Test
        public void test() {
    //        十万、二十万的数据
            int num = 200000;
            ArrayQueue<Integer> arrayQueue = new ArrayQueue();
            LoopQueue<Integer> loopQueue = new LoopQueue();
    
            // 十万测试的时间: 16.374 s     |  二十万测试的时间: 63.724 s
            System.out.println(testSpeed(arrayQueue, num));
            // 十万测试的时间: 0.085 s 、   |  二十万测试的时间: 0.128 s
            System.out.println(testSpeed(loopQueue, num));
    
        }

    结果

    从打印的时间看,二者的差距是 天壤之别

    循环队列 在完成 10万、20万 数据 入列、出列的时候,均在 1 s 之内 ;

    测试 二百万 的时间是 0.8 s二千万 数据,时间在 28 s


    数组队列 在完成 10万、20万 数据 入列、出列的时候,分别使用 16 s64 s

    二百万二千万,我没测试;但是,我测试 一百万 我等了 17 分钟,没跑完,然后我结束了运行,二千万的数据 ,估计得按 小时 算 ;


    备注:我的 CPUi7-4710mq ,具体测试,跟 CPU 型号有关 ;


    链表

    之前实现的 动态数组队列 其实本质上都是静态的, 底层都是利用 静态数组 创建的,我们需要考虑,什么时候 扩容,什么时候 缩小

    链表,是真正的动态结构,它根本不需要去考虑 扩容 、缩小 ,因为它本身就是动态的变化着 ;


    随机访问

    但是 链表 也有缺点,由于底层不再是利用 静态数组 实现的,因此,丧失了 随机访问 能力 ;

    因为 静态数组 底层开辟的内存,是连在一起的,可以根据下标,直接计算出偏移量,直接去访问对应地址的内存 ;

    链表 由于是动态的变化的,它的节点之间,是通过 引用 相互连接在一起的 ,是 无法直接计算 出某一个节点的内存地址的,因此,也就不具备随机访问了;

  • 相关阅读:
    北京,北京
    zha男/女的三种境界
    不爱和陌生人说话
    若风(一)
    【leetcode】部分思路整理
    【二叉树的遍历】
    【剑指offer】部分思路整理
    CentOS 7安装MySQL
    检查并解决CentOS 7 安装Tomcat是否成功
    CentOS 7安装JDK
  • 原文地址:https://www.cnblogs.com/young-youth/p/11665674.html
Copyright © 2011-2022 走看看