programación 3: tablas de dispersión
TRANSCRIPT
Universidad de CuencaFacultad de Ingeniería
Escuela de Ingeniería de SistemasProgramación III
Tema: Tablas de Dispersión
Por: Jonnathan Peñaranda
CONTENIDO• Tablas de dispersión.• Funciones de dispersión.• Colisiones y resolución de colisiones.• Problema planteado.• Conclusión.
TABLAS DE DISPERSIÓN (TABLAS HASH)Son estructuras
de datos
Se usan en secuencia de
elementosValor clave
Complejidad constante: O(1)
Su finalidad
Inserción
Búsqueda
Eliminación
• La tabla de dispersión es un vector de tamaño fijo m,• Contiene las claves de los elementos, • Consta de una función hash, que transforma el campo clave elegido,
en un valor entero dentro del rango del vector. pos Elemento
0
1
2
4
.
m-2
m-1
FUNCION_HASH( clave)
Elemento 1
Elemento 2
Elemento 3
clave1
clave2
clave3
Elemento 1
Elemento 2
Elemento 3
IMPLEMENTACIÓN EN JAVA
FUNCIONES DE DISPERSIÓN
Convierte el dato considerado campo clave en un índice dentro
del rango de definición del vector.
Lo ideal es determinar
posición en un almacenamiento
secuencial sin desperdiciar
mucho espacio.
FUNCIONES DE DISPERSIÓN
tamTabla = mHash(x): [0,m-1]
String clave = “a01”;
int clave = ASCII(a) + ASCII(0)+
ASCII(1);
CRITERIOS PARA SELECCIONAR UNA FUNCIÓN. • Fácil de evaluar y complejidad O(1)
• h(x) debe distribuir uniformemente las posiciones de los elementos sobre el conjunto de direcciones de memoria , de modo que minimice el numero de colisiones
• Preparar siempre resolución de colisiones para cuando éstas se produzcan.
TIPOS DE FUNCIONES HASH• Aritmética modular.• Plegamiento.•Mitad del cuadrado.•Método de la multiplicación
ARITMÉTICA MODULAR• La función hash mas simple
utiliza el operador.• Genera valores calculando el
resto de la división entera entre la clave x y el tamaño de la tabla m.
h(x)= x % m
• Implementación en Java
Ejemplo:m= 1000Elm1 = 245643Elm2 = 245221Elm3 = 257135
PLEGAMIENTO• Clave demasiado grande.
• Consiste en partir la clave x en varias partes ()
h(x) = x1 + x2 + x3 + x4 + ……..+ xr;h)x) = valor entero ;
• Implementación en Java
Ejemplo:m= 1000Elm1 = 245643Elm2 = 245221Elm3 = 257135
MITAD DEL CUADRADOtamTabla = 51;clave = 45;
clave^2 = 2025;
2 0 2 5
h(x) = 25;
• Implementación en Java
Ejemplo:m= 1000Elm1 = 245643Elm2 = 245221Elm3 = 257135
MÉTODO DE LA MULTIPLICACIÓN • La dispersión genera direcciones
en tres pasos:
1. A*clave (0 < A < 1).
2. d = A*x – ParteEntera(A*x).
3. h(x) = ParteEntera(m*d).
• Implementación en Java
Donald E. Knuth sugiere que A ≈ ( √ 5 − 1)/2 = 0.61680339887...
Ejemplo:m= 1000Elm1 = 245643Elm2 = 245221Elm3 = 257135
OPERACIONES DE LAS TABLAS DE DISPERSIÓN
Además• Dos claves diferentes, c1 y c2, den la misma dirección, h1(c1) =
h2(c2). Se produce una colisión.
• Direccionamiento hash implica: la elección de la función hash y resolución de colisiones.
COLISIONES Y RESOLUCIÓN DE COLISIONES
pos Elemento
0
1
2
4
.
m-2
m-1
FUNCION_HASH (clave)
Elemento 1
Elemento 2
clave1
clave2
Elemento1 Elemento 2
COLISIÓN
MODELOS PARA RESOLVER COLISIONES.• La exploración de direcciones• Exploración lineal• Exploración cuadrática
• Direccionamiento enlazado.
EXPLORACIÓN DE DIRECCIONES.• Las colisiones se resuelven explorando consecutivamente en una
secuencia de direcciones hasta que se encuentra una posición libre(hueco).
• Importante, inicializar todas las posiciones de la tabla con un valor que indique vacío. Por ejemplo null.
• Al insertar un elemento, si se produce una colisión, la secuencia de exploración termina cuando se encuentra una dirección vacía.
EXPLORACIÓN LINEAL• Forma mas simple y primitiva de resolver una colisión entre claves.• La forma de resolver la colisión consiste en buscar la primera posición
disponible que siga a la posición que retorna la función hash.pos Elemento
0
1 OCUPADO
2 OCUPADO
4
. OCUPADO
m-2
m-1
FUNCION_HASH (Elemento)
Elemento
EXP_LINEAL( pos)
¿Está ocupado?
SI
EXPLORACIÓN LINEAL• Forma mas simple y primitiva de resolver una colisión entre claves.• La forma de resolver la colisión consiste en buscar la primera posición
disponible que siga a la posición que retorna la función hash.pos Elemento
0
1 OCUPADO
2 OCUPADO
4
. OCUPADO
m-2
m-1
FUNCION_HASH (Elemento)
Elemento
EXP_LINEAL( pos)
¿Está ocupado?
SI
EXPLORACIÓN LINEAL• Forma mas simple y primitiva de resolver una colisión entre claves.• La forma de resolver la colisión consiste en buscar la primera posición
disponible que siga a la posición que retorna la función hash.pos Elemento
0
1 OCUPADO
2 OCUPADO
4
. OCUPADO
m-2
m-1
FUNCION_HASH (Elemento)
EXP_LINEAL( pos)
¿Está ocupado?
NO
Elemento
Elemento
IMPLEMENTACIÓN EN JAVA
EXPLORACIÓN CUADRÁTICA
FUNCION_HASH (clave)
EXP_CUADRATICA( POS)
¿Está ocupado? SI
ELEMENTO
POS ELEMENTOS
0 OCUPADO
1 OCUPADO
2
3 OCUPADO
4 OCUPADO
5
6 OCUPADO
7
8
9
10 OCUPADO
p
clave
EXPLORACIÓN CUADRÁTICA
FUNCION_HASH (clave)
EXP_CUADRATICA( POS)
¿Está ocupado? SI
ELEMENTO
POS ELEMENTOS
0 OCUPADO
1 OCUPADO
2
3 OCUPADO
4 OCUPADO
5
6 OCUPADO
7
8
9
10 OCUPADO
clavep+1
p
EXPLORACIÓN CUADRÁTICA
FUNCION_HASH (clave) EXP_CUADRATICA( POS)
¿Está ocupado? SI
ELEMENTO
POS ELEMENTOS
0 OCUPADO
1 OCUPADO
2
3 OCUPADO
4 OCUPADO
5
6 OCUPADO
7
8
9
10 OCUPADO
p+4
clavep+1
p
EXPLORACIÓN CUADRÁTICA
FUNCION_HASH (clave)
EXP_CUADRATICA( POS)
¿Está ocupado? NO
ELEMENTO
POS ELEMENTOS
0 OCUPADO
1 OCUPADO
2
3 OCUPADO
4 OCUPADO
5
6 OCUPADO
7
8
9
10 OCUPADOp+9
clave
ELEMENTO
Recorrido
p + i^2
i = 0, 1, 2, …
p+4
p+1p
IMPLEMENTACIÓN EN JAVA
DIRECCIONAMIENTO ENLAZADO.• Se basa en utilizar listas enlazadas, de tal forma que en cada lista se
colocan los elementos que tienen la misma dirección hash.• Todos los elementos que colisionan: h(x1) = h(x2) = h(x3) … van a
estar ubicados en la misma lista enlazada.pos Elemento *0124 . 11
12
FUNCION_HASH (clave)
Elemento 1clave
Elemento 2
DIRECCIONAMIENTO ENLAZADO.• Se basa en utilizar listas enlazadas, de tal forma que en cada lista se
colocan los elementos que tienen la misma dirección hash.• Todos los elementos que colisionan: h(x1) = h(x2) = h(x3) … van a
estar ubicados en la misma lista enlazada.pos Elemento *0124 . 11
12
FUNCION_HASH (clave) Elemento 1
clave
clave
null
Elemento 2
Elemento 1
DIRECCIONAMIENTO ENLAZADO.• Se basa en utilizar listas enlazadas, de tal forma que en cada lista se
colocan los elementos que tienen la misma dirección hash.• Todos los elementos que colisionan: h(x1) = h(x2) = h(x3) … van a
estar ubicados en la misma lista enlazada.pos Elemento *0124 . 11
12
FUNCION_HASH (clave) Elemento 1
clave
Elemento 2 nullnull
Elemento 2
TABLAS DE DISPERSIÓN ENLAZADAS EN JAVA
OPERACIONES DE TABLAS DE DISPERSIÓN ENLAZADAS
INSERTAR
OPERACIONES DE TABLAS DE DISPERSIÓN ENLAZADAS
INSERTAR
OPERACIONES DE TABLAS DE DISPERSIÓN ENLAZADAS
BUSCAR
OPERACIONES DE TABLAS DE DISPERSIÓN ENLAZADAS
BUSCAR
OPERACIONES DE TABLAS DE DISPERSIÓN ENLAZADAS
ELIMINAR
OPERACIONES DE TABLAS DE DISPERSIÓN ENLAZADAS
ELIMINAR
PROBLEMA.
PROBLEMA.
PROBLEMA.
PROBLEMA.
PROBLEMA.
PROBLEMA.
PROBLEMA.
PROBLEMA.
CONCLUSIÓN.
• tamTabla = numero_primo mayor, aunque cercano al numero de elementos que se tiene previsto almacenar en la tabla.• Para resolver una colisión, lo mejor seria que se utilizara el
direccionamiento enlazado, y de este modo el tamaño de la tabla sería irrelevante puesto que la estructura podrá almacenar los elementos de forma dinámica.
REFERENCIA.• Joyanes Aguilar, L., & Zohonero Martínez, I. (2008).
Estructura de datos en Java. McGraw-Hill España.