Foros del Web » Programando para Internet » Javascript »

Implementación pila de manera eficiente.

Estas en el tema de Implementación pila de manera eficiente. en el foro de Javascript en Foros del Web. Buenas, Según tengo entendido, los arrays en javascript tienen implementados los siguientos métodos con la siguiente complejidad algorítmica. @import url("http://static.forosdelweb.com/clientscript/vbulletin_css/geshi.css"); Código Javascript : Ver original ...
  #1 (permalink)  
Antiguo 09/01/2015, 05:39
 
Fecha de Ingreso: julio-2006
Ubicación: Barcelona
Mensajes: 244
Antigüedad: 18 años, 5 meses
Puntos: 32
Implementación pila de manera eficiente.

Buenas,

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
  1. push // O(1)
  2. pop // O(1)
  3. shift // O(n) pues al quitar el primer elemento hay que desplazar el resto de elementos
  4. 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
  1. function Queue (){
  2.    this.elements = {}
  3.    this.begin = 0;
  4.    this.end = -1;
  5. }
  6.  
  7. Queue.prototype.enqueue = function (element) {
  8.    this.end++;
  9.    this.elements[this.end] = element;
  10.    
  11. }
  12.  
  13. Queue.prototype.dequeue = function () {
  14.    var value = this.elements[this.begin];
  15.    if (this.begin === this.end) {
  16.       Queue.call(this); // si la cola tiene 1 elemento dejarla vacía y resetear indices begin y end
  17.    } else if (this.begin < this.end) {
  18.       delete this.elements[this.begin];
  19.       this.begin++;
  20.    }
  21.    return value;
  22. }

¿Tiene algún inconveniente? ¿Hay mejores maneras de implementar colas en javascript?

Un saludo y gracias.
__________________
github.com/xgbuils | npm/xgbuils

Última edición por Pantaláimon; 09/01/2015 a las 05:51
  #2 (permalink)  
Antiguo 09/01/2015, 06:40
Avatar de Panino5001
Me alejo de Omelas
 
Fecha de Ingreso: mayo-2004
Ubicación: -34.637167,-58.462984
Mensajes: 5.148
Antigüedad: 20 años, 6 meses
Puntos: 834
Respuesta: Implementación pila de manera eficiente.

A mi me gustó mucho esta implementación de Aijoona: http://blog.aijoona.com/2011/04/30/i...en-javascript/
  #3 (permalink)  
Antiguo 09/01/2015, 14:47
 
Fecha de Ingreso: julio-2006
Ubicación: Barcelona
Mensajes: 244
Antigüedad: 18 años, 5 meses
Puntos: 32
Respuesta: Implementación pila de manera eficiente.

A mi no me gustó por lo que ya expliqué en mi primer post:
Cita:
Iniciado por Aijoona
// Obtenemos la primer tarea activa
task = this._tasks.shift();
Si hay muchas tareas en la cola la operación shift tiene un coste demasiado elevado. Quizá para una cola de ejecución eso no pase habitualmente, no lo sé. Pero yo no quiero implementar una cola de ejecución.
__________________
github.com/xgbuils | npm/xgbuils
  #4 (permalink)  
Antiguo 09/01/2015, 15:47
Avatar de Panino5001
Me alejo de Omelas
 
Fecha de Ingreso: mayo-2004
Ubicación: -34.637167,-58.462984
Mensajes: 5.148
Antigüedad: 20 años, 6 meses
Puntos: 834
Respuesta: Implementación pila de manera eficiente.

Habría que hacer los tests correspondientes en varios navegadores. Al parecer algunos lo han hecho y comentan resultados diferentes de los tuyos: http://stackoverflow.com/questions/8...ally-for-googl
Yo no hice nunca los tests, pero recuerdo en viejas versiones de jQuery (las nuevas no las reviso hace mucho) que implementaban las colas con shift, y como es una comunidad muy grande seguro que han evaluado este tema.
De todas maneras, tu planteo me resulta interesante
  #5 (permalink)  
Antiguo 10/01/2015, 13:57
Avatar de marlanga  
Fecha de Ingreso: enero-2011
Ubicación: Murcia
Mensajes: 1.024
Antigüedad: 13 años, 11 meses
Puntos: 206
Respuesta: Implementación pila de manera eficiente.

Puedes usar push() y un array para añadir. "end" no lo necesitas, un simple this,length que no sea cero te servirá para saber si el array está vacío o no (aunque devuelva un tamaño no creíble). Es también O(1) porque internamente el objeto Array mantiene el atributo length con el índice numérico más grande que exista en el array + 1, que va actualizando en memoria cada vez que se inserta o elimina un elemento, como también hace PHP.

En cuanto a al eficiencia, con javascript nada es lo que parece. Me he llevado muchos palos por hacer suposiciones.

Y ya que estamos con la eficiencia, un this(); es más rápido que un Queue.call(this).

Código Javascript:
Ver original
  1. function Queue (){
  2.    this.elements = []
  3.    this.begin = 0;
  4. }
  5.  
  6. Queue.prototype.enqueue = function (element) {
  7.    this.elements.push(element);
  8.    
  9. }
  10.  
  11. Queue.prototype.dequeue = function () {
  12.    var value = this.elements[this.begin];
  13.    if (!this.elements.length) {
  14.       this(); // si la cola tiene 1 elemento dejarla vacía y resetear indices begin y end
  15.    } else if (this.elements.hasOwnProperty(this.begin)) {
  16.       delete this.elements[this.begin++];
  17.    }
  18.    return value;
  19. }

El hasOwnProperty hace lo que parece.

Última edición por marlanga; 10/01/2015 a las 14:23

Etiquetas: manera
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 05:46.