Tengo una pregunta con hash_mapy mapen C ++. Entiendo que mapestá en STL, pero hash_mapno es un estándar. ¿Cuál es la diferencia entre los dos?
117
Se implementan de formas muy diferentes.
hash_map( unordered_mapen 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_mapdebería ofrecer un rendimiento ligeramente mejor para acceder a elementos conocidos de la colección, pero maptendrá características útiles adicionales (por ejemplo, se almacena en orden ordenado, lo que permite recorrerlos de principio a fin). unordered_mapserá más rápido al insertar y eliminar que a map.
hash_mapera una extensión común proporcionada por muchas implementaciones de bibliotecas. Esa es exactamente la razón por la que se renombróunordered_mapcuando 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_mapyunordered_mapgeneralmente se implementan con tablas hash. Por tanto, el orden no se mantiene.unordered_mapinsertar / 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_mapes 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 esomapsería la elección.fuente
Algunas de las diferencias clave están en los requisitos de complejidad.
A
maprequiereO(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_maprequiere 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_mapserá 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
mapy 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_mapy demás a versiones posteriores del estándar C ++.fuente
mapes que generalmente un árbol b balanceado se debe al usooperator<()como medio para determinar la ubicación.mapse implementa desdebalanced binary search tree(generalmente arb_tree), ya que todos los miembros debalanced binary search treeestán ordenados, por lo tanto, map;hash_mapse implementa desde.hashtableDado que todos los miembros dehashtableno están ordenados, los miembros dehash_map(unordered_map)no están ordenados.hash_mapno 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 treefunción.hash_map:hash_mapse implementa a partir dehashtablecuya estructura es algo así:En el siguiente código, daré la parte principal de
hashtabley luego daréhash_map.Como
map'sesrb_treeelhash_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