Hola tengo algunas dudas sobre funciones de hashing implementadas en archivos.
Tengo que hacer unos ejercicios en pascal para la facultad.
El enunciado es el que sigue...
5.- Se tiene que generar un archivo del registro nacional de las personas, con los datos de cada uno de los ciudadanos del país. La información manipulada será el número de documento (clave primaria) el nombre y el sexo de cada persona. Para una rápida recuperación de la información se decide organizar dicho archivo con el método de dispersión. Se decide utilizar como función de hash el método de la división, para lo cual la clave primaria debe ser convertida a número (decidir Ud. el método de conversión). A los fines prácticos del ejercicio se dispersarán solamente 500000 personas. Se decide crear un archivo con cubetas de capacidad 500, y el número de cubetas deberá ser aquel que garantice una densidad de empaquetamiento de 0.8. Crear el algoritmo que permita generar dicho archivo utilizando como método para el tratamiento de colisiones:
a) saturación progresiva
b) saturación progresiva encadenada
c) área de desborde por separado (decida Ud. el número de cubetas involucradas para tal fin).
esta es la estructura que declare...
const
max = 1025;
type
indice = 0..max-1;
reg = record
nom_y_ap: string;
domicilio: string;
fecha_nac: integer;
dni: longint;
end;
cub = array[1..50] of reg;
cubeta = record
info: cub;
llena: boolean;
{sig: integer;}
end;
archivo = file of cubeta;
y esta es la asignacion de cubetas en el archivo...
procedure crea_archivo(var a:archivo; var c: cubeta);
var
i: integer;
begin
crea_cubeta(c );
assign(a,\'datos.bin\');
rewrite(a);
for i := 0 to max-1 do
write(a,c);
end;
funcion de hash e insercion (saturacion progresiva)...
function hash(dni: longint): indice;
begin
hash := dni mod max;
end;
procedure inserta(var a: archivo; r: reg);
var
c: cubeta;
ok: boolean;
i: integer;
pos: indice;
begin
reset(a);
pos := hash(r.dni);
seek(a,pos);
ok := true;
while (ok) do
begin
read(a,c);
If not c.llena then
begin
i := 1;
while (i < 500) and (c.info[i].dni <> -1) do
i:= i+1;
c.info[i] := r;
seek(a,pos-1);
write(a,c);
if i = 500 then c.llena := true;
ok := false;
end
else
begin
pos := pos+1;
seek(a,pos);
end;
end;
end;
esta bien esto hasta ahora???
ahora que diferencia hay entre saturacion progresiva y saturacion progresiva encadenada? como se implementa?
y la saturacion con desborde?
espero que puedan responderme a la brevedad...
desde ya...muchas gracias
saludos
Esteban