21
Copyright Cenfotec S.A. 2003 Prof. María Eugenia Ucrós, Julia Espinoza G. BISOFT-28 Estructuras de Datos 2 Hashing Instructor Esteban Meneses

BISOFT-28 Estructuras de Datos 2 · 2009-11-19 · • Una tabla hash es una estructura de datos que intenta hacer eficientes todas las operaciones básicas, de manera que su comportamiento

  • Upload
    others

  • View
    5

  • Download
    0

Embed Size (px)

Citation preview

Page 1: BISOFT-28 Estructuras de Datos 2 · 2009-11-19 · • Una tabla hash es una estructura de datos que intenta hacer eficientes todas las operaciones básicas, de manera que su comportamiento

Copyright Cenfotec S.A. 2003 Prof. María Eugenia Ucrós, Julia Espinoza G.

BISOFT-28Estructuras de Datos 2

Hashing

Instructor Esteban Meneses

Page 2: BISOFT-28 Estructuras de Datos 2 · 2009-11-19 · • Una tabla hash es una estructura de datos que intenta hacer eficientes todas las operaciones básicas, de manera que su comportamiento

Copyright Cenfotec S.A. 2003

• Las estructuras de datos lineales y jerárquicas tienen diferencias en la eficiencia de las operaciones básicas: insertar, eliminar, buscar.

• Por ejemplo:– Listas enlazadas desordenadas: insertar O(1),

eliminar O(n), buscar O(n).– Vector ordenado: insertar O(log n), eliminar

O(log n), buscar O(log n).– Árbol binario de búsqueda: insertar O(log n),

eliminar O(log n), buscar O(log n).• Sería ideal encontrar una estructura donde todas esas

funciones fueran casi constantes.

Introducción

Page 3: BISOFT-28 Estructuras de Datos 2 · 2009-11-19 · • Una tabla hash es una estructura de datos que intenta hacer eficientes todas las operaciones básicas, de manera que su comportamiento

Copyright Cenfotec S.A. 2003

• Una tabla hash es una estructura de datos que intenta hacer eficientes todas las operaciones básicas, de manera que su comportamiento sea casi constante.

• Los elementos que se insertan en una tabla hash se denominan llaves.

• A cada llave le corresponde una posición en la tabla hash.

Tabla hash

Page 4: BISOFT-28 Estructuras de Datos 2 · 2009-11-19 · • Una tabla hash es una estructura de datos que intenta hacer eficientes todas las operaciones básicas, de manera que su comportamiento

Copyright Cenfotec S.A. 2003

• Asocia una llave con una entrada de la tabla.

Función hash

x

0123456789

hash(x)

Page 5: BISOFT-28 Estructuras de Datos 2 · 2009-11-19 · • Una tabla hash es una estructura de datos que intenta hacer eficientes todas las operaciones básicas, de manera que su comportamiento

Copyright Cenfotec S.A. 2003

• Tamaño de la tabla: N• Usar la función modulo (residuo de la división

entera).•

Ejemplo 1: Tabla con elementos enteros

hash x =xmod N0123456

X=19

X=50

Page 6: BISOFT-28 Estructuras de Datos 2 · 2009-11-19 · • Una tabla hash es una estructura de datos que intenta hacer eficientes todas las operaciones básicas, de manera que su comportamiento

Copyright Cenfotec S.A. 2003

int hash(int key, int tableSize){ return key % tableSize;}

int hash2(int key, int tableSize){ return (key+2) % tableSize;}

Ejemplo 1: Código C++

[Tomado de Data Structures and Algorithm Analysis in C++, Mark Allen Weiss]

Page 7: BISOFT-28 Estructuras de Datos 2 · 2009-11-19 · • Una tabla hash es una estructura de datos que intenta hacer eficientes todas las operaciones básicas, de manera que su comportamiento

Copyright Cenfotec S.A. 2003

Ejemplo 2: Tabla con elementos hilera

• Tamaño de la tabla: N• Usar el valor entero de los caracteres: código ASCII.• Representar la hilera como un vector de caracteres.

• hash x =∑i=0

N−1

x [i ]mod N0123456

X=¨amigos¨

X=¨hola¨

Page 8: BISOFT-28 Estructuras de Datos 2 · 2009-11-19 · • Una tabla hash es una estructura de datos que intenta hacer eficientes todas las operaciones básicas, de manera que su comportamiento

Copyright Cenfotec S.A. 2003

int hash(string &key, int tableSize){ int hashVal = 0; for(int i=0; key.length(); i++) hashVal += key[i]; return hashVal % tableSize;}

int hash2(string &key, int tableSize){ return (key[0] + 27*key[1] + 729*key[2])

% tableSize;}

Ejemplo 2: Código C++

int hash(string &key, int tableSize){ int hashVal = 0; for(int i=0; key.length(); i++) hashVal += key[i]; return hashVal % tableSize;}

int hash2(string &key, int tableSize){ return (key[0] + 27*key[1] + 729*key[2])

% tableSize;}[Tomado de Data Structures and Algorithm Analysis in C++, Mark Allen Weiss]

Page 9: BISOFT-28 Estructuras de Datos 2 · 2009-11-19 · • Una tabla hash es una estructura de datos que intenta hacer eficientes todas las operaciones básicas, de manera que su comportamiento

Copyright Cenfotec S.A. 2003

int hash(string &key, int tableSize){ int hashVal = 0; for(int i=0; key.length(); i++) hashVal += key[i]; return hashVal % tableSize;}

int hash2(string &key, int tableSize){ return (key[0] + 27*key[1] + 729*key[2])

% tableSize;}

Ejemplo 2: Código C++

int hash3(string &key, int tableSize){ int hashVal = 0; for(int i=0; key.length(); i++) hashVal = 37*hashVal + key[i]; hashVal %= tableSize; if(hashVal < 0) hashVal += tableSize; return hashVal;}

[Tomado de Data Structures and Algorithm Analysis in C++, Mark Allen Weiss]

Page 10: BISOFT-28 Estructuras de Datos 2 · 2009-11-19 · • Una tabla hash es una estructura de datos que intenta hacer eficientes todas las operaciones básicas, de manera que su comportamiento

Copyright Cenfotec S.A. 2003

• Cada llave se asocia a una entrada 0..TamTabla-1.• Factor de carga: razón de elementos en la tabla

entre el tamaño de la tabla.• Colisión: dos llaves son asociadas a la misma

entrada de la tabla hash.

• Resolución de colisiones: algoritmo para resolver el problema de la colisión.

Colisiones

0123456

X=17

X=10

Page 11: BISOFT-28 Estructuras de Datos 2 · 2009-11-19 · • Una tabla hash es una estructura de datos que intenta hacer eficientes todas las operaciones básicas, de manera que su comportamiento

Copyright Cenfotec S.A. 2003

• Cada entrada de la tabla hash tiene una lista enlazada con todos los elementos que colisionan en esa entrada.

Encadenamiento Separado

0123456

17 1011

Page 12: BISOFT-28 Estructuras de Datos 2 · 2009-11-19 · • Una tabla hash es una estructura de datos que intenta hacer eficientes todas las operaciones básicas, de manera que su comportamiento

Copyright Cenfotec S.A. 2003

• Si hay una colisión, entonces se aplica nuevamente una función de hash para determinar un posible lugar donde se colocará el elemento conflictivo.

• Se aplica h0, h

1,h

2,... hasta que se encuentre un lugar

disponible.

Direccionamiento Abierto

hi x=hash x f i mod N

Page 13: BISOFT-28 Estructuras de Datos 2 · 2009-11-19 · • Una tabla hash es una estructura de datos que intenta hacer eficientes todas las operaciones básicas, de manera que su comportamiento

Copyright Cenfotec S.A. 2003

Prueba Lineal

f i =i

0123456

X=17

X=10

X=11

Orden de las inserciones: 11, 10, 17

Page 14: BISOFT-28 Estructuras de Datos 2 · 2009-11-19 · • Una tabla hash es una estructura de datos que intenta hacer eficientes todas las operaciones básicas, de manera que su comportamiento

Copyright Cenfotec S.A. 2003

Prueba Cuadrática

f i =i2

0123456

X=17

X=10

X=11

Orden de las inserciones: 11, 10, 17

Page 15: BISOFT-28 Estructuras de Datos 2 · 2009-11-19 · • Una tabla hash es una estructura de datos que intenta hacer eficientes todas las operaciones básicas, de manera que su comportamiento

Copyright Cenfotec S.A. 2003

Doble Hashing

f i =hash2 i

0123456

X=17

X=10

X=11

Orden de las inserciones: 11, 10, 17

hash2i =i∗3i

Page 16: BISOFT-28 Estructuras de Datos 2 · 2009-11-19 · • Una tabla hash es una estructura de datos que intenta hacer eficientes todas las operaciones básicas, de manera que su comportamiento

Copyright Cenfotec S.A. 2003

• ¿Qué sucede cuando no se puede insertar un elemento debido a que todas las posiciones colisionan?– Duplicar el tamaño de la tabla y volver a asociar los

elementos.

Rehashing

Tabla Hash Inicial Tabla

HashFinal

Llaves

Page 17: BISOFT-28 Estructuras de Datos 2 · 2009-11-19 · • Una tabla hash es una estructura de datos que intenta hacer eficientes todas las operaciones básicas, de manera que su comportamiento

Copyright Cenfotec S.A. 2003

• La función de hash se va modificando de acuerdo al número de elementos y al comportamiento de la tabla.

• Hashing extendible.– Uso de un directorio con M registros.– Concatenación de múltiples tablas hash.

Hashing dinámico

Page 18: BISOFT-28 Estructuras de Datos 2 · 2009-11-19 · • Una tabla hash es una estructura de datos que intenta hacer eficientes todas las operaciones básicas, de manera que su comportamiento

Copyright Cenfotec S.A. 2003

Directorio

00 01 10 11

000100

001000

001010

001011

010100

011000

100000

101000

101100

101110

111000

111001

Page 19: BISOFT-28 Estructuras de Datos 2 · 2009-11-19 · • Una tabla hash es una estructura de datos que intenta hacer eficientes todas las operaciones básicas, de manera que su comportamiento

Copyright Cenfotec S.A. 2003

• Ejercicio 1 Inserte en una tabla hash de tamaño 10, los elementos: 89,18,49,58,69,50,21,35. Utilice la prueba lineal, prueba cuadrática y el doble hashing con la función f(i)=i*3i.

• Ejercicio 2 Muestre el resultado de insertar las llaves: 10111101, 00000010, 10011011, 10111110, 01111111,01010001, 10010110, 00001011, 11001111, 10011110, 11011011, 00101011, 01100001, 11110000, 01101111 en una tabla con hashing dinámico y M = 4.

Ejercicios

Page 20: BISOFT-28 Estructuras de Datos 2 · 2009-11-19 · • Una tabla hash es una estructura de datos que intenta hacer eficientes todas las operaciones básicas, de manera que su comportamiento

Copyright Cenfotec S.A. 2003

• Ejercicio 3 Dadas las siguientes inserciones: 4371, 1323, 6173, 4199, 4344, 9679, 1989 en una tabla con 10 elementos y función de hash modular, muestre el resultado usando:a) Encadenamiento separado.b) Prueba lineal.c) Prueba cuadrática.d) Doble hashing con hash2(x)=7-(x mod 7)

Ejercicios (cont.)

Page 21: BISOFT-28 Estructuras de Datos 2 · 2009-11-19 · • Una tabla hash es una estructura de datos que intenta hacer eficientes todas las operaciones básicas, de manera que su comportamiento

Copyright Cenfotec S.A. 2003

FIN