如何在JavaScript中创建一个队列,我可以在O(1)/恒定时间内添加/删除元素?现在我有一个简单的数组作为队列,但要找到要删除的元素,我必须通过数组,然后调用Array.prototype.splice
。
不仅如此,如果您有一个基于简单数组的FIFO队列,您将需要调用Array.prototype.shift
或Array.prototype.unshift
,这两个都是O(N),因为它们有更新数组中每个项目的索引。
所以我希望在列表/队列中的任何位置连续插入/删除元素。如果您尝试将其置于FIFO队列中,则普通数组似乎不会产生这种情况。
答案 0 :(得分:1)
我已经考虑了一段时间,我能想到的只是一个双重链表。双向链表允许我们在恒定时间内从队列中添加/删除项目。
见这里的答案:
这是一个似乎有效的实现:
https://github.com/ORESoftware/linked-queue
这个工作原理的一个简单例子是,对于数组,每个shift / unshift调用都是O(N),因此以下需要80秒!
const values = [];
const t = Date.now();
for (let i = 0; i < 100000; i++) {
values.unshift({});
}
console.log('total time:', Date.now() - t); // 80 seconds!
但是如果我们添加到队列的前面,使用上面的库,它只需要60ms。超过2个数量级的差异。巨大。
const {LinkedQueue} = require('@oresoftware/linked-queue');
const q = new LinkedQueue();
const t = Date.now();
for (let i = 0; i < 100000; i++) {
q.addToFront({});
}
console.log('total time:', Date.now() - t); // 60 milliseconds!