PRÁCTICA DE ALGORÍTMICA ENUNCIADO B El problema. Supogamos que lo úico que se cooce respecto de u algoritmo so sus tiempos de ejecució e fució del úmero de datos que procesa. Dicha iformació podría ser algo parecido a lo siguiete: 1 2 3 4 5 6 7 8 9 10 11 12 T() 0,9 1,6 2,3 3,0 3,7 4,4 5,1 5,8 6,5 7,2 7,9 8,6 El objeto de esta práctica es realizar u programa capaz de deducir la cota superior de complejidad de dicho algoritmo úicamete a partir de esta iformació. Coviee recordar que la cota de complejidad o represeta el tiempo de ejecució sio la maera e que éste evolucioa y, e este setido, el pricipal reto de la práctica cosistirá e ivestigar qué algoritmo se debe utilizar. Co el fi de acotar el problema, vamos a clasificar los posibles grados de complejidad e diez tipos: Complejidad Código O ( ) 1 O ( 2 ) 2 O ( 3 ) 3 O ( 4 ) 4 O ( 5 ) 5 O ( 6 ) 6 O ( L ) 7 O ( 2 ) 8 O ( 1 ) 9 Otras 0 Como se puede ver, trataremos complejidades poliómicas (6 tipos), logarítmicas, expoeciales y costates. Además, se ha añadido u último tipo co el que haremos referecia a cualquier otra posibilidad. Prácticamete se descooce toda iformació relativa a los programas que se debe aalizar. No se sabe su cometido, i su leguaje de implemetació, i la máquia e que ha sido ejecutados. Ta solo sabremos sus tiempos de ejecució y la estructura matemática que los caracteriza. Así, vamos a supoer que los tiempos de ejecució de los programas se comporta coforme a algua de las fucioes que se describe a cotiuació.
Programas co tiempo costate: + T () = c / c R Programas co tiempo poliómico: T () = a k k + a k-1 k-1 +... + a Programas co tiempo logarítmico: 2 2 + a + a 1 0 / a R, i k N, 0 K 6 T () = L ( + a) + b / a,b R, + a > 0 Programas co tiempo expoecial: T () = 2 + a + b / a, b R, T () < 30 El programa solució. El procedimieto pricipal de la solució a la práctica deberá llamarse pb y deberá estar e u fichero de ombre pb.adb. Esto es muy importate y si o se cumple es posible que la práctica o se pueda evaluar. Datos de etrada. La etrada al programa será u úico fichero ASCII que se llamará f1.txt y estará e su mismo directorio. Cosistirá e ua secuecia de úmeros reales separados etre si por uo o varios caracteres e blaco, pudiedo icluir además cambios de líea. Puede haber ua catidad idetermiada de úmeros, pero siempre será múltiplo de 20, ya que cada cojuto de 20 úmeros represetará los tiempos de ejecució de u determiado programa para los valores de = 1, 2,...,19, 20. Por ejemplo, u fichero co el coteido que se idica a cotiuació, represetaría los tiempos de ejecució de dos programas (40 úmeros). 1.000 1.45 1.8 2 2.2 2.45 2.8 3.1 3.56 3.77 3.99 4.33 4.5 5.0 5.6 5.82 6.45 6.8 7.23 8 5.45 5.45 5.45 5.45 5.45 5.45 5.45 5.45 5.45 5.45 5.45 5.45 5.45 5.45 5.45 5.45 5.45 5.45 5.45 5.45 Los 20 primeros úmeros se refiere al primero de los programas e idica los siguietes tiempos: T(1) = 1.000 T(2) = 1.45 T(3) = 1.8... T(19) = 7.23 T(20) = 8 Los 20 restates hace referecia a u segudo programa cuyo tiempo de ejecució permaece costate para los 20 valores de. Al igual que ocurre e el ejemplo mostrado, cuado el úmero sea exacto podrá aparecer co o si decimales idistitamete.
Datos de salida. La salida del programa costará de u úico fichero ASCII que tedrá por ombre f2.txt y estará e su mismo directorio. Costará exclusivamete de ua secuecia de úmeros eteros (del 0 al 9) separados por uo o más espacios e blaco. Cada uo de los úmeros hará referecia a uo de los programas del fichero de etrada guardado estrictamete el orde e que éstos se proporcioaro. Dichos úmeros hará referecia al orde de complejidad del programa examiado de acuerdo al código que aparece e la tabla idicada más arriba. Por ejemplo, u fichero de salida podría teer el siguiete coteido: 3 2 1 7 8 0 0 Ello idicaría que se ha examiado 7 programas. Los tres primeros tiee complejidad poliómica de orde cúbico, cuadrático y lieal respectivamete. La complejidad del cuarto programa es logarítmica y la del quito expoecial. Los dos ceros del fial idica que los dos últimos programas o ecaja e igua de las complejidades que estamos cotemplado. Si e algú mometo o se sabe clasificar uo de los programas de la etrada, se le asigará el úmero 0 como salida. Es decir, el 0 se utilizará tato para idicar otra complejidad como o lo se. Bajo igú cocepto se debe omitir igú úmero e la salida o cambiar su orde respecto a los datos de etrada. El fichero de salida siempre debe teer tatos úmeros eteros como el resultado de dividir por 20 los úmeros proporcioados como etrada. Uso de fucioes matemáticas. Depediedo del efoque que se de a la solució, puede que e algú caso vega bie utilizar algua fució matemática. Si esto fuera así, icluiríamos la siguiete declaració al pricipio del programa: with ada.umerics.geeric_elemetary_fuctios; use ada.umerics; Después, e la zoa de declaracioes del procedimieto dode se vaya a usar las fucioes, sería ecesario poer lo siguiete: package fucioes is ew geeric_elemetary_fuctios (float); use fucioes; A partir de ese mometo ya se podrá hacer referecia a las fucioes matemáticas del paquete y cuyo coteido puede cosultarse e varios sitios de iteret, como por ejemplo e el siguiete elace: http://www.adaic.org/resources/add_cotet/stadards/95lrm/arm_html/rm-a-5-1.html
Etrada y salida co úmeros eteros. Para poder trabajar co eteros de forma cómoda, es útil escribir e la zoa de declaracioes lo siguiete: package eteros is ew iteger_io (iteger); use eteros; De esta forma podremos utilizar Put y Get directamete co ellos. El problema de la precisió. Al trabajar co úmeros reales podemos ecotrar problemas derivados de la precisió al realizar determiadas operacioes. Por ejemplo, puede ocurrir que dos variables, a y b, cotega los resultados de diferetes operacioes. Auque e teoría hayamos llegado a la coclusió de que, por las operacioes que se ha realizado, a y b debería ser iguales, podemos llevaros la sorpresa de que al compararlas éstas resulte diferetes. Co el fi de solucioar este problema vamos a evitar el uso del tipo float, ya que utiliza represetació e coma flotate, y vamos a apostar por los reales de coma fija. Para ello, itroduciremos lo siguiete e la zoa de declaració: type coma_fija is delta 0.0000001 digits 18; package coma_fija_io is ew decimal_io (coma_fija); Co esto defiimos u tipo de úmeros que tedrá u total de 18 dígitos de los cuales 7 se utilizará para represetar la parte decimal. Co esto tedremos u rago de trabajo y ua precisió suficietes. Pero co esto o acaba uestros problemas. Lo úico que hemos coseguido es que los márgees de error e uestras variables a y b, utilizadas como ejemplo, sea parecidos, pero el error seguirá existiedo. La solució pasa por cotemplar ese marge de error cuado hagamos las comparacioes. E vez de pregutar si a y b so iguales, pregutaremos si a y b so casi iguales. Por ejemplo podemos hacer lo siguiete: if abs( a b ) < abs( a * 0.2 ) the -- Cosideramos que a y b so iguales. else -- Los cosideramos diferetes. ed if; E este caso cosideramos que ambos valores so iguales si difiere e meos de u 20% del valor de uo de ellos. Obsérvese la ecesidad de usar la fució que calcula el valor absoluto cuado o estamos seguros de los valores que pueda tomar uestras variables. Naturalmete el marge de error permitido o tiee por qué ser el 20%, sio que e cada caso habrá que adoptar el más adecuado.
Evaluació de la práctica. La correcció se hará de forma automática por lo que es muy importate seguir al pie de la letra todas las idicacioes que se da. Las prácticas que o compile correctamete o aborte durate la ejecució será cosideradas suspesas. Lo mismo ocurrirá co aquellas que o siga las especificacioes idicadas respecto a los ombres de los ficheros de etrada y salida, formato de éstos y demás ormas geerales. Tambié es importate cumplir las istruccioes geerales que se ha dado e documetació aparte. Digamos que la primera prueba cosiste e ser capaz de cumplir todos estos requisitos si igua excepció. La práctica será probada co los datos reales de más 100 de programas. Cada programa clasificado adecuadamete irá icremetado la ota de la práctica. Cada programa clasificado de forma erróea descotará ua catidad similar. Los programas cuya clasificació sea 0 ( otra complejidad / o lo se ) i suma i resta ota. Ficheros de prueba. Juto co el euciado de la práctica se proporcioa uos ficheros de pruebas para poder comprobar el correcto fucioamieto de la solució. Hay que recordar que, auque los ficheros proporcioados para las pruebas tiee ombres distitos, el fichero de etrada a uestro programa siempre debe teer el mismo ombre (f1.txt). E la siguiete tabla se muestra los resultados que debería obteerse para cada uo de los ficheros de prueba. P1 P3 P5 L 1 1 1 1 3 3 3 3 5 5 5 5 7 7 7 7 Cos 9 9 9 9 Varios1 9 8 7 0 1 2 3 4 5 6 Varios2 P2 P4 P6 Exp 2 2 2 2 4 4 4 4 6 6 6 6 8 8 8 8 Otro 0 0 0 0 1 1 7 7 5 5 3 3 9 9 2 2 8 8 4 4 0 0 6 6 Varios3 6 0 5 9 1 1 4 7 3 8 3 6 9 5 2 2 4 8 3 1 0 7 6 8 2 0 5 7 4 9