En Java, ¿por qué usar un iterador para iterar a través de LinkedList más rápido que usar un bucle for?

En realidad, acabo de encontrar la respuesta en StackOverFlow (¿Por qué iterar sobre una Lista sería más rápido que indexarla?)

Un bucle for es ineficiente porque para acceder e imprimir cada elemento, tendría que hacer:

cabeza -> cabeza de impresión
cabeza -> item1 -> print item1
cabeza -> elemento1 -> elemento2 -> imprimir elemento2
cabeza -> item1 -> item2 -> item3 imprimir item3

Como puede ver, con cada iteración, comienza con el comienzo (encabezado) e itera a través de cada nodo.
Esto se vuelve terriblemente ineficiente O (N * N) a medida que terminas repasando cada elemento una y otra vez.

Si usa cualquiera de las formas de Iterator, la JVM solo tiene que hacer

cabezal -> cabezal de impresión -> elemento1 -> elemento de impresión1 -> elemento2 -> elemento de impresión2, etc.

lo cual no implica repetición.

Tl; Dr: una iteración for-loop a través de LinkedList lleva mucho más tiempo ya que restablece su posición con cada iteración, a diferencia de un iterador que itera directamente (como un for-loop en una matriz normal)

Como explicó otra respuesta, un bucle for que accede a cada elemento de una lista vinculada utilizando el índice del elemento (el desplazamiento en la lista) tiene que comenzar desde el principio de la lista cada vez que se llama a get (int).

Sin embargo, no siempre es más rápido usar un iterador. Considerar:

  • Para usar un Iterator, LinkedList tiene que crear una instancia e inicializar un objeto Iterator;
  • Para cada elemento obtenido del iterador, se requieren dos llamadas (hasNext () y next ()).

Lo que esto significa es que para una LinkedList vacía o muy pequeña, seguramente será más rápido usar el enfoque for loop, pero a medida que la lista se hace más grande, el enfoque for loop se degradará horriblemente: es O (n ^ 2) !

Una solución “simple” para esto es una implementación de Lista que almacena en caché el índice más reciente y el elemento asociado. Utilizamos dicha estructura de datos (SafeLinkedList) en Coherence.

Un iterador tiene una referencia al objeto actual, para obtener el siguiente objeto, simplemente tiene que mirar el campo currentObject.next (o algo similar dependiendo de la implementación). Usando el bucle for, está realizando búsquedas continuas dentro de la lista vinculada en puntos ‘arbitrarios’. Entonces, para obtener el elemento i-ésimo de una lista vinculada, internamente, la lista debe iterarse al elemento i-ésimo. Cuando más tarde desee obtener el elemento i + 1, debe comenzar este proceso nuevamente. Esto significa que el ejemplo inferior es O (N ^ 2) ya que para cada elemento, iteramos sobre la lista para encontrar el elemento en la lista.

Este comportamiento se produce porque cada elemento de la lista contiene una referencia al siguiente elemento, y esta es la única forma de pasar al siguiente nodo.

Tenga en cuenta que si utilizó una lista de matrices, entonces arrayList.get (i) sería O (1) ya que una lista de matrices está respaldada por una matriz y, por lo tanto, admite acceso aleatorio.

Ver http://www.joelonsoftware.com/ar… . En particular, la parte sobre ” el algoritmo de Shlemiel el pintor “.

More Interesting

Cómo mejorar mi forma analítica de pensar para trabajar matemáticamente para la programación de computadoras

¿Las matemáticas son muy difíciles en un programa BCA?

¿Puede un modelo de aprendizaje automático tener exactamente un 100% de especificidad?

Si A está positivamente relacionado con B y B está positivamente relacionado con C, ¿pueden A y C estar inversamente relacionados?

¿Hay programación en matemáticas y cursos de programación?

¿Cómo es útil la matemática (integral, pecado, cos) en la programación?

¿Existe un algoritmo generalizado para convertir una malla de superficie triangular 3D en una malla de volumen tetraédrico?

En la teoría de grafos, ¿existe un método para calcular la cantidad mínima de dimensiones que debe tener el espacio de diseño para que nunca se crucen dos bordes, suponiendo que todos los bordes sean segmentos no dirigidos y que el espacio de diseño sea euclidiano?

¿La función de módulo es distributiva, asociativa o conmutativa? Explicar con ejemplos y pruebas. ¿Cómo uso este concepto en la programación competitiva?

¿Cuál es el significado del teorema de Barrington?

¿Cómo funciona la fórmula para el bit de ajuste más a la derecha?

¿Qué aprendería una función de valor de acción de estado si colocamos múltiples objetivos en el espacio de estado y nos movemos de un punto de partida a un objetivo y luego de un objetivo a otro utilizando el aprendizaje de refuerzo con aproximación de funciones?

¿Una representación no discreta de información coexiste con nuestro uso discreto de BITS?

¿Cómo se puede resolver este problema?

Ciencias de la computación teóricas: ¿Hay una prueba para: "La mejora personal recursiva es posible"?