Está en la página 1de 4

Universidad Nacional de Ingeniera

Ciencias de la Computacin
Hashtables
Yuri Nuez Medrano *
ynunezm@gmail.com

Resumen
Las tablas hash se basan en una tabla T, donde cada registro
sea rpidamente ubicable.

1. Direct Address Table


Se asume que tenemos un Universo de keys razonablemente
pequeo y se tiene un universo U = {0, 1, ..., m 1}, donde
m no es grande.
Se asume que los key son distintos.
Se tiene una tabla T [0, ..., m 1]. Figura 1: Direct Address
 
x k(keys) x.key = k
T [k] = Con las siguiente ope-
nil en otro caso
raciones.

Algorithm 1: DIRECT_ADDRESS_SEARCH(T,k)
1 return T[k]

Algorithm 2: DIRECT_ADDRESS_INSERT(T,x)
1 T[x.key]=x Figura 2: Tabla Hash

2. Funcin Hash
Algorithm 3: DIRECT_ADDRESS_DELETE(T,x)
1 T[x.key]=nil La funcin hash mapea los keys aleatoriamente en los
registros de la tabla T .
h mapea el universo U de keys en los registros de la tabla
Direct Address tiene inconvenientes, si el Universo U es hash T [0, 1, ..., m 1].
grande, el almacenamiento de una tabla T de tamao |U | h : U {0, 1, ..., m 1}
puede ser impracticable. Donde m es menor que |U |
La funcin hash reduce el rango del indice del tamao del
array en vez del tamao |U |, el array tiene tamao m en la
* Escuela de Ciencias de la Computacin, 27-08-15 figura 2.

1
2

Algorithm 6: CHAINED_ADDRESS_DELETE(T,x)
1 eliminar x de la lista T[h(x.key)]

Figura 3: Chaining Hash


Figura 4: Mtodo de la multiplicacin

3. Chaining Hash 4. Escogiendo una Funcin Hash


Cuando se inserta en un registro ya ocupado ocurre una Debera distribuir los keys uniformemente en los registros.
colisin. Para la resolucin de colisiones mediante chaining, La distribucin de los keys no debera afectar la uniformi-
enlazar el registro en una lista como en la figura 3 dad.
con las siguientes colisiones en listas
h(k1 ) = h(k4 )
h(k5 ) = h(k2 ) = h(k7 )
h(k8 ) = h(k6 ) 4.1. Mtodo de la Divisin
h(k) = k mod m.
Con las siguiente operaciones. Ejm, si m es par y todos los key son pares los registros
impares no se usan.
Ejm, si m = 2r .
Algorithm 4: CHAINED_ADDRESS_SEARCH(T,k) Escoger un m tan cercano a una potencia de 2 o de 10.
1 buscar un elemento con key k en la lista T[h(k)]

4.2. Mtodo de la multiplicacin


Multiplicamos k (keys) por una constante A en el rango
Algorithm 5: CHAINED_ADDRESS_INSERT(T,x) 0 < A < 1 y m = 2p . en la figura 4
1 insertar x al inicio de la lista T[h(x.key)] la representacin de los valores w-bits del key k.
s = A,2k Ejm, k=89 A=0.8359375.
s = A,2w = 106,88 = 107
m=8
Analisis p=3
Caso peor, si todos los keys esta en el mismo registro, el h(k) = bm(k.A mod 1)c
3,1875
acceso toma (n) si |K| = n. z }| {
Caso promedio, suponemos de una simple funcin hashing h(k) = bm( |{z} k.A mod 1)c
uniforme. 74,398
Donde cada key K ES equivalente similar para la funcin
| {z }
0,398
hash, para ser distribuida en cualquier registro en T, inde- Ejm, k = 123456, p = 14, m = 214
pendientemente de otros key con su funcin has h(k). A = 2654435769/232 .
El load facto () en una tabla hash con n keys y m registros
67,1877441
es = n/m es el numero de key por registro. z }| {
El tiempo esperado de busqueda infructuosa. h(k) = bm( |{z}k.A mod 1)c
= (1 + ). 76300,0041
El tiempo esperado es = (1), si = O(1)
| {z }
0,0041
3

Figura 5: Solucin del ejemplo

Figura 6: Linear Probing


5. Open Adressing
Resolviendo coliciones por open addressing, evaluando una k = 583
llamada sistemtica a la tabla hasta encontrar un registro h(583, 0) = (h0 (583) + 0)mod 8=7
vacio. k = 206
h: U
|{z} {0, 1, ..., m 1} {0, 1, ...m 1} h(206, 0) = (h0 (206) + 0)mod 8=6
| {z } | {z }
U niverso de keys prueba el nro en un registro k = 480
probar la secuencia como una permutacin. h(480, 0) = (h0 (480) + 0)mod 8=0
hh(k, 0), h(k, 1), ..., h(k, m 1)i k = 131
h(131, 0) = (h0 (131) + 0)mod 8=3
k = 422
Algorithm 7: HASH_INSERT(T,k) h(422, 0) = (h0 (422) + 0)mod 8=6
1 i=0 h(422, 1) = (h0 (422) + 1)mod 8=7
2 repeat h(422, 2) = (h0 (422) + 2)mod 8=0
3 j= h(k,i) h(422, 3) = (h0 (422) + 3)mod 8=1
4 if T[j]=NIL then
5 T[j]=k
6 return j 5.2. Quadratic Probing
7 else i=i+1;
h(k, i) = (h0 (k) + c1 i + c2 i2 )mod m
8 until i==m;
donde h es una funcion hash auxiliar i = 0, 1, .., m 1, c1
9 error hash table overflow
y c2 es una constante auxiliares positivas.

5.3. Doble hashing


Algorithm 8: HASH_SEARCH(T,k)
1 i=0 h(k, i) = (h1 (k) + ih2 (k))mod m
2 repeat donde h1 y h2 son funciones hash auxiliares i = 0, 1, .., m1
3 j= h(k,i) m = 13 m0 = 11
4 if T[j]=k then si h1 (k) = k mod m
5 return j h2 (k) = 1 + (k mod m0 )
h(k, i) = (h1 (k) + ih2 (k))mod m
6 i=i+1
7 until T[j]==NIL or i==m; k = 14
8 return NIL h(14, 0) = (h1 (14) + 0h2 (14))mod 13 = 1
h(14, 1) = (h1 (14) + 1h2 (14))mod 13 = 5
h(14, 2) = (h1 (14) + 2h2 (14))mod 13 = 9
5.1. Linear Probing
h(k,i)=(h(k)+i)mod m
5.4. Perfect hashing
donde h es una funcion hash auxiliar , i = 0, 1, .., m 1
m = 8 si h0 (k) = k mod m Es una buena eleccion para un buen desempeo de un caso
h(k, i) = (h0 (k) + i)mod m promedio y para el caso peor, cuando el conjunto de key es
4

static, una vez que los key se guardan y no tienen cambios.


h(k) = ((ak + b)mod p)mod m
donde a , b y p son variables constantes.
las iesimas tablas tienen la siguiente formula
hj (k) = ((aj k + bj )mod p)mod m

Ejm: Evaluar los siguientes keys

K = 10, 22, 37, 40, 52, 60, 70, 72, 75

Referencias
[H.Cormen et al., 2009] H.Cormen, T., Leiserson, C., and
Riverson, R. L. (2009). Algorithms. The MIT Press.

Figura 7: Double Hash

Figura 8: Perfect Hash

También podría gustarte