HashTables en Java
HashTables en Java
HashTables en Java
Diccionarios
Algunas aplicaciones necesitan una estructura de datos que soporte las operaciones de un diccionario: insert, search y delete Este tipo de Estructuras, se enfocan en estas tres operaciones y buscan eficientizarlas. Una HashTable es una buena forma de guardar una estructura de diccionario, sobretodo porque facilita la bsqueda de los elementos
Direct-address Tables
Un Direct-address table es una forma simple de implementar una estructura de diccionario cuando el nmero de datos a guardar es relativamente pequeo. Se caracteriza por manejar los datos por medio de una llave o key:
Cada dato a guardar tiene una llave o key asociada, que es nica. Para cada key existe una nica posicin en la tabla.
Direct-address Tables
Como se implementara:
Si tenemos un conjunto de datos cuyas keys asociadas estn dentro del conjunto U = {0,1 .. , m-1} donde m es un nmero relativamente pequeo. Para representar una Direct-Address table utilizamos un arreglo T de m casillas, en el cual cada casilla corresponde a una key en U
Direct-address Tables
En Java:
public class DAddressTable { Object[] tabla; public DAddressTable(int numberofkeys){ tabla = new Object[numberofkeys]; }
Direct-address Tables
T
0 1 2
Direct-address Tables
T
0 1 2 DATO
Direct-address Tables
T
0 1 2 key(dato) k k DATO
Direct-address Tables
T
0 1 2 key(dato) k k DATO
Direct-address Tables
0 1 2
DATO
Direct-address Tables
El diccionario opera trivialmente con estas operaciones: INSERT x T[key(x)] = x DELETE x T[key(x)] = null SEARCH x return T[key(x)] SEARCH key return T[key] o
Direct-address Tables
public int key(Object dato) { } public void insert(Object dato) { tabla[this.key(dato)] = dato; } public void delete(Object dato) { tabla[this.key(dato)]= null; } public boolean search(Object dato) { return !(table[this.key(dato)] == null); } public boolean search(int key) { return !(table[key] == null); }
Solucin: HASHTABLES!!
Cuando el set de keys guardadas en un diccionario es mucho mas pequeo que el universo de posibles keys, una hash table requiere mucho menos almacenamiento que una direct-address table.
Solucin: HASHTABLES!!
Cuando el set de keys guardadas en un diccionario es mucho mas pequeo que el universo de posibles keys, una hash table requiere mucho menos almacenamiento que una direct-address table.
Hash Tables
A diferencia de un Direct Adress Table, el HashTable tiene un tamao menor al numero de elementos posibles (U) El key, ya no representa la posicin del dato, y puede ahora ser de cualquier tipo. Las posiciones de los datos, son calculadas de diferente forma, ya que ahora ya no pueden existe una asociacin directa key-posicin.
Hash Tables
DATO key (dato)
K Key del dato
hashfunction (k)
Hash Tables
0 1 2 k H Hashfunction(k) DATO key(dato)
Hash Tables
0 U h (k2)
k2 K k3 k1 k4
h (k1) h (k4)
h (k3) m
Hash Tables
Qu problema hay con tener una tabla de tamao mas pequeo al nmero de keys posibles?
Collision
Dato 1 Dato 2
k1
k2
h(k1)
h(k2)
Collision
0 U h (k1) = h (k2)
k2 K k3 k1 k4 h (k4)
h (k3) m
Chaining
Existen varias formas de solucionar el problema de colisiones, pero una de las mas utilizadas es: chaining. Chaining consiste en que cada casilla de la tabla guarda una lista encadenada, y no solo un dato.
Chaining
0 U k1 k2
k2 K k3 k1 k4 k6 k5 k4 k5 k6
k3 m
Hashtable
import java.util.LinkedList; import java.util.ArrayList; public abstract class HashTable<E> { ArrayList<LinkedList<E>> table; public HashTable(int size) { table = new ArrayList<LinkedList<E>>(size); for (int i=0; i<size; i++) { table.add(i,new LinkedList<E>()); } } public abstract Object key(E dato); public abstract int hashfunction(Object key); public abstract void insert(E dato); public abstract E delete(Object key); public abstract boolean searchDato(E dato); public abstract E searchKey(Object key); }