在javascript中实现fifo数据结构,而不使用数组pop、push、shift方法?

ycl3bljg  于 2021-09-23  发布在  Java
关注(0)|答案(1)|浏览(189)

我遇到了一个有趣的问题,其中的挑战是实现fifo,而不使用数组pop、push、shift等。
我搜索了很多答案,但它们要么实现自定义的pop、push和迭代器方法(map、filter等),要么没有实现shift/unshift。
帮帮我。
提前谢谢!

dphi5xsq

dphi5xsq1#

这实际上是一个实际问题,因为javascript没有一个有效的队列。通常,你只需要使用 pushshift 除去,但是 shift 需要o(n)个时间,因此当队列变长时,这是非常昂贵的。
我使用的解决方案只需要一个额外的变量( start )并且降低了从o(n)到摊销o(1)的项目移除成本。项目仍将添加 array.push(item) ,但既然你不能用,我就用 array[array.length]=item ,它的作用完全相同。
我不打算在课堂上总结这一点,因为在现实生活中,这很少合适:

let start=0;
let array=[];

function addLast(item) {
  array[array.length] = item;
}

function removeFirst() {
  if (start >= array.length) {
    return undefined;
  }
  const result = array[start++];
  if (start >= array.length - start) {
      //move all the elements into the free space at beginning
      let d=0;
      for (let i=start; i<array.length; ++i) {
        array[d++] = array[i];
      }
      start=0;
      array.length = d;
  }
  return result;
}

addLast(1);
addLast(2);
addLast(3);
console.log(removeFirst());
addLast(4);
console.log(removeFirst());
console.log(removeFirst());
addLast(5);
console.log(removeFirst());
console.log(removeFirst());

程序非常简单。我们不是像shift那样每次移除一个元素都会移动所有的元素,而是等到移除了至少和我们必须移动的元素一样多的元素。这确保了,平均而言,每移除一个元素,最多会移动一个元素。

相关问题