Colas enlazadas mas rápidas que arrays?

4 02 2009

Estaba leyendo esta nota donde dice que las colas indexadas son mas rápidas que los arrays. En este post, hay varias respuestas afirmando la valides de esta afirmacion.

El problema es que las pruebas que hice por mi cuenta arrojan exactamente lo opuesto:

Actionscript:
  1. package {
  2.     import flash.display.Sprite;
  3.     import flash.utils.getTimer;
  4.  
  5.     public class DeleteThisProject extends Sprite
  6.     {
  7.         public function DeleteThisProject()
  8.         {
  9.             var myArray:Array = new Array();
  10.             var tempSP:Sprite;
  11.            
  12.             var i:int = 0;
  13.             trace("Populating Arrays");
  14.             for(i = 0; i <= 10000; i++)
  15.             {
  16.                 tempSP = new Sprite();
  17.                 tempSP.y = 100;
  18.                 myArray.push(tempSP);
  19.             }
  20.             var lastCola:Cola = null;
  21.             var tempCola:Cola;
  22.             for(i = 0; i <= 10000; i++)
  23.             {
  24.                 tempSP = new Sprite();
  25.                 tempCola = new Cola(tempSP);
  26.                 tempCola.next = lastCola;
  27.                 lastCola = tempCola;
  28.             }
  29.             trace("Finished populating arrays");
  30.             trace("Begin Array iteration");
  31.             var timeStamp:int = getTimer();
  32.             for(i = 0; i <myArray.length; i++)
  33.             {
  34.                 tempSP = Sprite(myArray[i])
  35.                 tempSP.graphics.beginFill(0xFF0000);
  36.                 tempSP.graphics.drawCircle(0, 0, 50);
  37.                 addChild(tempSP);
  38.             }
  39.             trace("End Array iteration: " + (getTimer() - timeStamp) + "ms");
  40.            
  41.             trace("Begin Cola iteration");
  42.             timeStamp = getTimer();
  43.             tempCola = lastCola;
  44.             i = 0;
  45.             while(tempCola)
  46.             {
  47.                 tempSP = tempCola.sprite;
  48.                 tempSP.graphics.beginFill(0x00FF00);
  49.                 tempSP.graphics.drawCircle(0, 0, 50);
  50.                 addChild(tempSP);
  51.                 tempCola = tempCola.next;
  52.             }
  53.             trace("End Cola iteration: " + (getTimer() - timeStamp) + "ms " );
  54.         }
  55.     }
  56. }

La clase Cola dice así:

Actionscript:
  1. package
  2. {
  3.     import flash.display.Sprite;
  4.    
  5.     public class Cola
  6.     {
  7.         public var next:Cola;
  8.         public var sprite:Sprite;
  9.         public function Cola(pSprite:Sprite)
  10.         {
  11.             sprite = pSprite;
  12.         }
  13.     }
  14. }

Los valores que obtuve son los siguientes:

Populating Arrays
Finished populating arrays
Begin Array iteration
End Array iteration: 737ms
Begin Cola iteration
End Cola iteration: 7124ms

De que esta hablando esta gente?


Acciones

Informacion

2 respuestas a “Colas enlazadas mas rápidas que arrays?”

14 02 2009
Gonzalo (20:54:52) :

Acceder a un elemento determinado:
Un array es mucho mas rápido que una lista enlazada solo para acceder a un elemento en posicion x. Para hacer lo mismo en una lista enlazada hay que recorrer desde el principio hasta el elemento, básicamente es O(1) – Array contra O(n) – Lista enlazada.

Acceder a varios elementos:
En este caso la performance es similar, es constante en ambos casos – O(1)

Insertar elementos:
Acá está el tema: en una lista enlazada insertar un elemento es rapido ( basta con cambiar el next del elemento anterior y el prev del elemento siguiente), esto lleva O(1). En cambio en un array habría que mover todos los elementos al final para hacer espacio en el medio O(n) , donde N es la posicion del array donde se quiere insertar.

Remover elementos:
Acá también gana la lista enlazada, un elemento se puede eliminar en tiempo constante, mientras que en el array es necesario mover todos los elementos una posicion para atras.

Busqueda lineal:
Misma performance (igual que al acceder a varios elementos)

Busqueda binaria:
Es imposible de realizar en una lista enlazada, por lo que acá el array gana O(log n) versus O(n)

Depende del uso que necesite, conviene usar uno u otro.
gzaloprgm

17 05 2009
pablo.weremczuk (16:31:41) :

Muchas gracias por la aclaración!

Deje un comentario

usted puede usar estos tags : <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>