【问题标题】:O(1) deletion for a JavaScript queueJavaScript 队列的 O(1) 删除
【发布时间】:2018-11-13 05:58:46
【问题描述】:

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

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

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

【问题讨论】:

  • pop()shift() 是逆运算符。您应该只需要拼接来从数组的“中间”移除。其他人在末端工作
  • 是的,但我需要从数组的中间移除,这就是问题所在。
  • 我只需要在末端插入,但我需要从中间删除。
  • 您可以改用 Set,它在现代引擎 IIRC 中具有 O(1) 的插入/查找/删除复杂性
  • Set 是个好主意,但是如何存储队列的顺序,换句话说,如何在 Set 上实现 pop() /push()/shift()/unshift() .

标签: javascript node.js hash hashmap queue


【解决方案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!

但是,如果我们添加到队列的前面,使用上面的库,只需要 60 毫秒。超过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!

【讨论】:

    猜你喜欢
    • 2012-08-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-31
    • 1970-01-01
    • 1970-01-01
    • 2011-01-10
    相关资源
    最近更新 更多