(四)循环队列 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 s、64 s ;
二百万、二千万,我没测试;但是,我测试 一百万 我等了 17 分钟,没跑完,然后我结束了运行,二千万的数据 ,估计得按 小时 算 ;
备注:我的 CPU 是 i7-4710mq ,具体测试,跟 CPU 型号有关 ;
链表
之前实现的 动态数组 、队列 、栈 其实本质上都是静态的, 底层都是利用 静态数组 创建的,我们需要考虑,什么时候 扩容,什么时候 缩小;
而 链表,是真正的动态结构,它根本不需要去考虑 扩容 、缩小 ,因为它本身就是动态的变化着 ;
随机访问
但是 链表 也有缺点,由于底层不再是利用 静态数组 实现的,因此,丧失了 随机访问 能力 ;
因为 静态数组 底层开辟的内存,是连在一起的,可以根据下标,直接计算出偏移量,直接去访问对应地址的内存 ;
链表 由于是动态的变化的,它的节点之间,是通过 引用 相互连接在一起的 ,是 无法直接计算 出某一个节点的内存地址的,因此,也就不具备随机访问了;
(四)循环队列 VS 数组队列 (效率对比)的更多相关文章
- C语言 简单的队列(数组队列)
//简单的队列 #include<stdio.h> #include<stdlib.h> #define datatype int #define N 10 //定义队列结构体 ...
- Java数据类型Stack栈、Queue队列、数组队列和循环队列的比较
判断括号是否匹配:调用java本身 import java.util.Stack; public class Solution { public boolean isValid(String s){ ...
- js_数组去重效率对比
学习javascript已经快两年了,也不知道到了什么程度了. 说说我对javascript的理解,在电脑的世界里,只有数据. 数组,对象,字符串.对这些数据进行操作就可以完成很多业务逻辑,和页面的交 ...
- Python与数据结构[2] -> 队列/Queue[0] -> 数组队列的 Python 实现
队列 / Queue 数组队列 数组队列是队列基于数组的一种实现,其实现类似于数组栈,是一种FIFO的线性数据结构. Queue: <--| 1 | 2 | 3 | 4 | 5 |<-- ...
- 【栈和队列】5、队列概述与数组队列的基本实现 - Java
3-5 数组队列 简单记录 - bobo老师的玩转算法系列–玩转数据结构 - 栈和队列 队列Queue 队列也是一种线性结构 相比数组,队列对应的操作是数组的子集 只能从一端(队尾)添加元素,只能从另 ...
- 浅谈集合框架四——集合扩展:集合循环输出方式及list输出方式的效率对比
最近刚学完集合框架,想把自己的一些学习笔记与想法整理一下,所以本篇博客或许会有一些内容写的不严谨或者不正确,还请大神指出.初学者对于本篇博客只建议作为参考,欢迎留言共同学习. 之前有介绍集合框架的体系 ...
- 用数组实现队列(顺序队列&循环队列)
用数组实现队列(顺序队列&循环队列) 顺序队列 ️ 队列(先进先出) 几个问题: 队列方法:入队.出队 队列的存储:即队首队尾两个指针, 扩容:如果队列容量不够了,应该扩容,如果队尾没有位置了 ...
- C# 高性能的数组 高性能数组队列实战 HslCommunication的SharpList类详解
本文将使用一个gitHub开源的组件技术来实现这个功能 github地址:https://github.com/dathlin/HslCommunication ...
- 队列的C++实现(数组)——创建-进队-出队-返回队首元素-清空队列栈-处理队列
队列的数组实现,从队尾进入,对头删除. 队列长度用标志变量size,它是独立于front和rear的一个变量.size == 0,队列为空.size == capacity,满队列. 一.结点声明 s ...
随机推荐
- 2019CCPC-江西省赛C题 HDU6569 GCD预处理+二分
Trap Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 262144/262144 K (Java/Others)Total Subm ...
- centos7 配置静态ip时出现双ip问题解决
1.先用ifconfig,看看有几个网卡 2.执行vi /etc/sysconfig/network-scripts/ifcfg-eth0最后的网卡名字改为实际的 3.静态ip只需要设置着几个地方,B ...
- C语言学习笔记4-数据输入和输出
本系列文章由jadeshu编写,转载请注明出处.http://blog.csdn.net/jadeshu/article/details/50752127 作者:jadeshu 邮箱: jades ...
- Ubuntu 14.04 更换为阿里云源
#备份sudo cp /etc/apt/sources.list /etc/apt/sources.list.bak#编辑sudo vim /etc/apt/sources.list,清空后,加入以下 ...
- ZR#996
ZR#996 解法: 若删除长度为 $ x $ 的子串后序列中没有相同元素,那么一定有至少一个长度为 $ x+1 $ 的子串,删除它后序列中也没有相同元素. CODE: #include <io ...
- CF1030C
CF1030C 题意: 给你一个数字,问能否拆分成k段,使得每一段的每一位数字相加结果相等. 解法: 考虑数位DP. 暴力按位考虑每一位是否满足条件 CODE: #include<cstdio& ...
- 配置连接远程ip的Redis
1.修改redis服务器的配置文件redis.windows.conf 注释绑定的主机地址 # bind 127.0.0.1 修改redis的守护进程为no,不启用 daemonize "n ...
- 《你不知道的JavaScript(上)》笔记——作用域闭包
当函数可以记住并访问所在的词法作用域时, 就产生了闭包, 即使函数是在当前词法作用域之外执行. function wait(message) { setTimeout( function timer( ...
- Spring Boot Actuator:介绍和使用
Spring Boot Actuator提供一系列HTTP端点来暴露项目信息,用来监控和管理项目.在Maven中,可以添加以下依赖: <!-- Spring boot starter: actu ...
- C# json提取多层嵌套到数组-- C# json 数组
json比一般格式再复杂点的就像数组一样,有多层嵌套,研究了一下,记录代码如下: string jsonText = "{'name':'test','phone':'18888888888 ...