in

estructuras de datos: implementación de un HashMap en C

apple touch icon@2

El objetivo principal de un mapa hash es almacenar un conjunto de datos y proporcionar búsquedas en él en tiempo casi constante utilizando una clave única. Hay dos estilos comunes de implementación de hashmap:

  • Encadenamiento separado: uno con una matriz de depósitos (listas vinculadas)
  • Direccionamiento abierto: una única matriz asignada con espacio adicional para que las colisiones de índices se puedan resolver colocando la entrada en una ranura adyacente.

Es preferible un encadenamiento separado si el mapa de hash puede tener una función de hash deficiente, no es deseable preasignar almacenamiento para ranuras potencialmente no utilizadas, o las entradas pueden tener un tamaño variable. Este tipo de mapa hash puede seguir funcionando de manera relativamente eficiente incluso cuando el factor de carga excede 1.0. Obviamente, se requiere memoria adicional en cada entrada para almacenar punteros de listas vinculadas.

Los hashmaps que utilizan direccionamiento abierto tienen posibles ventajas de rendimiento cuando el factor de carga se mantiene por debajo de un cierto umbral (generalmente alrededor de 0,7) y se utiliza una función hash razonablemente buena. Esto se debe a que evitan posibles pérdidas de caché y muchas asignaciones de memoria pequeñas asociadas con una lista vinculada, y realizan todas las operaciones en una matriz contigua y preasignada. La iteración a través de todos los elementos también es más barata. El problema es que los hashmaps que utilizan direccionamiento abierto deben reasignarse a un tamaño más grande y actualizarse para mantener un factor de carga ideal, o se enfrentan a una penalización significativa en el rendimiento. Es imposible que su factor de carga exceda 1.0.

Algunas métricas de rendimiento clave para evaluar al crear un mapa de hash incluirían:

  • Factor de carga máximo
  • Recuento medio de colisiones en la inserción
  • Distribución de colisiones: la distribución desigual (agrupación) podría indicar una función hash deficiente.
  • Tiempo relativo para varias operaciones: poner, obtener, eliminar entradas existentes y no existentes.

Aquí hay una implementación de hashmap flexible que hice. Usé direccionamiento abierto y sondeo lineal para la resolución de colisiones.

https://github.com/DavidLeeds/hashmap

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

cgiarch

HTTP: descripción general

SkeJZECLdwSDxNZL3Ahdkb 1200 80

Cómo construir una PC para juegos retro (y festejar como si fuera 1998)