Académique Documents
Professionnel Documents
Culture Documents
Tablas de Hash
Tablas de Hash
Muchas aplicaciones requieren un conjunto dinmico que soporte
las operaciones de un diccionario: Insercin, Bsqueda,
Eliminacin.
Tablas de Hash
Tablas de Direccionamiento Directo
0
1
Universo de Claves
U
5
2
3
6
5
1
Claves
Almacenadas
(K)
3
4
7
8
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?
Tablas de Hash
Tablas de Hash
Alternativa de solucin?
Tablas de Hash
Tablas de Hash
Tabla de Hash
0
Universo de Claves
U
1
2
Funcin de
hash o
funcin de
mapeo
6
1
Claves
Almacenadas
(K)
3
4
5
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)
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}
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:
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)
Tablas de Hash
Hash Abierto
Tabla de
Hash
0
Universo de
Claves
U
5
Funcin
de hash
o
funcin
de
mapeo
6
1
Claves
3
Almacenad
as (K)
4
3
4
5
6
7
8
9
9
Tablas de Hash
Hash Abierto
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
Tablas de Hash
Hash Cerrado
Tabla de Hash Cerrado
K5
Universo de
Claves
U K0
K4
1
2
K8
K7
K6
K1
Claves
Almacenad
as (K)
K3
K2
Funcin
de hash
o
funcin
de
mapeo
3
4
5
6
7
8
K9
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
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.
Tablas de Hash
Ejercicios
1. Considere el siguiente conjunto de datos:
D = {(5, y1), (28, y2), (19, y3), (15, y4), (20, y5), (33, y6), (12, y7), (17, y8), (10,
y9)}donde yi (1< i < 9) es la informacin asociada con cada clave. Muestre el
proceso de insercin de las claves en una tabla de hash abierto de tamao m =
9, utilizando como funcin de hash el mtodo de la divisin (h(k) = k mod m).