Tablas de dispersion
1
El tamañode la tabla debe ser primo. De esta forma, y si las claves son números aleatorios, esta función suele distribuir las claves uniformemente. Si tuviéramos la tabla de la figura anterior (MAX_T =10), y todas las claves terminaran en cero, la dispersión con esta función no nos valdría. Cuando las claves son cadenas de caracteres lo usual es sumar los valores ASCII de los caracteres de la cadena. Acontinuación se declaran los tipos apropiados para la tabla de dispersión y el índice, que es el que devuelve la función de dispersión. TYPE INDICE = 0 .. MAX_T - 1; TablaDisp= ARRAY INDICE OF ... Una implementación sencilla de la función de dispersión sería la siguiente: FUNCTION hashing (llave: TipoCadena): INDICE; VAR aux, j: integer; BEGIN aux := ord (llave[1]); FOR j:=2 TO Length (llave) DO aux:= aux + ord (llave[j]); hashing := aux MOD MAX_T; END; El problema de esta función es que, si la tabla es grande, no hace una distribución uniforme de las claves. Pongamos un ejemplo: tenemos una tabla con un tamaño MAX_T= 10007 (primo) y las claves tienen una longitud máxima de ocho caracteres; como ord devuelve un número entero de valor máximo 127, la función de dispersión sólo tendrá valoresentre 0 y 1016 (127*8). Luego la distribución no es equitativa A continuaciòn vamos a tratar el tema de las colisiones. Esto ocurre cuando dos elementos distintos toman el mismo valor. Para solucionar las colisiones veremos dos métodos: la dispersión abierta y la dispersión cerrada. Dispersión abierta La dispersión abierta, también llamada encadenamiento separado, consiste en tener una lista delos 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:
2
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 clave y se devuelve un puntero a la posición de la celda que contiene la clave.
3
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...
Regístrate para leer el documento completo.