Tablas de Dispersión

Anuncio
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
Descargar