【问题标题】:JavaScript Queue NativeJavaScript 队列原生
【发布时间】:2018-01-24 01:30:19
【问题描述】:

我正在学习算法和 DS。如何在 JavaScript 中使用队列?

我知道你可以做这样的事情。

var stack = [];
stack.push(2);       // stack is now [2]
stack.push(5);       // stack is now [2, 5]
var i = stack.pop(); // stack is now [2]
alert(i);            // displays 5

var queue = [];
queue.push(2);         // queue is now [2]
queue.push(5);         // queue is now [2, 5]
var i = queue.shift(); // queue is now [5]
alert(i);              // displays 2

但 shift() 不会改变一切因此,时间复杂度是 O(N) 而不是 Java 中的 Dequeue 是 O(1)

为什么JavaScript原生没有像Stack(array)这样的Queue的概念?

我只是好奇。请赐教。

(我问自己这个问题,但找不到正当理由说明为什么 ES8 或 ES9 会使用 Dequeue O(1) 和 enqueue O(1) 内置队列而无需自己实现)

PS:很抱歉问了这么愚蠢的问题,但这让我很头疼!

【问题讨论】:

  • 正如您所提到的,Array 被设计为一个非常灵活的对象,您可以通过调用不同的方法来模拟数组、堆栈和队列操作。我认为这种操作的时间复杂度不是 O(N)。
  • 任何 shift 或 unshift() 操作都会重新创建数组。因此,如果我没记错的话,它将是 O(N)。
  • 你怎么知道 JS 实现没有优化 .shift()重建整个数组?
  • https://stackoverflow.com/questions/22614237/javascript-runtime-complexity-of-array-functions Shift 是 O(1) 仅在特殊情况下
  • @djna 是的,这就是所谓的墨菲定律,:-)

标签: javascript queue


【解决方案1】:

您可以在 vanilla JS 中从头开始实现它。至于为什么它不是原生的,可能是因为几乎不需要提高效率,而且数组/对象足够灵活,可以使用。

function Queue() {
    this._oldestIndex = 1;
    this._newestIndex = 1;
    this._storage = {};
}

Queue.prototype.size = function() {
    return this._newestIndex - this._oldestIndex;
};

Queue.prototype.enqueue = function(data) {
    this._storage[this._newestIndex] = data;
    this._newestIndex++;
};

Queue.prototype.dequeue = function() {
    var oldestIndex = this._oldestIndex,
        newestIndex = this._newestIndex,
        deletedData;

    if (oldestIndex !== newestIndex) {
        deletedData = this._storage[oldestIndex];
        delete this._storage[oldestIndex];
        this._oldestIndex++;

        return deletedData;
    }
};

【讨论】:

  • 我有一个问题。我是OP,有想法。为什么我们不能SWAP(arr[0], arr[len-1]) 然后做一个pop() 然后再做一次交换以保留原始订单?
  • 你不能交换 js 没有参考概念 all is a value.
猜你喜欢
  • 1970-01-01
  • 2014-12-29
  • 1970-01-01
  • 1970-01-01
  • 2019-08-11
  • 1970-01-01
  • 2023-03-17
  • 2011-06-24
  • 2012-10-10
相关资源
最近更新 更多