Tarea 5 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 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. 4. Implemente un método que recibe una referencia a la raíz de un árbol del tipo construido en las partes 2 y 3, e imprima el contenido del árbol en in-orden con paréntesis según el siguiente algoritmo: si el árbol está vacío entonces retorno un string vacío. Si no, retorno un string que contiene un abre de paréntesis, seguido por el string que resulta de llamar recursivamente al método para el subárbol derecho, seguido por la letra almacenada en la raíz, seguido por el string que resulta de llamar recursivamente el método para el subárbol derecho y finalmente un cierre de paréntesis. Por ejemplo, si el árbol es c / a \ \ d b El método debe imprimir ((a(b))c(d)) La regla sería: árbol vacío -> string vacío; árbol no vacío -> (I r D) (I = árbol izquierdo, r = raíz, D =árbol derecho Para cada uno de los archivos de texto que se encuentran en http://www.dcc.uchile.cl/nbaloian/cc3001/Tarea4 su programa debe leer el contenido de los archivos e imprimir en la salida estándar la tabla de probabilidades calculada, y luego, para cada algoritmo, el valor del contador de iteraciones, el costo esperado de búsqueda en el árbol construido, y el string que representa al árbol según lo explicado en el punto 4. 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): El código fuente y 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.