Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/elixir/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
O(1)删除JavaScript队列_Javascript_Node.js_Hash_Hashmap_Queue - Fatal编程技术网

O(1)删除JavaScript队列

O(1)删除JavaScript队列,javascript,node.js,hash,hashmap,queue,Javascript,Node.js,Hash,Hashmap,Queue,如何在JavaScript中创建一个队列,以便在接近O(1)/恒定时间内添加/删除元素?现在我有一个简单的数组作为队列,但要找到要删除的元素,我必须遍历数组,然后调用array.prototype.splice 不仅如此,如果您有一个基于简单数组的FIFO队列,您需要调用array.prototype.shift或array.prototype.unshift,这两个都是O(N),因为它们必须更新数组中每个项的索引 因此,我希望在列表/队列中的任何位置都能以恒定的时间插入/删除元素。如果您试图将

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

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


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

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

请参见此处的答案:

下面是一个似乎有效的实现:

一个简单的例子就是,对于数组,每次移位/取消移位调用都是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!
常量值=[];
const t=Date.now();
for(设i=0;i<100000;i++){
值。取消移位({});
}
console.log('total time:',Date.now()-t);//80秒!
但是,如果我们使用上述库添加到队列的前面,只需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!
const{LinkedQueue}=require('@oresoftware/LinkedQueue');
const q=新的LinkedQueue();
const t=Date.now();
for(设i=0;i<100000;i++){
q、 addToFront({});
}
console.log('total time:',Date.now()-t);//60毫秒!

pop()
shift()
是反向运算符。从阵列的“中间”移除时,应该只需要拼接。其他人处理尾端,但我需要从数组的中间删除,这就是问题所在。我只需要在尾端插入,但我需要从中间删除。你可以使用
集来代替,它在现代引擎中具有O(1)插入/查找/删除复杂性IIRCSet是个好主意,但我如何存储队列的顺序,换句话说,如何在集合上实现pop()/push()/shift()/unshift()。