Está en la página 1de 16

INF134 Estructuras de Datos

Hashing

Prof. Hubert Hoffmann


Departamento de Informática
Universidad Técnica Federico Santa María
Complejidad Temporal de Búsqueda
• Búsqueda lineal  O(n)
• Búsqueda binaria  O(log2 n)

• ¿Es posible buscar con complejidad O(1)?

• En principio no es un sueño imposible

2
Un Ejemplo
• Los 100 empleados de una compañía tienen roles
de 0 a 99

• Se quiere tener acceso a los datos de los


empleados usando como clave el rol

• Si se almacenan los datos de los empleados en un


arreglo con los índices de 0 a 99, hay un acceso
directo usando el rol  búsqueda con complejidad
temporal O(1)

3
Relación Clave - Índice
• Roles de 00.000 a 99.999
• No se usará un arreglo de 100.000 para los 100
empleados
• Se puede usar los últimos 2 dígitos del rol como
índice en el arreglo
• Por ejemplo: rol 53.374  índice 74 en el arreglo y
rol 81.235  índice 35 en el arreglo
• Obs.: Los roles no están ordenados según su valor

4
Función Hash
• En un arreglo T hay disponible m celdas: int T[m]
• Existe una clave x universo U = {0, ..., N-1}
• La clave x se mapea a un índice del arreglo T[m]
• Existe una función hash h(x):
– h:U  {0, 1, ..., m-1}
– x  índice = h(x)
• Se podría almacenar algo en T[h(x)], si la celda está
desocupada: posible colisión por m N

5
Función Hash del Ejemplo
• índice = h(rol % 100)
• Por ejemplo: 53.304 % 100 es [04]
• La función hash calcula el índice para almacenar y
para recuperar los datos de un empleado
53.304 00
01
02
03
rol % 100 04
05
.... ….
99
[04]
6
Colisiones
• La función h(rol % 100) no garantiza que se calcule
para 2 roles diferentes 2 índice diferentes:
– 01.234 y 91.234  [34]
• Esta situación se llama colisión
• Evitar colisiones es el mayor desafío en el diseño de
una buena función hash
• Una buena función hash minimiza las colisiones
distribuyendo los datos en forma uniforme en el
arreglo

7
Resolver Colisiones – Linear Probing
• Un método simple para resolver colisiones es
Linear Probing
– Se almacena el dato en el siguiente espacio disponible
77.003 [00] disponible
[01] 14.001
[02] disponible
[03] 50.003
03 [04] 00.104
[05] disponible para 77.003
[06] 79.606
[07] disponible
[...] ....
[99] 33.099
8
Eliminación de Datos (1/3)
• La eliminación de datos puede producir un
problema en una siguiente búsqueda
• Se ingresa: 14.001 [00] disponible
00.104 [01] 14.001
50.003 [02] disponible
77.003 [03] 50.003
42.504 [04] 00.104
33.099 [05] 77.003
.... [06] 42.504
[07] disponible
[08] disponible
[...] ...
[99] 33.099
9
Eliminación de Datos (2/3)

• Se elimina 77.003, en seguida se busca 42.504


• [05] está disponible y 42.504 no se encuentra
14.001 [00] disponible
00.104 [01] 14.001
50.003 [02] disponible
77.003 [03] 50.003
42.504 [04] 00.104
33.099 [05] 77.003 quedaría disponible
.... [06] 42.504
[07] disponible
[08] disponible
[...] ...
[99] 33.099
10
Eliminación de Datos (3/3)
• La solución es crear un nuevo dato: borrado

• La función insertar trata celdas disponible y


borrado de la misma manera

• La función buscar termina la búsqueda al llegar a


una celda disponible, pero sigue buscando al llegar
a una celda borrado

11
Clustering
• Clustering se llama la tendencia que los datos no
quedan distribuidos uniformemente en el arreglo
• Clustering significa que varios datos se ubican cerca
de una ubicación
[00] disponible
[01] 14.001
[02] disponible
[03] 50.003
[04] 00.104
[05] 77.003
[06] 42.504
[07] disponible 03, 04, 05, 06 y 07
[08] disponible 08
[...] ...
[99] 33.099
12
Rehashing
• Linear Probing es un ejemplo para resolver
colisiones a través de rehashing
• Se usó h(rol % 100) + 1
• Linear Probing en general:
h(x % tamaño arreglo) + constante
• Lo ideal es tomar para la constante y el tamaño del
arreglo valores que no tienen un divisor común
• Por ejemplo es malo: h(x % 100) + 2

13
Quadratic Probing
• h(x % tamaño arreglo ± i2)
• El valor de i indica cuantas veces se aplicó la función
rehash
– 1. se suma 1
– 2. se suma 4
– 3. se suma 9
– etc.
• Si el tamaño del arreglo es una potencia de 2, se examinan
pocas celdas
• Si el tamaño del arreglo es (4 * constante + 3) quadratic
probing examina todas las celdas
14
Random Probing
• El incremento del valor hash es un número
aleatorio

• Es un buen método para eliminar clustering, pero


es más lento que otros métodos

15
Bucket y Chaining
• Un bucket es una colección de datos que se
almacena con el mismo índice

• Chaining es un método en el cual se genera una


lista enlazada con punteros para almacenar los
datos que producen el mismo valor hash

• Chaining es un método de hashing abierto, los


otros métodos son hashing cerrado

16

También podría gustarte