tablas de hash. muchas aplicaciones requieren un conjunto dinámico que soporte las operaciones de...

21
Tablas de Hash Tablas de Hash

Upload: cleto-pantoja

Post on 23-Jan-2016

221 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: Tablas de Hash. Muchas aplicaciones requieren un conjunto dinámico que soporte las operaciones de un diccionario: Inserción, Búsqueda, Eliminación. Es

Tablas de Hash

Tablas de Hash

Page 2: Tablas de Hash. Muchas aplicaciones requieren un conjunto dinámico que soporte las operaciones de un diccionario: Inserción, Búsqueda, Eliminación. Es

Tablas de HashTablas de Hash

• Muchas aplicaciones requieren un conjunto dinámico que soporte las operaciones de un diccionario: Inserción, Búsqueda, Eliminación.

• Es posible hacer uso de una lista enlazada con un tiempo O(n).

• Otra alternativa es el uso de arreglos que nos permiten acceso a sus elementos en orden O(1). (Tablas de Direccionamiento Directo).

• Una opción sería usar un arreglo tan grande como el rango de posibles claves, de tal manera que la clave del elemento determinara su posición en la tabla. La desventaja es el espacio de memoria requerido en tal estrategia.

Page 3: Tablas de Hash. Muchas aplicaciones requieren un conjunto dinámico que soporte las operaciones de un diccionario: Inserción, Búsqueda, Eliminación. Es

Tablas de HashTablas de Hash

Universo de ClavesU

25 8 0

6

3

47

9

Claves Almacenadas

(K)

1

1

9

8

7

6

5

4

3

2

1

0

3

5

7

9

Tablas de Direccionamiento Directo

Page 4: Tablas de Hash. Muchas aplicaciones requieren un conjunto dinámico que soporte las operaciones de un diccionario: Inserción, Búsqueda, Eliminación. Es

Tablas de HashTablas de HashTablas de Direccionamiento Directo

onstante

MAXCLAVES = |U|;tipo

RangoClaves = 0..MAXCLAVES-1;

TipoClave = Entero;

TipoInfo = ?;

TipoElem = registro clave: TipoClave; info: TipoInfo; fregistro;  PTR_TipoElem = apuntador a TipoElem;  TDD = arreglo [RangoClaves] de PTR_TipoElem;

proc insertarTDD(var T: TDD; x: TipoClave; e: TipoInfo);

proc eliminarTDD(var T: TDD; x: TipoClave);

func buscarTDD(T: TDD; x: TipoClave): TipoElem;

Estructura de Datos y Operaciones:

Page 5: Tablas de Hash. Muchas aplicaciones requieren un conjunto dinámico que soporte las operaciones de un diccionario: Inserción, Búsqueda, Eliminación. Es

Tablas de HashTablas de Hash

¿Qué ocurre si el conjunto de las posibles claves es mucho más grande que las claves efectivamente almacenadas?

Se requeriría una estructura muy grande para almacenar un un número relativamente pequeño de elementos

Mal uso del espacio de almacenamiento

Page 6: Tablas de Hash. Muchas aplicaciones requieren un conjunto dinámico que soporte las operaciones de un diccionario: Inserción, Búsqueda, Eliminación. Es

Tablas de HashTablas de Hash

¿Alternativa de solución?

Otra opción es usar un arreglo menor, y convertir las claves en uso en índices de la tabla a través de una función. Esta función de mapeo es la función hash. La tabla así organizada es la tabla hash.

h(k) = i

h: Función de hash

k: Clave

i: Dirección o índice en la tabla

Tablas de Hash

Page 7: Tablas de Hash. Muchas aplicaciones requieren un conjunto dinámico que soporte las operaciones de un diccionario: Inserción, Búsqueda, Eliminación. Es

Tablas de HashTablas de Hash

Universo de ClavesU

25 8 0

6

3

47

9

Claves Almacenadas

(K)

1

Función de hash o

función de mapeo

Tabla de Hash

9

8

7

6

5

4

3

2

1

0

Tablas de Hash

Page 8: Tablas de Hash. Muchas aplicaciones requieren un conjunto dinámico que soporte las operaciones de un diccionario: Inserción, Búsqueda, Eliminación. Es

Tablas de HashTablas de Hash

Como es posible que dos claves conduzcan al mismo mapeo, es decir, que la función de hash produzca el mismo resultado para dos claves diferentes (colisión).

Tablas de Hash

• Hashing Abierto: Cada entrada de la tabla contiene una lista enlazada en la cual se almacenan todos elementos que, de acuerdo a la función de hash, correspondan a dicha posición arreglo.

• Hashing Cerrado: Cada entrada de la tabla contiene un solo elemento. Cuando ocurre una colisión, ésta se soluciona buscando celdas alternativas hasta encontrar una vacía (dentro de la misma tabla)

Es necesario buscar formas para resolver esta situación. Hay básicamente dos estrategias:

Colisión: k1 k2 ; h(k1) = h (k2)

Page 9: Tablas de Hash. Muchas aplicaciones requieren un conjunto dinámico que soporte las operaciones de un diccionario: Inserción, Búsqueda, Eliminación. Es

Tablas de HashTablas de HashFunciones de Hash

Una función hash (h) convierte una clave en una dirección (índice) dentro del arreglo:  

h(k) i; k {1, 2, . . ., |U| }; i {1, 2, . . ., |MAX_TABLA| – 1}

• Producir tan pocas colisiones como sea posible.

• Distribuir las claves de manera uniforme en la tabla de hash (hash uniforme).

• Ser fácil y rápida de calcular.

La función h debe cumplir en lo posible las siguientes condiciones:

Page 10: Tablas de Hash. Muchas aplicaciones requieren un conjunto dinámico que soporte las operaciones de un diccionario: Inserción, Búsqueda, Eliminación. Es

Tablas de HashTablas de HashFunciones de Hash

• Como el rango de la función de hash es un número natural, en el conjunto {1, 2, . . ., |MAX_TABLA| – 1}, esta debe transformar la clave en un número natural en ese rango.

• Si se trata de claves enteras, el problema está más o menos resuelto.

• Si se trata de secuencia de caracteres o strings, se puede interpretar cada caracter como un número en base 128 (los números ASCII van del 0 al 127) y el string completo como un número en base 128. Así por ejemplo la clave “pt” puede ser transformada a (112 *1281 + 116 * 1280) = 14452. (ASCII(p)=112 y ASCII(t)=116)

Page 11: Tablas de Hash. Muchas aplicaciones requieren un conjunto dinámico que soporte las operaciones de un diccionario: Inserción, Búsqueda, Eliminación. Es

Tablas de HashTablas de HashFunciones de Hash

Método de la división:

• Este método consiste en tomar el resto de la división por el número de entradas de la tabla. MAX_TABLA. Así

h(k) = k mod MAX_TABLA

• No se recomienda que MAX_TABLA sea una potencia de 2.

• Lo más recomendable es que MAX_TABLA sea un número primo inferior al número total de elementos y no muy cercano a una potencia de dos.

• Ventaja: Fácil de calcular.

Page 12: Tablas de Hash. Muchas aplicaciones requieren un conjunto dinámico que soporte las operaciones de un diccionario: Inserción, Búsqueda, Eliminación. Es

Tablas de HashTablas de HashFunciones de Hash

Método de la multiplicación:

Este método opera en dos pasos:

• Se multiplica la clave por una constante A en el rango 0 < A < 1 y se extrae la parte fraccionaria de k*A.

• Se multiplica este valor por el número de entradas de la tabla y se toma el piso o se trunca el resultado.

h(k) = MAX_TABLA *(k*A mod 1)

donde mod 1 debe ser interpretado como k*A - k*A

Una ventaja de este método es que el valor de MAX_TABLA no es crítico. El método trabaja bien con cualquier valor de A, pero se recomienda

A ~ (sqrt(5)-1)/2 ~ 0,6180339887

Page 13: Tablas de Hash. Muchas aplicaciones requieren un conjunto dinámico que soporte las operaciones de un diccionario: Inserción, Búsqueda, Eliminación. Es

Tablas de HashTablas de HashHash Abierto

Universo de Claves

U25 8 0

6

3

47

9

Claves Almacenad

as (K)

1

Función de hash

o función

de mapeo

Tabla de Hash

9

8

7

6

5

4

3

2

1

0

Page 14: Tablas de Hash. Muchas aplicaciones requieren un conjunto dinámico que soporte las operaciones de un diccionario: Inserción, Búsqueda, Eliminación. Es

Tablas de HashTablas de HashHash Abierto

La hash abierto, también llamada encadenamiento separado, consiste en tener en cada posición de la tabla, una lista de los elementos que, de acuerdo a la función de hash, correspondan a dicha posición.

El peor caso de hashing abierto nos conduce a una lista con todas las claves en una única lista. El peor caso para búsqueda es así O(n).

Page 15: Tablas de Hash. Muchas aplicaciones requieren un conjunto dinámico que soporte las operaciones de un diccionario: Inserción, Búsqueda, Eliminación. Es

Tablas de HashTablas de HashHash Abierto

onstante

MAX_TABLA = ?; tipo

RangoClaves = 0.. MAX_TABLA - 1;

TipoClave = Entero;

TipoInfo = ?;

TipoElem = registro clave: TipoClave; info: TipoInfo; fregistro;   THAbr = arreglo [RangoClaves] de Lista[TipoElem];

proc iniciaTHAbr(var T: THAbr);

func estaTHAbr (T: THAbr; x: TipoClave): booleano;

proc insertarTHAbr(var T: THAbr; x: TipoClave; e: TipoInfo);

proc eliminarTHAbr(var T: THAbr; x: TipoClave);

func buscarTHAbr(T: THAbr; x: TipoClave): TipoElem;

Estructura de Datos y Operaciones:

Page 16: Tablas de Hash. Muchas aplicaciones requieren un conjunto dinámico que soporte las operaciones de un diccionario: Inserción, Búsqueda, Eliminación. Es

Tablas de HashTablas de HashHash Cerrado

Universo de Claves

UK5

K3

K7

K9

Claves Almacenad

as (K)

K1

Función de hash

o función

de mapeo

Tabla de Hash Cerrado

9

8

7

6

5

4

3

2

1

0

K6

K4K2

K0

K8

Page 17: Tablas de Hash. Muchas aplicaciones requieren un conjunto dinámico que soporte las operaciones de un diccionario: Inserción, Búsqueda, Eliminación. Es

Tablas de HashTablas de HashHash Cerrado

El hash cerrado soluciona las colisiones buscando celdas alternativas hasta encontrar una vacía (dentro de la misma tabla). Se va buscando en las celdas: d0(k), d1(k), d2(k), ..., donde

di(k) = (h(k) + f(i)) mod MAX_TABLA

h(k, i) = (h’(k) + f(i)) mod MAX_TABLA

Cuando se busca una clave, se examinan varias celdas de la tabla hasta que se encuentra la clave buscada, o es claro que esta no está almacenada. La inserción se efectúa probando la tabla hasta encontrar un espacio vacío.

Page 18: Tablas de Hash. Muchas aplicaciones requieren un conjunto dinámico que soporte las operaciones de un diccionario: Inserción, Búsqueda, Eliminación. Es

Tablas de HashTablas de HashHash Cerrado

Ventaja: Elimina totalmente los apuntadores. Se libera así espacio de memoria, el que puede ser usado en más entradas de la tabla.

Desventaja: Si la aplicación realiza eliminaciones frecuentes, puede degradarse el rendimiento de la misma. Se requiere una tabla más grande. Para garantizar el funcionamiento correcto, se requiere que la tabla de hash tenga, por lo menos, el 50% del espacio disponible.

Dentro de la dispersión cerrada hay tres estrategias distintas para localizar posiciones alternativas en la tabla: la exploración lineal, la exploración cuadrática y la dispersión doble. Cada una de ellas implica una función f(i) diferente.

Page 19: Tablas de Hash. Muchas aplicaciones requieren un conjunto dinámico que soporte las operaciones de un diccionario: Inserción, Búsqueda, Eliminación. Es

Tablas de HashTablas de HashHash Cerrado

Estrategias de Exploración de la Tabla

Prueba lineal

En este tipo de estrategia se utiliza la función f(i), la cual es una función lineal de i, por ejemplo: f(i) = i. La función de hash quedaría de la siguiente manera:

h(k,i) = (h’(k) +i) mod MAX_TABLA

Una desventaja de este método es la tendencia a crear largas secuencias de entradas ocupadas, incrementando el tiempo de inserción y búsqueda.

Exploración cuadrática

Este método de resolución de colisiones elimina el problema del agrupamiento primario. La función de colisiones es cuadrática: f(i) = c1i + c2i

2. La función de

hashing es:

 h(k,i) = (h’(k) + c1i + c2i2.) mod MAX_TABLA

Page 20: Tablas de Hash. Muchas aplicaciones requieren un conjunto dinámico que soporte las operaciones de un diccionario: Inserción, Búsqueda, Eliminación. Es

Tablas de HashTablas de HashHash Cerrado

Estrategias de Exploración de la Tabla

Dispersión Doble

Esuno de los mejores métodos disponibles para resolver colisiones en una tabla de hashing cerrado. La función de resolución de colisiones es de la forma de la forma f (i) = i * h2 (x).  La función h(k, i) queda definida como:

(k,i) = ( h1(k) + i*h2(k) ) mod MAX_TABLA

La función h1(k) es la función de dispersión original. Lo que se hace es aplicar

una segunda función de dispersión h2 a k, y luego se prueba a distancias h2(k),

2h2(k). La función h2(x), nunca debe ser cero. En términos generales, la

función:

 h2(k) = R - (k MOD R)

con R un número primo menor que MAX_TABLA, da buenos resultados.

Page 21: Tablas de Hash. Muchas aplicaciones requieren un conjunto dinámico que soporte las operaciones de un diccionario: Inserción, Búsqueda, Eliminación. Es

Tablas de HashTablas de HashEjercicios

1. Considere el siguiente conjunto de datos:D = {(5, y1), (28, y2), (19, y3), (15, y4), (20, y5), (33, y6), (12, y7), (17, y8), (10, y9)}donde yi (1< i < 9) es la información asociada con cada clave. Muestre el proceso de inserción de las claves en una tabla de hash abierto de tamaño m = 9, utilizando como función de hash el método de la división (h(k) = k mod m).

2. Considere el siguiente conjunto de datos:D = {(61, y1), (62, y2), (63, y3), (64, y4), (65, y5)}donde yi (1< i < 5) es la información asociada con cada clave. Muestre el proceso de inserción de las claves en una tabla de hash abierto de tamaño m = 1000, utilizando como función de hash el método de la multiplicación