Aprendizaje de la estructura de datos: Capítulo 2: Lista lineal (Lista secuencial VS Lista enlazada)

Capítulo 2: Lista lineal (lista secuencial VS lista enlazada)

En las estructuras de datos de aprendizaje - Capítulo: tabla lineal (almacenamiento secuencial, inserción, eliminación) estructuras de datos de aprendizaje - Capítulo: tabla lineal (cadenas de tiendas, cadena simple, cadena doble, lista enlazada circular) en estos dos artículos están hablando después de las características de almacenamiento y operaciones básicas de listas de secuencia y listas enlazadas, a continuación se explican algunas de las diferencias entre listas de secuencia y listas enlazadas, qué elecciones debemos hacer al resolver problemas prácticos y las operaciones comunes de las listas lineales.

1. La diferencia entre la lista de secuencias y la lista enlazada

El almacenamiento de cada dato en una lista enlazada individualmente no es necesariamente continuo, por lo que no podemos lograr un acceso aleatorio y solo podemos conectar varios nodos a través de punteros, por lo que solo podemos lograr un acceso secuencial.
En la tabla de secuencia, el almacenamiento de cada fuente de datos es continuo, solo necesitamos pasar la fórmula LOC (A) + (n-1) * sizeof (ElemType), siempre que sepamos la dirección del primer elemento, will La dirección de cada elemento se puede obtener mediante cálculo, de modo que se pueda realizar el acceso aleatorio y el acceso secuencial. Por lo tanto:

Inserte la descripción de la imagen aquí
Lista individualmente enlazada : solo se puede lograr 顺序存取.
Tabla de secuencia : se puede lograr la 顺序存储suma 随机存取.

2. Diferencias entre estructura lógica y estructura física

Las ubicaciones de almacenamiento de los elementos de datos en una lista enlazada individualmente son arbitrarias y pueden ser adyacentes o no, mientras que las ubicaciones de almacenamiento de los elementos de la tabla de secuencia deben ser adyacentes.
La lista enlazada mantiene la estructura lógica a través de un puntero al siguiente elemento. Cada elemento no solo almacena el elemento de datos, sino también la dirección del siguiente elemento de datos. Todos los elementos se encadenan en una cadena a través del puntero. La tabla de secuencia mantiene una estructura lógica a través de la adyacencia de elementos de datos, y los elementos de datos que son lógicamente adyacentes también lo son físicamente.

Inserte la descripción de la imagen aquí

Tabla de secuencia : lógicamente adyacente y físicamente 也相邻, pasar 相邻significa apagado lógico.
Lista individualmente enlazada : lógicamente adyacentes entre sí físicamente 不一定相邻, 指针expresando relaciones lógicas a través de .

3. Funcionamiento básico de la mesa lineal

3.1 Insertar

En la tabla de secuencia: mueva el elemento hacia atrás -> asigne el nuevo elemento a la
lista enlazada individualmente: el siguiente puntero del nuevo nodo S apunta al siguiente nodo del nodo p -> modifique el siguiente puntero del nodo p para apuntar al nuevo nodo S.

Inserte la descripción de la imagen aquí

3.2 Eliminar

En la tabla de secuencia: comience con el elemento a eliminar y mueva los siguientes elementos hacia adelante uno por uno.
En la lista enlazada individualmente: primero un nuevo puntero apunta al nodo q que se va a eliminar -> luego modifique el siguiente puntero del nodo anterior de q para que apunte al nodo después de q -> luego suelte el espacio del q nodo.

Inserte la descripción de la imagen aquí

Insertar y eliminar

  • La lista enlazada individualmente es O(1)(se conoce el puntero de nodo); O(n)(se desconoce el puntero de nodo), pero solo necesita modificar el puntero durante la operación
  • La tabla de secuencia esO(n)且需要大量移动元素

3.3 Encontrar

Encontrar por valor

Tabla de secuencia: recorre el valor de comparación de la tabla de secuencia. O (n)
lista enlazada individualmente: recorre todo el valor de comparación de la lista enlazada individualmente. Sobre)

Buscar por número de serie

En la tabla de secuencia: De acuerdo con el número de secuencia, podemos encontrar directamente la posición del elemento de la matriz correspondiente al número de secuencia a través del subíndice de la matriz. O (1) En una
lista enlazada individualmente: es necesario recorrer toda la lista enlazada. Sobre)

Inserte la descripción de la imagen aquí

Encontrar

  • 无序Tanto la lista enlazada individualmente como la lista de secuencia ( ) en la búsqueda por valor son O (n);
  • La lista enlazada individualmente es O (n) en la búsqueda secuencial, y la tabla de secuencia es O (1);

3. Diferencias en el espacio de la memoria

El almacenamiento secuencial , ya sea una asignación estática o no estática, debe 预先分配preasignar demasiado espacio cuando se desperdicia la asignación estática adecuada de espacio de memoria, demasiado pequeño para causar desbordamiento; aunque no se desborda, la expansión requiere muchos elementos móviles cuando la asignación dinámica,
Cadena de baja eficiencia operativa El formato需要时分配 se puede almacenar en el espacio del nodo, lo cual es eficiente y conveniente, pero el puntero necesita usar espacio adicional.

4. ¿Cómo elegir la estructura de almacenamiento de la mesa lineal?

Inserte la descripción de la imagen aquí

5. Operaciones comunes de tablas lineales

Inserte la descripción de la imagen aquí

5.1 Encuentre el mejor valor

Tabla de secuencia

Primero, use dos variables para marcar el primer elemento de la matriz como el máximo y el mínimo, y luego recorra la tabla de secuencia. Si el elemento es mayor que el máximo, modifique la variable del máximo; si es menor que el mínimo, modificar la variable del mínimo. Los valores máximo y mínimo se pueden obtener al final del recorrido.

Inserte la descripción de la imagen aquí
Complejidad del tiempo: O (n)

int min=L[0];
int max=L[0];
for(int i=0;i<n;i++){
    
    
   if(min>L[i]){
    
    
      min=L[i];
   }
   if(max<L[i]){
    
    
      max=L[i];
   }
}

Lista única

Lo mismo es cierto y la tabla de secuencia.

Inserte la descripción de la imagen aquí

Complejidad del tiempo: O (n)

5.2 Inversión

Tabla de secuencia

Idea uno, solicitamos un espacio auxiliar, luego recorremos toda la tabla de secuencia desde el final hasta el principio, y luego insertamos cada elemento en el nuevo espacio, pero la complejidad temporal y espacial de esto es O (n). Aquí hay otro método:

Podemos usar dos etiquetas para apuntar a los valores del elemento de cabeza iy el elemento de cola jrespectivamente, y luego intercambiar los valores de los dos elementos de datos etiquetados, luego mover la ietiqueta un bit hacia atrás, la jetiqueta hacia adelante un bit, y seguir intercambiando el valor del elemento ... Hasta i<jel fin de los tiempos. La complejidad temporal de este método es O (n) y la complejidad espacial es O (1)

Inserte la descripción de la imagen aquí
Lista única

En la lista enlazada individualmente, tenemos un puntero de cabeza ( p) y un puntero de cola ( r). Movemos el primer nodo de elemento de datos a la parte (r)posterior del puntero, y luego continuamos moviendo el primer nodo de elemento de datos al rpuntero ( ). .. Continuar operando, hasta que pel siguiente nodo del puntero sea el final del rnodo ( ).

Inserte la descripción de la imagen aquí

Explicación del código: p->next!=res la condición de juicio para el final del movimiento ry finaliza cuando el nodo se mueve como el primer nodo. temp=p->nextEs pel siguiente nodo para guardar el nodo. p->next=temp->nextEs directamente p结点和temp后面的结点相连接. [Las dos primeras declaraciones son sacar y guardar el nodo que se va a mover] temp->next=r->nextModificar el siguiente puntero del nodo que se va a insertar para que apunte al siguiente rnodo del nodo, que se r->next=temp;va a conectar. [Las dos últimas oraciones son operaciones de conexión]

Complejidad temporal: O (n).

5.3 Fusión

Tabla de secuencia

Debe solicitar un nuevo espacio, el tamaño es la suma de los dos espacios de tabla secuenciales, y luego debe encontrar el que tiene el valor de elemento más pequeño en las dos tablas de secuencia de libros y luego insertarlo en la nueva tabla. En este momento, necesitamos usar tres marcadores, uno ( i) apunta a la primera posición de L1, uno ( j) apunta a la primera posición de L2 y uno ( k) apunta a la nueva matriz. 注意这里的顺序表的元素都是从小到大排列的,我们只需要保证合并后的元素值也是从小到大排列。Luego, necesitamos comparar los valores De los elementos de las dos matrices a la vez. Si L1 [i] <L2 [i], agregue L1 [i] a la nueva matriz en este momento, y marque k ++ al mismo tiempo, luego deje i ++ y j sin cambios, y luego continuar con la comparación. Si se comparan los elementos de la matriz L1, en este momento, la matriz L2 aún se deja y no hay necesidad de comparar en este momento, simplemente agregue los elementos de la matriz L2 a la nueva matriz uno por uno.

Inserte la descripción de la imagen aquí

Entre ellos i<L1_Size&&j<L2_Sizeestá determinar si las dos matrices se eliminan todas. Los siguientes dos whilejuicios son para juzgar si las dos matrices se eliminan todas, porque no sé qué matriz no se elimina.

Complejidad del tiempo: O (n)

Lista única

La tabla de secuencia es básicamente la misma.

Inserte la descripción de la imagen aquí

Bienvenido al número de interés público 理木客más emocionante esperando que lo descubras

Supongo que te gusta

Origin blog.csdn.net/qq_41941875/article/details/106180993
Recomendado
Clasificación