Hashing - Dispersión
Karim Guevara Puente de la Vega UCSM, 2014
Agenda
2
Introducción Tablas hash/dispersión Funciones hash Factor de carga Colisiones Resolución de colisiones Longitud de búsqueda Predicción de distribución Hashing extensible o dinámico
Introducción
¿Si se tiene 100 empleados con clave 99999?
La dispersión es un método para referenciar elementos directamente en una tabla realizando transformaciones aritméticas sobre las claves.
3
…¿Se necesitaría un estructura de 10000 elementos?
Evita comparaciones. comparaciones.
No permite algoritmos eficientes para acceder a todos los elementos de la tabla Las claves van a mapearse a direcciones diferentes. Dos o mas claves diferentes son transformadas a la misma dirección (sinónimos): Colisión
Tabla Hash
Es un conjunto formado por un número arbitrario de elementos distintos (del mismo tipo). Estructuras utilizadas en aplicaciones que manejan secuencia de elementos
4
Cada elemento tiene asociado una clave única
Objetivo : realizar las búsquedas o eliminaciones de un registro en tiempo constante. Las tablas de hash constituyen una herramienta importante para la manipulación y almacenamiento de datos en memoria secundaria.
Función Hash
Es la que se va a encargar de transformar las claves en direcciones de la tabla.
Se llama “función ideal”, a aquella que distribuya a todos los elementos lo más uniformemente posible sobre la gama de valores índice.
Si tabla almacena M items, entonces:
5
Requiere de una función que transforme claves a enteros entre [0, M-1] o [1,M].
Función Hash
Definición:
Dado un conjunto X de claves posibles y un conjunto D de direcciones de memoria, una función dispersión o hash para una clave K se define como: hash(k): llave localidad de la tabla Dadas ki < k < kj, no necesariamente
hash(ki) < hash(k) < hash (kj).
Una buena función hash satisface:
6
Es fácil de cálcular. Debe minimizar colisiones.
Aritmética modular
Funciones hash
Toma el resto de la división entre la clave y el numero de M de items (tamaño de la tabla). Proporciona un valor entre 0 y M1.
h(x) = x mod M
Para una mayor uniformidad en la distribución, el valor de M debe ser primo o que sea divisible por pocos números (m) h(x) = x mod m
7
Aritmética modular
Funciones hash
P.e.: si la tabla tiene un tamaño de 995 posiciones (direcciones), y m es 997 h(42325431) = 42325431 mod 997 = 787 h(35623456) = 35623456 mod 997 = 646 h(23452463) = 23452463 mod 997 = 32
Sumatoria de valores ASCII: tomar el resto entre la sumatoria de los valores ASCII de la cadena de caracteres y el número M (tamaño de la tabla). for (i=0; letra != ‘ \n’; i++) suma += Letra[i]; h(k) = (suma mod M)
8
Aritmética modular
Funciones hash
P.e.: sea la clave LOWELL, hallar el valor hash: LOWELL
=
76 79 87 69 76 76 L O W E L L
Entonces: 7679 mod 997 = 700 700 + 8769 = 9469 mod 997 = 496 496 + 7676 = 8172 mod 997 = 196
9
Plegado
Funciones hash
Dividir la clave en partes iguales y sumarlas o multiplicarlas.
Esta suma o producto se puede hacer directamente o uniendo los extremos consecutivos con un efecto acordeón:
10
Plegado por desplazamiento
Plegado por las fronteras.
Se desprecian dígitos mas significativos que se obtengan del acarreo.
Plegado
Funciones hash
11
Si el resultado excede el rango de direcciones
Aplicar módulo
Descarta el dígito más significativo
Plegado
Funciones hash
P.e.: si el rango de direcciones es [0 - 995]
12
Claves son cadenas de caracteres
Mitad del cuadrado
Funciones hash
Cálcular el cuadrado de la clave K y extraer los dígitos centrales como dirección. El número de dígitos a tomar es determinado por el rango del índice. h(k) = digitos_centrales(k2 )
13
Utilizar siempre las mismas posiciones de K al cuadrado para todas las claves.
Mitad del cuadrado
Funciones hash
14
P.e.: sean las siguientes claves: 245643, 245981, 257135. Y el contenedor tiene una capacidad de 1000 elementos. Los valores hash para estas claves serían:
Transformación de la base
Funciones hash
Implica convertir la llave a alguna otra base numérica que no sea con la que se esté trabajando.
Tomar el resultado del módulo con la máxima dirección como la dirección de dispersión.
P.e.: sean los siguientes datos: Direcciones; [0 - 99] Clave: 453 (base decimal) Equivalente en base 11: 382 Entonces:
382 mod 99 = 85 15
Factor de carga (densidad de empaquetamiento)
Proporción entre el número de registros por almacenar (r) y el número de espacios disponibles (N): = r/N Medida de la cantidad de espacio que se utiliza en realidad Cuantos más registros estén empaquetados en un determinado espacio de la tabla (archivo), más probable es que ocurra una colisión al agregar un registro nuevo. P.e.. si r=75, N=100 entonces:
= 75 / 100 = 0.75 = 75% 16
Colisión Sean dos claves x, y distintas, se dice que son sinónimas para la transformación h si:
h(x) = h(y)
COLISIÓN
P.e.:: h(123445678) = 123445678 mod 101 = 44 h(123445880) = 123445880 mod 101 = 44
17
Se produce un desbordamiento al tratar de insertar un nuevo registro con una clave cuya dirección ya está ocupada.
Rehasing: hashing cerrado - direc. abierto
Resolución de colisiones
Requiere de una tabla mas grande: M sea mayor que la cantidad N de items.
Los espacios vacíos en la tabla permiten resolver las colisiones.
Factor de carga no debe exceder del 50% para una buena performance.
<= 0.5
18
Hashing cerrado (direccionamiento abierto)
Resolución de colisiones
Búsqueda lineal- lineal probing (Saturación progresiva) Dado el registro R de clave K, donde h(K) = P, y P está ocupada por otro registro: Buscar Q (primera posición disponible que siga a P) y asignar R a Q.
19
Búsqueda secuencial.
A veces es necesario que el contenedor tenga el comportamiento de un arreglo circular
Hashing cerrado (direccionamiento abierto)
Resolución de colisiones
Búsqueda lineal – lineal probing (Saturación progresiva)
20
P.e.:
Hashing cerrado (direccionamiento abierto)
Resolución de colisiones
Búsqueda lineal – lineal probing (Saturación progresiva)
Para un
Si
La mayoría de las búsquedas encuentran una posición vacía en unos pocas inspecciones en la tabla.
cercano a 1: Una búsqueda puede llevar un gran número de inspecciones e incluso puede caer en un ciclo infinito.
Desventaja:
21
chico:
Se generan clusters (primario)
búsqueda
secuencial.
Hashing cerrado (direccionamiento abierto)
Resolución de colisiones
Búsqueda cuadrática
Mejora el problema del agrupamiento primario (Clustering) de la Búsqueda Lineal.
La diferencia radica en que, la función de inspección de Búsqueda Lineal es f(i) = i ; ahora vamos a usar una función cuadrática f(i) = i2: 12, luego 22 ,luego 32 ,etc.
Es decir, si P es la dirección base, se inspecciona: P, P+12, P+22, P+32, . . ., P+i2, P, P+1, P+4, P+9, . . ., P+i2.
22
Hashing cerrado (direccionamiento abierto)
Resolución de colisiones
Búsqueda cuadrática – quadratic rehash
Desventaja:
23
Pueden quedar celdas sin visitar (Clustering Secundario). Si la tabla esta llena en más de un 50% ( >0.5) , no hay garantía de encontrar una celda vacía si el tamaño de la tabla no es PRIMO.
Si el tamaño de la tabla es un número primo está garantizado que podremos insertar un nuevo elemento.
Hashing cerrado (direccionamiento abierto)
Resolución de colisiones
Doble hashing
Eliminar cualquier clase de agrupamiento
Involucra el uso de dos funciones de hashing: h1, h2.
h1 es la “función primaria de hashing” (primary hash function), usada primero para determinar la
posición en la cual el registro debe ser guardado.
24
Si esa posición esta ocupada, la función de rehashing: h2 es utilizada sucesivamente.
Hashing cerrado (direccionamiento abierto)
Resolución de colisiones
Eliminación de elementos
Espacio liberado por eliminación puede obstaculizar las búsqueda posteriores.
Reutilizar el espacio liberado.
Estrategías: Aplicar rehashing para los items insertados
posteriormente.
25
Utilizar marcas de reutilización. que ocupe el espacio de la clave borrada.
Hashing cerrado (direccionamiento abierto)
Resolución de colisiones
Eliminación de elementos Marcas de reutilización:
26
No rompen secuencia de búsqueda.
Reutilizan espacio liberado
Hashing cerrado (direccionamiento abierto)
Resolución de colisiones
Eliminación de elementos Marcas de reutilización:
27
Hashing cerrado (direccionamiento abierto)
Resolución de colisiones
Por compartimentos - cubetas
28
Algunas veces, es conveniente que los registros se agrupen en bloques en lugar de almacenarse individualmente.
Si en cada celda se tiene espacio para una cantidad fija de registros se habla de bloque.
La dirección de compartimento base se determina por dispersión
Hashing cerrado (direccionamiento abierto)
Resolución de colisiones
Por compartimentos – cubetas
29
Hashing cerrado (direccionamiento abierto)
Resolución de colisiones
Por compartimentos – cubetas
30
P.e.: sean 200 alumnos donde la clave está dada por los tres últimos dígitos del DNI. La tabla hash tiene una capacidad de 1000 compartimentos cada uno de tres registros:
Encadenamiento: Hashing abierto-encad. directo
Resolución de colisiones
La tabla de dispersión contiene un registro y referencias a listas encadenadas (u otras estructuras) donde están los elementos que pertenecen a esa posición. El costo promedio de una búsqueda usando encadenamiento directo es 1 + L/2 es decir O(L). Por tanto, el factor de carga debe ser cercano a 1: = N/M , (largo promedio de cada lista ).
31
h(k) es el numero de lista enlazada que contiene el registro de clave k.
Encadenamiento: Hashing abierto-encad. directo
Resolución de colisiones
32
Longitud de búsqueda
Se refiere al número de accesos requeridos para extraer un registro de la memoria secundaria.
En la dispersión, la longitud de búsqueda se incrementa cada vez que ocurre una colisión.
Si un registro está a gran distancia de su dirección base, la longitud de búsqueda puede ser inaceptable.
Longitud media de búsqueda:
longitud total de búsqueda número total de registros 33
Longitud media de búsqueda
34
Predicción de la distribución
Función Poisson
r / N e P x x
r / N
x! r
Donde:
N = el número de direcciones disponibles r = el número de registros que se van a almacenar, x= el número de registros asignados a una dirección dada.
Predicción de la distribución
P.e.: si N=1000 y r=1000, entonces r/N = 1
“la probabilidad de que una dirección determinada no tenga llaves dispersadas a ella (x=0) es:” 1 e P 0 0
1 e P 1 1
1 e P 2 2
1!
2!
0.368
1
0.368
1 e P 3 3
1
0!
1
0.184
3!
1
0.061
Hashing Extensible
Es una combinación perfecta del hashing y de la búsqueda por la raíz Diseñado para localizar cualquier registro de datos como máximo en 2 accesos al medio externo de almacenamiento
37
Directorio o índice Página Hoja
En memoria se mantiene un directorio o índice de las páginas clasificadas según un número especifico de bits de la clave
Hashing Extensible
Se caracteriza por que el índice del hashing es dinámico: Puede expandirse y contraerse.
38
En número de entradas es potencia de 2
Cada entrada contiene punteros a páginas
Una página
Tiene tamaño fijo (M)
Contiene claves y sus registros o punteros a otros registros.
La función hashing usada puede ser cualquiera que sea apropiada.
Hashing Extensible
Tener en cuenta dos factores:
39
Un número d, que indica la porción de la dirección hash que vamos a utilizar como índice del directorio. Se le denomina “profundidad del directorio”. Un número d‟ , tal que d’ <= d , indica el número de dígitos de la dirección hash comunes a todos los registros de una página. Llamado “profundidad de una página”.
Tamaño del directorio es de 2d .
Hashing Extensible d Directorio d’
Páginas
40
División y Expansión
La división de una página se da cuando se ha excedido el factor de carga máximo establecido (M) para las páginas.
Si en el directorio se tiene dos o más entradas direccionando a la página que será dividida, no hay expansión.
Se incremente d‟ de la página que se dividió y este valor asume la nueva página.
La expansión del directorio ocurre, cuando sólo se tenga una entrada en el directorio
41
La división es de uno a dos.
Se debe de tomar más dígitos de la dirección (aumentar d ), por lo tanto, el tamaño del directorio se duplica.
División y Expansión
42
P.e.: en la estructura insertamos la clave 10010
Unión y Contracción
Operaciones inversas a la división y expansión. La unión consiste en la fusión de dos páginas, juntando las claves de las dos en una de ellas. Para poder fusionarlas se deben cumplir 3 condiciones:
El factor de carga de ambas sea menor o igual al 50%.
Las páginas deben tener el mismo valor de d„.
43
Las direcciones de los registros deben tener el valor común en los d' - 1 primeros dígitos.
Una vez fusionadas, una página se elimina, y el valor de d‟ de la otra disminuye en 1.
Unión y Contracción
44
Al ir uniendo las páginas, hay muchas entradas del directorio que apuntan a una misma página. La contracción del directorio ocurre cuando todos las páginas tienen un valor en d‟ menor al valor d del directorio.
El directorio se contrae a la mitad de su tamaño
Se combinan las entradas con d-1 bits iguales.
El valor d disminuye en 1.
Unión y Contracción
45
P.e.: eliminar la clave 10011 de la estructura