O(1)删除JavaScript队列

时间:2018-06-03 22:12:04

标签: javascript node.js hash hashmap queue

如何在JavaScript中创建一个队列,我可以在O(1)/恒定时间内添加/删除元素?现在我有一个简单的数组作为队列,但要找到要删除的元素,我必须通过数组,然后调用Array.prototype.splice

不仅如此,如果您有一个基于简单数组的FIFO队列,您将需要调用Array.prototype.shiftArray.prototype.unshift,这两个都是O(N),因为它们有更新数组中每个项目的索引。

所以我希望在列表/队列中的任何位置连续插入/删除元素。如果您尝试将其置于FIFO队列中,则普通数组似乎不会产生这种情况。

1 个答案:

答案 0 :(得分:1)

我已经考虑了一段时间,我能想到的只是一个双重链表。双向链表允许我们在恒定时间内从队列中添加/删除项目。

见这里的答案:

https://www.quora.com/How-can-I-create-a-queue-in-JavaScript-where-I-can-search-for-or-remove-elements-in-near-O-1-time-Right-now-I-have-a-simple-array-as-a-queue-but-to-find-an-element-to-delete-I-have-to-go-through-the-array-and-then

这是一个似乎有效的实现:

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!