Академический Документы
Профессиональный Документы
Культура Документы
Tarea N2
Stern-Brocot Trees
Alumno: Daniel Retamal H. Modulo: Algoritmos y estructuras de datos Profesor: Rodrigo Paredes. Fecha: 11 de Junio del 2011
Introduccin:
En este caso, estudiaremos un curioso caso sobre arboles binarios, una sucesin matemtica conocida como sucesin de Farey Una sucesin de Farey es una sucesin matemtica de fracciones irreductibles entre 0 y 1 que tienen un denominador menor o igual a n en orden creciente. Cada sucesin de Farey comienza en el 0, denotado por la fraccin 01, y termina en el 1, denotado por la fraccin 1/1. En este problema especficamente se pide que dada una fraccin se le solicita que imprima el recorrido en el rbol que la produce y adicionalmente, que dibuje el camino de bajada en el rbol. Para su solucin, ocuparemos los conceptos de rboles binarios , tales como nodo padre, nodo izquierda , nodo derecha , etc.
Situaciones de borde:
Consideramos situaciones de borde, a posibles errores de ejecucin del problema o problemas encontrados en el desarrollo del problema: En los posibles errores de ejecucin, puede pasar que al ejecutar el programa , este no encuentre los archivos necesarios para si correcta ejecucin , o estos se encuentren daados. En la seccin de Modo de uso encontraremos la manera de lograr una correcta ejecucin. Al desarrollar el programa que modela este problema , principalmente se encontraron dos grandes complicaciones : 1.- El diseo de esta sucesin. 2.- Graficar eficazmente , el recorrido que fue necesario para encontrar una fraccin deseada.
y 1/1 se obtiene de la
Ahora, a partir de estas 3 fracciones, consideraremos al 1/1 como padre o raz principal del rbol. Por lo que debemos encontrar los hijos de este como se muestra en la figura:
0 1
1 = 1 2
1 1
1 0
A partir del dibujo anterior, podemos encontrar la forma de construir las siguientes ramas de este rbol de la siguiente forma: Para formar el hijo izquierdo: Conservamos el valor menor, 0/1, y se lo sumamos al padre , 1/1 , obteniendo el hijo izquierdo.
0 1
1 1 = 1 2
Para formar el hijo derecho: Conservamos el padre , 1/1 , y se lo sumamos al nmero mayor , 1/0 , obteniendo el hijo derecho.
1 1
1 2 = 0 1
2) Sentido en bsqueda dela fraccin en el rbol: Ahora debemos decidir cmo mostrar el camino que fue necesario para encontrar una cierta fraccin en este rbol, para lo cual haremos lo siguiente:
1.- Cada vez que nos encontremos en un nodo padre, lo guardaremos: 2.-Luego , compararemos la fraccin que buscamos con el nodo padre donde estamos, si es mayor , el rbol se seguir construyendo hacia la derecha , por lo cual guardaremos una letra L. De modo contrario , si la fraccin que buscamos es menor que el nodo padre donde nos encontramos, seguiremos contrayendo el rbol hacia la izquierda y guardaremos una letra R 3.- Este proceso se repite hasta encontrar la fraccin que buscamos.
Con esto, podremos mostrar una cadena que contenga las direcciones que fue siguiendo el rbol hasta encontrar la fraccin buscada , como un ejemplo podemos indicar : Fraccin a buscar : 5/7 Salida : LRRL
Con lo planteado anteriormente, solucionamos el problema de mostrar por pantalla las direcciones que fue tomando nuestra bsqueda de la fraccin. 3) Mostrar el recorrido del rbol: Este , sin lugar a duda , fue el proceso ms complicado en este proyecto. Despus de realizar muchos dibujos y encontrar ciertas relaciones en algunas cosas, mostrare algunas figuras que fueron clave para solucionar este problema y explicare lo que implica cada una:
Grafo 1:
0 1 2 3 4 5 6 7 8 9 + |
/
10 11 12 13 14 15 1 / 1 2
+ | + |
1 /
0 1 2 3 4 5 6
Gracias a este grafo, fue cuando surgi la idea definitiva de cmo realizar el dibujo del recorrido del rbol, decid crear una funcin que me ayudara conocer la cantidad de veces que debo correr mi inicio de rbol para que se pueda dibujar correctamente. Adems cree un pivot , quien es el encargado de recordarme en la ltima posicin donde dibuje algo. En este caso e pivot me indicaba donde fue que imprim el signo +.
Adems encontr la siguiente relacin en mi manera de dibujar el rbol: 1.- Lo encontr muy parecido a la forma de una matriz, por lo cual tendra filas y columnas.
2
Siendo la cantidad de elementos, las fracciones a dibujar , sin considerar la raz del rbol 1/1.
2
Siendo la cantidad total de elementos, las fracciones a dibujar, considerando la raz del rbol 1/1.
4. Considerando que en computacin todo empieza de 0 , la dimisin de la matriz de gua coincide perfectamente con lo necesitado.
Grafo 2:
0
1
1
/
2
1
3 -
4 2
5 + |
/
10 11 12 13 14 15 0 1 2 3 4 5 6
+ |
/ 1
+ |
5 /
Realizando el siguiente grafo, me di cuenta que al representar el recorrido dentro de una matriz, perda muchos espacios en vacos y que me podra traer problema con la memoria del computador. Para seguir dibujando casos de prueba, segu utilizando este esquema pero decid utilizar String representando cada lnea.
Para la lnea que contenga la fraccin , coloco una cierta cantidad de espacios determinada por la cantidad de nmeros que tenga que poner hacia la izquierda. Luego , en caso de que el nodo siguiente se dirija a la izquierda , coloco +-- y luego la fraccin. De caso contrario , coloco la fraccin primero y luego la cadena --+ , al contrario de la anterior. Luego mi pivot queda en la misma posicin del +, as en la lnea siguiente puedo dibujar el carcter | justo debajo de l. La prxima fraccin comenzara a dibujarse justo debajo del ultimo carcter de la lnea anterior (| ). Con estas consideraciones , solucionamos el problema de mostrar por pantalla el rbol y los nodos por los cuales paso la bsqueda de la fraccin a buscar.
Diagrama de Estados:
Implementacin:
Bsicamente , el seudocdigo del algoritmo funciona de la siguiente manera Mientras queden Lneas por leer : Si ( numerado = denominador = modo = 1 ) // fin de la ejecucin De lo contrario : Guardar los valores de numerador , denominador , modo. Llamar fraccionIrreductible(numerador , denominador ); Llamar a sbt(modo)
La funcin fraccionIrreductible(numerador , denominador ); , decide si la fraccin ingresada es una fraccin irreductible , de no ser as la convierte a fraccin irreductible y guarda en las variables globales numerador , denominador el valor correspondiente a cada una. La funcin sbt(modo) , utilizando las variables globales de numerador y denominador , a medida que va recorriendo el rbol , va guardando los nodos padres del rbol y a dems va guardando los sentidos que va tomando. Cuando finalmente llega a la fraccin buscada, imprime la fraccin irreductible y los sentidos por los cuales paso el recorrido. Adems , si el modo es igual a 1 , se debe imprimir el recorrido del rbol de una forma grafica, para esto , ocuparemos lo utilizado en la seccin de Mostrar el recorrido del rbol. Del caso de que el modo fuera 0, no se mostrara el recorrido del rbol.
Modo de uso:
El cdigo entregado de este proyecto fue escrito en editor NetBeans 7.0 , en Windows. Adems se adjunt otro documento que funciona en Linux. Para su compilacin en la terminal de Linux basta con : 1.- Abrir la terminal de Unix 2.- Situarse en la carpeta donde estn los cdigos : ( cd nombreDeCapeta ) 3.- Para compilar el cdigo : javac SternBrocotTree.java 4.- Luego teniendo el programa compilado , procedemos a ejecutarlo java SternBrocotTree input.txt Siendo : input.txt : El nombre del documento de texto donde estn los casos de prueba. * Cualquier otro comando no presentado en este documento conlleva a error del programa 5.- En la Misma terminal abierta , podemos ver los resultados obtenidos. Para su compilacin en Netbeans basta con : 1.- Abrir el proyecto , navegando por las carpetas hasta llegar al proyecto llamado SternBrocotTree. 2.- Ir a Archivo > Proyecto Properties (SternBrocotTree). 3.- En la ventana emergente ir a Ejecutar y en la parte que dice argumentos, poner el nombre del archivo de texto donde se encuentran los casos de prueba. 4.- Finalmente poner aceptar y presionar F6 para compilar y ejecutar. 5.- En el Terminal dispuesto por Netbeans se observan los resultados.
Pruebas
En el caso de que el documento de texto contenga lo siguiente :
8 3 0 10 14 1 1 1 1
Conclusin:
Realizando en presente trabajo, aprendimos de una manera ms prctica lo estudiado en clases, como lo fueron utilizar los arboles binarios para una eficaz bsqueda. Admito que fue un trabajo difcil de cumplir, en la complejidad de pensar en la forma de representar el recorrido del rbol, pero de igual manera fue un buen desafo de desarrollar y, finalmente, cumplir.