Download Tarea 4
Document related concepts
no text concepts found
Transcript
Tarea 4 CC3001 - Algoritmos y estructuras de datos Profesores: Patricio Poblete, Nelson Baloian Fecha de entrega: 9 de junio de 2015 No se aceptarán tareas atrasadas Objetivo El objetivo de esta tarea es implementar el algoritmo para encontrar el árbol de búsqueda binaria óptimo para un conjunto de llaves con probabilidades de acceso no uniforme, así como una forma alternativa, más rápida, de encontrar un árbol cercano al óptimo. Descripción del problema Dado un conjunto de llaves X1 <... < Xn, con probabilidades de acceso p1, ..., pn, en clases vimos cómo construir un árbol de búsqueda binaria óptimo, esto es, un árbol en el cual el costo esperado de búsqueda sea mínimo. Para los efectos de esta tarea, supondremos que sólo hay búsquedas exitosas (esto es, que todas las probabilidades q son cero). Usted debe escribir un programa en Java que lea un archivo de texto desde su entrada estándar, y que: 1. Calcule la frecuencia con la cual aparece cada una de las letras. Para simplificar, considere sólo las letras del alfabeto ASCII básico (sin acentos ni eñes) y no distinga entre mayúsculas y minúsculas. En base a esta tabla de frecuencias, defina la probabilidad de acceso de cada una de las letras (como la frecuencia de cada letra dividida por la suma de las frecuencias de todas las letras). 2. Usando las probabilidades así calculadas, implemente el algoritmo visto de orden O(n3) visto en clases para encontrar el árbol óptimo. Identifique el ciclo más interno e inserte un contador que le permita contar el número de veces que se ejecuta ese ciclo. 3. Implemente un algoritmo para construir un árbol que aproxime al árbol óptimo. Su algoritmo debe escoger como raíz del árbol a aquella llave que hace que los "pesos" de los subárboles izquierdo y derecho resultantes sean lo más parecidos posible. (Recuerde que el peso de un subárbol es la suma de las probabilidades de todas sus llaves). El mismo método se aplica recursivamente para la construcción de los subárboles. Inserte un contador en el punto apropiado para llevar la cuenta del número de iteraciones ejecutadas por este algoritmo. Su programa debe leer el archivo de entrada e imprimir en la salida estándar la tabla de probabilidades calculada, y luego, para cada algoritmo, el valor del contador de iteraciones y el costo esperado de búsqueda en el árbol construido. Restricciones El programa debe ser escrito en Java. No se aceptará ningún otro lenguaje de Programación. Tareas que no compilen serán calificadas con nota 1.0 La tarea es individual. El plazo es absolutamente perentorio. No se corregirán tareas atrasadas. Entrega Deberá enviar usando Ucursos (plazo: 11:59 del último día de entrega): Un informe donde debe describir y documentar el programa realizado, incluyendo ejemplos de entradas y salidas. Además incluya información relevante para hacer funcionar su tarea. No incluya los archivos .class, únicamente los .java Contenido del Informe El informe debe describir el trabajo realizado, el código fuente desarrollado y los resultados obtenidos. Principalmente sea breve, describiendo cada uno de los puntos que a continuación se indican, pero sin sobrepasar las 10 páginas. Estos son los puntos que debe contener su informe: Portada: indicando número de la tarea, fecha, autor, email, código del curso. Introducción: descripción del problema y su solución (¡muy breve!) Análisis del problema: exponga en detalle el problema, los supuestos que pretende ocupar, casos de borde y brevemente la metodología usada para resolverlo. Solución del problema: o Algoritmos de solución, incluyendo toda la información y figuras que considere necesarias. o Partes relevantes del código fuente o Ejemplos de entradas y salidas escogidos por usted. Modo de uso, explicando cualquier dato extra necesario para la compilación y ejecución de su programa.