El funcionamiento de un hashmap no se basa directamente en punteros, aunque en algunos lenguajes de programación, como C o C++, se puede implementar utilizando punteros. La idea principal detrás de un hashmap es el uso de una tabla hash y una función hash para mapear claves a valores de manera eficiente. A continuación, te explico cómo funciona un hashmap:
- Tabla Hash: Es una estructura de datos que contiene una lista de buckets (contenedores). Cada bucket puede almacenar uno o más pares clave-valor.
- Función Hash: Es una función que toma una clave y la transforma en un índice en la tabla hash. La calidad de esta función es crucial porque debe distribuir las claves uniformemente en la tabla para minimizar las colisiones.
- Inserción de Pares Clave-Valor:
- Se aplica la función hash a la clave para obtener un índice.
- Se almacena el par clave-valor en el bucket correspondiente al índice calculado.
- Resolución de Colisiones: Cuando dos claves diferentes producen el mismo índice (colisión), se utilizan técnicas como:
- Encadenamiento: Cada bucket contiene una lista enlazada de pares clave-valor. Si ocurre una colisión, el nuevo par se añade al final de la lista en el bucket correspondiente.
- Dirección Abierta: Se buscan otras posiciones en la tabla según una secuencia definida hasta encontrar una posición vacía.
- Búsqueda de Valores:
- Se aplica la función hash a la clave para obtener el índice.
- Se accede al bucket correspondiente y se busca la clave dentro del bucket.
- Si la clave está presente, se devuelve el valor asociado.
- Eliminación de Pares Clave-Valor:
- Se aplica la función hash a la clave para encontrar el índice.
- Se busca la clave en el bucket correspondiente y, si se encuentra, se elimina el par clave-valor.
Ejemplo en Pseudocódigo:
pseudoCopiar código
function hashFunction(key):
index = some_hash_algorithm(key)
return index
function put(key, value):
index = hashFunction(key)
bucket = table[index]
if bucket is empty:
bucket = new List()
bucket.add((key, value))
function get(key):
index = hashFunction(key)
bucket = table[index]
for (k, v) in bucket:
if k == key:
return v
return null
function remove(key):
index = hashFunction(key)
bucket = table[index]
for (k, v) in bucket:
if k == key:
bucket.remove((k, v))
break
Implementaciones en Lenguajes Específicos:
- Java: Utiliza internamente arrays de
Entry (que contienen claves, valores y referencias a los siguientes Entry en caso de colisiones).
- Python: Los diccionarios (dict) están implementados usando tablas hash con encadenamiento.
- C++: La biblioteca estándar tiene
std::unordered_map, que se implementa usando tablas hash.
En resumen, aunque un hashmap puede hacer uso de punteros en su implementación (especialmente en lenguajes como C o C++), su funcionamiento principal se basa en la función hash y en la estructura de la tabla hash para almacenar y recuperar datos de manera eficiente.
Conceptos Específicos para Hash Maps
-
Función Hash:
- Qué es una función hash
- Cómo diseñar una buena función hash
- Propiedades de una buena función hash (uniformidad, determinismo, rapidez)
-
Manejo de Colisiones:
- Encadenamiento (chaining)
- Dirección abierta (open addressing)
- Técnicas de dirección abierta (hashing lineal, hashing cuadrático, doble hashing)
-
Tamaño de la Tabla y Redimensionamiento:
- Factores de carga
- Estrategias de redimensionamiento
- Rehashing
-
Complejidad Temporal:
- Comprender la complejidad temporal de las operaciones básicas (inserción, eliminación, búsqueda)
- Análisis en el mejor caso, caso promedio y peor caso
RECURSOS EXTRA
Video de Betta Tech
¿Qué son las TABLAS de HASH? | Estructuras de Datos en Ingeniería Informática
Video de Funcionalidades de Hash
📌[ HASH ] ¿Qué es el HASH? ¿Cómo se genera el HASH? ► Los 6 USOS MÁS DESTACADOS del HASH