Sei sulla pagina 1di 25

Tabla Hash

Programación III
 Muchas aplicaciones requieren un
conjunto dinámico que soporte las
operaciones de un diccionario: Insert,
Search, Delete. Por ejemplo el
compilador cuando guarda los
identificadores de un programa.
 Laidea surge de los arreglos que nos
permiten acceso a sus elementos en
orden.
 Unaopción sería usar un arreglo tan
grande como el rango de posibles
claves. La desventaja es el espacio de
Tabla Hash

 Una tablahash es una estructura de datos para


almacenar pares clave-valor. 
A diferencia de una matriz básica, que utiliza números
de índice para acceder a los elementos, una tabla hash
utiliza claves para buscar entradas de la tabla. Esto
hace que la gestión de datos más manejable para el
usuario humano, ya que es más fácil de catalogar las
entradas de datos por parte de sus atributos en lugar
de su recuento en una lista gigante
Operaciones

Buscar(Tabla T, clave x)
devuelve el elemento de la tabla T[h(x)]
Insertar(Tabla T, elemento k)
añade el elemento k, T[h(clave(k)] j k
Eliminar (Tabla T, clave x)
retira de la tabla el elemento con clave x, T[h(x)]
j LIBRE
Uno de los métodos en C ++ es implementar una tabla
hash como una serie de listas enlazadas
Función Hash
 Una función hash decide dónde almacenar y recuperar
elementos en una tabla hash. Se necesita en un elemento clave
como parámetro y devuelve una ubicación de índice para ese
artículo en particular. En general, una función hash utiliza
aritmética de módulo. En particular, un valor de clave se
divide por la longitud de la tabla para generar un número de
índice en la tabla. Este número de índice se refiere a un lugar, o
un cubo, en la tabla hash.
 Una función de dispersión convierte el dato considerado campo
clave (tipo entero o cadena de caracteres) en un índice dentro
del rango de definición del array o vector que almacena los
elementos, de tal forma que sea adecuado para indexar el array.
Aritmetica Modular
 función de dispersión que utiliza la aritmética modular
genera valores dispersos calculando el resto de la
división entera entre la clave x y el tamaño de la tabla m.

 h(x)= x modulo m

 Considere una aplicación en la que debe almacenar 999


registros, Elja el tamaño de la tabla de dispersión y
calcule la posición que ocupa los elementos cuyo numero
identificador es
245643 245981 257135
 m = 997 ,¿por que? Por ser un numero primo próximo
Teniendo en cuenta el valor de m, se
aplica la función hash de aritmética
modular y se obtienen estas direcciones:

h(245643)= 245643 modulo 997 = 381


h(245981)= 245981 modulo 997 = 719
h(257135)= 257135 modulo 997 = 906
MOD
Ejemplo: Supongamos que la función hash toma en una cadena como
parámetro, y luego se suma los valores ASCII de todos los personajes de
esa cadena para obtener un número entero. Si la clave es "calabaza",
entonces la suma de los valores ASCII sería 772. Después de eso, la
función hash toma el módulo de este número por la longitud de la tabla
para obtener un número de índice. Si la longitud de la tabla es 13,
entonces 772 modulo 13 es 5. Así el artículo con la tecla "calabaza",
entraría en cubo # 5 en la tabla hash.
Código C++
int hash( string key, int tableLength )
{
int value = 0;
for ( int i = 0; i < key.length(); i++ )
value += key[i];
return value % tableLength;
}
Método de plegamiento

 Latécnica del plegamiento se utiliza cuando el


valor entero del campo clave elegido es
demasiado grande. Consiste en partir la clave
x en varias partes x1, x2, x3 ... xn,

h(x) = x1 + x2 + x3 + ... + xn
Ejemplo

 Los registros de pasajeros de un tren se identifican por 6 dígitos,


cree una tabla dispersa de m=1000 posiciones (rango de 0 a
999).
demuestre con los siguientes registros
245643 - 245981 - 257135

R//
h(245643) = 245 + 643 = 888
h(245981) = 245 + 981 = 1226 -> 226 (se ignora el acarreo 1)
h(257135) = 257 + 135 = 392
A veces, se determina la inversa de las partes
pares, x2, x4 ... antes de sumarlas, con el fin de
conseguir mayor dispersión. La inversa en el
sentido de invertir el orden de los dígitos.
Así, con las mismas claves se obtienen las
direcciones:

h(245643) = 245 + 346 = 591


h(245981) = 245 + 189 = 434
h(257135) = 257 + 531 = 788
Mitad del cuadrado

 Esta técnica de obtener direcciones dispersas consiste,


en primer lugar, en calcular el cuadrado de la clave x
y, a continuación, extraer del resultado, x2, los dígitos
que se encuentran en ciertas posiciones

 El número de dígitos a extraer depende del rango de


dispersión que se quiere obtener. Así, si el rango es de
0 .. 999 se extraen tres dígitos, siempre, los que están
en las
mismas posiciones
Ejemplo

 Una vez elevado al cuadrado el valor de la clave, se eligen los dígitos que
se encuentran en las posiciones 4, 5 y 6 por la derecha. El valor de esa
secuencia es la dirección obtenida al aplicar este método de dispersión
Método de la multiplicación

 1. R * x
 2. d = R * x – ParteEntera(R * x)
 3. h(x) = ParteEntera(m * d)
 Una elección de la constante R es la inversa de la razón áurea, R =
0.6180334 =

 Por ejemplo, la clave x = 245981, m = 1000, la dirección que se obtiene:


 1. R * x: 0.6180334 * 245981 152024.4738
 2. d: 152024.4738 – ParteEntera(152024.4738) 0.4738
 3. h(245981): 1000 * 0.4738 ParteEntera (473.8) 473
Colisiones
 En ocasiones, diferentes palabras generarán el mismo
resultado de la función hash
 Por ejemplo, las teclas “tar" y “rat" serán tanto hash para
el índice 2, si hay (97 + 116 + 114 = 327 % 13 = 2)
EXPLORACIÓN DE
DIRECCIONES.
DIRECCIONAMIENTO ABIERTO
Las colisiones se resuelven explorando
consecutivamente en una secuencia de
direcciones, hasta que se encuentra una
posición libre (un hueco).

Al buscar un elemento, se obtiene la dirección


dispersa según su clave, a partir de esa
dirección es posible que haya que explorar la
secuencia de posiciones hasta encontrar la clave
1. Exploración lineal

Consiste en buscar la primera posición disponible que siga a p. La


secuencia de exploración que se genera es lineal: p,
p+1, p+2, ... m-1, 0, 1,

Entonces las posiciones de almacenamiento en la tabla, aplicando


exploración lineal:
Exploración cuadrática

 La función para este método es 𝑃


  +𝑖
2
, donde i = 1, i=2, i=3, i….

 Elemento: x1 x2 x3 x4 x5 x6 x7 x8 x9
h(x): 5 8 10 8 5 11 6 7 7

 Elemento: x1 x2 x3 x4 x5 x6 x7 x8 x9
Posición: 5 8 10 9 6 11 7 16

 elemento x10= 5
posición 5 = (5+1=6), (5+4=9)
Ejercicios

 14.1, 14.3, 14.4,14.5 del libro


 Con estas claves resuelva lo siguiente 541633 143981
557635, 788789, 789453 con 900posiciones
 Aritmética modular
 Método de plegamiento y plegamiento inverso
 Mitad al cuadrado con dígitos 4,5,6

Potrebbero piacerti anche