// Autor: Pablo Sanchez (p.sanchez@unican.es)
// http://personales.unican.es/sanchezbp
// Descripcion: Implementacion de una tabla hash
// cerrada con funcion de dispersion abstracta

PARAMETRO ElementoComparableIgualdad ES CLASE CON

METODOS:
// Falta un parametro que seria el objeto que recibe
// la llamada
igual(e2 : E) : Booleano;
FINPARAMETRO

PARAMETRO ElementoDispersable ES CLASE CON

METODOS:
hash() : NATURAL;

FINPARAMETRO

DOMINIO TEstadoTablaHash ES CONJUNTO {VACIO, OCUPADO, BORRADO}

CLASE TablaHash(K,E) (como TH(K,E))
USA PARAMETRO E;
USA PARAMETRO K : ElementoComparableIgualdad,
ElementoDispersable ES

// NOTA: He escogido 1009 por ser primo :-).
HEREDABLE MAX_TABLA ES NATURAL CON VALOR 1009;

HEREDABLE NodoTabla ES TUPLA
e : E;
clave : K;
estado : TEstadoTablaHash;
FINTUPLA;

// Inv: forall 0<= i < MAX_TABLA,
// (tabla[i].estado == OCUPADO) => (tabla[i].clave != NULO)
// Inv: forall 0<= i < MAX_TABLA,
// (tabla[i].estado != OCUPADO) => (tabla[i].clave == NULO)
// Inv: contains(k) => en el intervalo entre hash(k,0) y la
// casilla que contiene realmente a k, todos los
// elementos tienen el estado BORRADO u OCUPADO
HEREDABLE tabla : VECTOR DIM MAX_TABLA DE NodoTabla;

// Invariante: tamanho == size(esteObj)
// Invariante: 0 <= tamaho <= MAX_TABLA
HEREDABLE tamaho : NATURAL;

PUBLICO CONSTRUCTOR() : TH(K,E) ES
tamanho := 0;
i : NATURAL;
PARA i DESDE 0 HASTA MAX_TABLA - 1 HACER
tabla[i].e := NULO;
tabla[i].clave := NULO;
tabla[i].estado := VACIO;
FINPARA
FINCONSTRUCTOR

// Post: 0 <= hash(c,i) < MAX_TABLA
HEREDABLE FUNCION hash(c : K, i : NATURAL) : NATURAL ES
DEVOLVER (c.hash() + i) mod MAX_TABLA;
FINFUNCION

// Pre : (k != null) AND (tamanho < MAX_TABLA)
// Post: 0 <= buscaHueco(k) < MAX_TABLA
HEREDABLE FUNCION buscaHueco(k : K) : NATURAL ES

hueco, intento : NATURAL;

intento := 0;
hueco := hash(k,intento);
MIENTRAS ((tabla[hueco] != VACIO) AND
(tabla[hueco] != BORRADO) HACER
intento := intento + 1;
hueco := hash(k,intento);
FINMIENTRAS

DEVOLVER hueco;

FINFUNCION


// Pre: (tamanho < MAX_TABLA) AND
// (NOT (contains(k))) AND (k != NULO)
PUBLICO PROC inserta(k : K, e : E) ES

hueco : NATURAL;
hueco := buscaHueco(k);

tabla[hueco].e := e;
tabla[hueco].clave := k;
tabla[hueco].estado := OCUPADO;

tamanho := tamaho + 1;

FINPROC // inserta

// Pre: (k != NULO) AND (contains(k))
HEREDABLE FUNCION buscaClave(k : K) : NATURAL ES

hueco, intento : NATURAL;

intento := 0;
hueco := hash(k,intento);
// Por el invariante de la tabla, las casillas
// solo pueden tener como estado BORRADO u OCUPADO,
// y si la casilla esta ocupada, la clave no puede
// ser nula
MIENTRAS ((tabla[hueco].estado == BORRADO) OR
NOT (tabla[hueco].clave.igual(k))) HACER
intento := intento + 1;
hueco := hash(k,intento);
FINMIENTRAS

DEVOLVER hueco;

FINFUNCION


// Pre: (k != NULO) AND contains(k)
PUBLICO PROC asigna(k : K, e : E) ES
tabla[buscaClave(k)].e = e;
FINPROC // asigna

// Pre: (k != NULO) AND contains(k)
PUBLICO PROC borra(k : K, e : E) ES

hueco : NATURAL;

hueco := buscaClave(k);

DESTRUIR tabla[hueco].e;
DESTRUIR tabla[hueco].clave;
tabla[hueco].estado := BORRADO;

tamanho := tamaho - 1;

FINPROC // borra

PUBLICO FUNCION size() : NATURAL ES

DEVOLVER esteObj.tamanho;

FINFUNCION // size

// Pre: (k != NULL)
PUBLICO FUNCION contains(k : K) : BOOLEANO ES

hueco, intento : NATURAL;

intento := 0;
hueco := hash(k,intento);
MIENTRAS ((tabla[hueco].estado != VACIA) AND
((tabla[hueco].estado == BORRADO) OR
NOT (tabla[hueco].clave.igual(k))) AND
(intento < MAX_TABLA)) HACER
intento := intento + 1;
hueco := hash(k,intento);
FINMIENTRAS

DEVOLVER (tabla[hueco].estado == OCUPADO) AND
(tabla[hueco].estado.clave.igual(k));

FINFUNCION // contains

PUBLICO FUNCION estaVacia() : BOOLEANO ES
DEVOLVER esteObj.tamanho == 0;
FINFUNCION

PUBLICO FUNCION estaLLena() : BOOLEANO ES
DEVOLVER esteObj.tamanho == MAX_TABLA;
FINFUNCION

PUBLICO PROC DESTRUCTOR() ES
i : NATURAL;
PARA i DESDE 0 HASTA MAX_TABLA - 1 HACER
DESTRUIR tabla[i].e;
DESTRUIR tabla[i].clave;
FINPARA
FINPROC

FINCLASE

Last modified: Friday, 26 May 2017, 10:22 AM