Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
Tema 13 - Implementacin de un
Diccionario segn una Tabla de
Dispersin
Germn Molt
ndice general:
1.
Implementacin de las Operaciones de un Diccionario en
Tiempo Constante: Ideas Bsicas
2.
Funcin de dispersin (hashing): Caractersticas. El Mtodo
hashCode de Object
3.
Resolucin de Colisiones: Encadenamiento Enlazado
4.
Implementacin en Java de una Tabla Hash Enlazada
Objetivos
Presentar la Tabla Hash como una Representacin
eficiente de la EDA Diccionario. En concreto, se
estudiarn:
Bibliografa
Libro de M.A. Weiss, Estructuras de Datos en Java (AdissonWesley, 2000).
Apartado 7 del captulo 6 (Introduccin a la Tabla de Dispersin).
Motivacin
Motivacin
X
insertar(x)
buscar(x)
Universo de Objetos
5
0
1
0
.
.
.
.
.
.
.
.
2
.
.
.
.
.
.
.
.
65.535
....
......
7
10
Ejemplo de Implementacin de
hashCode
Returns a hash code for this string. The hash code for a String
object is computed as
s[0]*31^(n-1) + s[1]*31^(n-2) + ... + s[n-1]
using int arithmetic, where s[i] is the i-th character of the
string, n is the length of the string, and ^ indicates
exponentiation. (The hash value of the empty string is zero)
Overrides (sobreescribe): hashCode in class Object
12
14
Y
Objetos
15
Tabla Hash
Paradoja del cumpleaos
16
Ejemplo de Implementacin de
hashCode
Y
X
Persona o = (Persona) x;
Tabla Hash
return this.nif.equals(o.nif);
Objetos
}
}
17
18
Exploracin Lineal
Exploracin Cuadrtica
Objetos
19
Tabla Hash
20
Hashing Enlazado
Insertar los elementos {5, 10, 3, 15, 20, 19} en una Tabla
Hash de tamao 10 y con funcin hash:
hash(x) = x % 10
10
20
1
0
A
5
Y10
Z
15
3
4
5
6
Factor de Carga
21
4
5
15
6
7
8
9
19
1.
2.
3.
4.
23
22
19
X
20
Objetos
B
3
24
Funciones de dispersin
120000
107909
107909
107909
107909
107909
107909
107909
107909
107909
107909
100000
Colisiones
80000
hashCode
Mala
60000
Weiss
48877
McKenzie
40309 40050
40000
35344
27729
26706
23611
23422 23154
21126
21094
20305
12627 12625
10264 10128
8740 8579
19121
18435
1653816114
20000
7500 7345
6568 6650
5964 5754
5310 5300
767060
876640
986220
1095800
0
109580
219160
328740
438320
547900
657480
Tam ao de la tabla
Funciones de dispersin
120000
100000
80000
Colisiones
hashCode
Mala
60000
Weiss
McKenzie
40000
20000
Ventajas:
109580
219160
328740
438320
547900
657480
767060
876640
986220
1095800
hashCode
40309
23422
16538
12627
10264
8740
7500
6568
5964
5310
Mala
107909
107909
107909
107909
107909
107909
107909
107909
107909
107909
Weiss
40050
23154
16114
12625
10128
8579
7345
6650
5754
5300
McKenzie
48877
35344
27729
26706
23611
21126
20305
21094
18435
19121
Tam ao de la tabla
Inconvenientes:
28
package librerias.estructurasDeDatos.hash;
@SuppressWarnings("unchecked")
Import librerias.estructurasDeDatos.modelos.*;
import librerias.estructurasDeDatos.lineales.*;
import librerias.excepciones.*;
talla = 0;
public TablaHash() {
this(TAMANYO_DEFECTO);
}
protected static final boolean esPrimo(int n){
29
30
return indiceHashX;
lpi.insertar(x);
if (lpi.esFin()) {
// Insertar nuevo
talla++;
} else {
return (double)(talla)/elArray.length;
// Actualizar
lpi.eliminar();
}
}
31
return lpi.recuperar();
lpi.eliminar();
talla--;
33
34
String res = ;
for (int i = 0; i < this.elArray.length; i++) {
ListaConPI<E> lpi = elArray[i];
}
return res;
}
El ABB:
35
36
Sobre la Implementacin de un
Diccionario Mediante una Tabla Hash
package librerias.estructurasDeDatos.modelos;
public interface Diccionario<C, V> {
void insertar(C c, V v);
V recuperar(C c) throws ElementoNoEncontrado;
void eliminar(C c) throws ElementoNoEncontrado;
boolean esVacio();
int talla();
ListaConPI<C> toLPIClaves();
}
37
La Clase EntradaDic
package librerias.estructurasDeDatos.hash;
class EntradaDic<C,V> {
C clave;
V valor;
EntradaDic(C c,V v) { clave = c; valor = v; }
EntradaDic(C c) { this(c, null); }
@SuppressWarnings("unchecked")
public boolean equals(Object x) {
return ((EntradaDic<C,V>)x).clave.equals(this.clave);
}
public String toString() {
return "(" + this.clave + "," + this.valor + ")";
}
public int hashCode() { return clave.hashCode(); }}
38
public TablaHashDiccionario() {
th = new TablaHash<EntradaDic<C,V>>();
}
public TablaHashDiccionario(int tallaMaximaEstimada) {
th = new TablaHash<EntradaDic<C,V>>(tallaMaximaEstimada);
}
public void insertar(C c, V v) {
th.insertar(new EntradaDic<C,V>(c, v));
}
39
40
Objetivo:
Importante:
}
return lpi;
}
} /* Fin de la clase TablaHashDiccionario */
41
42
Persona o = (Persona) x;
return this.nif.equals(o.nif);
}
public String toString(){return this.nif + " " + this.nombre + " " + this.edad; }
}
43
44
46
47