tablas hash fash vmaa

20
1 Tablas HASH Franco Sánchez Huertas ([email protected]) Víctor Arroyo Apaza ([email protected]) Algoritmos y Estructura de Datos Arequipa – Perú UCSP – 2008

Upload: vicomanuel

Post on 17-Dec-2014

3.361 views

Category:

Sports


2 download

DESCRIPTION

tablas hash

TRANSCRIPT

Page 1: Tablas Hash Fash Vmaa

1

Tablas HASHFranco Sánchez Huertas ([email protected])

Víctor Arroyo Apaza ([email protected])

Algoritmos y Estructura de Datos

Arequipa – PerúUCSP – 2008

Page 2: Tablas Hash Fash Vmaa

2

Introducción• Muchas aplicaciones requieren un conjunto dinámico que soporte las

operaciones de un diccionario: Insert, Search, Delete. Por ejemplo el compilador cuando guarda los identificadores de un programa.

• Es posible hacer uso de una lista enlazada con un tiempo O(n) ; sin embargo, este tiempo se puede reducir notablemente a orden O(1) en la mayoría de los casos usando una tabla hash.

• La idea surge de los arreglos que nos permiten acceso a sus elementos en orden O(1).

• Una opción sería usar un arreglo tan grande como el rango de posibles claves. La desventaja es el espacio de memoria requerido en tal estrategia.

• Otra opción es usar un arreglo menor, al cual podemos mapear las claves en uso. Esta función de mapeo es la función hash. La tabla así organizada es la tabla hash.

• Como es posible que dos claves conduzcan al mismo mapeo (lo cual se conoce como una colisión), es necesario buscar formas para resolver esta situación.

• Una forma, conocida como hashing abierto (hay otros términos dependiendo del texto), crear una lista asociada a cada entrada del arreglo.

Page 3: Tablas Hash Fash Vmaa

3

Introducción• Otra forma, conocida como hashing cerrado (el término depende del libro),

almacena las claves en las mismas entradas del arreglo o tabla hash.• Una tabla tiene varios campos (tipos de información)

– Una guía telefónica podría tener campos como: nombre, dirección, teléfono, etc.

• Para encontrar una entrada en la tabla, solo se necesita conoce el contenido de uno de los campos (no de todos ellos). Este concepto se le conoce como key (clave).

– En la guía de teléfonos, la clave suele ser el nombre.• Idealmente, una clave identifica unívocamente una entrada.

– Si la clave es el nombre y ninguna entrada en la guía tiene el mismo nombre, la clave identificará de forma univoca cada entrada.

Page 4: Tablas Hash Fash Vmaa

4

Definición• Una tabla hash o mapa hash es una estructura de datos que asocia

llaves o claves con valores. La operación principal que soporta de manera eficiente es la búsqueda: permite el acceso a los elementos (teléfono y dirección, por ejemplo) almacenados a partir de una clave generada (usando el nombre o número de cuenta, por ejemplo). Funciona transformando la clave con una función hash en un hash, un número que la tabla hash utiliza para localizar el valor deseado.

• Las tablas hash almacenan la información en posiciones pseudo-aleatorias, así que el acceso ordenado a su contenido es bastante lento. Otras estructuras como árboles binarios auto-balanceables son más lentos en promedio (tiempo de búsqueda O(log n)) pero la información está ordenada en todo momento.

• Comparada con otras estructuras de arreglos asociadas, las tablas hash son más útiles cuando se almacenan grandes cantidades de información.

Page 5: Tablas Hash Fash Vmaa

5

Ventajas e Inconvenientes

• Una tabla hash tiene como principal ventaja que el acceso a los datos suele ser muy rápido si se cumplen las siguientes condiciones:

– Una razón de ocupación no muy elevada (a partir del 75% de ocupación se producen demasiadas colisiones y la tabla se vuelve ineficiente).

– Una función resumen que distribuya uniformemente las claves. Si la función está mal diseñada, se producirán muchas colisiones.

• Los inconvenientes de las tablas hash son:

– Necesidad de ampliar el espacio de la tabla si el volumen de datos almacenados crece. Se trata de una operación costosa.

– Dificultad para recorrer todos los elementos. Se suelen emplear listas o colecciones (Collection usadas en .net) para procesar la totalidad de los elementos .

– Desaprovechamiento de la memoria. Si se reserva espacio para todos los posibles elementos, se consume más memoria de la necesaria; se suele resolver reservando espacio únicamente para punteros a los elementos.

Page 6: Tablas Hash Fash Vmaa

6

Funciones Hash

• Una buena función hash debería satisfacer la suposición de hash uniforme.

• Como el recorrido de la función de hash es un número natural, hay que saber interpretar o transformar a número natural el tipo de clave.

• Si se trata de claves enteras, el problema está más o menos resuelto.• Si se trata de secuencia de caracteres, strings, se puede interpretar

cada carácter como un número en base 128 (los números ASCII van del 0 al 127) y el string completo como un número en base 128. Así por ejemplo la clave “pt” puede ser transformada a (112*128+116)=14452. OBS: ASCII(p)=112 y ASCII(t)=116.

• En adelante supondremos que las claves son números naturales (o ya han sido transformadas a números naturales)

Page 7: Tablas Hash Fash Vmaa

7

Hashing Abierto• Suposición de hashing uniforme: es cuando cualquier elemento es igualmente probable

de caer en cualquiera de las m entradas de la tabla hash, independientemente de cualquier otro elemento.

• Aún con hashing uniforme, el peor caso de hashing abierto nos conduce a una lista con todas las claves en una única lista. El peor caso para búsqueda es así (n).

• En hashing abierto la búsqueda no exitosa de una clave toma tiempo (1+), donde es el factor de carga =número de claves en la tabla/número de entradas en la tabla hash.¿Por qué esto? El costo de calcular la función hash (1), más la prueba en cada una de los nodos de la lista asociada a la entrada. En promedio hay n/m nodos en cada lista y hay que probarlos todos ==> (). Luego se tiene que el tiempo total es (1+).

• Análogamente la búsqueda exitosa de una clave toma un tiempo (1+/2)• La inserción de una clave toma (1)• La eliminación de una clave toma un tiempo (1+). Aquí suponemos que la clave debe

ser buscada dentro de la lista, para luego ser eliminada.• En resumen, si la tabla mantiene un número limitado de claves, n/m está acotado por

una constante, todas las operaciones toman un tiempo (1).

Page 8: Tablas Hash Fash Vmaa

Visión gráfica (hashing abierto)• Desde un “gran” Universo sólo un número reducido de claves serán

consideradas.

Claves usadas

Universo de Claves

Función de mapeoo Función de hash Lista Enlazada

Page 9: Tablas Hash Fash Vmaa

Hashing Cerrado

• En Hashing cerrado, todos los elementos o claves son almacenadas en la tabla hashing misma. Es decir, cada entrada de la tabla contiene un elemento del conjunto dinámico o NULL.

• Cuando se busca, examinamos varias entradas hasta encontrar lo buscado o es claro que no está.

• No hay una lista ni elementos almacenados fuera de la “tabla”.• La tabla se podría llenar. El factor de carga no puede exceder 1.• La gran ventaja de hashing cerrado es que elimina totalmente los

punteros usados en la lista enlazada. Se libera así espacio de memoria, el que puede ser usado en más entradas de la tabla y menor número de colisiones.

Page 10: Tablas Hash Fash Vmaa

10

Visión gráfica (hashing cerrado)• Desde un “gran” Universo sólo un número reducido de claves serán

consideradas.

Claves usadas

Universo de Claves

Función de mapeoFunción de hash

La “lista” se almacena en la misma tabla

Page 11: Tablas Hash Fash Vmaa
Page 12: Tablas Hash Fash Vmaa
Page 13: Tablas Hash Fash Vmaa
Page 14: Tablas Hash Fash Vmaa
Page 15: Tablas Hash Fash Vmaa
Page 16: Tablas Hash Fash Vmaa

16

Page 17: Tablas Hash Fash Vmaa

17

Factores que afectan al rendimiento de las tablas hash

• La función hash– Idealmente debería distribuir las claves y entradas por toda la tabla.– Debería minimizar las colisiones (posición devuelta por la función hash ya

ocupada).• Estrategia de resolución de colisiones

– Encadenamiento separado: enlazar juntas varias clave/entrada en cada posición.

– Direccionamiento abierto: almacenar claves/entradas en posiciones diferentes.

• Tamaño de la tabla (suele ser un número primo)– Demasiado grande: se desperdicia memoria.– Demasiado pequeño: incrementará las colisiones pudiendo forzar rehashing

(copiar en una tabla mayor).– Apropiado a la función hash utilizada.

Page 18: Tablas Hash Fash Vmaa
Page 19: Tablas Hash Fash Vmaa
Page 20: Tablas Hash Fash Vmaa

Fin de la Presentación... xD

P.S. NO C/C++20