Examen de Estructuras de Datos y Algoritmos1

Anuncio
Examen de Estructuras de Datos y Algoritmos
1. Al escribir un programa informático es usual que el compilador interno revise si los delimitadores
que el programador ha utilizado a lo largo de su código son correctos, en el sentido de abrirlos y
cerrarlos apropiadamente. Evidentemente ningún programa se considera correcto si existe al
menos un par de delimitadores que no coinciden (abrir llaves y cerrar paréntesis, por ejemplo). Si
consideramos únicamente los delimitadores: paréntesis “(”, “)”; llaves “{”,”}” y corchetes ”[” , ”]”,
escriba un algoritmo que verifique si tales delimitadores han sido usados correctamente. Use al
menos una de las siguientes estructuras de datos de acuerdo a lo que usted considere
conveniente: pilas, colas, listas. Además, asuma que dispone de funciones de lectura y escritura de
variables tipo char y string y una función que reconoce el final de un archivo de texto.
2. Considere el siguiente algoritmo para ordenar un arreglo A de tamaño n, que se basa en el
principio de “Divide y vencerás” y cuyas etapas se ejemplifican a continuación:
Dado un arreglo A=[p…r]:
Dividir: El arreglo A=[p…r] se particiona en dos nuevos subarreglos no vacíos A=[p…q] y A=[q+1…r]
de manera que cada elemento de A=[p…q] es menor o igual que cada elemento de A=[q+1…r]. El
índice q se calcula como parte del proceso de particionamiento.
Vencer: Los dos subarreglos A=[p…q] y A=[q+1…r] se ordenan por llamadas recursivas al algoritmo
de ordenamiento.
Combinar: Dado que los subarreglos están ordenados y se ordenan dentro del mismo arreglo (no
se usan estructuras de datos adicionales), el arreglo original queda ordenado también.
El algoritmo de ordenamiento se puede implementar como sigue:
ORDENAMIENTO (A,p,r)
If p < r then
q= Particion(A,p,r)
ORDENAMIENTO (A,p,q)
ORDENAMIENTO (A,q+1,r)
Para ordenar el arreglo completo A, la llamada inicial es:
ORDENAMIENTO (A,1,tamaño[A]).
La clave del algoritmo es el proceso de Partición. Este proceso reordena el subarreglo A=[p…r]
dentro del mismo arreglo. Toma en primer lugar el elemento x=A[p] como un “pivote” alrededor del
cual se particiona A=[p…r] en dos regiones, A=[p…q] y A=[q+1…r] desde el inicio hasta el final del
arreglo A=[p…r] respectivamente, de manera que cada elemento de A=[p…q] es menor o igual que x y
cada elemento de A=[q+1…r] es mayor o igual que x. Por ejemplo, dado el arreglo
A[p…r]=[5,3,2,6,4,1,3,7], el algoritmo inicia con x=A[p]=5, y devuelve como resultado final el arreglo
A[p..r]=[3,3,2,1,4,6,5,7] con q correspondiente a la posición en la que A[q]=4.
Escriba una función Particion(A,p,r) que realice la partición del arreglo A con las propiedades indicadas
e ilustre su funcionamiento tomando como entrada el arreglo A=[13,19,9,5,12,8,7,4,6,21].
Descargar