(四)循环队列 VS 数组队列 (效率对比)
2024-10-21 09:24:18
目录
背景
各自完成插入 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
型号有关 ;
链表
之前实现的 动态数组
、队列
、栈
其实本质上都是静态的, 底层都是利用 静态数组
创建的,我们需要考虑,什么时候 扩容
,什么时候 缩小
;
而 链表
,是真正的动态结构,它根本不需要去考虑 扩容 、缩小
,因为它本身就是动态的变化着 ;
随机访问
但是 链表
也有缺点,由于底层不再是利用 静态数组 实现的,因此,丧失了 随机访问 能力 ;
因为 静态数组
底层开辟的内存,是连在一起的,可以根据下标,直接计算出偏移量
,直接去访问对应地址的内存 ;
链表
由于是动态的变化的,它的节点之间,是通过 引用
相互连接在一起的 ,是 无法直接计算
出某一个节点的内存地址的,因此,也就不具备随机访问了;
最新文章
- javascript面向对象之一
- iOS 设置系统屏幕亮度
- Android和SQLite版本对应关系
- 【原】Comparator和Comparable的联系与区别
- token验证 sae
- Material Master
- hdu_5876_Sparse Graph(补图BFS)
- 46. leetcode 500. Keyboard Row
- 《JavaScript高级程序设计》笔记:事件(十三)
- Vue过滤器
- linux内存 free命令 buffer cache作用
- js 实现异步上传图片+预览
- JavaWeb三大组件之Servlet
- java代码理解
- Android学习之基础知识十四 — Android特色开发之基于位置的服务
- ROS 错误之 [rospack] Error: package &#39;beginner_tutorials&#39; not found
- shell中test命令方法详解
- 微信小程序导出当前画布指定区域的内容并生成图片保存到本地相册(canvas)
- svn up 排除目录更新
- addEvent兼容版