You are on page 1of 21

Tablas de Hash

Tablas de Hash

Tablas de Hash
• Muchas aplicaciones requieren un conjunto dinámico que soporte
las operaciones de un diccionario: Inserción, Búsqueda,
Eliminación.

• Es posible hacer uso de una lista enlazada con un tiempo O(n).
• Otra alternativa es el uso de arreglos que nos permiten acceso a
sus elementos en orden O(1). (Tablas de Direccionamiento
Directo).
• Una opción sería usar un arreglo tan grande como el rango de
posibles claves, de tal manera que la clave del elemento
determinara su posición en la tabla. La desventaja es el espacio de
memoria requerido en tal estrategia.

Tablas de Hash Tablas de Direccionamiento Directo 0 1 Universo de Claves U 5 8 2 0 1 2 3 3 4 5 6 5 1 Claves Almacenadas (K) 6 3 4 7 7 7 8 9 9 9 .

TipoClave = Entero.MAXCLAVES-1. TipoInfo = ?. info: TipoInfo. fregistro.Tablas de Hash Tablas de Direccionamiento Directo Estructura de Datos y Operaciones: onstante MAXCLAVES = |U|. proc eliminarTDD(var T: TDD. x: TipoClave): TipoElem. tipo RangoClaves = 0. proc insertarTDD(var T: TDD. func buscarTDD(T: TDD.. . x: TipoClave). e: TipoInfo). TipoElem = registro clave: TipoClave. TDD = arreglo [RangoClaves] de PTR_TipoElem. x: TipoClave. PTR_TipoElem = apuntador a TipoElem.

Tablas de Hash ¿Qué ocurre si el conjunto de las posibles claves es mucho más grande que las claves efectivamente almacenadas? Se requeriría una estructura muy grande para almacenar un un número relativamente pequeño de elementos Mal uso del espacio de almacenamiento .

Tablas de Hash Tablas de Hash ¿Alternativa de solución? Otra opción es usar un arreglo menor. Esta función de mapeo es la función hash. y convertir las claves en uso en índices de la tabla a través de una función. La tabla así organizada es la tabla hash. h(k) = i h: Función de hash k: Clave i: Dirección o índice en la tabla .

Tablas de Hash Tablas de Hash Tabla de Hash 0 Universo de Claves U 1 2 5 8 2 0 Función de hash o función de mapeo 6 1 Claves Almacenadas (K) 3 3 4 5 6 4 7 7 8 9 9 .

h(k1) = h (k2) Es necesario buscar formas para resolver esta situación. ésta se soluciona buscando celdas alternativas hasta encontrar una vacía (dentro de la misma tabla) . Hay básicamente dos estrategias: • Hashing Abierto: Cada entrada de la tabla contiene una lista enlazada en la cual se almacenan todos elementos que.Tablas de Hash Tablas de Hash Como es posible que dos claves conduzcan al mismo mapeo. • Hashing Cerrado: Cada entrada de la tabla contiene un solo elemento. es decir. Colisión: k1  k2 . correspondan a dicha posición arreglo. Cuando ocurre una colisión. de acuerdo a la función de hash. que la función de hash produzca el mismo resultado para dos claves diferentes (colisión).

i  {1.Tablas de Hash Funciones de Hash Una función hash (h) convierte una clave en una dirección (índice) dentro del arreglo: h(k)  i. . ... 2. |MAX_TABLA| – 1} La función h debe cumplir en lo posible las siguientes condiciones: • Producir tan pocas colisiones como sea posible. . k  {1. . . . • Distribuir las claves de manera uniforme en la tabla de hash (hash uniforme). 2. . • Ser fácil y rápida de calcular. |U| }.

• Si se trata de secuencia de caracteres o strings. Así por ejemplo la clave “pt” puede ser transformada a (112 *1281 + 116 * 1280) = 14452. se puede interpretar cada caracter como un número en base 128 (los números ASCII van del 0 al 127) y el string completo como un número en base 128. . . (ASCII(p)=112 y ASCII(t)=116) . esta debe transformar la clave en un número natural en ese rango. el problema está más o menos resuelto. • Si se trata de claves enteras.Tablas de Hash Funciones de Hash • Como el rango de la función de hash es un número natural.. en el conjunto {1. 2. . |MAX_TABLA| – 1}.

Así h(k) = k mod MAX_TABLA • No se recomienda que MAX_TABLA sea una potencia de 2. • Lo más recomendable es que MAX_TABLA sea un número primo inferior al número total de elementos y no muy cercano a una potencia de dos.Tablas de Hash Funciones de Hash Método de la división: • Este método consiste en tomar el resto de la división por el número de entradas de la tabla. • Ventaja: Fácil de calcular. . MAX_TABLA.

Tablas de Hash Funciones de Hash Método de la multiplicación: Este método opera en dos pasos: • Se multiplica la clave por una constante A en el rango 0 < A < 1 y se extrae la parte fraccionaria de k*A. h(k) =  MAX_TABLA *(k*A mod 1) donde mod 1 debe ser interpretado como k*A .k*A Una ventaja de este método es que el valor de MAX_TABLA no es crítico.6180339887 . • Se multiplica este valor por el número de entradas de la tabla y se toma el piso o se trunca el resultado. pero se recomienda A ~ (sqrt(5)-1)/2 ~ 0. El método trabaja bien con cualquier valor de A.

Tablas de Hash Hash Abierto Tabla de Hash 0 Universo de Claves U 5 8 2 2 0 Función de hash o función de mapeo 6 1 Claves 3 Almacenad as (K) 4 1 7 3 4 5 6 7 8 9 9 .

Tablas de Hash Hash Abierto La hash abierto. también llamada encadenamiento separado. El peor caso de hashing abierto nos conduce a una lista con todas las claves en una única lista. consiste en tener en cada posición de la tabla. El peor caso para búsqueda es así O(n). una lista de los elementos que. correspondan a dicha posición. . de acuerdo a la función de hash.

THAbr = arreglo [RangoClaves] de Lista[TipoElem]. func buscarTHAbr(T: THAbr. x: TipoClave): TipoElem. fregistro. info: TipoInfo. x: TipoClave): booleano. TipoClave = Entero.. TipoInfo = ?. x: TipoClave). tipo RangoClaves = 0.Tablas de Hash Hash Abierto Estructura de Datos y Operaciones: onstante MAX_TABLA = ?. proc insertarTHAbr(var T: THAbr. x: TipoClave.1. MAX_TABLA . func estaTHAbr (T: THAbr. proc iniciaTHAbr(var T: THAbr). . TipoElem = registro clave: TipoClave. proc eliminarTHAbr(var T: THAbr. e: TipoInfo).

Tablas de Hash Hash Cerrado Tabla de Hash Cerrado K5 0 Universo de Claves U K0 K4 1 2 K8 K7 K6 K1 Claves Almacenad as (K) K3 K2 Función de hash o función de mapeo 3 4 5 6 7 8 K9 9 .

se examinan varias celdas de la tabla hasta que se encuentra la clave buscada. donde di(k) = (h(k) + f(i)) mod MAX_TABLA h(k.. La inserción se efectúa probando la tabla hasta encontrar un espacio vacío. d1(k).. o es claro que esta no está almacenada.. Se va buscando en las celdas: d0(k). . i) = (h’(k) + f(i)) mod MAX_TABLA Cuando se busca una clave. d2(k).Tablas de Hash Hash Cerrado El hash cerrado soluciona las colisiones buscando celdas alternativas hasta encontrar una vacía (dentro de la misma tabla). .

Para garantizar el funcionamiento correcto. Se libera así espacio de memoria. Se requiere una tabla más grande. Desventaja: Si la aplicación realiza eliminaciones frecuentes. se requiere que la tabla de hash tenga.Tablas de Hash Hash Cerrado Ventaja: Elimina totalmente los apuntadores. el 50% del espacio disponible. . por lo menos. el que puede ser usado en más entradas de la tabla. Dentro de la dispersión cerrada hay tres estrategias distintas para localizar posiciones alternativas en la tabla: la exploración lineal. la exploración cuadrática y la dispersión doble. Cada una de ellas implica una función f(i) diferente. puede degradarse el rendimiento de la misma.

por ejemplo: f(i) = i.) mod MAX_TABLA . Exploración cuadrática Este método de resolución de colisiones elimina el problema del agrupamiento primario. incrementando el tiempo de inserción y búsqueda.i) = (h’(k) + c1i + c2i2. la cual es una función lineal de i. La función de colisiones es cuadrática: f(i) = c1i + c2i2.Tablas de Hash Hash Cerrado Estrategias de Exploración de la Tabla Prueba lineal En este tipo de estrategia se utiliza la función f(i). La función de hash quedaría de la siguiente manera: h(k. La función de hashing es: h(k.i) = (h’(k) +i) mod MAX_TABLA Una desventaja de este método es la tendencia a crear largas secuencias de entradas ocupadas.

. La función de resolución de colisiones es de la forma de la forma f (i) = i * h2 (x). nunca debe ser cero. i) queda definida como: (k.(k MOD R) con R un número primo menor que MAX_TABLA. y luego se prueba a distancias h2(k). 2h2(k). La función h2(x). La función h(k. En términos generales.Tablas de Hash Hash Cerrado Estrategias de Exploración de la Tabla Dispersión Doble Esuno de los mejores métodos disponibles para resolver colisiones en una tabla de hashing cerrado. da buenos resultados. Lo que se hace es aplicar una segunda función de dispersión h2 a k.i) = ( h1(k) + i*h2(k) ) mod MAX_TABLA La función h1(k) es la función de dispersión original. la función: h2(k) = R .

y7). utilizando como función de hash el método de la multiplicación . y4). y3). y2).Tablas de Hash Ejercicios 1. y5)} donde yi (1< i < 5) es la información asociada con cada clave. (62. (64. (28. utilizando como función de hash el método de la división (h(k) = k mod m). y3). y1). (65. y6). y5). y4). (10. Considere el siguiente conjunto de datos: D = {(5. 2. y1). (63. y2). (33. y8). (15. (12. Muestre el proceso de inserción de las claves en una tabla de hash abierto de tamaño m = 1000. Muestre el proceso de inserción de las claves en una tabla de hash abierto de tamaño m = 9. Considere el siguiente conjunto de datos: D = {(61. (19. (20. y9)}donde yi (1< i < 9) es la información asociada con cada clave. (17.