用链表实现队列

news/2025/2/24 17:54:10/文章来源:https://www.cnblogs.com/yangkangkang/p/18734585

问题:链表和数组,哪个队列更快?

分析:

  • 队列是先进后出
  • 数组是连续存储的,push很快,shift 很慢  
  • 链表是非连续存储,add 和 delete 都很快
  • 结论:链表实现队列更快

链表实现队列

  • 单向链表,要同时记录 head 和 tail
  • 要从tail 入队,从head 出队
  • length要实时记录,不可遍历链表获取

代码实现:

/*** @description 链表实现队列* @author ykk*/
interface ILinkListNode {value: numbernext: ILinkListNode | null
}
export class QueueWithLink {private head:ILinkListNode | null = nullprivate tail:ILinkListNode | null = nullprivate len: number = 0/*** 入队*/add(n:number){const newNode:ILinkListNode = {value: n,next: null}//处理 headif(this.head == null){this.head = newNode}//处理 tailconst tailNode = this.tail if(tailNode){tailNode.next = newNode}this.tail = newNodethis.len++}/*** 出队,在 head位置*/delete():number | null{if(this.head == null  || this.len === 0){return null}//取值const value = this.head.value//修改头节点,指向下一个this.head = this.head.next// 记录长度this.len--return value}get length(): number{return this.len}
}

 

测试用例:

/*** @description 链表实现队列* @author ykk*/
import {QueueWithLink} from './queue-with-list'
describe('链表实现队列测试', () =>{it('add delete',()=>{const q = new QueueWithLink()expect(q.length).toBe(0)q.add(100)q.add(200)q.add(300)expect(q.length).toBe(3)})it('length',()=>{const q = new QueueWithLink()expect(q.delete()).toBeNull()q.add(100)q.add(200)q.add(300)expect(q.delete()).toBe(100)expect(q.delete()).toBe(200)})
})

 

性能测试:

 数组实现队列 和 链表实现队列 删除元素的性能测试,代码如下

//性能测试:
const p1 = new QueueWithLink()
for(let i = 0; i < 10 * 10000; i++){p1.add(i)
}
console.time('p1')
for(let i = 0; i < 10 * 10000; i++){p1.delete()
}
console.timeEnd('p1')const q2 = []
for(let i = 0; i < 10 * 10000; i++){q2.push(i)
}
console.time('q2')
for(let i = 0; i < 10 * 10000; i++){q2.shift()
}
console.timeEnd('q2')

 

执行时间对比:

链表删除的时间比 数组删除数据的时间要快5千多ms。 数字shift 执行时间非常慢

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/889108.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

PLC及CNC数控机床设备运行状态工艺参数节拍产量采集焊接设备

序号 车间 产线 设备名称 设备数量 控制器 控制器型号 通讯接口 设备采集参数 增加转 类型 换模块1 焊洗 焊洗4线 压簧支柱焊接设备 1 PLC 三菱FX1N 串口 设备运行状态;节拍;产量 是2 焊洗 焊洗4线 机脚焊接设备 1 PLC 三菱FX3U 串口 设备运行状态;节拍;产量 是3 焊…

Unity UI框架总结

前言 目前国内手游的开发过程中,大部分业务玩法都是围绕着UI进行的。一个玩法业务不管是大型还是小型,UI上能占用40%-60%的工作量,不过当然也与玩法类型也有关系,玩法越偏3D,UI占有率越低,玩法越偏2D,UI占有率就越高,甚至能达到100%。博主作为一个3年多工作经验的U3D小…

战神电话app版本过低怎么办更新最新版本

您的App版本过低,已无法使用,请升级App,您的App版本过低,已经停止提供烧录等功能,并即将停用全部功能,请记录设备密码并及时升级App 战神电话app最新版本,战神电话app版本过低怎么办, 怎么更新到最新版本,版本过低有什么app可以代替,不能继续使用app的用户,可以联系升…

Language-only Efficient Training of Zero-shot Composed Image Retrieval

目录概LinCIR代码Gu G., Chun S., Kim W., Kang Y. and Yun S. Language-only efficient training of zero-shot composed image retrieval. CVPR, 2024.概 本文提出了一种仅在文本上训练的 Zero-Shot Composed Image Retrieval (ZS-CIR) 方法. LinCIR上图展示了一种最为常见的…

vue中接收接口数据控制svg图转动

前段时间做了svg图放到vue项目中项目,实时展示监控堆垛机、线体、告警等实时信息,还有暖通、废气、水处理、进料等系统的实时数据,直接展示在svg图上,并且部分系统设备能下发设备参数或者开关控制设备。在之前已经讲过《vue集成svg大图拖拽无限放大缩小》、《vue若依集成C#…

DeepSeek-R1 1.5b、7b、8b、14b、32b、70b、671b 都是什么鬼?

大家好,我是R哥。 你是不是被 DeepSeek-R1 1.5b、7b、8b、14b、32b、70b、671b 这些概念绕晕了? 如图所示:DeepSeek-R1 模型有好几种规格,比如 1.5b、7b、8b、14b、32b、70b、671b,后面的数字代表模型的参数量,而 b 则是指 “billion” 的意思,也就是十亿,表示这个模型…

北京智和信通:全方位智能 OLT、ONU 设备监控运维方案

北京智和信通OLT、ONU监控运维方案自动发现网络中不同品牌、型号的OLT设备,统一纳管,集中监控,动态呈现OLT、ONU设备的运行态势,通过对OLT、ONU设备的有效监控和管理,保障OLT、ONU设备的高效运行,及时发现并解决潜在问题,保障网络稳定。 随着网络技术的不断迭代与…

Redis低版本客户端Jedis2.9.0兼容高版本redis(比如redis6)不支持ACL的问题(亲测可用)

redis6版本及以上使用了acl认证 就是通过账号密码去认证,但是在之前版本都是只需要密码的,这种如果要适配,可能就要升级jedis客户端依赖的,但是一些老项目都不能随便升级的 之前的代码可能就不适配了 如果就要考虑使用现有的jedis版本 如:2.9.0 去支撑redis6的连接 以下有…

Linux 中sed命令的整行替换

Linux 中sed命令的整行替换.001、基本用法[root@PC1 test2]# ls a.txt [root@PC1 test2]# cat a.txt ## 测试文件 a UU i a UU i b q j c q y [root@PC1 test2]# sed /b/ s/.*/QQ/ a.txt ## 将匹配b的行全部替换为Q…

高科战神拨号精灵app下载设置方法

高科战神拨号助手、拨号健、全家软件下载,高科拨号精灵app使用设置方法说明:首先用安卓手机安装拨号助手app【联系图片上的V信 2081003456下载】。安装好后拨12345678进行蓝牙连接,蓝牙连接好后就可以进行操作。1拨号 2拨号 3拨号 4拨号 5拨号 关闭程序 12345678拨号设置。

Spherical Linear Interpolation and Text-Anchoring for Zero-shot Composed Image Retrieval

目录概Spherical Linear Interpolation (Slerp)Text-Anchored-Tuning (TAT)代码Jiang Y. K., Huynh D., Shah A., Chen W. and Lim S. Spherical linear interpolation and text-anchoring for zero-shot composed image retrieval. ECCV, 2024.概 本文提出了一种非常简单的 Ze…

uniapp + 微信小程序:新版canvas常用api及注意事项

关于新旧canvas的比较我以前写过一篇博客 :https://www.cnblogs.com/sunshine233/p/17014701.html ,这里就不重复了。 但在正文开始之前,我不得不再说一遍微信的文档写的真垃圾。很多问题的答案都是在微信开发者社区里找到的。一、新版canvas 基础用法:<template><…