Hashtable

2,550 views

Published on

Funcionamiento básico de una tabla hash e implementación de Java de esta clase.

Published in: Education
0 Comments
0 Likes
Statistics
Notes
  • Be the first to comment

  • Be the first to like this

No Downloads
Views
Total views
2,550
On SlideShare
0
From Embeds
0
Number of Embeds
51
Actions
Shares
0
Downloads
46
Comments
0
Likes
0
Embeds 0
No embeds

No notes for slide

Hashtable

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

×