Professional Documents
Culture Documents
Tablas Hash
Una tabla hash es una estrucytura de datos que es una generalizacin de la nocin
ordinaria de un array, donde el tiempo de bsqueda de un elemento en una tabla hash es
O(1), bajo algunas asumpciones especiales.sin embargo el peor caso es O(n)
Decimos que las tablas hash son generalizaciones de los arrays ordinarios pues en un array
podemos localizar un elemento de clave k en la posicin k, esto se llama
direcionamiento directo, usaremos una tabla hash cuando no necesariamente queramos o
podamos acceder directamente dada la clave a la posicin de la tabla.
Consideraciones:
El nmero de claves almacenadas es pequea en relacin con el nmero de claves
existentes
Dada una clave k, no usaremos este valor como ndice de la tabla, en lugar
aplicaremos una funcin especial a k llamada funcin hash
1. Direccionamiento Directo
Trabaja bien cuando el universo de claves es pequeo, por ejemplo se supongamos
que tenemos un universo de claves U={0,m-1} y el conjunto de claves
k={0m-1}
2. Tablas hash
entradas, , entonces el las tablas de direccionamiento directo son tiles para ciertos
casos, y para valores pequeos de tablas, en este caso sen particular sera ingenuo
utililizar una tabla de direccionamietno directo
llamaremos h a la funcin hash y ser la encargada de mapear las claves hacia una
posicin en la tabla, obviamente tendra valores dentro del rango de valores
permitidos por el tamao de la tabla es decir se mapear dentro del rango de
valores T={0,,m-1}, siendo el universo de claves mucho mayor U={0,,n-1}
n>m
Bsqueda
Buscar clave T [h(k)] en la lista
Eliminacin
Eliminar elemento x con clave T [h(key[x])] de la lista
= n /m
Este factor indica el nmero promedio de elementos por slot, pudiendo ser
<1 =1 >1
Bsqueda insactisfactoria
Teorema
Una bsqueda insactisfactoria toma el tiempo de (1 + )
Prueba
Para decir que el elemento con clave k no se encuentra en la tabla T, buscaremos
hasta el final de la lista T[h(k)], cuya longitud esperada es E[nh(k)] = ,
Bsqueda insactisfactoria
Teorema
Una bsqueda satisfactoria toma el tiempo de (1 + )
3. Funciones hash
Escoger una buena buncin hash quiere decir que la funcin hash debe distribuir
los datos uniformemente por la tabla, de tal manera que los valores de las claves no
deben afectar esta distribucin; lamentablemente en la prctica no podemos hacer
esto pues es imposible conocer de antemano las distribuciones de probabilidad de
las claves, pero sin embargo existen heursticas que trabajan bien
Mtodo de Divisin
h(k) = k mod m
Ventajas Rpido
Mtodo de Multiplicacin
donde
parte fraccionaria de kA
Implementacin
Escoger m = 2p para algn entero p
Sea el tamao de palabra de mquina w bits
Asumir que k cabe en una palabra w
Establecemos un entero s en el rango 0 < s < 2w
A es de la forma s/2w
Multiplicar ks
Como se est multiplicando dos palabras w el resultado ser 2w bits r12w +
r0 donde r1 es la palabra de alto orden del producto y r0 es la palabra de
bajo orden
Ejemplo:
m=8
w=5
k= 21
si m = 8 entonces p = 3
s estar entre 0 < s < 25 por ejemplo s = 13
A = 13 /32
Usando la formula
Usando la implementacin
ks = 21 (13) = 273 = 8 25 + 17
r1 = 8, r0 = 17
en w bits tenemos escritos 10001, tomando los 3 bits mas significantes,
de r0 tenemos 100 en binario, 4 en decimal h(k) = 4
4. Direccionamiento abierto
En direccionamietno directo cada elemento es almacenado en la tabla hash, es decir
cada slot de la tabla hash contiene el elemento o NIL, una propiedad del
direccionamiento directo es que el factor de carga nunca excede en valor a 1.
h(k,0)k(k,m-1)
Ejemplo:
Prueba Lineal
Usar
h( k,i ) = ( h(k) + i ) mod m i = 0m-1
Prueba Cuadrtica
Usar
h( k,i ) = ( h(k) + c1i + c2i2) c1 y c2 ~= 0 i = 0m-1
Hashing doble
Es uno de los mejores mtodos disponibles para direccionamiento directo.
Ejemplo:
Si tenemos una tabla de longitude 13, con h1(k) = k mod 13 y h2(k) = 1 + (k mod
11), insertar el valor 14 en la siguiente tabla:
79
69
98
72
50
En todos estos casos vistos se puede insertar o se puede buscar una clave dentro de una
tabla hash T de la siguiente manera:
HASH-INSERTAR(T, k)
1 i 0
2 repeat j h(k, i)
3 if T[j] = NIL
4 then T[j] k
5 return j
6 else i i + 1
7 until i = m
8 error "tabla hash overflow"
HASH-BUSQUEDA(T, k)
1 i 0
2 repeat j h(k, i)
3 if T[j] = k
4 then return j
5 i i + 1
6 until T[j] = NIL or i = m
7 return NIL
Referencias Bibliogrficas
[1] Donald E. Knuth. Sorting and Searching, volume 3 of The Art of Computer
Programming. Addison-Wesley, 1973.
[2] Thomas H. Cormen, Charles E. Leiserson, Ronald L. Rivest, and Clifford Stein,
Introduction to algorithms, second ed., The MIT Press, September 2001.