Tablas Hash by FASH

Descargar como pdf o txt
Descargar como pdf o txt
Está en la página 1de 28

Tablas HASH

Franco Sánchez Huertas ([email protected])


Víctor Arroyo Apaza ([email protected])

Algoritmos y Estructura de Datos

Arequipa – Perú
UCSP – 2008

1
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.
2
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.

3
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.

4
Consideraciones

• El número de claves almacenadas es pequeña en relación con el


número de claves existentes
• Una tabla hash es un array pero de tamaño proporcional al
número de claves almacenadas (no al número posible de
claves)
• Dada una clave k, no usaremos este valor como índice de la
tabla, en lugar aplicaremos una función especial a k llamada
función hash

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.

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)

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).

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

Universo de Claves

Claves usadas

Función de mapeo
Lista Enlazada
o Función de hash
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.
Visión gráfica (hashing cerrado)
• Desde un “gran” Universo sólo un número reducido de claves serán
consideradas.

Universo de Claves

Claves usadas

La “lista” se almacena en
la misma tabla
Función de mapeo
11
Función de hash
Método de División
(h(k) = k mod m)
Ejemplo: m = 20, k = 91, h(k) = 11
Ventajas: Rápido
Desventajas: Evita ciertos valores de m .
Trabaja mal con las potencias de 2, si m = 2p, entonces h(k) es
los p bits menos significantes, de k.
POR EJEMPLO:
m = 2^6 >> La función hash no depende de todos los bits de k
si k = 0110001110110102, entonces h(k) = 0110102
Si k es una cadena de caracteres representado con radix 2^p,
entonces m = 2p – 1 trabaja mal pues si se permutan el orden de los
caracteres se tiene el mismo valor de la función hash.
Usualmente se escoge como valor de m un número primo no cercano
ni a 2 ni a 10.

15
Método de Multiplicación

Donde:
Parte fraccionaria de kA

Dicho de otra manera se procede como sigue:

1. Escoger una constante A dentro del rango 0 < A < 1


2. Multiplicar kA
3. Extraer la parte fraccionaria de kA
4. Multiplicar la parte fraccionaria por m
5. Tomar el mínimo entero del resultado

Desventajas : Más lento que el método por división.


Ventajas : El valor de m no es crítico.

16
Método de Multiplicación
(Implementación)

17
18
Tablas Hash
Un problema es cuando el universo de claves es demasiado grande por ejemplo si
tenemos 18,446,744,073,709,551,616 números de claves, esto mantendría un archivo
demasiado grande incluso, si solamente se almacenarían algunas pocas entradas, ,
entonces el las tablas de direccionamiento directo son útiles para ciertos casos, y para
valores pequeños de tablas, en este caso sen particular sería ingenuo utililizar una tabla
de direccionamietno directo

A diferencia de las tablas de direccionamieto directo en las tablas hash se requiere que
el universo de claves sea mucho mayo en comparación con el conjunto posible de
claves. de esta manera si tenemos por ejemplo 18,446,744,073,709,551,616 como
número máximo de clave no necesariamente tendremos un archivo de ese tamaño, si
no un archivo de tamaño mucho menor, es decir la complejidad de espacio en este
sentido será de O(k) llamaremos h a la función hash y será la encargada de mapear
las claves hacia una posición en la tabla, obviamente tendra valores dentro del rango
de valores permitidos por el tamaño de la tabla es decir se mapeará dentro del rango
de valores T={0,…,m-1}, siendo el universo de claves mucho mayor U={0,…,n-1} n>m

19
20
In

22
23
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.

25
Fin de la Presentación... xD

KSI NO C/C++ (v. 2008.1)


28

También podría gustarte