【问题标题】:Implement FIFO data structure in javascript, Without array pop, push, shift methods?在javascript中实现FIFO数据结构,没有数组pop、push、shift方法?
【发布时间】:2021-07-10 06:00:05
【问题描述】:

我遇到了一个有趣的问题,挑战是在不使用数组弹出、推送、移位等的情况下实现 FIFO。

我搜索了很多答案,但它们要么实现了自定义 pop、push 和迭代器方法(map、filter 等),但没有一个实现 shift/unshift。

在这里帮帮我。

提前致谢!

【问题讨论】:

  • 那么,你只是想在 JavaScript 中重新实现数组方法?
  • 您是问如何在不使用数组或不使用这些数组方法的情况下实现 FIFO 数据结构?
  • 没有数组我们还有什么其他选项来存储和维护数据?
  • 这个练习的重点不是让你自己弄清楚如何去做,而不是在互联网上搜索代码吗?编程不是复制/粘贴,而是一个创造性的过程。
  • shiftunshift 将每个数组元素复制到相邻元素(向下为shift,向上为unshift)。这只是一个for 循环。

标签: javascript data-structures


【解决方案1】:

这实际上是一个实际问题,因为 JavaScript 没有高效的队列。通常,您只需使用push 来添加和shift 来删除,但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 那样每次删除一个元素时都移动所有元素,而是等到我们至少删除了与我们必须移动的元素一样多的元素。这样可以确保平均而言,每删除一个元素,最多移动一个元素。

【讨论】:

    猜你喜欢
    • 2019-10-30
    • 1970-01-01
    • 2022-01-05
    • 2021-12-06
    • 1970-01-01
    • 1970-01-01
    • 2011-06-20
    • 2010-11-09
    • 2014-06-22
    相关资源
    最近更新 更多