FuncionamientobásicoHashtable{David Moreno García }
¿Quéesunatabla hash?¿       ?Una tabla hash o mapa hash es una estructura de datos que asocia llaves o claves con valores.Se usa principalmente cuando necesitamos realizar búsquedas sobre un conjunto de datos.Funcionan haciendo uso de funciones hash.
¿Quéesunafunción hash?¿       ?Hash es una función que permite generar claves casi unívocas para un documento, fichero, variable, etc.Se usan en lastablashashparadiscernir en queposicióndebemosguardar un valor a partir de su clave.El uso de estasfuncionespermitecrearestructuras de accesodirecto, esdecir, con unacomplejidad de acceso O(1).
Funcionamiento de unatabla hashLas tablas hash se implementansobrevectoresunidimensionales.En estosvectores, se almacenaprincipalmente el objetoquedeseamosguardar.La posicióndondeguardarlovieneindicadaporunafunción de mapeo, la cualtransforma el hash de la clave en unaposición del vector.
Gestionandoerrores: Claves duplicadasSe puededar el caso de quenuestrafunción hash genere el mismo hash para dos claves distintas.En estassituaciones el objeto del vector apunta al nuevoobjeto, creandounalista.Si introducimos un cuartoelemento en el ejemplo anterior y usamoscomo clave “1”, el vector quedaríaasí:Cuartoobjeto
Implementación de JavaHashtable
Capacidad y factor de cargaLa principal característica de la tabla hash de Java esqueconsta de unacapacidady de un factor de carga.La capacidadestablece el tamañoinicial del vector de objetos.El factor de carga, númerocomprendido entre 0.0 y 1.0, especifica el grado de eficiencia de la tabla. Valoresgrandesharán un mejoruso de la memoria, mientrasque los valorespequeñosusaránmásesterecurso e incrementarán la eficienciaal reducir el número de colisiones.Si el número de elementossupera el producto de estas dos variables, la tablaaumentarásucapacidad.
Función hash en JavaEl métodoencargado de obtener el hash de las claves en la implementación de Java se llama hashCode().Al haceruso de templates, la implementacióndepende del tipo de clave que se estéusando (Integer, String, etc.).Estodota a la tabla hash de una mayor flexibilidad, yaquesiqueremosusarnuestraspropiasclasescomo claves de la tabla, solo necesitaremosdefinirdichafunción.En el caso de que la clave no conste de dichafunción se utilizará la de su padre (generalmente la de Object).
Hashtablepublic synchronized V put(K key, V value) {if(key != null && value != null) { inthash = key.hashCode();intindex = (hash & 0x7FFFFFFF) % elementData.length; Entry<K, V> entry = elementData[index];while(entry != null && !entry.equalsKey(key, hash)) {		entry = entry.next;	}if(entry == null) { modCount++;if(++elementCount > threshold) {			rehash();			 index = (hash & 0x7FFFFFFF) % elementData.length;		}if(index < firstSlot) {firstSlot= index; 		}if(index > lastSlot) {lastSlot= index;			}		entry = newEntry(key, value, hash);entry.next= elementData[index];elementData[index] = entry;return null;	}	V result = entry.value;entry.value= value;	return result;	}throw new NullPointerException();}Método put(K key, V value)
Rehash: Función de dispersiónUnavez el vector quecontiene los objetoscrece, esnecesariovolver a recolocarlosyaquesuposición en el vector vienedeterminadapor la propiacapacidad de este.La función rehash entra en acciónunavez se ha excedido el producto de capacidad y factor de carga.Su cometido en la implementación de Java implicaincrementar el tamaño del vector y recolocar los objetos.
Hashtableprotected void rehash() {intlength = (elementData.length << 1) + 1;if(length == 0) {	length = 1;}intnewFirst = length;intnewLast = -1;Entry<K, V>[] newData = newElementArray(length);for(int i = lastSlot + 1; --i >= firstSlot;) {Entry<K, V> entry = elementData[i];while(entry != null) {intindex = (entry.getKeyHash() & 0x7FFFFFFF) % length;if(index < newFirst) {newFirst= index;			}if(index > newLast) {newLast= index;		}Entry<K, V> next = entry.next;entry.next= newData[index];newData[index] = entry;		entry = next;	}}firstSlot= newFirst;lastSlot= newLast;elementData= newData;computeMaxSize();}Método rehash()
ReferenciasWikipedia: http://en.wikipedia.org/wiki/Hash_tableHashtable collisions: http://www.javaworld.com/javaworld/javaqa/2002-06/01-qa-0621-hashtable.html

Hashtable

  • 1.
  • 2.
    ¿Quéesunatabla hash?¿ ?Una tabla hash o mapa hash es una estructura de datos que asocia llaves o claves con valores.Se usa principalmente cuando necesitamos realizar búsquedas sobre un conjunto de datos.Funcionan haciendo uso de funciones hash.
  • 3.
    ¿Quéesunafunción hash?¿ ?Hash es una función que permite generar claves casi unívocas para un documento, fichero, variable, etc.Se usan en lastablashashparadiscernir en queposicióndebemosguardar un valor a partir de su clave.El uso de estasfuncionespermitecrearestructuras de accesodirecto, esdecir, con unacomplejidad de acceso O(1).
  • 4.
    Funcionamiento de unatablahashLas tablas hash se implementansobrevectoresunidimensionales.En estosvectores, se almacenaprincipalmente el objetoquedeseamosguardar.La posicióndondeguardarlovieneindicadaporunafunción de mapeo, la cualtransforma el hash de la clave en unaposición del vector.
  • 5.
    Gestionandoerrores: Claves duplicadasSepuededar el caso de quenuestrafunción hash genere el mismo hash para dos claves distintas.En estassituaciones el objeto del vector apunta al nuevoobjeto, creandounalista.Si introducimos un cuartoelemento en el ejemplo anterior y usamoscomo clave “1”, el vector quedaríaasí:Cuartoobjeto
  • 6.
  • 7.
    Capacidad y factorde cargaLa principal característica de la tabla hash de Java esqueconsta de unacapacidady de un factor de carga.La capacidadestablece el tamañoinicial del vector de objetos.El factor de carga, númerocomprendido entre 0.0 y 1.0, especifica el grado de eficiencia de la tabla. Valoresgrandesharán un mejoruso de la memoria, mientrasque los valorespequeñosusaránmásesterecurso e incrementarán la eficienciaal reducir el número de colisiones.Si el número de elementossupera el producto de estas dos variables, la tablaaumentarásucapacidad.
  • 8.
    Función hash enJavaEl métodoencargado de obtener el hash de las claves en la implementación de Java se llama hashCode().Al haceruso de templates, la implementacióndepende del tipo de clave que se estéusando (Integer, String, etc.).Estodota a la tabla hash de una mayor flexibilidad, yaquesiqueremosusarnuestraspropiasclasescomo claves de la tabla, solo necesitaremosdefinirdichafunción.En el caso de que la clave no conste de dichafunción se utilizará la de su padre (generalmente la de Object).
  • 9.
    Hashtablepublic synchronized Vput(K key, V value) {if(key != null && value != null) { inthash = key.hashCode();intindex = (hash & 0x7FFFFFFF) % elementData.length; Entry<K, V> entry = elementData[index];while(entry != null && !entry.equalsKey(key, hash)) { entry = entry.next; }if(entry == null) { modCount++;if(++elementCount > threshold) { rehash(); index = (hash & 0x7FFFFFFF) % elementData.length; }if(index < firstSlot) {firstSlot= index; }if(index > lastSlot) {lastSlot= index; } entry = newEntry(key, value, hash);entry.next= elementData[index];elementData[index] = entry;return null; } V result = entry.value;entry.value= value; return result; }throw new NullPointerException();}Método put(K key, V value)
  • 10.
    Rehash: Función dedispersiónUnavez el vector quecontiene los objetoscrece, esnecesariovolver a recolocarlosyaquesuposición en el vector vienedeterminadapor la propiacapacidad de este.La función rehash entra en acciónunavez se ha excedido el producto de capacidad y factor de carga.Su cometido en la implementación de Java implicaincrementar el tamaño del vector y recolocar los objetos.
  • 11.
    Hashtableprotected void rehash(){intlength = (elementData.length << 1) + 1;if(length == 0) { length = 1;}intnewFirst = length;intnewLast = -1;Entry<K, V>[] newData = newElementArray(length);for(int i = lastSlot + 1; --i >= firstSlot;) {Entry<K, V> entry = elementData[i];while(entry != null) {intindex = (entry.getKeyHash() & 0x7FFFFFFF) % length;if(index < newFirst) {newFirst= index; }if(index > newLast) {newLast= index; }Entry<K, V> next = entry.next;entry.next= newData[index];newData[index] = entry; entry = next; }}firstSlot= newFirst;lastSlot= newLast;elementData= newData;computeMaxSize();}Método rehash()
  • 12.
    ReferenciasWikipedia: http://en.wikipedia.org/wiki/Hash_tableHashtable collisions:http://www.javaworld.com/javaworld/javaqa/2002-06/01-qa-0621-hashtable.html