Algoritmos y Lenguaje de Programación, Sección 1 Tablas de Dispersión Tablas de Dispersión • Conocidas también como Tablas Hash )Nombre en ingles: Hash Tables • Dos partes: Mario Medina C. [email protected] Ejemplo: clasificador de correos )Tabla de dispersión de n entradas )Una función de dispersión que transforma datos de entrada en una clave ` Clave es índice en tabla de dispersión ` Rango de entradas >> Rango de claves Almacenamiento en tabla de dispersión • Recibe una carta para destinatario “Juan Pérez” y la clasifica en la letra P )Entrada: “Pérez” )Función de dispersión: convierte apellido en inicial )Qué pasa si dos apellidos comienzan con la misma letra? ` Se almacenan en el mismo casillero ` Colisión! Funciones de dispersión Operaciones básicas • Se busca transformar una clave k a una posición x en la tabla de tamaño m • Insertar(clave, elemento) )H(k) = x, 0 < x < m • Dispersión uniforme )Dadas n claves, cada casilla en la tabla debe recibir aproximadamente n/m claves ` No siempre es posible ` Escoger bien cómo transformar la clave! ©Mario Medina C. )Aplica función de dispersión a la clave ` Retorna índice de posición en tabla )Usar índice para almacenar el elemento en dicha posición del tabla )Si posición está ocupada, resolver la colisión ` Definir dónde almacenar el elemento 1 Algoritmos y Lenguaje de Programación, Sección 1 Operaciones básicas Búsqueda en tablas de dispersión • Buscar(clave) • Generación de la clave es O(1) )Aplica función de dispersión a la clave ` Retorna índice de posición en tabla )Usar índice para obtener elemento almacenado en dicha posición del tabla )Si elemento no es el buscado, seguir buscando ` Dónde buscar? Depende del tipo de tabla ` Si no encuentra el elemento, éste no está en la tabla )Función simple y conocida • Búsqueda en una tabla dado el índice es O(1) )Excepto si hay colisiones • Desempeño baja si hay muchas colisiones )Peor caso: todos los datos en colisión )Comportamiento es O(n) Resolución de colisiones Tablas encadenadas • Tablas encadenadas • Vector de listas encadenadas • Una lista por casilla )Datos en colisión se almacenan en listas encadenadas ` Una lista por casilla • Direccionamiento abierto )Datos en colisión se almacenan en la misma tabla )En caso de colisión, nuevo elemento se agrega a la lista de la casilla correspondiente • Dispersión no uniforme: algunas listas pueden crecer mucho )Tiempo de acceso a elementos aumenta )Factor de carga α: razón entre elementos a almacenar n y número de casillas m ` Número esperado de elementos por lista Ejemplo de tabla encadenada Eligir una función de dispersión • Objetivo: aproximar dispersión uniforme • Método de la división entera h(k) = k mod m • Escoger m tal que no sea potencia de 2 • Escoger m como un número primo ©Mario Medina C. 2 Algoritmos y Lenguaje de Programación, Sección 1 Eligir una función de dispersión • Método de la multiplicación )Multiplicar k for un factor A, 0 < A < 1 )Tomar la parte fraccionaria del resultado )Multiplicar ésta por m )Escoger en máximo entero inferior h(k ) = ⎣m(kA mod 1) ⎦ • Valor típico de A: 0.618 Direccionamiento abierto • Tabla de tamaño fijo • Elementos se almacenan sólo en la tabla Función de dispersión para ristras unsigned int hashpjw(const void *key) { const char *ptr = key; unsigned int tmp, val = 0; while (*ptr != ‘\0’) { val = (val << 4) + (*ptr); if (tmp = (val&0xf0000000)) { val = valˆ(tmp << 24); val = val ˆtmp; } ptr++; } return val%TABLESIZE; } Ejemplo de direccionamiento abierto )Factor de carga α ≤ 1 )En caso de colisión, nuevo elemento se agrega en primera casilla vacía a continuación de la casilla correspondiente )Búsqueda en tabla es recorrer hasta encontrar el elemento, una casilla vacía o hasta haber recorrido toda la tabla Direccionamiento abierto Funciones de dispersión para direccionamiento directo • Número de casillas a revisar: 1/(1 - α) • Debe asegurarse de visitar toda la tabla • Prueba lineal (linear probing) Factor de carga Casillas a revisar < 50% 1(1 – 0.50) = 2 80% 90% 1(1 – 0.80) = 5 1(1 – 0.90) = 10 95% 1(1 – 0.95) = 20 ©Mario Medina C. h1(k, i) = (h2(k) + i) mod m )h2: función de dispersión auxiliar )i varía entre 0 y m - 1 • Dispersión doble (Double hashing) h(k, i) = (h1(k) + I h2(k)) mod m )h1 y h2: funciones de dispersión auxiliar 3 Algoritmos y Lenguaje de Programación, Sección 1 Comparación de los dos métodos Aplicaciones • Tablas encadenadas • Bases de datos • Tablas de símbolos para compiladores • Vectores asociativos • Diccionarios de datos • Criptografía • Firmas digitales )Requiere memoria adicional a la tabla )Búsqueda promedio: 1 + α /2 – 1/2M )Peor caso: lista encadenada O(N) • Direccionamiento directo )Requiere funciones de hashing adicionales )Búsqueda promedio: (2 - α )/(2 - 2α ) )Peor caso: recorrer toda la tabla O(N) ©Mario Medina C. 4