Академический Документы
Профессиональный Документы
Культура Документы
Agustn J. Gonzlez
ELO320: Estructura de Datos y
Algoritmos
Introduccin
Claves usadas
Funcin de mapeo
o Funcin de hash
Lista Enlazada
Claves usadas
La lista se almacena
en la misma tabla
Funcin de mapeo
Funcin de hash
Hashing Abierto
Funciones Hash
Mtodo de divisin:
Este mtodo consiste en tomar el resto de la
divisin por m, el nmero de entradas de la tabla.
As
h(k) = k mod m
En C sera h(k) = k % m;
Usar m = una potencia de 2, no es buena idea, ya
que el valor de hash queda dependiendo de slo
los bits menos significativos de k.
Una forma de hacer hash(k) dependiente de todos
los bits menos significativos es usar nmero
primos no muy cercanos a una potencia de dos.
Este mtodo opera en dos pasos. Primero, multiplicamos la clave por una
constante A en el rango 0 < A < 1 y extraemos la parte fraccionaria de
k*A. Segundo, Multiplicamos este valor por el nmero de entradas de la
tabla y tomamos el piso del (o truncamos el) resultado.
En resumen:
h(k) = m *(k*A mod 1)
Donde mod 1 debe ser interpretado como k*A - k*A
Cmo se hace en C? Ver man modf. Tambin es til man -k fraction
#include <math.h>
double modf(double x, double *iptr);
Description: The modf() function breaks the argument x into an integral
part and a fractional part, each of which has the same sign as x. The
integral part is stored in iptr. The modf() function returns the fractional
part of x.
Una ventaja de este mtodo es que el valor de m no es crtico.
El mtodo trabaja bien con cualquier valor de A, pero trabaja mejor con
algunos valores que otros, por ejemplo A~(sqrt(5)-1)/2 es recomendado.
As para m =10000, h(123456) = 10000 *(123456*0.61803.. mod 1) =41
Hashing Cerrado
Hashing Cerrado
Hash_Insert(T, k) {
/* pseudo cdigo */
int i,j;
for (i = 0; i<m; i++) {
j=h(k,i);
if (T[j] == NULL){
T[j]=k;
return;
}
}
printf( hash overflow);
}
int Hash_Search(T, k) {
/* pseudo cdigo*/
int i,j;
for (i = 0; i<m; i++) {
j=h(k,i);
if (T[j] == NULL)
return -1;
else if (T[j] == k)
return j;
}
}
10
11
79
69
98
72
14
50
12
Notar que:
i P{X i} P{ X i 1}
i 0
0 * P{X 0 } 0 * P{ X 1}
1* P{X 1 } 1* P{ X 2}
2 * P{X 2 } 2 * P{ X 3} ..
(i 1) * P{X i 1 } (i 1) * P{ X i}
i * P{X i} i * P{ X i 1} ...
P{X 1 } P{X 2 } P{X 3 } P{X 4 } P{X 5 } ...
P{X i}
i 1
13
1 pi
i 1
p1 n / m
n
p2
n 1
n n 1
pi
m m 1
n i 1 n
i
..
m i 1 m
1
Luego I 1 p i 1 1 2 3 ....
1
i 1
14
15
n i 0
1
m
m
1
n i 0 m i n i 0 m i
1 1
1
1
1
1
1
...
m m 1 m 2 m 3
m (n 1)
1 n 1 1
1
i 0 (m i )
m n 1
1 1
j m n 1 j
j m n 1 j
(1 / x)dx
mn
1 1
ln
16
Hashing Abierto:
Costo
Costo
Costo
Costo
de
de
de
de
insercin = (1)
bsqueda exitosa = (1+/2)
bsqueda no exitosa = (1+)
eliminacin = (1+/2) cuando la clave est
= (1+) cuando la clave no est
Hashing Cerrado
Costo de insercin
1
1 1
ln
17
Ejercicio
1
1
*M /3
* 3M / 4
3
M
/
4
11/ 3
1
3M
0.5M M 1.5M
Caso 2 : x
18
Ejercicio
ln
1 1
* M / 2
ln
* 3M / 4
12
3M / 4
3/8
2M
1
1
1
1
x
ln
ln
*M / 2
* 3M / 4
0.5 1 0.5
3 / 8 1 3 / 8
8 8
x 2 ln 2 * M / 2 ln * 3M / 4 M ln 2 2(3 ln 2 ln 5) M
3 5
x (7 ln 2 2 ln 5) M M ln(128 / 25) M ln(5.12)
1 0.5, 2
19
Ejercicio
1 1
1 1
* M / 3 ln
* 3M / 4
x ln
1 1 1
2 12
3M / 4
1 1 / 3, 2
1/ 4
3M
x 3 ln 3 / 2 * M / 3 4 ln 4 / 3 * 3M / 4
3 4 3
x M ln 3 / 2 3M ln(4 / 3) M ln *
2 3
x M ln(32 / 9) M ln(3.55)
=> Mejor
caso 2 20
Divertimento
21