Red de conocimiento del abogados - Ley de patentes - Matrices y listas enlazadas

Matrices y listas enlazadas

Una matriz es una estructura de datos básica. Una matriz es una estructura de datos de "lista lineal" que utiliza un conjunto de espacios de memoria continuos para almacenar un conjunto de datos del mismo tipo. (Pero en JavaScript, no es un conjunto de espacios de memoria contiguos y se pueden almacenar valores de diferentes tipos en matrices. Pero aún tenemos que seguir las mejores prácticas y no hacer esto. La mayoría de los lenguajes no tienen esta capacidad).

Análisis de sustantivos: 1. Tabla lineal: Una tabla lineal es una estructura en la que los datos se organizan en una línea. Los datos de cada tabla lineal tienen como máximo dos direcciones: hacia adelante y hacia atrás. De hecho, además de las matrices, las listas vinculadas, colas, pilas, etc. también son estructuras de listas lineales. El concepto opuesto son las tablas no lineales, como árboles binarios, montones y gráficos. La razón por la que se llama no lineal es porque en una tabla no lineal no existe una relación simple entre los datos.

2. Espacio de memoria continuo y el mismo tipo de datos. Es precisamente por estas dos limitaciones que se puede acceder a él de forma aleatoria. Pero existen ventajas y desventajas. Estas dos limitaciones también hacen que muchas operaciones en matrices sean muy ineficientes. Por ejemplo, si desea eliminar o insertar datos en una matriz, se requiere mucho trabajo de movimiento de datos para garantizar la continuidad.

? En comparación con las matrices, las listas vinculadas son una estructura de datos un poco más compleja. Los elementos de una lista vinculada se pueden almacenar en cualquier lugar de la memoria (a diferencia de las matrices, que requieren espacio de memoria contiguo). Cada elemento de la lista vinculada almacena la dirección del siguiente elemento. Un conjunto de bloques de memoria dispersos se conectan en serie mediante "punteros", encadenando así una serie de direcciones de memoria aleatorias.

Varias estructuras de listas enlazadas comunes: lista enlazada simple, lista enlazada doblemente y lista enlazada circular.

? Un nodo en una lista enlazada individualmente debe tener dos atributos: val? y ?siguiente

Lista enlazada única

? campo y un campo de puntero. Este enlace apunta al siguiente nodo de la lista y el último nodo apunta a un valor nulo.

¿Lista doblemente enlazada

? Cada nodo tiene dos conexiones: una apunta al nodo anterior (cuando esta "conexión" es la primera "conexión", apunta a un valor nulo). o Lista vacía); y el otro apunta al siguiente nodo (cuando esta "conexión" es la última "conexión", apunta a un valor nulo o una lista vacía)

Lista enlazada circular

Inicio El nodo y el nodo final están conectados entre sí

Para mantener la continuidad de los datos de la memoria en la matriz, las operaciones de inserción y eliminación serán relativamente ineficientes.

Cada vez que se realiza una operación de inserción, si insertamos un dato en la k-ésima posición de la matriz, para liberar la k-ésima posición, necesitamos mover todos los datos después k una posición hacia atrás. Entonces la complejidad del tiempo promedio es O (n).

De la misma manera, si queremos eliminar los datos en la k-ésima posición, también debemos mover los datos por el bien de la continuidad de la memoria. De lo contrario, aparecerán agujeros en el medio y en la parte superior. la memoria no será continua, por lo que la complejidad del tiempo promedio También es O (n).

? De hecho, en algunos escenarios especiales, no necesariamente tenemos que buscar la continuidad de los datos en la matriz. Si realizamos varias operaciones de eliminación juntas, ¿mejorará mucho la eficiencia de la eliminación? Sigamos con ejemplos. Hay 8 elementos almacenados en la matriz a[10]: a, b, c, d, e, f, g, h. Ahora queremos eliminar los tres elementos a, b y c en secuencia.

? Para evitar que los datos d, e, f, g, h se muevan tres veces, puede registrar los datos eliminados primero. Cada operación de eliminación en realidad no mueve los datos, solo registra que los datos se han eliminado. Cuando la matriz no tiene más espacio para almacenar datos, activamos una operación de eliminación real, lo que reduce en gran medida el movimiento de datos causado por la operación de eliminación.

Si hay muchas operaciones de eliminación e inserción en situaciones reales, para mejorar la complejidad temporal de la eliminación e inserción, podemos utilizar listas vinculadas.

Al insertar o eliminar una lista vinculada, no necesitamos mover nodos para mantener la continuidad de la memoria, porque el espacio de almacenamiento de la lista vinculada en sí no es continuo. Por tanto, insertar y eliminar datos en una lista vinculada es muy rápido.

Sin embargo, si desea acceder aleatoriamente al k-ésimo elemento en una lista vinculada, no es tan eficiente como una matriz. Debido a que los datos en la lista vinculada no se almacenan continuamente, la dirección de memoria correspondiente no se puede calcular directamente mediante la fórmula de direccionamiento de acuerdo con la primera dirección y el subíndice como una matriz, sino que debe calcularse nodo por nodo de acuerdo con el puntero. Recorra por turno hasta encontrar el nodo correspondiente, por lo que la complejidad del tiempo es O (n).

Resumen: las listas vinculadas son adecuadas para inserción y eliminación, y la complejidad temporal es O (1); las matrices admiten acceso aleatorio, y la complejidad temporal del acceso aleatorio basado en subíndices es O (1). ?

? 1. Las listas enlazadas son diferentes de las matrices. Las matrices requieren un espacio de memoria continuo, pero las listas enlazadas no requieren un espacio de memoria continuo. Utilizan "punteros" para conectar un grupo de bloques de memoria dispersos en serie. .

Nota: En JavaScript, una matriz es un objeto similar a una lista y su prototipo proporciona operaciones relacionadas para atravesar y modificar elementos. La longitud y el tipo de elemento de las matrices de JavaScript no son fijos. Debido a que la longitud de una matriz puede cambiar en cualquier momento y sus datos pueden ser discontinuos en la memoria, una matriz de JavaScript no es necesariamente densa, dependiendo de cómo se use. En JS, las matrices se implementan mediante mapas hash o diccionarios, por lo que no son continuas. En términos generales, estas características de las matrices brindarán comodidad de uso, pero si estas características no son adecuadas para su escenario de uso específico, puede considerar el uso de matrices tipificadas. Aquí no estamos hablando de matrices en JavaScript.

?2. Los elementos de la matriz están todos juntos; los elementos de la lista vinculada están separados y cada elemento almacena la dirección del siguiente elemento.

?3. La velocidad de lectura de la matriz es muy rápida; la velocidad de inserción y eliminación de la lista vinculada es muy rápida.

Resumen: si necesita agregar o eliminar nodos con frecuencia, una lista vinculada puede ser una buena opción.

Si necesita acceder con frecuencia a elementos por índice, una matriz puede ser una mejor opción que una lista enlazada.