Objetivos Primera parte:Tablas de dispersión (hash tables

Anuncio
Programación 2
Práctico 8 - Colecciones: TADs tabla y tabla de dispersión
Objetivos
Introducir la estructura de datos tabla de dispersión o hash table, y analizar que TADs pueden implementarse con ésta.
Trabajar con el TAD tabla, desarrollando y analizando implementaciones.
Usar el TAD tabla en la resolución de problemas simples y complejos.
Primera parte:Tablas de dispersión (hash tables)
Ejercicio 1
Suponga que se tiene una tabla de dispersión abierta de 10 cubetas (buckets), con la función de
dispersión h(i) = i % 10
(a) Muestre la tabla de dispersión resultante de insertar 4371, 1323, 6173, 4199, 4344, 9679, 1989.
(b) Repita la parte anterior para una tabla de dispersión cerrada, usando resolución lineal de colisiones.
(c) ¿Cómo se comporta ante la secuencia de inserciones de la parte a) una tabla de 7 cubetas con la
función de dispersión h(i) = i % 7?
(d) Analice problemas, ventajas, y desventajas de estas estrategias.
Segunda parte: Especificación de Tabla.
Ejercicio 2
Considere el TAD Tabla no acotada (también llamado Mapping o Asociación) con elementos del
dominio D y elementos del rango R, conteniendo un conjunto mínimo de constructores, selectores,
predicados y destructores para:
Crear una Tabla vacía.
Determinar si una Tabla es vacía o no.
Inserciones de parejas (d,r), con d en D y r en R, tal que se define T(d) = r, independientemente
de que T(d) estuviera ya definido.
Determinar si T(d) está definido.
Supresiones, que borran T(d) de la tabla, si está definido.
Recuperar el valor T(d), si está definido en la Tabla.
(a) Desarrollar una especificación procedural de dicho TAD.
(b) ¿Qué modificaciones deberían hacerse a la especificación anterior para obtener una especificación
del TAD Tabla acotada?
Tercera parte: Implementaciones.
Ejercicio 3
Considere el TAD Tabla no acotada del Ejercicio 1 parte a
(a) Discuta posibles implementaciones, incluyendo tablas de dispersión.
(b) Analice el orden del tiempo de ejecución de todas las operaciones.
Instituto de Computación - Facultad de Ingeniería - UdelaR
Página 1 de 2
Programación 2
Práctico 8 - Colecciones: TADs tabla y tabla de dispersión
Ejercicio 4
Se quiere implementar una tabla no acotada, cuyo dominio son las cadenas de caracteres y su recorrido
los enteros, utilizando una tabla de dispersión abierta, donde la resolución de colisiones usa separate
chaining (resolución de colisiones usando listas).
(a) ¿Qué necesita para estimar el tamaño de la tabla de dispersión? ¿Cómo hace esta estimación?
(b) Analice diferentes opciones para la función de hash a utilizar, analizando pros y contras.
(c) Implemente
Ejercicio 5
Se quiere implementar un conjunto no acotado de enteros utilizando una tabla de dispersión cerrada
que resuelva colisiones usando linear probing (resolución lineal de colisiones).
(a) ¿Qué necesita para estimar el tamaño de la tabla de dispersión? ¿Cómo hace esta estimación?
(b) Analice diferentes opciones para la función de hash a utilizar, analizando pros y contras.
(c) Implemente
Cuarta parte: Aplicaciones del TAD Tabla.
Ejercicio 6
Se quiere escribir un programa que, dado un texto, devuelva las 100 palabras más frecuentes en el
mismo. Diseñe una solución que utilice el TAD Tabla.
Ejercicio 7 (Examen diciembre 2013)
Se desea utilizar una Tabla para guardar información de contactos telefónicos en forma de correspondencias entre Nombres y Télefonos, donde ambos se pueden representar como cadenas de caracteres.
(a) Especifique un TAD TablaContactos con operaciones constructoras, selectoras/destructoras y predicados, que permita guardar una cantidad no conocida a priori de Nombres y Télefonos. Además
de las operaciones habituales de Tabla se necesita contar con la operación ListarTodosOrdenados
que recibe una TablaContactos e imprime todos los contactos en orden alfabético por Nombre,
en forma de líneas que contienen cada una Nombre y Télefono.
(b) Implemente el TAD TablaContactos teniendo en cuenta que las operaciones de inserción deben
ejecutarse en orden log2 (n) en caso promedio, siendo n la cantidad de elementos que contiene
la TablaContactos. Provea una representación para este TAD y el código de las operaciones constructoras y de ListarTodosOrdenados. Omita el código del resto de las operaciones del TAD. Se
permite utilizar las operaciones <, >, = y <>para comparar cadenas de caracteres.
(c) Considere que se quiere modificar el TAD TablaContactos, agregando la funcionalidad de discado
rápido que permita almacenar hasta K referencias a contactos. Esta funcionalidad se implementa
mediante las siguientes operaciones:
1
2
/* Inicializa el discado r á pido en la TablaC ontact os T */
void I n i c i a l i z a r L D R a p i d o ( Tabl aConta ctos & T );
3
4
5
6
/* Inserta en la posici ó n j <= K del discado r á pido de T una referencia al contacto
ya existente en T con nombre = nomContacto */
void I n s e r ta r L D R a p i d o ( Tab laCont actos &T , char * nomContacto , unsigned int j );
7
8
9
/* Imprime el tel é fono y nombre del contacto almacenado en la posici ó n j <= K
del discado r á pido de T */
void BusquedaRapi da ( TablaC ontact os &T , unsigned int j );
i. Modifique la representación del TAD que propuso como solución a la parte (b) para poder
resolver la operación BusquedaRapida en O(1).
ii. Implemente InicializarLDRapido, InsertarLDRapido y BusquedaRapida.
Instituto de Computación - Facultad de Ingeniería - UdelaR
Página 2 de 2
Descargar