TABLAS HASH

34
TABLAS HASH 1.- TABLAS HASH Una tabla hash es simplemente un array que hace uso de una función (Función Hash) donde los elementos son guardados de acuerdo a esta función.. U: universo h : U {0,1,…, m-1} K: clave tabla hash : T[0… m-1] h: Función hash

description

TABLAS HASH. 1.- TABLAS HASH Una tabla hash es simplemente un array que hace uso de una función (Función Hash) donde los elementos son guardados de acuerdo a esta función.. U: universoh : U  {0,1,…, m-1} K: clavetabla hash : T[0… m-1] h: Función hash. Ejemplo :. - PowerPoint PPT Presentation

Transcript of TABLAS HASH

TABLAS HASH

1.- TABLAS HASH Una tabla hash es simplemente un array

que hace uso de una función (Función Hash) donde los elementos son guardados de acuerdo a esta función..

U: universo h : U {0,1,…, m-1}K: clave tabla hash : T[0… m-1]h: Función hash

Ejemplo :

Función hash h(k) = k mod 8

usando h para mapear las claves hacia los slots de la tabla hash,las claves k2 y k5 tienen el mismo slots, entonces ellos colisionaron.

Resolución de Colisión por Encadenamiento (Chaining)

Las entradas en la Tabla Hash son dinámicamente asignadas e ingresadas en un linked list asociado con cada entrada en la tabla hash.

Implementación Chained-hash-insertar(T,x)

Insertar x en la cabecera de la lista T[h(clave[x])]

Chained-hash-buscar(T,k)Buscar para un elemento con clave k en la lista T[h(k)]

Chained-hash-eliminar(T,x)Eliminar x de la lista T[h(clave[x])]

Análisis El peor caso para la inserción es O(1). Por que se

asume que el elemento x esta siendo insertado no esta en la tabla (puede ser verificada con un costo adicional). Para la búsqueda el peor caso es proporcional al tamaño de la lista(será analizada mas adelante). La eliminación sera de O(1) si la lista es una lista doblemente enlazada, sino estaríamos en el mismo caso de una búsqueda.

¿Cuan bueno es el desempeño con Chaining? In Particular, ¿cuanto toma una búsqueda de un elemento y una clave dada?

Dado una tabla hash T con m slots que guardan n elementos.El peor caso es cuando todos los n elementos tienen el mismo slot, creando una lista de tamaño n el cual seria O(n) mas el tiempo de computo de la función.

2.- FUNCIONES HASH Que hace a un buena función hash? Debería ser fácil y rápida de calcular. También debería

ser una función inyectiva, que quiere decir a claves distintas les debería asignar posiciones distintas dentro del array. También debería ser sobreyectiva, es decir, debería poder colocar alguna clave en todas las posiciones del array.

H : Clave Posición La cual es una función hash perfecta, la cual es difícil

de encontrar por que el numero de claves posibles es muy grande del que solo almacenaremos un subconjunto pequeño, pero no sabemos a priori ese subconjunto

Métodos

El método de división Mapeamos una clave k dentro uno de los

slots m tomando el resto de k dividido por m.

h(k)= k mod mejemplo en una tabla de tamaño 12 (m=12) y

k=100, entonces h(k)=4(por requerir solo una división es muy rápido), en este método tenemos que evitar algunos valores. Por ejemplo m no debería ser una potencia de 2.

El método de multiplicación

Opera en dos pasos. Primero multiplicamos la clave k por A en el rango 0<A<1 y extraer la parte fraccionaria de kA, luego multiplicamos este valor por m.

h(k) = m(kA mod 1)

donde “kA mod 1” significa la parte fraccionaria de kA, esto es, kA - kA

m no es critico típicamente es m = 2p

Ejemplo:m = 16 , A = 0.3 k =75 kA =22.5kA mod 1 = 0.5 12(0.5)=6

3.- DISPERCION ABIERTA Todos los elementos son guardados en la

misma tabla hash. Inserción: se busca usa la función hash si

para la clave hay un slots vació se inserta, si no la hay se busca hasta encontrar una posición libre(el cual requeriría de un tiempo de búsqueda de O(n))

Búsqueda, eliminación: es similar a la inserción.

Redispersion lineal

Es de la forma: hi(k) = (k + i) mod m k mod m,(k+1) mod r,(k +2) mod r,... (i =0,1,2,…m-1 hi(k) y hi+1 (k) la distancia es constante generalmente 1)

Redispersion Cuadrático Es una variante del método lineal usa una función

hash de la forma: hi(k) = (h’(k) + i2) mod m , donde h’ es una función

hash auxiliar , i = 0,1,…m-1, la colisión secundaria no implica la formación de cadenas siempre que h(k) ≠ h(k') y si h(k) = h(k') entonces las cadenas son idénticas.

Para mejorar el desempeño m es primo, de esa forma recorre [m/2] medios diferentes (dado que i y m-i modulo m son iguales) por lo que puede haber sitios libres y no los encuentre o la tabla, en al practica no es importante. Si después de [m/2] ensayos no se encuentra ningún sitio libre significa que la tabla esta casi llena y debe regenerarse.

Dispersión doble Es uno de los mejores métodos hábiles para

direccionamiento abierto por que las permutaciones producidas tienen muchas de las características de permutaciones de elección aleatoria. La dispersión doble usa una función hash de la forma:

hi(k) = (h’(k)+ih’’(k)) mod m es necesario que h’’(k) produzca valores

entre 0 y m-1 que sea primo con m. h’’ depende de h’ por ejemplo: si h’(k) = k mod m h’’(k) = 1 + (k mod (m-2)) idealmente m y m-2 deben ser PESI

Ejemplo: sea una Tabla de capacidadDelArray=10, función de dispersión tal que hi(k) =(k +i) mod 10 (lineal) y hi(k) = (k+i2) mod 7 (cuadratica). Insertar en ella 89, 18, 49, 58 ,3 y 9

Lineal cuadrático doble

Bibliografía

Estructuras de datos Especificación, diseño e implementación 3ra edición de Xavier Franch Gutiérrez

Introduction to Algorithms, 2da Edición de Thomas H. Cormen

Aplicaciones de las Tablas Hash

PERMITE EL ACCESO A LOS ELEMENTOS (TELÉFONO Y DIRECCIÓN, POR EJEMPLO)

ALMACENADOS A PARTIR DE UNA CLAVE GENERADA (USANDO EL NOMBRE O NÚMERO DE CUENTA, POR EJEMPLO).ES MUY UTILIZADO EN LOS DICCIONARIOS.

Aplicaciones de las Tablas Hash

Cuando tenemos la necesidad de almacenar datos en memoria tenemos una serie de opciones: (listas enlazadas, arrayas, arboles...) cada una de las cuales tienes sus ventajas y sus inconvenientes que normalmente consisten en establecer un compromiso entre espacio en memoria y velocidad.

Por que es mejor utilizar la tabla Hash ?

Una lista enlazada aprovecha completamente el espacio de memoria pero la velocidad de búsqueda es lineal

en un array reservamos toda la memoria que podríamos por adelantado pero por contra obtenemos un rendimiento de búsqueda constante O(1).

Por que es mejor utilizar la tabla Hash ?

Los arboles constituyen una variación de las listas enlazadas en las cuales se mejora el rendimiento de búsqueda (O(log(n)))a cambio de empeorar el rendimiento de inserción

Por que es mejor utilizar la tabla Hash

Las tablas hash constituyen una forma de obtener un rendimiento (casi) constante controlando la cantidad de memoria que deseamos comprometer, cuanto más pequeña sea la tabla mayor será el impacto sobre el rendimiento de la tabla debido al numero de colisiones.

Funciones Hash en Criptografía

En informática, Hash se refiere a una función o método para generar claves o llaves que representen de manera casi unívoca a un documento, registro, archivo, etc., resumir o identificar un dato a través de la probabilidad, utilizando una función hash o algoritmo hash. Un hash es el resultado de dicha función o algoritmo.

Funciones Hash en Criptografía

Una función Hash "comprime" los bits del mensaje a un valor Hash de tamaño fijo, de manera de distribuir uniformemente los posibles mensajes en los posibles valores Hash

Funciones Hash en Criptografía

La función hash toma como entrada una cadena de longitud arbitraria, digamos 5259 bits, luego divide éste mensaje en partes iguales, digamos de 160bits; como en este caso y en general el mensaje original no será un múltiplo de 160, entonces para completar un número entero de partes de 160 bits al último se le agrega un relleno, digamos de puros ceros.

En nuestro caso en 5259 caben 32 partes de 160 bits y sobran 139, entonces se agregarán 21 ceros más.

Funciones Hash en Criptografía

Funciones Hash en Criptografía

Posteriormente se asocia un valor constante a un vector inicial IV y H0=IV Ahora se obtiene H1 que es el resultado de combinar H0 con X1 usando una función de compresión f H1 = f(H0,X1) Posteriormente se obtiene H2, combinando H1 y X2 con f H2 = f(H1,X2) Se hace lo mismo para obtener H3 H3 = f(H2,X3) Hasta llegar a Ht Ht = f(Ht-1, Xt) Entonces el

valor hash será h(M) = Ht

Funciones Hash en Criptografía

Funciones Hash en Criptografía