Sei sulla pagina 1di 20

Tablas de Hash

Tablas de Hash

Tablas de Hash
Muchas aplicaciones requieren un conjunto dinmico que soporte las operaciones de un diccionario: Insercin, Bsqueda, Eliminacin.
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 opcin sera usar un arreglo tan grande como el rango de posibles claves, de tal manera que la clave del elemento determinara su posicin 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

2 3 4

3
5

6
1 Claves Almacenadas (K) 3 4 7
8
5

6 7

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

Tablas de Hash
Qu ocurre si el conjunto de las posibles claves es mucho ms grande que las claves efectivamente almacenadas?

Se requerira una estructura muy grande para almacenar un un nmero relativamente pequeo de elementos

Mal uso del espacio de almacenamiento

Tablas de Hash
Tablas de Hash
Alternativa de solucin?

Otra opcin es usar un arreglo menor, y convertir las claves en uso en ndices de la tabla a travs de una funcin. Esta funcin de mapeo es la funcin hash. La tabla as organizada es la tabla hash. h(k) = i

h: Funcin de hash
k: Clave i: Direccin o ndice en la tabla

Tablas de Hash
Tablas de Hash
Tabla de Hash
0

Universo de Claves U
5 6 1 Claves Almacenadas (K) 3 4 7

1 2

Funcin de hash o funcin de mapeo

3 4
5

6
7 8

9
9

Tablas de Hash
Tablas de Hash
Como es posible que dos claves conduzcan al mismo mapeo, es decir, que la funcin de hash produzca el mismo resultado para dos claves diferentes (colisin). Colisin: k1 k2 ; h(k1) = h (k2)

Es necesario buscar formas para resolver esta situacin. Hay bsicamente dos estrategias: Hashing Abierto: Cada entrada de la tabla contiene una lista enlazada en la cual se almacenan todos elementos que, de acuerdo a la funcin de hash, correspondan a dicha posicin arreglo. Hashing Cerrado: Cada entrada de la tabla contiene un solo elemento. Cuando ocurre una colisin, sta se soluciona buscando celdas alternativas hasta encontrar una vaca (dentro de la misma tabla)

Tablas de Hash
Funciones de Hash
Una funcin hash (h) convierte una clave en una direccin (ndice) dentro del arreglo:
h(k) i; k {1, 2, . . ., |U| }; i {1, 2, . . ., |MAX_TABLA| 1}

La funcin h debe cumplir en lo posible las siguientes condiciones:

Producir tan pocas colisiones como sea posible. Distribuir las claves de manera uniforme en la tabla de hash (hash uniforme). Ser fcil y rpida de calcular.

Tablas de Hash
Funciones de Hash
Como el rango de la funcin de hash es un nmero natural, en el conjunto {1, 2, . . ., |MAX_TABLA| 1}, esta debe transformar la clave en un nmero natural en ese rango. Si se trata de claves enteras, el problema est ms o menos resuelto. Si se trata de secuencia de caracteres o strings, se puede interpretar cada caracter como un nmero en base 128 (los nmeros ASCII van del 0 al 127) y el string completo como un nmero en base 128. As por ejemplo la clave pt puede ser transformada a (112 *1281 + 116 * 1280) = 14452. (ASCII(p)=112 y ASCII(t)=116)

Tablas de Hash
Funciones de Hash
Mtodo de la divisin: Este mtodo consiste en tomar el resto de la divisin por el nmero de entradas de la tabla. MAX_TABLA. As

h(k) = k mod MAX_TABLA


No se recomienda que MAX_TABLA sea una potencia de 2. Lo ms recomendable es que MAX_TABLA sea un nmero primo inferior al nmero total de elementos y no muy cercano a una potencia de dos. Ventaja: Fcil de calcular.

Tablas de Hash
Funciones de Hash
Mtodo de la multiplicacin: Este mtodo 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. Se multiplica este valor por el nmero de entradas de la tabla y se toma el piso o se trunca el resultado. h(k) = MAX_TABLA *(k*A mod 1) donde mod 1 debe ser interpretado como k*A - k*A Una ventaja de este mtodo es que el valor de MAX_TABLA no es crtico. El mtodo trabaja bien con cualquier valor de A, pero se recomienda A ~ (sqrt(5)-1)/2 ~ 0,6180339887

Tablas de Hash
Hash Abierto
Tabla de Hash
0

Universo de Claves U
5 6 1 Claves 3 Almacenad as (K) 4 8 0 2

1 2

Funcin de hash o funcin de mapeo


7

3 4
5

6
7 8

9
9

Tablas de Hash
Hash Abierto

La hash abierto, tambin llamada encadenamiento separado, consiste en tener en cada posicin de la tabla, una lista de los elementos que, de acuerdo a la funcin de hash, correspondan a dicha posicin. El peor caso de hashing abierto nos conduce a una lista con todas las claves en una nica lista. El peor caso para bsqueda es as O(n).

Tablas de Hash
Hash Abierto
Estructura de Datos y Operaciones:
onstante MAX_TABLA = ?; tipo RangoClaves = 0.. MAX_TABLA - 1; TipoClave = Entero; TipoInfo = ?; TipoElem = registro clave: TipoClave; info: TipoInfo; fregistro;

THAbr

= arreglo [RangoClaves] de Lista[TipoElem];

proc iniciaTHAbr(var T: THAbr); func estaTHAbr (T: THAbr; x: TipoClave): booleano; proc insertarTHAbr(var T: THAbr; x: TipoClave; e: TipoInfo); proc eliminarTHAbr(var T: THAbr; x: TipoClave); func buscarTHAbr(T: THAbr; x: TipoClave): TipoElem;

Tablas de Hash
Hash Cerrado
Tabla de Hash Cerrado
0
1 2

K5

Universo de Claves U K0
K4

K8

K7 K6 K1 Claves Almacenad as (K) K3 K9

K2

Funcin de hash o funcin de mapeo

3 4
5

6 7

8
9

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

Tablas de Hash
Hash Cerrado
Ventaja: Elimina totalmente los apuntadores. Se libera as espacio de memoria, el que puede ser usado en ms entradas de la tabla. Desventaja: Si la aplicacin realiza eliminaciones frecuentes, puede degradarse el rendimiento de la misma. Se requiere una tabla ms grande. Para garantizar el funcionamiento correcto, se requiere que la tabla de hash tenga, por lo menos, el 50% del espacio disponible.

Dentro de la dispersin cerrada hay tres estrategias distintas para localizar posiciones alternativas en la tabla: la exploracin lineal, la exploracin cuadrtica y la dispersin doble. Cada una de ellas implica una funcin f(i) diferente.

Tablas de Hash
Hash Cerrado
Estrategias de Exploracin de la Tabla
Prueba lineal En este tipo de estrategia se utiliza la funcin f(i), la cual es una funcin lineal de i, por ejemplo: f(i) = i. La funcin de hash quedara de la siguiente manera: h(k,i) = (h(k) +i) mod MAX_TABLA Una desventaja de este mtodo es la tendencia a crear largas secuencias de entradas ocupadas, incrementando el tiempo de insercin y bsqueda.

Exploracin cuadrtica Este mtodo de resolucin de colisiones elimina el problema del agrupamiento primario. La funcin de colisiones es cuadrtica: f(i) = c1i + c2i2. La funcin de hashing es:

h(k,i) = (h(k) + c1i + c2i2.) mod MAX_TABLA

Tablas de Hash
Hash Cerrado
Estrategias de Exploracin de la Tabla
Dispersin Doble Esuno de los mejores mtodos disponibles para resolver colisiones en una tabla de hashing cerrado. La funcin de resolucin de colisiones es de la forma de la forma f (i) = i * h2 (x). La funcin h(k, i) queda definida como: (k,i) = ( h1(k) + i*h2(k) ) mod MAX_TABLA La funcin h1(k) es la funcin de dispersin original. Lo que se hace es aplicar una segunda funcin de dispersin h2 a k, y luego se prueba a distancias h2(k), 2h2(k). La funcin h2(x), nunca debe ser cero. En trminos generales, la funcin: h2(k) = R - (k MOD R) con R un nmero primo menor que MAX_TABLA, da buenos resultados.