La implementación subyacente de Unity List y la implementación subyacente de algunos métodos

Tabla de contenido

implementación subyacente

método común

pros y contras

        ventaja

        defecto

implementación subyacente

El tipo de lista de Unity utiliza un bloque contiguo de memoria para almacenar elementos y acceder y manipular estos elementos a través del índice de la matriz. Cuando agregamos elementos a la Lista, si la capacidad actual del arreglo interno no es suficiente para acomodar los nuevos elementos, Unity asignará automáticamente un bloque de memoria más grande y copiará los elementos antiguos a la nueva memoria. Este proceso se denomina expansión. Normalmente, Unity duplicará el tamaño del arreglo interno cada vez que se expanda para reducir las operaciones de expansión frecuentes.

método común

  • Add(item): Agrega un elemento al final de la Lista. Si la capacidad actual es insuficiente para albergar el nuevo elemento, se activará una operación de ampliación. La implementación subyacente agregará nuevos elementos al final de la matriz interna y actualizará la longitud de la lista.
  • Remove(item): Elimina el elemento especificado de la Lista. La implementación subyacente recorre toda la Lista, encuentra el primer elemento coincidente y lo elimina. Esta operación puede hacer que los elementos subsiguientes se desplacen hacia adelante, por lo que la complejidad del tiempo es O(n).
  • Insert(index, item): inserta un elemento en la posición de índice especificada. La implementación subyacente moverá el elemento después de la posición del índice un poco hacia atrás para dejar espacio para el nuevo elemento y colocarlo en la posición correcta. Esta operación puede hacer que los elementos subsiguientes se desplacen hacia atrás, por lo que la complejidad del tiempo es O(n).
  • Clear(): Borrar todos los elementos de la Lista. La implementación subyacente establecerá la longitud de la lista en 0, pero no liberará la memoria de la matriz interna.
  • Contains(item): determina si la Lista contiene el elemento especificado. La implementación subyacente atraviesa toda la Lista y compara los elementos con el elemento de destino uno por uno. La complejidad de tiempo promedio de esta operación es O(n).
  • Find(Predicate<T> match): busque el primer elemento que cumpla la condición en la Lista de acuerdo con la condición especificada y devuelva el elemento. La implementación subyacente atraviesa toda la Lista, comparando elementos y condiciones uno por uno. La complejidad de tiempo promedio de esta operación es O(n).
  • FindAll(Predicate<T> match): según la condición especificada, busque todos los elementos que cumplan la condición en la Lista y devuelva una nueva Lista. Esta operación recorre toda la Lista, comparando elementos y condiciones uno por uno. La complejidad del tiempo es O(n).
  • ForEach(Action<T> action): Realiza la operación especificada en cada elemento de la Lista. La implementación subyacente utiliza un ciclo simple para iterar y aplicar las funciones de operación una por una.
  • RemoveAt(index): elimina el elemento en la posición de índice especificada. La implementación subyacente moverá los elementos después del índice hacia adelante un bit, sobrescribirá los elementos que deben eliminarse y actualizará la longitud de la lista. Esta operación hace que los elementos posteriores se desplacen hacia adelante, por lo que la complejidad del tiempo es O(n).
  • ToArray(): Copie los elementos de la Lista en una nueva matriz y devuelva la matriz. La implementación subyacente crea una nueva matriz y copia los elementos de la Lista en la nueva matriz uno por uno.

Además, List proporciona algunos métodos para ordenar e invertir listas:

  • Sort(): Ordena los elementos en la Lista. Unity usa el algoritmo de clasificación rápida para implementar este método, que tiene una alta eficiencia. La complejidad temporal de la clasificación es O(n log n).
  • Reverse(): Invierte el orden de los elementos en la Lista. La implementación subyacente intercambiará el primer elemento con el último elemento, y así sucesivamente, hasta que se haya invertido la lista completa.

pros y contras

        ventaja

  1. Cambio de tamaño dinámico: la lista tiene la capacidad de expandirse automáticamente y puede ajustar dinámicamente el tamaño de la matriz interna según sea necesario para acomodar la adición o eliminación de elementos. Esto hace que List sea flexible para manejar un número indeterminado de elementos.

  2. Acceso aleatorio: dado que la capa inferior se implementa mediante una matriz, List admite el acceso aleatorio a través de índices, es decir, se puede acceder directamente a los elementos en cualquier posición. Esta característica de acceso aleatorio hace que las operaciones de lectura y escritura en elementos sean muy eficientes, con una complejidad de tiempo de O(1).

  3. Iteración lineal: use el bucle for y otros métodos para realizar una iteración lineal en la Lista para recorrer los elementos en ella. Este método iterativo es relativamente simple y eficiente.

        defecto

  1. La inserción y eliminación de elementos son ineficientes: dado que la capa inferior es un bloque de memoria continuo, cuando es necesario insertar o eliminar un elemento en el medio, provocará una serie de operaciones hacia adelante o hacia atrás de los elementos, lo que resultará en una complejidad de tiempo de O (norte). Por lo tanto, las operaciones frecuentes de inserción y eliminación pueden afectar el rendimiento.

  2. Sobrecarga de memoria: List almacena elementos en forma de arreglos continuos en la memoria.Si es necesario almacenar una gran cantidad de elementos, y solo una pequeña parte de ellos está activa, puede causar una cierta cantidad de desperdicio de memoria.

  3. No es compatible con la búsqueda rápida: dado que List se implementa en función de una matriz, no proporciona una función de búsqueda rápida como un diccionario (diccionario). Para escenarios que requieren operaciones de búsqueda frecuentes, el uso de List puede causar una degradación del rendimiento.

En resumen, la implementación de List como una matriz dinámica tiene ventajas significativas en el manejo de la adición, eliminación y acceso aleatorio de elementos, pero puede haber algunas desventajas en términos de operaciones frecuentes de inserción y eliminación y requisitos de búsqueda rápida. De acuerdo con los requisitos específicos de uso y rendimiento, podemos elegir la estructura de datos adecuada para cumplir con los requisitos de desarrollo.

おすすめ

転載: blog.csdn.net/qq_66312646/article/details/132087678