Colección de citas famosas - Slogan de motivación - ¿Qué es más eficiente, Diccionario o Lista?

¿Qué es más eficiente, Diccionario o Lista?

1. Los conceptos básicos

Lista es una colección, que puede almacenar un cierto tipo de lista

Diccionario, nosotros Comúnmente conocido como diccionario, contiene una clave y el valor correspondiente. Su propósito es encontrar rápidamente el valor en función de la clave, y la complejidad del algoritmo es O (1).

2 Similitudes y diferencias entre Dictionary y Hashtable

En primer lugar, muchas personas están de acuerdo con el hecho de que Dictionary es una versión genérica de. HashTable. Generalmente es correcto, pero cuando ejecutamos dicho código, podemos ver la diferencia:

1 Diccionario dic = new Dictionary(); /p>

2 dic.Add(1, 5);

3 dic.Add(10, 3);

4 dic.Add(2, 5) ;

5 foreach (tecla int en dic.Keys)

6 {

7 Console.WriteLine(key);

8 }

9

10 Hashtable hashtable = new Hashtable();

11 hashtable.Add(1, 5);

12 hashtable .Add(10, 3);

13 hashtable.Add(2, 5);

14 foreach (clave de objeto en hashtable.Keys)

15 {

16 Console.WriteLine(key.ToString());

17 }

El diccionario se recorre según el orden de inserción , pero Hashtable codificará su posición cuando se inserte.

Y cuando usamos Reflector para ver el código fuente, también encontraremos que Hashtable es seguro para subprocesos, pero Dictionary obviamente no tiene esa característica.

3. Principio de almacenamiento del diccionario

Hablando de diccionario, tenemos que hablar de su estructura de almacenamiento. Calculará lo que debe almacenar en función de la clave. Cálculo hash. Esta es también la razón por la que la clave debe ser la única en la tabla hash. Cuando buscamos según la clave, primero calculamos la dirección de memoria virtual donde se almacena en función de la clave y luego vamos a la. dirección de memoria correspondiente para encontrar los datos y obtener su valor.

Esto es lo mismo que HashTable.

4. Pregunta

Para discutir la eficiencia del Diccionario y la Lista al atravesar, un experto escribió un código, que es una imagen

Es muy obvio. , LIST es mucho más eficiente.

5. Análisis de problemas

También es una colección, ¿por qué existe tal brecha en el rendimiento?

Tenemos que comenzar con los principios de estructura de almacenamiento y sistema operativo.

En primer lugar, entendemos que List es una capa de empaquetado para la matriz. Lo llamamos lista lineal en la estructura de datos, y el concepto de lista lineal es un área continua en. la memoria, excepto el primero. Excepto los nodos y los nodos de cola, cada nodo tiene su nodo predecesor único y su nodo posterior. Nos ocupamos aquí del concepto de continuidad.

En cuanto a HashTable o Diccionario, es una dirección de memoria generada en base al análisis del algoritmo Key y Hash, por lo que es macroscópicamente discontinuo, aunque Microsoft también ha optimizado mucho su algoritmo.

Debido a tal discontinuidad, el Diccionario inevitablemente generará una gran cantidad de cambios de página de memoria durante el recorrido, mientras que Lista solo requiere cambios mínimos de página de memoria. Esta es la eficiencia de Lista y Diccionario al atravesar. la diferencia.

6. Hablemos de Diccionario nuevamente

Muchas personas pueden decir que dado que Diccionario es tan poderoso, ¿por qué no usamos Diccionario para reemplazar todas las colecciones?

Además del problema de recorrido de ahora, aquí también debemos mencionar el problema de espacio de almacenamiento del Diccionario. En Diccionario, además de almacenar el Valor que realmente necesitamos, también necesitamos una Clave de variable auxiliar. lo que provoca que esto elimine un doble desperdicio de espacio en la memoria.

Y cuando se inserta al final, List solo necesita continuar con el almacenamiento en función de su dirección original, pero Dictionary necesita realizar cálculos Hash complejos, que también es donde se pierde rendimiento.