You are on page 1of 9

Ordenacion de Archivos

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

Una tabla hash es un array pero de tamao prorpocional al nmero de claves


almacenadas (no al nmero posible de claves)

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}

implementar las funciones de insercin, eliminacin y bsqueda de registros en un


archivo son fciles pues son solo conocer el valor de campo clave obtendremos el
registro deseado y la complejidad de tiempo para cada una de estas operaciones es
O(1).

2. Tablas hash

Un problema es cuando el universo de claves es demasiado grande por ejemplo si


tenemos 18,446,744,073,709,551,616 nmeros de claves, esto mantendra un
archivo demasiado grande incluso, si solamente se almacenaran algunas pocas

Ing. Jorge Luis G. Daz 1


Escuela de Informtica
Ordenacion de Archivos

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

A diferencia de las tablas de direccionamieto directo en las tablas hash se requiere


que el universo de claves sea mucho mayo en comparacin con el conjunto posible
de claves. de esta manera si tenemos por ejemplo 18,446,744,073,709,551,616
como nmero mximo de clave no necesariamente tendremos un archivo de ese
tamao, si no un archivo de tamao mucho menor, es decir la complejidad de
espacio en este sentido ser de O(k)

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

Resolucin de Colisiones por encadenamiento


Sin embargo como se podr observar en la figura anterior , existen colisiones, es
decir al aplicar la funcin hash sobre la clave k , se obtendra en algunos casos el
mismo valor. Esto se puede solucioar empleando una lista enlazada a esta solucin
se llama solucin de colisiones por encadenamiento

Ing. Jorge Luis G. Daz 2


Escuela de Informtica
Ordenacion de Archivos

Podemos realizar las operaciones de insercin eliminacin y bsqueda utilizando la


.
funcin hash.
Insercin
Insertar elemento x en la cabeza de la lista con T [h(key[x])]

Bsqueda
Buscar clave T [h(k)] en la lista

Eliminacin
Eliminar elemento x con clave T [h(key[x])] de la lista

Analisis de hashing con encadenamiento


Cual ser el tiempo en encontrar un elemento con una determinada clave? O
determinar que el elemento con determinada clave no se encuentra en la tabla?

Analizaremos el factor de carga

= n /m

Este factor indica el nmero promedio de elementos por slot, pudiendo ser

<1 =1 >1

n = nmero de elemntos en la tabla T


m = nmero de slots en la tabla T nmero de listas vacas

Peor caso (n) si todos los elementos estn en el mismo slot


Caso promedio Si asumimos un hashing uniforme es decir los elementos
estn uniformemente distribuidos por la tabla T

Ing. Jorge Luis G. Daz 3


Escuela de Informtica
Ordenacion de Archivos

Si la tabla T tiene m slots, entonces para j = 0,,m-1 indicaremos que el nmero


de elementos de determinado slots de la tabla T es la siguiente T[j] = nj, entonces
n = n1 + . + nm-1

El valor promedio de nj lo denotaremos por E [nj] = = n/m

Si asumimos que podemos calcular la funcin hash en un tiempo de O(1) entonces


el tiempo de bsqueda depender de la longitud de nh(k) en la posicin de la tabla
T[h(k)]

Existen dos casos de anlisis

bsqueda insactisfactoria, si no se encuentra el elemento con clave k en la tabla T


Bsqueda satisfactoria, si se encuentra el elemento con clave k en la tabla T

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)] = ,

Agregando el costo de calcular la funcin hash el tiempo esperado es (1 + )

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

Las claves como Nmeros Naturales


Las funciones hash suponen que las claves son nmeros naturales, si no lo son se
deben interpretar como nmeros naturales
Ejemplo

Clave CLRS, valores ascii c = 67, L = 76, R = 83, S = 83

Podemos interpretar el valor de CLRS como (radix 2p)

Mtodo de Divisin
h(k) = k mod m

Ing. Jorge Luis G. Daz 4


Escuela de Informtica
Ordenacion de Archivos

Ejemplo m = 20, k = 91, h(k) = 11

Ventajas Rpido

Desventajas evita ciertos valores de m


Trabaja mal con las potencias de 2, si m = 2p, entonces h(k) es los p
bits menos significantes, de k
Ejemplo

m = 26 la funcin hash no depende de todos los bits de k

si k = 0110001110110102, entonces h(k) = 0110102

Si k es una cadena de caracteres representado con radix 2p, entonces


m = 2p 1 trabaja mal pues si se permutan el orden de los caracteres
se tiene el mismo valor de la funcin hash

Usualmente se escoge como valor de m un nmero primo no


cercano ni a 2 ni a 10,

Mtodo de Multiplicacin

donde

parte fraccionaria de kA

dicho de otra manera se procede como sigue:

1. Escoger una constante A dentro del rango 0 < A < 1


2. Multiplicar kA
3. Extraer la parte fraccionaria de kA
4. Multiplicar la parte fraccionaria por m
5. Tomar el mnimo entero del resultado

Desventajas Ms lento que el mtodo por divisin

Ventajas El valor de m no es crtico

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

Ing. Jorge Luis G. Daz 5


Escuela de Informtica
Ordenacion de Archivos

r1 tiene la parte entera de kA y r0 almacena la parte fraccionaria de


kA
Como deseamos obtener se puede obtener este valor
haciendo un desplazamiento de r0 a la izquierda por p = lg m bits, y luego
tomado los p bits que fueron desplazados a la izquierda del punto binario

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

kA =21 (13/32) = 273/32 = 8 17/32,


kA mod 1 = 17/32,
m(kA mod 1) = 8 (17/32) = 17 / 4 = 4 1/4,
entonces
h(k) = 4

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

Se sugiere utilizar un A con valor

A = sqrt (5) -1 = 0.6180339887

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.

Ing. Jorge Luis G. Daz 6


Escuela de Informtica
Ordenacion de Archivos

Para insertar un elemento en la tabla hash, se debe utilizar aparte de la funcin


hash, un nmero llamado nmero de prueba, por ejemplo si deseamos insertar un
elemento con clave k en la tabla T deberamos calcular la posicin donde insertar
por medio de h(k), si el slot est vaco insertamos el elemento en caso contrario
probamos nuevamente, el nmero de prueba es til en este sentido.

h(k,0)k(k,m-1)
Ejemplo:

Ing. Jorge Luis G. Daz 7


Escuela de Informtica
Ordenacion de Archivos

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.

h ( k,i ) = ( h1(k) + ih2(k)) mod m

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

Ing. Jorge Luis G. Daz 8


Escuela de Informtica
Ordenacion de Archivos

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.

Ing. Jorge Luis G. Daz 9


Escuela de Informtica

You might also like