Documentos de Académico
Documentos de Profesional
Documentos de Cultura
INGENIERIA EN COMPUTACION
SEMESTRE 2022-I
ESTRUCTURA DE DATOS
GRUPO: 1307
Índice
Objetivo.............................................................................................................................................................2
Introducción......................................................................................................................................................2
Problema uno...................................................................................................................................................2
Variables.......................................................................................................................................................3
Botones.........................................................................................................................................................4
Salir............................................................................................................................................................4
Aleatorios..................................................................................................................................................4
Botón Iniciar..............................................................................................................................................5
Métodos de Ordenamiento.........................................................................................................................6
Sacudida...................................................................................................................................................6
Burbuja......................................................................................................................................................7
Inserción....................................................................................................................................................7
Selección..................................................................................................................................................8
QuickSort Recursivo................................................................................................................................9
QuickSort Iterativo.................................................................................................................................10
Ejecución del programa............................................................................................................................12
Problema dos y tres......................................................................................................................................13
Declaraciones.............................................................................................................................................14
Botón Conversión......................................................................................................................................15
Botón Evaluar.............................................................................................................................................19
Ejecución....................................................................................................................................................20
Problema cuatro.............................................................................................................................................21
Declaraciones.............................................................................................................................................21
Ratón...........................................................................................................................................................21
Recursivo....................................................................................................................................................22
Iterativo.......................................................................................................................................................22
Ejecución....................................................................................................................................................23
Conclusiones..................................................................................................................................................24
Referencias....................................................................................................................................................25
1
Objetivo
Conocer distintos métodos de ordenamiento y su eficiencia
Reconocer las ventajas de las pilas
Reconocer las ventajas de la recursividad
Introducción
Este segundo parcial plantea 4 problemas, que involucran los temas vistos en este segundo parcial
(métodos de ordenamiento y pilas). Con lo visto en clase sobre la implementación de los distintos
métodos de ordenamiento y la parte teórica sobre estos. De igual forma conocer una nueva
herramienta para almacenar datos, la pila y las ventajas que representa para resolver distintos
problemas como lo es permitir volver iterativos los métodos recursivos. Justamente esto ultimo es
algo que forma parte de este segundo parcial.
Identificación y resolución de los problemas
Problema uno
El primer problema solicita mostrar de manera grafica varios algoritmos de ordenamiento para
poder analizar cuál es el más eficiente, los métodos de ordenamiento son los siguientes:
Burbuja
Selección
Inserción
Sacudida
QuickSort iterativo
QuickSort Recursivo
Lo primero a hacer fue crear en scene builder el diseño
Ya con todas las graficas con la que se iba a trabajar, con los elementos que se dieron en clase
hice algunas modificaciones y adiciones que veremos paso por paso.
2
Variables
Para poder mostrar y representar cada uno de los métodos de ordenamiento se hizo la declaración
del BarChart respectivo para cada método.
Los botones que realizaran las diferentes acciones según sea el seleccionado también son
declarados
De igual forma, se hizo la declaración de las variables que permiten la manipulación de las barras
que representan los datos de las listas
3
También se declaro el hilo con el que estará corriendo el programa
Botones
Salir
El botón salir lo que hace es revisar si el hilo es diferente de nulo para tener la información sobre si
se está ejecutando, en el caso de que se cumpla la condición corta el hilo y cierra la aplicación.
Aleatorios
Esta función lo que hace es limpiar las listas por si llegasen a tener elementos previos
Se declara un objeto de tipo Random y una variable para almacenar los valores aleatorios
Se entra en un ciclo iterativo en el cual se asignarán a cada lista 90 elementos con valores
aleatorios entre 0 y 199.
4
Cuando se terminó de ejecutar la función númerosAleatorios se limpian los datos de las series
Por ultimo se revisa una condición donde si el hilo es diferente de null para ejecutarlo
Botón Iniciar
Métodos de Ordenamiento
Sacudida
Se hace la declaración de las variables que se utilizaran
Se entra en un ciclo while donde se realizarán dos ciclos for que recorrerán toda la lista para ir
ordenando los elementos.
El primero recorre la lista de derecha a izquierda
Al concluir este ciclo se le asigna el valor de k + 1 a la variable izq y se empieza a recorrer la lista
de izquierda a derecha, al término de este segundo ciclo se asigna el valor de k – 1 a la variable
der
6
Burbuja
El método burbuja es mas sencillo utiliza dos ciclos for para recorrer la lista y hacer las
comparaciones para ordenar la lista
Inserción
El método de inserción utiliza variables auxiliares, entra en un ciclo for que recorrerá toda la lista,
se asignan los extremos de la lista y se guarda el estilo de la variable auxiliar
7
Se entra en un ciclo while que acercara cada vez mas los extremos mientras se compara el
elemento que se encuentra en la mitad de los extremos y al terminar este ciclo se le asigna el valor
de i -1 a la variable j
Después de eso se entra a otro ciclo while donde se recorrerá la lista de la posición j hasta el
extremo izquierdo
Selección
El método de selección es menos extenso, utiliza dos ciclos for para buscar el elemento menor de
la lista e ir haciendo los intercambios correspondientes
8
QuickSort Recursivo
El método QuickSort Recursivo utiliza una función secundaria llamada reduceRecursivo
La función secundaria reduceRecursivo recibe por entrada los datos de los extremos de la lista,
utiliza una variable booleana para entrar en un ciclo while donde se empezarán a hacer las
comparaciones primero desde la variable pos hasta el extremo derecho de la lista.
9
Después hace las mismas comparaciones, pero esta vez desde la variable pos hasta el extremo
izquierdo de la lista
Con la lista dividida por la variable pos se repite el mismo proceso para ambos lados
QuickSort Iterativo
Para este método de ordenamiento algunas variables que tuve que declararlas estáticas para que
pudiera funcionar de manera correcta
El método comienza inicializando todas las variables en 0 por si estas tenían un dato previo,
además que se asignan los valores de los extremos de la lista
Se entra en un bucle while y se asignan los extremos de la lista, además de que se llama a una
función secundaria llamada reduceIterativo
10
Se comparan los extremos de la lista respecto a la variable posRI
11
Ejecución del programa
Al ejecutar el programa se inicializan todas las graficas con los mismos valores para poder ser
ordenadas y poder comparar cual método es más eficiente.
12
Al presionar el botón de aleatorio las graficas se llenan con nuevos datos
Nota. Por una razón que desconozco en ocasiones al presionar el botón aleatorio no actualiza de
forma corriente todas las gráficas, solo se debe presionar el botón de aleatorio nuevamente
13
Declaraciones
Como se muestra en la imagen anterior se declaran dos Buttons, dos Labels, dos TextField y un
TextArea
Se declaran variables estáticas que serán utilizadas para la conversión de la expresión interfija a
posfija, en las primeras versiones token era un arreglo unidimensional, pero fue cambiado a un
objeto de ListaSimple debido a la propiedad dinámica que tiene, permitiendo almacenar mas o
menos elementos, quitando un limite aparente a la extensión de la expresión.
Botón Conversión
El botón Conversión lo primero que hace es revisar si la lista token está vacía si no es el caso la
limpia para que se llene con nuevos elementos sin afectar la expresión que ingreso el usuario
14
Se ingresa el contenido del TextField en la variable cadena, posteriormente se ingresa en un
arreglo unidimensional para ingresar los elementos en la lista token
Se entra en un ciclo while mientras no sea el fin de la cadena, se inserta el elemento en la posición
del contador en una variable símbolo para poder identificar posteriormente si se trata de un
operador o un operando, también se llama a una función secundaria llamada paréntesis que busca
los paréntesis que existen en la expresión. Después de la ejecución de la función secundaria se
revisa si el contador es igual a la longitud y es un paréntesis de cierre esto se hace debido a la
naturaleza de la función paréntesis, para el caso de que el paréntesis de cierre sea el ultimo
elemento de la expresión no arroje un error la aplicación, si se cumple la condición se hace un
break y se sale del ciclo debido a que el contador no es menor que la longitud de la expresión.
Posteriormente se asigna nuevamente a símbolo el valor que tiene la lista en la posición del
contador y se revisa si el símbolo es un operando, si no es un operando se inserta el elemento en
la cadena en caso contrario se inserta en la pila
15
La función secundaria paréntesis utiliza como base el algoritmo visto en clase para verificar los
paréntesis correctos, se declaran nuevas variables que servirán para apoyarse al momento de
hacer todo el proceso
Se revisa si la pila está vacía en caso de contener elementos se almacena en la pila tmp
Se entra en un ciclo while que recorrerá toda la lista, la primera condición revisa si se encuentra un
paréntesis de apertura, en el caso de que se cumpla se asigna el valor siguiente a la variable
posición para que desde ahí comience la conversión sin tomar en cuenta el paréntesis
Si es un paréntesis de cierre se revisa que tipo de paréntesis es para este primer caso se trata de
“)” y se realiza el mismo algoritmo para convertir la expresión en posfija
16
Con la variación de que se incrementa el contador una vez más para que al salir de la función el
contador no esté en la posición del paréntesis de cierre. Esto se repite con los otros dos tipos de
paréntesis
17
Por ultimo se revisa si la pila tmp no contiene ningún elemento, en caso de que si contenga
elementos se insertan en la pila
Otra función secundaria que se utiliza es la de prc esta retorna un valor booleano dependiendo de
la jerarquía de la operación en el caso de que val1 sea “*” o “/” retorna un true en el caso contrario
se hacen las evaluaciones correspondientes.
18
Botón Evaluar
Se declaran las variables con las que se va a ejecutar el programa para realizar las operaciones
correspondientes
En el caso contrario se extrae el contenido de la pila y se les asigna a los operandos para
posteriormente identificar cual es la operación por realizar el resultado de la operación se guarda
nuevamente en la pila
19
Al terminar el ciclo se extrae el valor de la pila y se asigna al TextArea
Ejecución
El usuario debe ingresar la expresión interfija en la caja de texto indicada y presionar el botón de
conversión para pasar la expresión interfija en una posfija, posteriormente presionar el botón
Evaluar para evaluar la operación posfija.
20
Problema cuatro
El cuarto problema solicitaba convertir un programa que utilizaba una función recursiva en uno
iterativo con el uso de pilas, este problema fue resuelto en clase.
La aplicación se inicializa para tener una imagen que pueda ser manipulable por nosotros para
poder pintar sobre ella.
Declaraciones
Se declaran todos los elementos que ser van a utilizar, para colocar la imagen que se va a pintar y
con lo que se va a rellenar
Ratón
Este programa no utiliza botones para funcionar por lo que tiene un oyente que esta revisando si se
da un clic en la imagen para poder llamar las funciones para pintar la imagen, revisa el color del
pixel que en el que se dio el clic y posteriormente llama a la función para rellenar la imagen.
Recursivo
La función recursiva es sencilla de entender, primero tiene el caso base para evitar desperdiciar memoria,
mientras no se llegue a el caso base se revisan los pixeles alrededor y se van pintando mientras se va
reduciendo el numero de llamadas que se indico
21
Iterativo
Lo que nos interesa es el iterativo, primero se declara una estructura de tipo Pila en la que se insertan
coordenadas para poder empezar a hacer las iteraciones
Se entra en un ciclo Do While en el que se extrae el valor de las coordenadas donde se hizo el clic, también
se obtiene el color del pixel que seleccionamos
Se revisa una condición para ver si los pixeles que se quieren pintar son blancos y de cumplirse se agregan
las coordenadas para 8 direcciones, arriba, abajo, derecha, izquierda, diagonal superior derecha, diagonal
superior izquierda, diagonal inferior derecha y diagonal inferior izquierda. Este ciclo se realiza mientras la
pila contenga elementos en su interior.
22
Ejecución
Al ejecutar el programa tenemos la imagen dispuesta a nosotros para que podamos comenzar a rellenarla
23
Al comenzar a clicar en los pixeles blancos la imagen se comienza a rellenar, rellena la superficie
solo que llega a tardar bastante dependiendo que tan grande sea lo que tiene que rellenar.
Conclusiones
El primer problema represento un gran desafío debido a que al ser mi primera vez utilizando
JavaFx me resulto bastante complicado comprender como estaban funcionando las cosas, realicé
primero cada uno de los métodos de ordenamiento en una clase aparte que mostraba los
resultados por consola antes de comenzar a trabajar de forma grafica de esta forma pude
concentrarme únicamente en la parte gráfica. De lo que pude apreciar los métodos más rápidos
son QuickSort iterativo y recursivo, el mas lento el de selección, la primera impresión es que el de
inserción es el más rápido debido a que pareciera que se ordena antes que todos, pero en realidad
todavía sigue manipulando algunos elementos.
Ver el uso que se pueden dar a las pilas incluso de esta forma un tanto especifica a un problema
de convertir y evaluar operaciones, en un punto donde para la conversión debía guardar los
elementos en una variable temporal, lo primero fue utilizar una variable string, después me percate
que en la pila podrían existir mas de un elemento en espera, entonces cambie de un string a una
ListaSimple pero me di cuenta de que con otra pila podía almacenar toda la información.
El problema de conversión me llevo demasiado tiempo debido a que la forma en la que planteé mi
solución podía a llegar a tener ciertos fallos, conforme hacia pruebas me di cuenta de que ciertas
expresiones rompían mi programa entonces fui creando validaciones para evitar errores en la
ejecución, lo mas probable es que existan soluciones y algoritmos mucho más eficientes que el
mío, pero eso ya será un reto personal.
Para el problema numero 4 solamente agregue otras 4 direcciones en las cuales pintar y cambiar la
condición del ciclo Do While esto debido a que la proporcionada estaba en que el ciclo se
cumpliera siempre y eso me marcaba errores con la pila vacía, con la condición nueva ya no
aparecen esos errores y luce idéntico a cómo funciona la función recursiva. Únicamente hice eso
porque no comprendí si se tenia que hacer algo más, lo que solicitaba el problema fue
proporcionado en clase.
Referencias
Cairo, O. (2001). Estructuras de Datos - 2b: Edición. MC Graw Hill.
D. (2016). Como Programar En Java (9.a ed.). Pearson Education.
Ford, T. H. W. W. R. (2021). Estructuras de datos con C ++ usando STL. Pearson.
24