51
Universidad de Cuenca Facultad de Ingeniería Escuela de Ingeniería de Sistemas Programación III Tema: Tablas de Dispersión Por: Jonnathan Peñaranda

Programación 3: tablas de dispersión

Embed Size (px)

Citation preview

Page 1: Programación 3: tablas de dispersión

Universidad de CuencaFacultad de Ingeniería

Escuela de Ingeniería de SistemasProgramación III

Tema: Tablas de Dispersión

Por: Jonnathan Peñaranda

Page 2: Programación 3: tablas de dispersión

CONTENIDO• Tablas de dispersión.• Funciones de dispersión.• Colisiones y resolución de colisiones.• Problema planteado.• Conclusión.

Page 3: Programación 3: tablas de dispersió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

Page 4: Programación 3: tablas de dispersió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

Page 5: Programación 3: tablas de dispersión

IMPLEMENTACIÓN EN JAVA

Page 6: Programación 3: tablas de dispersión

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.

Page 7: Programación 3: tablas de dispersión

FUNCIONES DE DISPERSIÓN

tamTabla = mHash(x): [0,m-1]

String clave = “a01”;

int clave = ASCII(a) + ASCII(0)+

ASCII(1);

Page 8: Programación 3: tablas de dispersión

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.

Page 9: Programación 3: tablas de dispersión

TIPOS DE FUNCIONES HASH• Aritmética modular.• Plegamiento.•Mitad del cuadrado.•Método de la multiplicación

Page 10: Programación 3: tablas de dispersió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

Page 11: Programación 3: tablas de dispersión

Ejemplo:m= 1000Elm1 = 245643Elm2 = 245221Elm3 = 257135

Page 12: Programación 3: tablas de dispersión

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

Page 13: Programación 3: tablas de dispersión

Ejemplo:m= 1000Elm1 = 245643Elm2 = 245221Elm3 = 257135

Page 14: Programación 3: tablas de dispersión

MITAD DEL CUADRADOtamTabla = 51;clave = 45;

clave^2 = 2025;

2 0 2 5

h(x) = 25;

• Implementación en Java

Page 15: Programación 3: tablas de dispersión

Ejemplo:m= 1000Elm1 = 245643Elm2 = 245221Elm3 = 257135

Page 16: Programación 3: tablas de dispersión

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

Page 17: Programación 3: tablas de dispersión

Ejemplo:m= 1000Elm1 = 245643Elm2 = 245221Elm3 = 257135

Page 18: Programación 3: tablas de dispersión

OPERACIONES DE LAS TABLAS DE DISPERSIÓN

Page 19: Programación 3: 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.

Page 20: Programación 3: tablas de dispersión

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

Page 21: Programación 3: tablas de dispersión

MODELOS PARA RESOLVER COLISIONES.• La exploración de direcciones• Exploración lineal• Exploración cuadrática

• Direccionamiento enlazado.

Page 22: Programación 3: tablas de dispersión

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.

Page 23: Programación 3: tablas de dispersión

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

Page 24: Programación 3: tablas de dispersión

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

Page 25: Programación 3: tablas de dispersión

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

Page 26: Programación 3: tablas de dispersión

IMPLEMENTACIÓN EN JAVA

Page 27: Programación 3: tablas de dispersión

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

Page 28: Programación 3: tablas de dispersión

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

Page 29: Programación 3: tablas de dispersión

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

Page 30: Programación 3: tablas de dispersión

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

Page 31: Programación 3: tablas de dispersión

IMPLEMENTACIÓN EN JAVA

Page 32: Programación 3: tablas de dispersión

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

Page 33: Programación 3: tablas de dispersión

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

Page 34: Programación 3: tablas de dispersión

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

Page 35: Programación 3: tablas de dispersión

TABLAS DE DISPERSIÓN ENLAZADAS EN JAVA

Page 36: Programación 3: tablas de dispersión

OPERACIONES DE TABLAS DE DISPERSIÓN ENLAZADAS

INSERTAR

Page 37: Programación 3: tablas de dispersión

OPERACIONES DE TABLAS DE DISPERSIÓN ENLAZADAS

INSERTAR

Page 38: Programación 3: tablas de dispersión

OPERACIONES DE TABLAS DE DISPERSIÓN ENLAZADAS

BUSCAR

Page 39: Programación 3: tablas de dispersión

OPERACIONES DE TABLAS DE DISPERSIÓN ENLAZADAS

BUSCAR

Page 40: Programación 3: tablas de dispersión

OPERACIONES DE TABLAS DE DISPERSIÓN ENLAZADAS

ELIMINAR

Page 41: Programación 3: tablas de dispersión

OPERACIONES DE TABLAS DE DISPERSIÓN ENLAZADAS

ELIMINAR

Page 42: Programación 3: tablas de dispersión

PROBLEMA.

Page 43: Programación 3: tablas de dispersión

PROBLEMA.

Page 44: Programación 3: tablas de dispersión

PROBLEMA.

Page 45: Programación 3: tablas de dispersión

PROBLEMA.

Page 46: Programación 3: tablas de dispersión

PROBLEMA.

Page 47: Programación 3: tablas de dispersión

PROBLEMA.

Page 48: Programación 3: tablas de dispersión

PROBLEMA.

Page 49: Programación 3: tablas de dispersión

PROBLEMA.

Page 50: Programación 3: tablas de dispersión

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.

Page 51: Programación 3: tablas de dispersión

REFERENCIA.• Joyanes Aguilar, L., & Zohonero Martínez, I. (2008).

Estructura de datos en Java. McGraw-Hill España.