Tablas de Dispersión
(Hashing Tables)
Dispersión abierta
La dispersión abierta, también llamada encadenamiento separado,
consiste en tener una lista de los elementos que se dispersan en el mismo valor
de la tabla. Suponiendo una tabla de tamaño 10 de números enteros y con la
función de dispersión: dispersión(x) = x MOD 10, nos quedaría una tabla
de dispersión abierta como la de la figura:
Las declaraciones de los tipos necesarios para la
dispersión abierta son: TYPE
posicion =POINTER TO nodo;
nodo = RECORD
elem : TipoElemento;
sig : posicion;
END;
TablaDisp = ARRAY INDICE OF posicion;
Inicialización de la tabla
Primero debemos inicializar la tabla,
asignando a cada celda el valor NIL: PROCEDURE IniciaTabla (VAR D: TablaDisp);
VAR
i : integer;
BEGIN
FOR i:=0 TO MAX_T-1 DO
D[i]:= NIL;
END;
Búsqueda en la tabla
Para efectuar una búsqueda en una tabla, primero
usamos la función de dispersión para determinar la lista a recorrer.
Seguidamente, se recorre la lista hasta encontrar la llave y se devuelve un
puntero a la posición de la celda que contiene la llave. FUNCTION Buscar (llave: TipoElemento; D: TablaDisp): posicion;
VAR
res, p: posicion;
BEGIN
p := D[hashing(llave)];
res:= NIL;
WHILE p <> NIL DO
IF p^.elemento = llave THEN BEGIN
res:= p; BREAK;
END;
p := p^.sig;
END;
Buscar:= res;
END;
Inserción en la tabla
Para insertar un elemento en una tabla, primero
buscamos en la lista que le corresponde para ver si ya está insertado; si es
nuevo, se inserta al principio de la lista: PROCEDURE Insertar (llave:TipoElemento; VAR D: TablaDisp);
VAR
h: INTEGER;
pos, lista : posicion;
nuevo : posicion;
BEGIN
pos := Buscar (llave, D);
IF pos = NIL THEN BEGIN (* no encontrado *)
h:= hashing(llave);
NEW (nuevo);
nuevo^.elem := llave;
nuevo^.sig := D[h];
D[h]:= nuevo;
END;
END;
Factor de carga
Llamamos factor de carga de una tabla de
dispersión , l, al cociente entre el número de
elementos en la tabla y el tamaño de la misma:
La longitud media de una lista es l. El tiempo
que se tarda en realizar una búsqueda será el tiempo en que se calcula la
función de dispersión más el tiempo necesario para recorrer la lista. Si la
búsqueda es infructuosa, el número medio de enlaces por recorrer es l. Si la búsqueda tiene éxito los enlaces por recorrer son,
por término medio, 1 + l /2.
De esto se deduce que
el factor de carga es importante a la hora de diseñar una tabla. En el caso de
la dispersión abierta la regla general es que l
tienda a 1 (es decir, el tamaño de la tabla igual a los elementos
esperados).
Tampoco debemos olvidar que el tamaño de la tabla debe ser
primo.