CC30A Algoritmos y Estructuras de Datos
Prof. Rodrigo Paredes
Tarea 2
Fecha de entrega: viernes 13 de septiembre. No se aceptarán
tareas atrasadas.
Objetivos
En esta tarea se pretende prácticar con dos estructuras de datos
básicas en computación: los árboles y las listas.
El problema que vamos a abordar en esta tarea consiste en buscar cuál
es el gen menos repetido dentro de una secuencia genética e indicar
las posiciones del gen dentro de la secuencia.
Descripción de la tarea
Uno de los problema estudiados en biología computacional es buscar
genes cortos dentro de una secuencia genética grande.
Para simplificar el problema vamos a considerar que la secuencia genética
consiste en un string gigante (secuencia S, de tamaño n),
compuesta por las letras 'A', 'C', 'G' y 'T'. Por ejemplo:
TACTAAGAAGC
y lo que interesa es buscar strings cortos (gen G, de tamaño
m)
dentro de esta secuencia gigante. Por ejemplo, si consideramos genes de
tamaño 2, en gen CC no está
presente en la caneda, en cambio, el gen AA
se presenta 2 veces en la cadena.
La metodología que utilizaremos para resolver este problema es
simple:
Vamos a considerar un árbol 4-ario de m niveles de profundidad.
Los nodos internos pueden tener 4 hijos, puesto que son 4 las posibles
letras, y las hojas contienen la lista de posiciones del gen G dentro
de la secuencia S.
Considere la siguiente estructura del nodo interno y de las hojas:
Nodo{
Nodo hijoA;
Nodo hijoC;
Nodo hijoG;
Nodo hijoT;
}
Hoja {
ListaInt pos;
}
Para la secuencia TACTAAGAAGC, con genes
de tamaño 2, se tiene el siguiente árbol:
Como se dijo anteriormente el gen AA está en las posiciones 4
y 7 de la secuencia, y el gen CC no está presente en la secuencia.
Para usar esta estructura para buscar el gen que menos se repite, tenemos
que hacer dos cosas:
-
Generar el árbol (con las listas vacias) para el tamaño del
gen buscado
-
Leer el archivo y cargar las listas con las posiciones de los genes
Para cargar los genes en las lista tenemos que:
-
Leer el gen i-ésimo
-
Descender en el árbol segun las letras del gen i-esimo
-
Una vez en la hoja, guardar la posición del gen (i) en la
lista
Este ciclo lo hacemos para los n - m genes de la secuencia (ojo
que el primer gen está en la posición 0).
Una vez que tenemos calculadas las posiciones de todos los genes de
S,
para encontrar el gen que menos se repite, basta con buscar la lista más
corta. Si hay empate, se dejan los dos genes como los menos repetidos.
De acuerdo a lo anterior, en esta tarea se le solicita implementar la
estructura para buscar genes dentro de una secuencia, de modo de determinar
cuál o cuáles son los genes que menos se repiten, y mostrar
las posiciones el o los genes menos repetidos (si el gen no está
presente en la secuencia, la lista de posiciones es vacia).
Pruebas
Implemente la estructura para buscar genes de 8 caracteres, es decir, un
árbol 4-ario de 8 niveles, y pruebe su programa con los archivos:
-
dnacorto.zip [4.3 kB], al descomprimir
obtienen un archivo de 14,081 bytes.
-
dnalargo.zip [270 kB], al descomprimir
obtienen un archivo de 1,048,577 bytes.
Los datos vienen en una línea larga, terminada con un '\n'.
Puede utilizar el programa getGen.class
$ java getGen pos archi
que muestra el gen en la posición pos
del archivo archi, por ejemplo:
$ java getGen 20 dnacorto
para verificar los resultados de su programa (este programa estará
disponible lo antes posible).
Restricciones
-
El programa debe ser escrito en Java.
-
Plazo de entrega: viernes 13 de septiembre. 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
-
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 general como las listas de
enteros, 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.