CC30A Algoritmos y Estructuras de Datos
Prof. Rodrigo Paredes
Tarea 3
Fecha de entrega: viernes 25 de octubre. No se aceptarán
tareas atrasadas.
Objetivos
Uno de los problemas básicos en computación, consiste en
dado un conjunto de valores construir un índice que permita realizar
búsquedas eficientemente. En esta tarea vamos a comparar el comportamiento
de dos estructuras para indexar conjuntos de datos: Árboles de Búsqueda
Binaria y Skip Lists. En particular analizaremos el costo de las operaciones
de inserción, búsqueda y eliminacion de elementos tanto para
los Árboles de Búsqueda Binaria como para las Skip Lists.
Descripción de la tarea
La solución trivial para determinar si un elemento pertenece a un
conjunto consiste en realizar una búsqueda exhaustiva del elemento
dentro del conjunto, lo cual tiene un costo O(n). Si tenemos
la oportunidad de preprocesar los datos, podemos construir un índice
sobre los datos lo cual nos permite verificar si el elemento pertenece
en un tiempo mucho menor. En esta tarea vamos a comparar dos índices:
Árboles de Búsqueda Binaria (ABB) v/s Skip Lists (SL).
Sabemos que ambos índices realizan las operaciones de inserción,
borrado y búsqueda en tiempo promedio O(log n), la
pregunta que naturalmente surge es: ¿cuál índice es
mejor?. Para ello vamos a hacer experimentos de inserción, búsqueda
y borrado utilizando ambas estructuras, y vamos a medir el costo de las
operaciones de interés (inserciones, búsquedas y borrados)
contando las comparaciones de llaves que sean necesarias. Luego de tener
las comparaciones podemos construir un modelo de ajuste para cada operación
de interés, y comparando los modelos obtenidos para cada operación,
podremos determinar que índice es mejor bajo las condiciones
del estudio.
Esta tarea se divide en dos partes:
-
Implementación de los índices de búsqueda: ABB y SL.
-
Medición experimental de los tiempos para inserción, borrado
y búsqueda. Para medir los tiempo deben contar las comparaciones
de llaves.
Pruebas
Se les proporciona un archivo que contiene una
permutación aleatoria compuesta por números entre 1 y 150000.
Vamos a trabajar con valores de n = 1000, ..., 100000. Para cada
valor de n se realizará la carga de los datos, una serie
de búsquedas (que pueden ser exitosas o no) y luego eliminar los
n
valores del índice.
Consideren 2 rangos para valores de n, el primer rango es n
= 1000, 2000, 3000, ..., 10000 elementos y el segundo n = 10000,
20000, 30000, ..., 100000 elementos.
Para cada valor de n realice el experimento de:
-
Insertar n valores en cada uno de los índices (ABB o SL).
Para esta parte inserte los primeros n valores del archivo
de datos a cada uno de los índices.
-
Buscar n valores. En esta parte realice n búsquedas
tanto para valores que pertenecen a los elementos indexados (búsquedas
exitosas) como para valores que no pertencen a los elementos indexados
(búsqueda infructuosa). Considere 2/3 de búsquedas exitosas
y 1/3 de búsquedas infructuosas.
-
Eliminar n valores. En esta parte elimine los primeros
n
valores de cada uno de los índices (ABB o SL)
Para cada experimento realizado, se deben medir las comparaciones realizadas
para cada valor de n.
Por último obtenga los modelos de inserción, búsqueda
y borrado, recuerde que cada inserción, búsqueda o borrado
tiene costo promedio O(log n) por operación, por otro
lado hacer n operaciones de inserción, borrado o búsqueda
tiene costo promedio O(n log n).
Hints
Dado que sabemos que ambas extructuras tienen el mismo orden en tiempo
promedio, para determinar que índice es mejor es necesario comparar
las constantes.
Restricciones
-
El programa debe ser escrito en Java.
-
Plazo de entrega: viernes 25 de octubre. No se recibirán tareas
atrasadas.
-
Queda prohibido utilizar bibliotecas o clases preconstruidas en el lenguaje
que implementen:
-
Listas, o arreglos (por ejemplo NO use la clase List y sus derivadas, y
NO use la clase Arrays y sus derivadas).
-
Árboles generales.
-
Skip Lists.
-
Árboles de búsqueda binaria.
-
También esta prohibido el uso de las clases que se entregan en cc10a.
-
La tarea es individual.
-
Para la tarea tienen que entregar un informe de resultados junto al código
fuente (el programa que implementa la tarea). No se aceptan códigos
si informe ni informes sin código.
-
Cualquier falta a las restricciones anteriores invalida irrevocablemente
la tarea. Revisen las normas
descritas en el plan del curso
Hints
Tiene que implementar tanto el árbol de búsqueda binaria
como la skip list, ponga especial cuidado en los métodos:
-
de inserción de nodos en el árbol general
-
búsqueda en el árbol general
-
inserción de nodos en las listas
-
calcular la cantidad de elementos en la lista
Junto con estos métodos, implemente todo lo demás que considere
necesario (borrado de elementos, destructores, métodos para consultar
si la lista esta vacia, etc.)
Ponderación
El informe equivale a un 50% de la nota de tarea.
El código equivale a un 50% de la nota de tarea.
Entrega de la tarea
La entrega de la tarea debe incluir un informe escrito donde se describa
y documente el programa realizado, y se incluyan ejemplos de entradas y
salidas.
El informe debe ser entregado en la Secretaría Docente de Computación
(donde Magaly, tercer piso Edificio de Computación, hasta las 17:00
horas del último día de plazo), y el código fuente
(junto a un archivo README que explique como compilar) debe ser enviado
utilizando el Cursomático de cc30a.
El contenido del informe debe seguir la siguiente pauta común
para todas las tareas:
Portada
Universidad de Chile
Facultad de Ciencias Físicas y Matemáticas
Departamento de Ciencias de la Computación
Informe Tarea X
Nombre de la tarea X
|
Fecha:
|
fecha entrega
|
|
Autor:
|
nombre alumno
|
|
Sección:
|
sección que corresponda
|
|
E-mail:
|
correo del alumno
|
-
Introducción: Descripción del problema y de su solución
-
Análisis del Problema: Se expone en detalle el problema, los supuestos
que se van a ocupar, las situaciones de borde, y la metodología
para abordar el problema.
-
Solución del problema:
-
Algoritmo de solución: Se detallan los pasos a seguir para solucionar
el problema. De ser necesario, se recomienda incluir figuras, tablas, etc.,
que permitan mejorar la comprensión del problema.
-
Diagrama de Estados: Muestra en forma global el programa.
-
Diseño: Explicitar las Pre y Post condiciones consideradas, mostrar
los invariantes empleados.
-
Implementación: Se debe mostrar el código del programa que
soluciona el problema (omita los detalles que no tengan relevancia para
el problema), explicando lo que hace el código. Se recomienda usar
nombres representativos a las variables. NOTA: El código generado
para resolver la tarea debe corresponder al diseño descrito, preocúpese
de realizar los comentarios que sean necesarios.
-
Modo de uso: Se debe explicar el modo de uso del programa y el modo de
compilación. Nota: la tarea debe ser compilable en cipres o en los
computadores del zócalo. Si las indicaciones que Usted entrega son
erróneas al momento de compilar, la evaluación de su tarea
será severamente penalizada.
-
Resultados: En esta sección se deben indicar las pruebas realizadas
y sus resultados. Se debe señalar claramente cuál es la llamada
al programa y su salida. En esta sección debe incluir las
tablas y gráficos necesarios solicitados, y el análisis de
los resultados. En este capítulo adjunten las conclusiones obtenidas
de los resultados de la tarea.
-
Anexos:
-
Listados: Se debe incluir un listado con el programa completo que se compiló
realmente (utilicen una fuente pequeña (8 pt) en este listado).
-
Otros: De ser necesario, cualquier información adicional se debe
agregar en los anexos y debe ser referenciada en alguna sección
del informe de la tarea.