Está en la página 1de 32

Universidad de Valladolid

Departamento de informtica
Campus de Segovia
Estructura de datos
Tema 6:
Tablas de dispersin (hashing)
Prof. Montserrat Serrano Montero
NDICE
Conceptos bsicos
Funciones hash
Implementacin de tablas hash
Manejo de desbordamiento
Anlisis de tablas hash
CONCEPTOS BSICOS
Las tablas hashing constituyen un TAD
especialmente indicado para la manipulacin
y almacenamiento de la informacin en
memoria secundaria.
Cualquier tabla es una asociacin de celdas.
Las tablas hashing son tablas que relacionan
claves con posiciones de memoria donde se
almacenan atributos.
La idea bsica consiste en transformar las
claves en direcciones de memoria
mediante una funcin de transformacin.
Estas direcciones pueden hacer referencia a
memoria primaria, en cuyo caso tendramos
un array, pero en general las tablas de
dispersin aprovechan su potencial para la
implementacin en memoria secundaria.
EJEMPLO
Supngase que se quiere desarrollar una
aplicacin para registrar los participantes en un
congreso. Se esperan alrededor de 3000
participantes y se requerir almacenar los
datos de cada uno, como nombre, apellidos,
DNI o pasaporte, etc. Se utilizar como campo
clave el primer apellido. Suponiendo que los
apellidos pueden tener hasta 16 caracteres,
habr 26
16
claves posibles (con un alfabeto de
26 caracteres).
Problema: Cmo asignar una clave de todas las
posibles a una direccin de memoria.
Solucin: Una funcin de transformacin. Pero,
cmo es esa funcin?
CONCEPTOS BSICOS
Conclusin: Las tablas hashing se aplican
cuando el conjunto de claves posibles es
mucho mayor que el de claves reales a
almacenar.
Definicin: Dado un conjunto de claves
posibles, X, y un conjunto de direcciones de
memoria, D, una funcin de
transformacin, H(x), es una aplicacin
suprayectiva del conjunto de claves posibles
en el conjunto de direcciones de memoria.
H: X D
Definicin: El TAD tabla de dispersin es
un tipo de datos homogneo de tamao fijo,
Ttabla, compuesto por un nmero fijo de
componentes, denominadas celdas, a las que
se accede mediante una direccin de
memoria resultante de una funcin de
transformacin. Sobre este TAD se definen
los operadores Insertar, Buscar y Eliminar.
CONCEPTOS BSICOS
Se dice que dos claves distintas x
1
y x
2
son
sinnimas para una funcin de
transformacin H(x) si H(x
1
) = H(x
2
).
Se dice que se ha producido un
desbordamiento cuando una nueva clave se
aplica a una direccin de memoria
completamente ocupada.
Se dice que se ha producido una colisin
cuando dos claves distintas se aplican sobre
la misma celda.
En el caso habitual en el que una celda
contiene un nico registro el desbordamiento
y la colisin se producen simultneamente.
CONCEPTOS BSICOS
Se denomina densidad de claves al cociente
entre el nmero de claves en uso, m, y el
nmero total de llaves posibles, n
x
.
Se denomina factor de carga, (o densidad
de carga), , al cociente entre el nmero de
claves en uso y el nmero total de registros
almacenables en la tabla de dispersin. As:
m
=
s . b
donde s es el nmero de registros por bloque
y b es el nmero de bloques que hay en la
tabla de dispersin.
FUNCIONES HASH
Caractersticas:
a) Fciles de calcular.
b) El valor que calcula depende de la clave.
c) Producir el menor n de colisiones porque
hace que la ocupacin de los bloques sea
equiprobable.
Funciones uniformes que dividen el conjunto
de claves posibles en grupos de claves
aproximadamente iguales.
Mtodos de construccin:
1. Divisin
2. Plegado
3. Compresin
4. Extraccin
5. Otros ...
FUNCIONES HASH:
MTODO DIVISN
f (x) = X mod M.
a) Cuidar el elegir M
b) Espacio de direcciones: [0, M-1]
Si el conjunto de claves es numrico y
acabado en cero, no se puede elegir M
= 10.
Si las claves son cadenas de
caracteres. Con M = 2
k
y k 24,
todas las cadenas que tengan los tres
ltimos caracteres iguales se asignan a
la misma direccin. Esto sucede
porque las potencias de M tienen
divisores.
Elegir M primo.
FUNCIONES HASH:
MTODO PLEGADO
Para las funciones de plegado: Dividir la
clave en partes iguales y sumarlas. La suma
de las partes puede realizarse de dos formas
a) Plegado por desplazamiento.
b) Plegado por las fronteras.
El plegado por desplazamiento consiste en
sumar las partes directamente.
El plegado por las fronteras consiste en
plegar el identificador por las fronteras de las
partes y sumar los dgitos coincidentes.
Si la claves es una cadena de caracteres, los
dgitos de cada carcter vienen determinados
por el valor decimal de la secuencia de
cotejo correspondiente (ASCII, EBCDIC,
etc.)
FUNCIONES HASH:
MTODO PLEGADO
a) Cadena de ocho caracteres representada por
los nmeros de orden dentro de la secuencia
de cotejo correspondiente.
b) Plegado por desplazamiento.
c) Plegado en las fronteras en base decimal.
d) Plegado en las fronteras en base binaria.
e) Detalle del plegado en base binaria.
FUNCIONES HASH:
MTODO COMPRESIN
Dividir la clave en componentes, traducir su
nmero de cotejo a binario y aplicar la
operacin xor y al resultado la operacin
resto de divisin entera.
Ejemplo: C = Cadena de caracteres.
C = David
D = 01100100
A = 01100001
V = 01110010
I = 01101001
D = 01100100
01111010 = 122 mod 26 = 18
XOR
FUNCIONES HASH:
MTODO EXTRACCIN
Mtodo de la mitad del cuadrado: Si tenemos
claves numricas (si no las transformamos),
calculamos su cuadrado y nos quedamos con
algn nmero de la zona central del
resultado. Nos quedamos con tantos dgitos
como necesitemos para mapear el array.
Ejemplo: Array con N = 0..99
C = 340 i
2
= 115600 H (C) = 56
C = 521 i
2
= 271441 H (C) = 14
ESPECIFICACIN
DEL TAD TABLA HASH
TAD TablaHash (VALORES: Atributos almacenados en las
posiciones resultado de una transformacin Hash de claves;
OPERACIONES: Inicializar, Hash, Buscar, Insertar, Eliminar)
Inicializar TablaHash
Efecto: Crea una tabla hash vaca.
Hash (Clave) Posicion
Efecto: Devuelve la transformacin adecuada a partir de la
clave.
Buscar (TablaHash, Clave) Atributo, Boolean
Efecto: Si la clave est en la tabla, devuelve el atributo
correspondiente y un valor lgico llamado error a false. En
caso contrario error valdr true.
Excepcin: Error si la clave no est en la tabla.
Insertar (TablaHash, Clave, Atributo) TablaHash,
Boolean
Efecto: Si la posicin no est libre, el valor lgico error vale
true. En caso contrario en la posicin Hash (clave) se
almacena el par (clave, atributo).
Excepcin: Error si hay colisin, desbordamiento o tabla llena.
Eliminar (TablaHash, Clave) TablaHash, Boolean
Efecto: Si la clave existe en la tabla, se deja vaca esa
posicin y se actualiza error a false. En caso contrario, error
vale true.
Excepcin: Error si la clave no est en la tabla.
Informal
Clave: Cadenas de caracteres en maysculas.
Funcin hash: Primer carcter de la clave.
unit TADHash;
interface
const
npares = ...; vacia = ...;
type
cadena = ...; tatributo = ...;
posicion = 1..npares;
par = record
clave: cadena;
atributo: tatributo;
end;
TablaHash = array [posicion] of par;
procedure Inicializar (var T: TablaHash);
function Hash (c: cadena): posicion;
procedure Buscar (T: TablaHah; c: cadena; var
atrib: tatributo; var error: boolean);
procedure Insertar (var T: TablaHash; c: cadena;
atrib: tatributo; var error: boolean);
procedure Eliminar (var T: TablaHah; c: cadena;
var error: boolean);
IMPLEMENTACIN
procedure Inicializar;
var pos: posicion;
begin
for pos := 1 to npares do
T [pos].clave := vacia;
end;
IMPLEMENTACIN
function Hash;
begin
Hash := (ord (c [1]) ord (A) + 1
end;
procedure Buscar;
var pos: poscicion;
begin
pos := Hash (c);
if T [pos].clave = c then
begin
atrib := T [pos].atributo;
error := false
end
else error := true
end;
implementation
IMPLEMENTACIN
procedure Insertar (var T: TablaHash; c:
cadena; atrib: tatributo; var error: boolean);
var pos: posicion;
begin
pos := Hash (c);
if T [pos].clave = c then error := true
else
begin
error := false;
T [pos].clave := c; {elimina clave
T [pos].atributo := atrib anterior}
end;
end;
IMPLEMENTACIN
procedure Eliminar (var T: TablaHah; c:
cadena; var error: boolean);
var pos: posicion;
begin
pos := Hash (c);
if T [pos].clave = c then
begin
error := false;
T [pos].clave := vacia
end
else error := true
end;
end.
MANEJO DE
DESBORDAMIENTO
Encontrar posiciones donde ubicar el rea de
desbordamiento de una tabla.
Esto puede hacerse de dos formas:
a) Encadenamiento cerrado o interno.
b) Encadenamiento abierto o externo.
En el primer caso, el rea de desbordamiento
se ubica dentro de la tabla, comportndose
como un mtodo esttico, y en el segundo
caso, se ubica en listas enlazadas asociadas a
cada bloque de la tabla.
MANEJO DE
DESBORDAMIENTO
Encadenamiento cerrado o interno:
La exploracin puede expresarse como:
direccin = f(x) + g(x)
donde:
a) f(x): funcin de dispersin
b) g(x): funcin de tratamiento de sobrecargas.
Segn la forma de g(x) puede hablarse de:
1. Exploracin lineal:
g(x) = i; 1< i < TamaoTabla
2. Exploracin cuadrtica:
g(x) = i
2
; 1< i < TamaoTabla
3. Retransformacin o rehashing: La funcin
de exploracin es una familia de funciones de
dispersin que se examinan sucesivamente en
un orden dado.
g(x) = f
i
(x); 1< i < m
MANEJO DE
DESBORDAMIENTO
Encadenamiento cerrado o interno:
Ejemplo:
Considerando la tabla circular, la direccin
vendr dada por
(f(x) + g(x)) mod TamaoTabla
a) La exploracin lineal tiende a colocar las
claves poco uniformemente a lo largo de la
tabla, de forma que las sobrecargas van
llenando bloques cercanos a los ocupados.
b) La exploracin cuadrtica hace examinar los
bloques:
f(x), (f(x)+i
2
) mod TamaoTabla y
(f(x) i
2
) mod TamaoTabla con
1 i (TamaoTabla - 1) / 2
Cuando TamaoTabla es un n primo de la
forma 4j + 3 con j entero, esta exploracin
tiende a recorrer todos los bloques de la tabla.
[Radke 1970].
MANEJO DE
DESBORDAMIENTO
Encadenamiento cerrado o interno:
c) Retransformacin: (varios tipos)
Lineal:
H
i
(x) = (H
i-1
(x) + k) mod N
k = constante
N = nmero de elementos de la tabla
Aleatoria:
H
i
(x) = (H
i-1
(x) + A
i
) mod N
A
i
= n aleatoria entre N-1 nmeros aleatorios.
Mixtas:
H
i
(x) = (H
i-1
(x) + F (i, x)) mod N
Aplican a su vez otra funcin de
transformacin que dependa de la clave. Son
menos eficientes.
MANEJO DE
DESBORDAMIENTO
Encadenamiento cerrado o interno:
Ejercicio:
Calcular las funciones de retransformacin
lineal para una tabla circular donde la funcin
de dispersin inicial es el ordinal del primer
carcter de las cadenas de caracteres que
comienzan con A:
k = 3 y N = 26
Solucin:
H
0
= Hash (primer carcter)
H
0
= 1
H
1
(x) = (H
0
(x) +3) mod 26
H
1
(A) = (1 + 3) mod 26 = 4
H
2
(A) = (4 + 3) mod 26 = 7
MANEJO DE
DESBORDAMIENTO
Tanto la exploracin lineal, como la cuadrtica
o el rehashing requieren comprobaciones
sucesivas con los elementos de la tabla hash.
Muchas de ellas pueden evitarse utilizando
otras estrategias de tratamiento de colisiones.
La ms elemental consiste en mantener una
lista asociada a cada bloque de la tabla hash,
para almacenar todos los sinnimos que no
pueden insertarse en el bloque correspondiente.
La implementacin ms adecuada es una lista
enlazada ya que el nmero de sobrecargas es
desconocido a priori.
sta es la estrategia del encadenamiento abierto
o externo que requiere disponer en cada bloque
de espacio para almacenar un enlace.
MANEJO DE
DESBORDAMIENTO
Encadenamiento abierto o externo:
const
npares = ...; vacia =...;
type
cadena = ...; tatributo =...;
posicion = 1..npares;
enlace = ^par;
par = record
clave: cadena;
atributo: tatributo;
sig: enlace;
end;
Tabla = array [posicion] of par;
IMPLEMENTACIN
procedure Inicializar (var T: Tabla);
var pos: posicion;
begin
for pos := 1 to npares do
begin
T [pos].clave := vacia;
T [pos].sig := nil
end
end;
IMPLEMENTACIN
procedure Buscar (T: Tabla; c: cadena; var atrib:
tatributo; var error: boolean);
var pos: poscicion; p: enlace;
begin
pos := Hash (c);
if T [pos].clave = c then{est en 1 registro
begin bloque}
atrib := T [pos].atributo;
error := false
end
else
begin
p := T[pos].sig;
error := true;
while (p <>nil) and error do{recorr bloque}
if p^.clave = c then error := false
else p := p^.sig;
if not error then atrib := p^.atributo
end;
end;
procedure Insertar (var T: Tabla; c: cadena; atrib: tatributo;
var error: boolean);
var pos: posicion; p: enlace;
procedure Ins (var p: enlace; c: cadena; atrib: tatributo;
var error: boolean);
begin {Inserta nuevo nodo en lista de desbordamiento}
if p = nil then
begin
error := false;
new (p); p^.clave := c; P^.atributo := atrib;
P^.sig := nil;
end
else if (p^.clave = c) then error := true
else Ins (p^.sig, c, atributo, error);
end;
begin {Programa principal}
pos := Hash (c);
if T [pos].clave = c then error := true {ya est en bloque}
else if T [pos].clave = vacia then {si bloque vaco}
begin
error := false;
T [pos].clave := c;
T [pos].atributo := atrib
end;
else Ins (T[pos].sig, c, atrib, error); {recorro el
end; bloque}
IMPLEMENTACIN
IMPLEMENTACIN
procedure Eliminar (var T: Tabla; c: cadena; var
error: boolean);
var pos: posicion;
procedure Sup (var p: enclace; c: cadena; var
error: boolean);
var q: enlace;
begin
if p = nil then error := true
else if p^.clave = c then
begin
q := p; p:= p^.sig; dispose (q);
error := false;
end
else Sup (p^.sig, c, error)
end;
begin {Programa principal}
pos := Hash (c);
if T [pos].clave = vacia then error := true
else if T [pos].clave = c then {si hay colisin}
begin
error := false; (sigue)...
IMPLEMENTACIN
if T[pos].sig = nil then T [pos].clave = vacia
else {si est al principio y no hay ms}
begin {si est al principio del bloque}
p := T[pos].sig;
T [pos].clave := p^.clave;
T [pos].atributo := p^.atributo;
T [pos].sig := p^.sig;
dispose (p);
end
end {del 2 if}
else
Sup (T [pos].sig, c, error); {sigue por la lista
end; enlazada a ese bloque}
ANLISIS DE TABLAS HASH
El factor de carga de la tabla es m/N, donde
m es el nmero de ndices distintos que se
han almacenado en la tabla y N es el tamao
de la matriz que se emplea para
implementarla.
Si suponemos que todos los ndices, todos los
punteros y todos los valores almacenados en
la tabla ocupan una cantidad de espacio
constante, entonces la tabla ocupa un espacio
que est en O (N + m) y la longitud media
de la lista es igual al factor de carga. As un
incremento de N reduce la longitud pero
incrementa el espacio.
Si se mantiene el factor de carga entre y
1, la tabla ocupa un espacio que est en O
(m), lo cual es ptimo salvo un pequeo
factor cte, y la longitud media de la lista es
menor que 1, lo cual implica un acceso
eficiente a la tabla.
ANLISIS DE TABLAS HASH
Resulta tentador mejorar este esquema
sustituyendo las N listas de colisin por
rboles equilibrados, pero no merece la pena
si el factor de carga se mantiene en valores
pequeos.
El factor de carga se mantiene en valores
pequeos mediante una redispersin. Cuando
el factor de carga supera el valor uno, se
dobla el tamao de la matriz empleada para
implementar la tabla de dispersin.
La funcin de dispersin cambia para doblar
su alcance, y todas las entradas que estn en
la tabla se redistribuyen a sus nuevas
posiciones en alguna lista de la matriz
mayor. La redistribucin es costosa pero
infrecuente as, no incrementa mucho el
tiempo de acceso a la tabla. Cada vez que el
factor de carga sobrepasa el valor uno, se
reorganiza la tabla y el factor de carga
vuelve a valer .

También podría gustarte