Algoritmo Java ---- comenzando con matrices

1. mesa lineal

1. En la estructura de datos, la estructura lógica de los datos se divide en estructura lineal y estructura no lineal.

2. Estructura lineal: un conjunto ordenado (ordenado) de n elementos de datos. Sus características son las siguientes:

  1. Debe haber sólo un "primer elemento" en el conjunto.
  2. Debe haber sólo un "último elemento" en el conjunto.
  3. Excepto el último elemento, todos los demás elementos de datos tienen un "sucesor" único.
  4. Excepto el primer elemento, todos los demás elementos de datos tienen un "predecesor" único.

3. La estructura lineal en la estructura de datos se refiere a una estructura de datos en la que existe una relación lineal "uno a uno" entre los elementos de datos. Por supuesto, esta linealidad no significa necesariamente que sea una línea recta. Las estructuras de datos lineales comunes incluyen: matrices (unidimensionales), listas vinculadas, pilas y colas; también son la base para nuestro aprendizaje posterior de otras estructuras de datos. , y sus expresiones son las siguientes: 4. Correspondiente a
Insertar descripción de la imagen aquí
la estructura lineal, la característica lógica de la estructura no lineal es que un elemento de nodo puede corresponder a múltiples predecesores directos y múltiples sucesores, como los que se explicarán más adelante: árboles, gráficos, montones, etc., como se muestra a continuación:
Insertar descripción de la imagen aquí

2. matriz

1. Concepto y estructura

1. La matriz es una especie deespacio de memoria contiguoalmacenamientoMismo tipo de datosestructura de datos lineal de datos

int[] array = new int[]{
    
    10,20,30};
int[] array = new int[6];

2. Representación en memoria:
Insertar descripción de la imagen aquí
3. Representación de matriz: utilice subíndices para obtener datos de elementos de matriz

  1. Supongamos que hay una matriz de caracteres a, el número de elementos es nInsertar descripción de la imagen aquí
  2. ¿Cómo representar u obtener los elementos del array? La recuperación está representada por subíndices. Los subíndices de la matriz comienzan desde 0 y terminan en la longitud de la matriz -1.
    Insertar descripción de la imagen aquí

4. Piense en cómo la plataforma operativa encuentra la dirección de memoria del elemento correspondiente según el subíndice.

  1. Tomemos como ejemplo una matriz con una longitud de 10, int [] a = new int [10]. En la imagen a continuación, la computadora asigna un espacio continuo a la matriz, 100-139, donde se encuentra la dirección inicial de la memoria. es baseAddress =100
    Insertar descripción de la imagen aquí
    Sabemos que la computadora asigna una dirección a cada unidad de memoria y accede a sus datos a través de la dirección, por lo tanto, cuando desea acceder a un elemento en la matriz, primero debe calcular el elemento al que se accederá en la memoria. mediante una fórmula de direccionamiento la dirección de:
a[i] = baseAddress + i * dataTypeSize
  1. donde dataTypeSize representa el tamaño del tipo de elemento en la matriz. En este ejemplo, se almacenan datos de tipo int, por lo que dataTypeSize = 4 bytes
  2. ¿Por qué los subíndices comienzan desde 0 en lugar de 1?
  3. Desde la perspectiva del modelo de memoria del almacenamiento en matriz, la definición más precisa de "subíndice" debería ser "compensación". Como se mencionó anteriormente, si se usa una matriz para representar la primera dirección de la matriz, la matriz [0] es la posición con un desplazamiento de 0, que es la primera dirección, y la matriz [k] representa la posición con un desplazamiento de k tipo_tamaño , entonces para calcular la matriz [La dirección de memoria de k] solo necesita usar esta fórmula:
array[k]_address = base_address + k * type_size

Pero si el subíndice comienza desde 1, entonces calcular la dirección de memoria de la matriz [k] será:

array[k]_address = base_address + (k‐1)*type_size

Al comparar las dos fórmulas, no es difícil encontrar que si se accede al elemento de la matriz según el subíndice que comienza desde 1, habrá una instrucción de resta más para la CPU.

2. Características de las matrices.

1. Consulta O (1): se accede a los elementos de la matriz mediante subíndices. La computadora puede encontrar rápidamente el elemento al que desea acceder a través de la primera dirección de la matriz y la fórmula de direccionamiento.

public int test01(int[] a,int i){
    
    
	return a[i];
}

La cantidad de veces que se ejecuta el código no cambia a medida que cambia el tamaño de los datos de la matriz, es constante, por lo que la complejidad temporal de las operaciones de consulta de datos es O (1)

2. Inserción y eliminación O (n): la matriz es un espacio de memoria continuo, por lo que para garantizar la continuidad de la matriz, la eficiencia de la inserción y eliminación de la matriz será muy baja.

  1. Inserción de datos: supongamos que la longitud de la matriz es n, ahora si necesitamos insertar un dato en la k-ésima posición de la matriz. Para liberar la k-ésima posición para los nuevos datos, necesitamos mover secuencialmente los elementos de la k-ésima parte hacia atrás una posición. Como se muestra abajo
    Insertar descripción de la imagen aquí

La complejidad temporal correspondiente a la operación de inserción es: O (1) en el mejor de los casos, O (n) en el peor de los casos y O (n) en el caso promedio.

  1. Eliminación de datos: Se puede decir lo mismo: si queremos eliminar los datos en la k-ésima posición, también debemos mover los datos para garantizar la continuidad de la memoria, de lo contrario, aparecerán agujeros en el medio y la memoria no ser continuo y la complejidad del tiempo sigue siendo O (n)

3. ¿En qué escenarios y qué métodos se pueden utilizar para mejorar la eficiencia de la eliminación de datos?

  1. 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?
    Tomemos un ejemplo: la matriz a[6] almacena 6 elementos: a1, a2, a3, a4, a5, a6. Ahora queremos eliminar los dos elementos a1 y a2 en secuencia.
  2. Para evitar que los datos a3, a4, a5 y a6 se muevan dos veces, primero podemos registrar los datos eliminados. 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.
  3. Esta idea es la idea central del algoritmo de recolección de basura de marcado y barrido de JVM.

Supongo que te gusta

Origin blog.csdn.net/weixin_44702984/article/details/131180713
Recomendado
Clasificación