¿Cuáles son las listas vinculadas en Java y qué las hace mejores que las matrices normales?

Una estructura de datos que en una máquina de Turing teórica realiza la inserción y eliminación de O (1) para un iterador arbitrario frente a O (n) si se usara una matriz.

¿Qué los hace mejores que las matrices en Java? Nada. Las computadoras reales tienen localidad de caché L1 / 2, paginación de memoria y muchos otros parámetros que dominan completamente la parte O (1). Nunca los he visto funcionar mejor que un ArrayList o ArrayDeque, incluso para entradas grandes.

No me lo quites, tómalo de Joshua Bloch, autor del marco de colecciones de Java:

@jerrykuch @shipilev @AmbientLion ¿Alguien usa LinkedList? Lo escribí y nunca lo uso.

– Joshua Bloch (@joshbloch) 3 de abril de 2015

Puede haber algún algoritmo en el que LinkedList funcione mejor que una matriz en la práctica, pero no lo he visto y dudo que tal caso de uso no pueda abordarse mejor con un algoritmo y una estructura de datos diferentes.

Lo que voy a decir no solo es cierto sobre Java, es cierto sobre cualquier lenguaje de programación que tenga listas vinculadas como una opción.

Supongamos que tiene una serie de enteros:

int [] arr = {2, 3, 4, 5, 6};

y date cuenta de que olvidaste el número [math] 1 [/ math]. Desea colocarlo al comienzo de los números porque desea mantener los números en orden.

¿Cómo lo haces? Bueno, (suponiendo que tenga espacio) tiene que deslizar todos los números a la posición correcta, y los números escriben un [matemático] 1 [/ matemático] al principio. Me gusta esto:

para (int i = 4; i> = 0; i–)
arr [i + 1] = arr [i];
arr [0] = 1;

¿Cuántas operaciones lleva esto? Toma aproximadamente [math] 5 [/ math] operaciones en este caso, porque la matriz era de longitud [math] 5 [/ math]. En general, esto tomará aproximadamente [math] n [/ math] pasos (escrito [math] \ Theta (n) [/ math] donde [math] n = [/ math] arr.length .

Ahora, una lista vinculada no funciona de esta manera. En una lista vinculada, cada vez que desee agregar un elemento a la lista, lo asignó dinámicamente sobre la marcha y lo adjuntó a la lista actualizando las referencias.

Define una clase ListNode:

clase ListNode {
datos int públicos; // podría ser cualquier typr
ListNode público siguiente;
}

En realidad, podría abarcar esta clase dentro de la otra clase.

Una clase de Lista debería mantener una referencia al primer nodo, generalmente llamado cabeza.

Lista de clase {
privada ListNode head = null;
}

public void addToFront (valor int) {

// crea un nuevo nodo con el valor “valor”

ListNode newOne = new ListNode ();
newOne.data = value;

// si no hay nodos, entonces haga el
// apunta al nuevo nodo
// y establece newOne’s junto a null
if (head == null) {
newOne.next = null;
head = newOne;
más {
newOne.next = head;
head = newOne;
} // de lo contrario, establezca newOne’s junto a
// ser lo que solía ser la cabeza de la
// lista, y hacer newOne la nueva cabeza.
}

¿Cuánto tiempo addToFront() ejecución de addToFront() ? Tenga en cuenta que no tenemos ningún bucle. Hacemos aproximadamente el mismo número de operaciones, independientemente de cuántos números almacenamos. Esto lleva tiempo constante, o tiempo [matemático] \ Theta (1) [/ matemático].

Si la matriz tuviera un millón de elementos, la operación addToFront () tomaría aproximadamente un millón de operaciones, mientras que en una lista vinculada, tomaría algunas operaciones.

Las listas no son mejores que las matrices, son más flexibles, pero si se trabaja con una cantidad específica de elementos, una matriz es más efectiva porque los datos se almacenan en una línea de memoria, la lista contiene elementos distribuidos aleatoriamente en la memoria asignada.

En las matrices normales, debe definir su tamaño antes de usarlo, pero en la lista vinculada, su tamaño aumenta automáticamente según sus necesidades. No tiene que preocuparse por el tamaño de la lista vinculada, se aumenta o disminuye automáticamente según sus operaciones.

Las listas enlazadas son buenas para insertar elementos en el medio de la lista (O (1)), que la matriz no puede manejar bien. Las matrices son buenas para el acceso aleatorio del elemento k-ésimo (O (1)), que es O (k) para las listas.

Una lista vinculada es algo que no tiene límite de cuántos valores va a almacenar. Puede almacenar 5 o 50 o 500, depende de usted. Pero en la matriz, debe declarar cuántos valores va a almacenar al máximo. Me gusta:

int arr [60];

significa que vas a almacenar como máximo 60 enteros. No puedes exceder el límite.

En la lista vinculada cada vez que almacena un valor, también almacena un puntero donde se almacenará su próximo valor si desea almacenar más. De esa manera no tiene límite para almacenar valores.

More Interesting

¿Qué es la notación O grande? ¿Y deberían saberlo los programadores principiantes?

¿Son necesarios los algoritmos y las clases de estructura de datos para hacer una clase de desarrollo de aplicaciones móviles?

¿Cómo funciona el algoritmo de acortador de URL?

¿Cómo pueden uno y qué algoritmos podrían usarse para entrenar una red neuronal profunda con una cantidad limitada de datos desaprender sus representaciones mal aprendidas?

¿Cómo se diseñaría una estructura de datos para soportar las siguientes operaciones en tiempo logarítmico: insert, deleteMin, deleteMax findMin, findMax?

Cómo aprender estructuras de datos y algoritmos para empezar

¿Cuál es la intuición detrás del algoritmo de clasificación rápida de múltiples claves?

¿Qué sitio web / tutorial / video puedo usar para comprender muy bien la programación dinámica en un día?

¿Cuáles son los mejores libros para aprender estructuras de datos y algoritmos para un principiante con poco lenguaje de programación de C?

¿Qué es el algoritmo TDIDT?

¿Cuáles son los 5 mejores algoritmos con los que debería estar familiarizado para tener éxito en una entrevista de desarrollador junior?

¿Qué algoritmos se pueden usar para encontrar un objeto similar en una base de datos que contenga múltiples atributos, numéricos, categóricos y no categóricos?

¿Cuál es el algoritmo de Google Map para recomendar rutas?

¿Cuál es el algoritmo utilizado para la agrupación de documentos de texto después de aplicar LSA?

¿Cuál es el algoritmo más extraño que hayas usado?