Sunteți pe pagina 1din 26

Yana Saint-Priest

Universidad Santiago de Cali


Análisis de Algoritmos

HASHING
BÚSQUEDA POR TRANSFORMACIÓN DE
CLAVES
EL PROBLEMA:

 Para encontrar un dato en una lista hay que


recorrerla O(n)
 Si es un arreglo y está ordenado; o se trata de
un árbol binario ordenado; se puede usar
búsqueda binaria O(log n)

 Pero ¿y no existe una manera más rápida de


accesar los datos? Y si son miles de millones
de datos ¿qué?
UNA IDEA!
UNA IDEA!

¿Y si fueran cédulas de los estudiantes USC?


UNA IDEA!

¿Y si fueran cédulas de los estudiantes USC?

¿Cuántas casillas no quedarán en blanco?

Solución  ?????
LA SOLUCIÓN

 Métodos de Tabla Hash


 Métodos de Hashing

 Transformación de claves

 Técnica de direccionamiento directo

 Métodos de transformación de llave-a-dirección

 Técnica de almacenamiento disperso


CARACTERÍSTICAS

 Le apunta a encontrar la información


directamente
 Traduce, a través de una función (función
hash) un conjunto de valores llave en un rango
de direcciones relativas
  Las funciones no son uno a uno, así que en
ocasiones se presentan colisiones. Dos llaves
diferentes con igual dirección relativa =
sinónimas
 
 Se puede trabajar con las  No pueden usarse registros
llaves, la traducción es de longitud variable
transparente  La información no está
 Las llaves son ordenada
independientes del espacio  No permite llaves repetidas
de direcciones  Sólo permite acceso por una
 No se requiere sola llave
almacenamiento adicional  O(huy!) si hay muchas
para índices colisiones
 O(1)

COSTO = O(FUNCIÓN DE HASH) + O(SOLUCIÓN DE


COLISIONES)
LA FUNCIÓN HASH

Su eficiencia depende de:


 La distribución de los valores

 La cantidad de valores respecto al espacio de


las direcciones
 La técnica usada para resolver el problema de
colisiones
HASHING POR RESIDUO DE LA DIVISIÓN

 h(k) = k mod m
 m = número primo no muy cercano a una
potencia de dos
 (si m=2p, entonces h(k) es los p bits menos
significativos de k
 El asunto es ¡qué elegir como divisor!
A tener en cuenta al momento de elegir el divisor:

 El rango resultante va desde cero hasta el


divisor -1. Entonces el divisor determina el
tamaño del espacio de direcciones relativas. Si
almacenamos n datos, debería divisor > n
 ¿Y las colisiones? Divisores pares se
comportan mal con llaves impares. Se sugiere
el primo más cercano al tamaño necesario
FACTOR DE CARGA

 Mide la saturación de un archivo


 número de datos / número de datos que podría
contener
 A medida que aumenta, más lleno está el
archivo!
 Se sugiere trabajar con máximo 70% u 80%

 ¿Si necesito almacenar 100 datos, cuánto


espacio sería bueno reservar?
HASHING POR MÉTODO DE LA MULTIPLICACIÓN

 h(k) = |m(k A mod 1) |


 0 < A < 1, m no es crítico, se sugiere que sea
potencia de 2

 Ejemplo:
Si k = 22345, m = 10000 y A = (√5 –
1)/2≈0,6180339887
h(k) = ?
HASHING POR MEDIO DEL CUADRADO

 Eleva la llave al cuadrado


 Se seleccionan algunos dígitos de la mitad

 Y se usan para la dirección

 Si se desea una dirección de n dígitos, se usan


los n del centro (se truncan los extremos)

 Pueden inventarse sumar los valores,


abs(restarlos), multiplicarlos …. Pero esto
genera muchas colisiones
HASHING POR PLIEGUE

 La llave se parte en varias “partes” ;-P


 Cada una tiene igual cantidad de dígitos que la
dirección relativa (menos la última)
 Se suman y el resultado es la dirección

 Igual que el anterior, el espacio de direcciones


es potencia de 10 (10n, donde n es el tamaño
de la partición o los dígitos extraídos)
mmmm…….
¿Y SI LA LLAVE NO SON NÚMEROS?
mmmm…….
¿Y SI LA LLAVE NO SON NÚMEROS?

 Usar código ASCII para convertirla a número


BUENO, AHORA SÍ, LAS COLISIONES!

 h(k1) = h(k2)  k1 se almacena en su dirección


origen, llega k2  CRASH!
¿Qué hacer?
 Direccionamiento abierto: se encuentra un
puesto para K2 en otra dirección del archivo
 Separación de desbordes (área de desborde):
se almacena k2 en un área por
fuera del archivo
MÉTODOS

 Sondeo Lineal (desbordamiento consecutivo)


 Busca la siguiente dirección vacía
 Si llega al final, vuelve al inicio

 OJO no sobrepasar de nuevo la dirección,


significaría que no hay espacio
 Para buscar se debe verificar la información
contenido
OTRO MÉTODO

 Doble Hashing
 Aplica otra función de hash para combinar la llave
con el resultado de la primera función
 El resultado puede colocarse dentro o en otro
archivo
 Si en el segundo hash también hay colisiones toca
hacer otra cosa
MEJORAS

 Direccionamiento por cubetas


 Tener un espacio múltiple en lugar de una simple
casilla

 Encadenamiento de sinónimos
 Tener una lista enlazada en
las direcciones que tiene
colisiones
JAVA - HASHTABLE
A TRABAJAR

 Lleve su ejemplo a código java, emplee al


menos 20 objetos diferentes
 Modifique el método de inserción de la tabla (a
mano!)
 Calcule la complejidad de la inserción y
búsqueda
ACTIVIDAD 8. VARIADOS
 Lea sobre Algoritmos de Grafos lo siguiente:
 Camino más corto
 Algoritmo de Dijsktra (diferente al primero)
 Algoritmo de Floyd y Warshall
 Estrategias de búsquedas en grafos
 Métodos de reintento
 Métodos de grafo explícito
 Construya un ejemplo con el tema de la Actividad 7
DEL HASHING. (AL MENOS 8 NODOS Y ENLACES!)
 El ejemplo debe ilustrar una prueba de escritorio de la
aplicación de los conceptos
BIBLIOGRAFÍA
 McCONNELL, Jeffrey J. Analysis of Algorithms: An
Active Learning Approach. Second Edition. Jones
And Bartlett Publishers. USA, 2008. Chapter 8
 VALENZUELA RUZ, Víctor. Manual Análisis de
Algoritmos. Versión 1.0. INACAP Copiapó. Chile,
2003. Capítulo 8.
http://colabora.inacap.cl/sedes/ssur/Asignatura%2
0Indtroduccion%20a%20la%20Programacn/An%C3
%A1lisis%20de%20Algoritmo/Manual-
Analisis%20de%20Algoritmos_v1.pdf

S-ar putea să vă placă și