Menu
Coddy logo textTech

Hash Map

Última actualización

Un hash map almacena pares clave-valor y permite buscar un valor por su clave en O(1) en promedio. Funciona igual que una tabla hash, pero cada entrada de cubeta lleva tanto una clave como su valor asociado. Para almacenar o recuperar un par, la clave se hashea a un índice de cubeta y luego se recorre la cadena de esa cubeta buscando la clave coincidente. Pulsa reproducir arriba para ver cómo los pares se colocan por cubeta hasheada y cómo se recupera un valor por su clave.

Esta es la estructura detrás del dict de Python, del HashMap de Java y del Map/objetos de JavaScript. Las colisiones se manejan igual que en una tabla hash - aquí, mediante encadenamiento separado - así que el rendimiento depende de una buena función de hash y de un factor de carga bajo.

Complejidad temporal

OperaciónPromedioPeor caso
Insertar/actualizar (put)O(1)O(n)
Buscar (get)O(1)O(n)
EliminarO(1)O(n)
EspacioO(n)O(n)

Hash map en lenguajes comunes

LenguajeTipo
Pythondict
JavaHashMap
JavaScriptMap / objeto
C++std::unordered_map
Gomap

Ejemplo resuelto

Insertando los pares ("cat", 3), ("dog", 5), ("cat", 9), ("emu", 7) en un mapa con 8 cubetas, usando hash(key) % 8. Supongamos hash("cat") % 8 = 2, hash("dog") % 8 = 5, hash("emu") % 8 = 2:

PasoEstructuraAcción
Put ("cat", 3)cubeta 2: [("cat", 3)]Se hashea a la cubeta 2; cadena vacía, así que se añade el par.
Put ("dog", 5)cubeta 2: [("cat", 3)], cubeta 5: [("dog", 5)]Se hashea a la cubeta 5; cadena vacía, así que se añade el par.
Put ("cat", 9)cubeta 2: [("cat", 9)], cubeta 5: [("dog", 5)]Se hashea a la cubeta 2; la clave "cat" ya está en la cadena, así que se actualiza su valor a 9.
Put ("emu", 7)cubeta 2: [("cat", 9), ("emu", 7)], cubeta 5: [("dog", 5)]Se hashea a la cubeta 2; colisiona con "cat", la clave no se encuentra, así que se añade el par.
Get "emu"cubeta 2: [("cat", 9), ("emu", 7)]Se hashea a la cubeta 2; se recorre la cadena, se salta "cat", coincide "emu", se devuelve 7.

Cuándo usar un hash map

Úsalo cuandoEvítalo cuando
Necesitas búsqueda, inserción y eliminación en O(1) promedio por una clave exacta.Necesitas mantener las claves ordenadas o hacer consultas por rango - usa un BST balanceado o un mapa ordenado.
Las claves son hasheables y su igualdad está bien definida (cadenas, enteros, tuplas).Las claves son mutables y pueden cambiar tras la inserción, lo que corrompe su cubeta.
Estás contando, deduplicando, cacheando o indexando por un identificador.Necesitas garantías de peor caso O(log n) en lugar de cotas promedio amortizadas.
El orden de iteración no importa, o basta con un mapa ordenado por inserción.La memoria es muy escasa - las cubetas, el margen del factor de carga y los punteros añaden sobrecarga.

Código de Hash Map

Una implementación limpia y ejecutable de Hash Map en Python, JavaScript, Java, C++, C. Elige un lenguaje, copia el código o ábrelo ya cargado en el Playground de Coddy.

Código de Hash Map en Python

Python
1# Python's built-in dict is a hash map: O(1) average2# insert, lookup, and delete.3inventory = {"apple": 3, "banana": 7}4
5# Insert and update6inventory["cherry"] = 57inventory["apple"] += 28
9# Lookup, with .get for a safe default on missing keys10print("apple: ", inventory["apple"])11print("mango: ", inventory.get("mango", 0))12
13# Membership test and delete14print("banana in stock:", "banana" in inventory)15del inventory["banana"]16print("banana in stock:", "banana" in inventory)17
18# Iterate over key-value pairs19for fruit, count in sorted(inventory.items()):20    print(f"{fruit}: {count}")21
22# Classic hash map use case: counting frequencies23words = "the quick brown fox jumps over the lazy dog the end".split()24freq = {}25for word in words:26    freq[word] = freq.get(word, 0) + 127
28print("Occurrences of the:", freq["the"])29print("Most common word:  ", max(freq, key=freq.get))
Ejecuta este código en el Playground de Python

Preguntas frecuentes sobre hash map

¿Cuál es la diferencia entre un hash map y una tabla hash?
Son esencialmente la misma estructura - un arreglo de cubetas direccionadas por un hash de la clave. En el uso común, "tabla hash" a menudo se refiere a un conjunto de claves o a la técnica general, mientras que "hash map" enfatiza el almacenamiento de pares clave-valor. Algunos lenguajes también hacen una distinción de seguridad ante hilos (por ejemplo, Hashtable vs HashMap en Java), pero el algoritmo central es idéntico.
¿Cuál es la complejidad temporal de un hash map?
Put, get y delete son O(1) en promedio con una buena función de hash y un factor de carga bajo. En el caso patológico en que todas las claves colisionan en una sola cubeta, degeneran a O(n), por lo que el redimensionamiento y un buen hashing importan.
¿Cómo maneja un hash map dos claves que hashean a la misma cubeta?
Resuelve la colisión. Esta visualización usa encadenamiento separado: cada cubeta contiene una pequeña lista, y un nuevo par cuya clave hashea allí se añade a esa lista. En la búsqueda, el mapa recorre la cadena corta buscando la clave coincidente. La técnica alternativa es el direccionamiento abierto, que sondea otra ranura del arreglo.
Hash map vs árbol binario de búsqueda: ¿cuál debería usar?
Usa un hash map cuando solo necesitas búsqueda por clave exacta y quieres operaciones en O(1) promedio. Usa un árbol binario de búsqueda balanceado (como TreeMap o std::map) cuando necesitas claves ordenadas, consultas por rango o búsquedas de predecesor/sucesor, que cuestan O(log n). El BST cambia algo de velocidad por garantías de orden que un hash map no puede ofrecer.
¿Qué es el factor de carga y por qué desencadena el redimensionamiento?
El factor de carga es la razón entre las entradas almacenadas y las cubetas. A medida que sube, las cadenas se alargan y las búsquedas promedio se ralentizan, así que la mayoría de las implementaciones redimensionan (típicamente duplican las cubetas y rehashean todo) cuando supera un umbral como 0.75. El redimensionamiento es O(n) pero poco frecuente, por lo que se amortiza y mantiene las operaciones promedio en O(1).
¿Puedo usar un objeto mutable como una lista como clave de un hash map?
Normalmente no. Las claves deben ser hasheables y su hash debe permanecer constante mientras están en el mapa - Python lanza TypeError: unhashable type para una list, por ejemplo. Si mutas una clave después de insertarla, su hash cambia y el mapa ya no puede encontrarla en la cubeta correcta, perdiendo silenciosamente la entrada. Usa claves inmutables como cadenas, números o tuplas.
Coddy programming languages illustration

Domina los algoritmos con Coddy

COMENZAR