Tengo una pregunta con hash_map
y map
en C ++. Entiendo que map
está en STL, pero hash_map
no es un estándar. ¿Cuál es la diferencia entre los dos?
117
Se implementan de formas muy diferentes.
hash_map
( unordered_map
en TR1 y Boost; utilícelos en su lugar) use una tabla hash donde la clave está codificada en un espacio en la tabla y el valor se almacena en una lista vinculada a esa clave.
map
se implementa como un árbol de búsqueda binario balanceado (generalmente un árbol rojo / negro).
An unordered_map
debería ofrecer un rendimiento ligeramente mejor para acceder a elementos conocidos de la colección, pero map
tendrá características útiles adicionales (por ejemplo, se almacena en orden ordenado, lo que permite recorrerlos de principio a fin). unordered_map
será más rápido al insertar y eliminar que a map
.
hash_map
era una extensión común proporcionada por muchas implementaciones de bibliotecas. Esa es exactamente la razón por la que se renombróunordered_map
cuando se agregó al estándar C ++ como parte de TR1. map generalmente se implementa con un árbol binario balanceado como un árbol rojo-negro (las implementaciones varían, por supuesto).hash_map
yunordered_map
generalmente se implementan con tablas hash. Por tanto, el orden no se mantiene.unordered_map
insertar / eliminar / consulta será O (1) (tiempo constante) donde mapa será O (log n) donde n es el número de elementos en la estructura de datos. Entoncesunordered_map
es más rápido, y si no le importa el orden de los artículos, debe preferirlomap
. A veces se desea mantener el orden (ordenado por clave) y para esomap
sería la elección.fuente
Algunas de las diferencias clave están en los requisitos de complejidad.
A
map
requiereO(log(N))
tiempo para las operaciones de inserción y búsqueda, ya que se implementa como una estructura de datos de árbol rojo-negro .An
unordered_map
requiere un tiempo 'promedio' deO(1)
para inserciones y búsquedas, pero se le permite tener un tiempo en el peor de los casos deO(N)
. Esto se debe a que se implementa utilizando la estructura de datos de la tabla hash .Entonces, por lo general,
unordered_map
será más rápido, pero dependiendo de las claves y la función hash que almacene, puede empeorar mucho.fuente
La especificación de C ++ no dice exactamente qué algoritmo debe usar para los contenedores STL. Sin embargo, impone ciertas restricciones a su rendimiento, lo que excluye el uso de tablas hash
map
y otros contenedores asociativos. (Se implementan más comúnmente con árboles rojo / negro). Estas restricciones requieren un mejor rendimiento en el peor de los casos para estos contenedores que el que pueden ofrecer las tablas hash.Sin embargo, muchas personas realmente quieren tablas hash, por lo que los contenedores asociativos STL basados en hash han sido una extensión común durante años. En consecuencia, agregaron
unordered_map
y demás a versiones posteriores del estándar C ++.fuente
map
es que generalmente un árbol b balanceado se debe al usooperator<()
como medio para determinar la ubicación.map
se implementa desdebalanced binary search tree
(generalmente arb_tree
), ya que todos los miembros debalanced binary search tree
están ordenados, por lo tanto, map;hash_map
se implementa desde.hashtable
Dado que todos los miembros dehashtable
no están ordenados, los miembros dehash_map(unordered_map)
no están ordenados.hash_map
no es una biblioteca estándar de c ++, pero ahora se le cambió el nombre aunordered_map
(puede pensar en que se le cambió el nombre) y se convierte en una biblioteca estándar de c ++ desde c ++ 11 ver esta pregunta ¿ Diferencia entre hash_map y unordered_map? para más detalles.A continuación, daré una interfaz básica del código fuente de cómo se implementa el mapa de dos tipos.
mapa:
El siguiente código es solo para mostrar que, map es solo un envoltorio de
balanced binary search tree
, casi toda su función es simplemente invocar labalanced binary search tree
función.hash_map
:hash_map
se implementa a partir dehashtable
cuya estructura es algo así:En el siguiente código, daré la parte principal de
hashtable
y luego daréhash_map
.Como
map's
esrb_tree
elhash_map's
único miembro , el único miembro eshashtable
. Es el código principal de la siguiente manera:La imagen de abajo muestra cuando un hash_map tiene 53 cubos e inserta algunos valores, su estructura interna.
La siguiente imagen muestra alguna diferencia entre mapa y hash_map (unordered_map), la imagen proviene de ¿Cómo elegir entre mapa y unordered_map? :
fuente
No sé qué da, pero hash_map tarda más de 20 segundos en borrar () 150K claves enteras sin firmar y valores flotantes. Solo estoy ejecutando y leyendo el código de otra persona.
Así es como incluye hash_map.
Leí esto aquí https://bytes.com/topic/c/answers/570079-perfomance-clear-vs-swap
diciendo que clear () es el orden de O (N). Eso para mí es muy extraño, pero así es.
fuente