tabla_hash_cerrada
// 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