Según tengo entendido, los arrays en javascript tienen implementados los siguientos métodos con la siguiente complejidad algorítmica.
Código Javascript:
Ver original
push // O(1) pop // O(1) shift // O(n) pues al quitar el primer elemento hay que desplazar el resto de elementos unshift // O(n) pues al insertar un elemento en la primera posición hay que desplazar el resto
Esto hace que se pueda implementar una pila de manera eficiente usando push i pop pero no se pueda implementar un cola de manera eficiente usando las combinaciones unshift-pop o push-shift.
Entonces la manera que se me ha ocurrido de implementar una cola es mediante los objetos de javascript, que al ser hashes tanto la inserción como el borrado tienen un coste constante O(1). Por ejemplo:
Código Javascript:
Ver original
function Queue (){ this.elements = {} this.begin = 0; this.end = -1; } Queue.prototype.enqueue = function (element) { this.end++; this.elements[this.end] = element; } Queue.prototype.dequeue = function () { var value = this.elements[this.begin]; if (this.begin === this.end) { Queue.call(this); // si la cola tiene 1 elemento dejarla vacía y resetear indices begin y end } else if (this.begin < this.end) { delete this.elements[this.begin]; this.begin++; } return value; }
¿Tiene algún inconveniente? ¿Hay mejores maneras de implementar colas en javascript?
Un saludo y gracias.