mapa vs. hash_map en C++
hashmap (5)
Tengo una pregunta con hash_map
y map
en C ++. Entiendo que el map
está en STL, pero hash_map
no es un estándar. ¿Cuál es la diferencia entre los dos?
Algunas de las diferencias clave están en los requisitos de complejidad.
Un mapa requiere O (log (N)) tiempo para inserciones y hallazgos.
Un mapa no ordenado requiere un tiempo "promedio" de O (1) para inserciones y hallazgos, pero se le permite tener un tiempo de caso más desfavorable de O (N).
Por lo tanto, generalmente, unordered_map será más rápido, pero dependiendo de las teclas y la función de hash que almacene, puede empeorar.
La especificación C ++ no dice exactamente qué algoritmo debe usar para los contenedores STL. Sin embargo, pone ciertas restricciones en su rendimiento, lo que descarta el uso de tablas hash para map
y otros contenedores asociativos. (Generalmente se implementan con árboles rojos / negros.) Estas restricciones requieren un mejor rendimiento en el peor de los casos para las tablas hash.
Muchas personas realmente quieren tablas hash, sin embargo, los contenedores asociativos STL basados en hash han sido una extensión común durante años. En consecuencia, agregaron unordered_map
y tal como versiones posteriores del estándar de C ++.
No sé lo que ofrece, pero hash_map tarda más de 20 segundos en borrar () 150K claves enteros sin signo y valores flotantes. Solo estoy corriendo y leyendo el código de otra persona.
Así es como incluye hash_map.
#include "StdAfx.h"
#include <hash_map>
Leo 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 como es.
Se implementan de maneras muy diferentes.
hash_map
( hash_map
en TR1 y Boost; utilícelos en su lugar) usa una tabla hash donde la clave se asigna a una ranura en la tabla y el valor se almacena en una lista vinculada a esa clave.
map
se implementa como un árbol de búsqueda binaria equilibrado (generalmente un árbol rojo / negro).
Un map
unordered_map
debería proporcionar un rendimiento ligeramente mejor para acceder a elementos conocidos de la colección, pero un map
tendrá características útiles adicionales (por ejemplo, se almacena en orden ordenado, lo que permite el cruce de principio a fin). unordered_map
será más rápido en insertar y eliminar que en un map
.
hash_map
era una extensión común proporcionada por muchas implementaciones de bibliotecas. Es exactamente por eso que se renombró a unordered_map
cuando se agregó al estándar de C ++ como parte de TR1. el mapa generalmente se implementa con un árbol binario equilibrado como un árbol rojo-negro (las implementaciones varían por supuesto). hash_map
y hash_map
generalmente se implementan con tablas hash. Por lo tanto, el orden no se mantiene. unordered_map
insert / delete / query será O (1) (tiempo constante) donde el mapa será O (log n) donde n es el número de elementos en la estructura de datos. Por lo tanto, unordered_map
es más rápido, y si no le importa el orden de los elementos, debe preferirse sobre el map
. Algunas veces quiere mantener el orden (ordenado por la clave) y para ese map
sería la opción.