Вы находитесь на странице: 1из 15

Universidad de Talca Facultad de Ingeniera Escuela de ingeniera civil en computacin

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.

Anlisis del problema


Conociendo un poco ms sobre la sucesin de Farey , un buen ejemplo para guiarnos en la solucin del problema es conocer esta sucesin y el bosquejo de su representacin en un rbol binario como el que se muestra a continuacin : Sucesin de Farey:

Bosquejo de la Sucesin de Farey , en este caso un Stern-Brocot Tree

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.

Metodologa para abordar el problema


Durante la clases de metodologas de desarrollo de software , discutimos varios tipos de metodologas , yo en este caso me incline por una metodologa llamada espiral, la cual plantea separar los problemas dificultad , desarrollando los requerimientos de ms dificultad en un comienzo y luego las de menos riesgo .

Solucin del problema


Algoritmo de solucin:
1) Construccin del rbol: Tras analizar detalladamente el funcionamiento de esta sucesin, explicare grficamente el funcionamiento de esta:

Esta sucesin comienza con los siguientes valores:

En qu; 0/1 representa el 0 y 1/0 representa el siguiente manera:

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

Gracias al anlisis hecho anteriormente, encontramos algunas invariantes :


1.- Siempre habrn 3 dgitos claves para la construccin de una nueva raz. 2.- Si queremos construir una raz hacia la izquierda, conservaremos el nmero menor inicia y se lo sumaremos al nmero del padre. 3.- Si queremos construir una raz hacia la derecha, conservaremos el nmero mayor inicial y se lo sumaremos al nmero del padre.

Con lo planteado anteriormente, solucionamos el problema de la construccin del rbol.

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.- Las filas , corresponden a la siguiente ecuacin :

2
Siendo la cantidad de elementos, las fracciones a dibujar , sin considerar la raz del rbol 1/1.

3.- Las columnas, corresponden a la siguiente ecuacin:

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.

Importante : El documento de texto debe cumplir la siguiente norma :


El archivo de entrada contiene mltiples casos de prueba. Cada caso de prueba consiste de una lnea que contiene tres enteros positivos m, n y o; donde m y n son el numerador y denominador de la fraccin, respectivamente, y o vale 1 o 0 dependiendo de si se desea dibujar el recorrido en el rbol producido por la fraccin especificada previamente. La entrada termina con un caso de prueba que contiene 1 1 1, y este caso no debe ser considerado en el clculo. Para cada caso de prueba en el archivo de entrada, si o es 0, la salida debe ser una lnea que contiene la fraccin reducida o simplificada (si la fraccin ya es irreductible, se repite tal cual viene en la entrada) y la representacin de la fraccin dada en el sistema numrico de Stern-Brocot; y si es 1, junto con la fraccin reducida y su representacin de Stern-Brocot, se requiere que se imprima la bajada en el rbol.

Un buen documento de texto seria si contiene lo siguiente


8 3 0 10 14 1 2634 969 0 1 1 1

PD: Basndose en lo anterior

Pruebas
En el caso de que el documento de texto contenga lo siguiente :
8 3 0 10 14 1 1 1 1

Su salida seria la siguiente:


8 3 RRLR 5 7 LRRL +--1/1 | 1/2--+ | 2/3--+ | +--3/4 | 5/7

En otro caso de que el documento de texto contenga lo siguiente :


100 330 0 100 10 1 1 1 1

Su salida seria la siguiente:


10 33 LLLRRRLL 10 1 RRRRRRRRR 1/1--+ | 2/1--+ | 3/1--+ | 4/1--+ | 5/1--+ | 6/1--+ | 7/1--+ | 8/1--+ | 9/1--+ | 10/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.

Вам также может понравиться