Las modificaciones a lista enlazada implican dos operaciones:
- localizar el nodo a añadir el nuevo nodo a
- realidad añadiendo el nodo, cambiando los punteros a nodos
En lista enlazada, la segunda operación es una operación O(1)
, por lo que es una cuestión del costo de las primeras operaciones.
Al agregar al último nodo, las implementaciones ingenuas de la lista vinculada darían como resultado O(n)
tiempo de iteración. Sin embargo, las buenas bibliotecas de listas enlazadas representarían los usos más comunes, y el caso especial accedería al último nodo. Esta optimización daría como resultado la recuperación O(1)
del último elemento, lo que da como resultado el tiempo total de inserción O(1)
para finalizar.
En cuanto a la mitad, su análisis es correcto en que la localización del nodo también tomaría O(n)
. Sin embargo, algunas bibliotecas exponen un método que tomaría un puntero al lugar donde debe insertarse el nuevo nodo en lugar del índice (por ejemplo, C++
list
). Esto elimina el costo lineal, lo que resulta en O(1)
.
Mientras que la inserción en el medio generalmente se considera operación O(n)
, en algunos casos se puede optimizar a O(1)
.Esto es lo opuesto a la lista de arreglos, donde la operación de inserción misma (la segunda operación) es O(n)
, ya que todos los elementos en ubicaciones más altas deben ser reubicados. Esta operación no puede ser optimizada.
Para la inserción Una implementación ingenua de una lista vinculada daría como resultado O(n)
tiempo de inserción. Sin embargo, los buenos escritores de bibliotecas de listas enlazadas se optimizarían para los casos comunes, por lo que mantendrían una referencia a los últimos elementos (o tendrían una implementación circular de listas enlazadas), lo que daría como resultado un tiempo de inserción O(1)
.
En cuanto a la inserción en el medio. Algunas bibliotecas como la de C++
, tienen una ubicación sugerida para la inserción. Tomarían un puntero al nodo de la lista, donde se agregará el nuevo. Dichas inserciones costarían O(1)
. No creo que puedas alcanzar O(1)
por número de índice.
Esto se opone a una lista de matriz, donde la inserción en el centro fuerza el reordenamiento de todos los elementos superiores, por lo que tiene que ser una operación O(n)
.
Si la inserción en el medio de la lista era O (1) no necesitaríamos más matrices :). – Li0liQ
Li0liQ: una de las ventajas de las listas vinculadas es que puede insertar elementos en el medio en tiempo constante, donde en las matrices debe mover todos los elementos siguientes. – Amnon
@ Li0liQ: ¿Qué pasa con la indexación de tiempo constante? – sykora