Algoritmos voraces (greedy): seleccionan los elementos ms prometedores del
conjunto de candidatos hasta encontrar una solucin. En la mayora de los casos la solucin no es ptima. Algoritmos paralelos: permiten la divisin de un problema en subproblemas de forma ue se puedan ejecutar de forma simultnea en varios procesadores. Algoritmos probabilsticos: algunos de los pasos de este tipo de algoritmos estn en funcin de valores pseudoaleatorios Algoritmos determinsticos: El comportamiento del algoritmo es lineal: cada paso del algoritmo tiene !nicamente un paso sucesor y otro ancesor. Algoritmos no determinsticos: El comportamiento del algoritmo tiene forma de rbol y a cada paso del algoritmo puede bifurcarse a cualuier n!mero de pasos inmediatamente posteriores" adems todas las ramas se ejecutan simultneamente. #ivide y vencers: dividen el problema en subconjuntos disjuntos obteniendo una solucin de cada uno de ellos para despu$s unirlas" logrando as la solucin al problema completo. %etaheursticas: encuentran soluciones apro&imadas (no ptimas) a problemas basndose en un conocimiento anterior (a veces llamado e&periencia) de los mismos. 'rogramacin dinmica: intenta resolver problemas disminuyendo su coste computacional aumentando el coste espacial. (amificacin y acotacin: se basa en la construccin de las soluciones al problema mediante un rbol implcito ue se recorre de forma controlada encontrando las mejores soluciones. )uelta Atrs (Backtracking): se construye el espacio de soluciones del problema en un rbol ue se e&amina completamente" almacenando las soluciones menos costosas. REGLAS PARA LA ESCRITURA ALGORITMICA 'ara escribir los algoritmos primero debemos seguir una serie de reglas para una respuesta eficiente. Sangras *as instrucciones ue apare+can debajo de ,inicio- deben tener una sangra mayor ue dicha instruccin. .sta sangra se mantendr hasta la aparicin del ,fin- correspondiente. Esto es particularmente importante cumplirlo si e&isten varios bloues inicio/fin anidados. Asimismo" un algoritmo es ms fcil de leer si los comentarios tienen todos la misma sangra. Ejemplo: Escribir un algoritmo ue determine" entre dos n!meros A y 0" cul es el mayor o si son iguales. 1bserve bien las sangras de cada bloue de instrucciones" as como la posicin alineada de los comentarios. algoritmo comparar // Funcin: Comparar dos nmeros A y B variables A,B son enteros inicio leer (A) // leemos los dos nmeros del teclado leer (B) si (A == B) entonces // los nmeros son iguales inicio escribir (!os dos nmeros son iguales) "in si#no // los nmeros son distintos, as$ %ue inicio // vamos a compararlos entre s$ si (A & B) entonces inicio // A es mayor escribir (A es mayor %ue B) "in si#no inicio // B es mayor escribir (B es mayor %ue A) "in "in "in Prescindir de inicio y !in 2uando un bloue de instrucciones slo contiene una instruccin" podemos escribirla directamente" sin necesidad de encerrarla entre un ,inicio- y un ,fin-. Esto suele redundar en una mayor facilidad de lectura. Ejemplo: (epetiremos el mismo ejemplo anterior" prescindiendo de los ,inicio- y ,fin- ue no sean necesarios. 3jese en ue el algoritmo es ms corto y" por lo tanto" ms fcil de leer y entender. algoritmo comparar // Funcin: Comparar dos nmeros A y B variables A,B son enteros inicio leer (A) // leemos los dos nmeros del teclado leer (B) si (A == B) entonces // los nmeros son iguales escribir (!os dos nmeros son iguales) si#no // los nmeros son distintos, as$ %ue inicio // vamos a compararlos entre s$ si (A & B) entonces escribir (A es mayor %ue B) si#no escribir (B es mayor %ue A) "in "in Ti"ogra!a En muchos te&tos" se resaltan las palabras clave del lenguaje de programacin en negrita" para distinguirlas de identificadores de variable" smbolos" etc. %uchos editores de te&to pensados para escribir programas con ellos tambi$n lo hacen" utili+ando diversos colores para distinguir los elementos entre s. Esto aumenta la legibilidad del algoritmo" aunue tiene sus detractores. 'ara escribir algoritmos con un procesador de te&to convencional o usando pseudocdigo" es conveniente ue usar una fuente de tamao fijo (el tipo 2ourier va bastante bien). Es"acios 1tro elemento ue aumenta la legibilidad es espaciar suficientemente (pero no demasiado) los distintos elementos de cada instruccin. 'or ejemplo" esta instruccin ya es bastante complicada y difcil de leer: si (a & b) y (c & d ' rai(()) ) entonces a = ) * +,- ' b 'ero se lee mucho mejor ue esta otra" en la ue se han suprimido los espacios (e&cepto los imprescindibles): si(a&b)y(c&d'rai(()))entonces a=)*+,-'b Al ordenador le dar igual si escribimos (a 4 b) o (a4b)" pero a cualuier programador ue deba leer nuestro cdigo le resultar mucho ms cmoda la primera forma. 'or la misma ra+n" tambi$n es conveniente dejar lneas en blanco entre determinadas instrucciones del algoritmo cuando se considere ue mejora la legibilidad. Identi!icadores A la hora de elegir identificadores de variables (o de constantes) es muy importante utili+ar nombres ue sean significativos" es decir" ue den una idea de la informacin ue almacena esa variable. 'or ejemplo" si en un programa de nminas vamos a guardar en una variable la edad de los empleados" es una buena ocurrencia llamar a esa variable ,edad-" pero no llamarla ,5-" ,A- o ,cosa-. Ahora bien" dentro de esta poltica de elegir identificadores significativos" es conveniente optar por auellos ue sean lo ms cortos posible" siempre ue sean descifrables. As" un identificador llamado ,edad6de6los6empleados- es engorroso de escribir y leer" sobre todo si aparece muchas veces en el algoritmo" cuando probablemente ,edad6empl- proporciona la misma informacin. 7in embargo" si lo acortamos demasiado (por ejemplo ,ed6em-) llegar un momento en el uede claro lo ue significa. 8oda esta idea de significacin de los identificadores es e&tensible a los nombres de los algoritmos" de las funciones" de los procedimientos" de los archivos y" en general" de todos los objetos relacionados con un programa. En ciertos lenguajes e&isten convenciones ms o menos rgidas para formar identificadores largos. 8ambi$n pueden e&istir acuerdos (escritos o tcitos) en empresas y organi+aciones" as ue uno debe amoldarse al sitio y al lenguaje. El objetivo es evitar ue unos programadores usen identificadores del tipo edad_de_los_empleados" mientras ue otros bauticen a esta variable edadDeLosEmpleados. 'or !ltimo" se9alar ue muchos lenguajes de programacin distinguen entre may!sculas y min!sculas" es decir" ue para ellos no es lo mismo el identificador ,edad- ue ,Edad- o ,E#A#-. Es conveniente" por tanto" ir acostumbrndose a esta limitacin. :osotros preferiremos usar identificadores en min!scula" por ser lo ms habitual entre los programadores de lenguaje 2. CUERPO BASICO #E UN ALGORITMO ;n algoritmo de be seguir lo s siguientes pasos: Enca$e%ado <4 nombre del algoritmo. Inicio <4 todo algoritmo empie+a con la etiueta =. #ec&araciones <4 se declaran variables" funciones" etc. Procesos <4 leer" calcular" imprimir. 'in <4 OPERACIONES BASICAS EN PSEU#OCO#IGO ( #IAGRAMA #E 'LU)O OPERACIONES EN PSEU#OCO#IGO ( #IAGRAMA #E 'LU)O* *as operaciones basicas ue se reali+an en pseudocdigo son: arit+eticas: > suma < resta ? multiplicacin @ division mod modulo div division entera #e co+"araci,n: A igual B4 diferente B menor ue 4 mayor ue BA menor o igual ue 4A mayor o igual ue &,gicos: A:# la e&presin ser verdadera si y solo si ambas e&presiones son verdaderas 1( la e&presin ser verdadera si al menos una e&presin es verdadera 51( la e&presin ser verdadera si y solo si ambas e&presiones son diferentes (verdadero y falso" o viceversa) :18 el valor de la e&presin es la nrgacion de la e&presin original :ota: la procedencia de los operadores la establecen los par$ntesis. ESTRUCTURAS #E CONTROL EN PSEU#OCO#IGO ( #IAGRAMA #E 'LU)O Las estructuras de control permiten modificar el flujo de ejecucin de las instrucciones de un programa . Todas las estructuras de control tienen un nico punto de entrada y un nico punto de salida. Las estructuras de control se puede clasificar en: secuencial, alternativas y repetitivas. Estr-ct-ra Sec-encia& Accin = <4 Accin C <4 Accin D <4 ... *a solucin del problema consiste en la solucin de subproblemas parciales" en forma consecutiva. Es decir ue la accin E no se inicia hasta haber terminado la accin E<=. En muchos casos" para reali+ar la accin E necesitaremos el resultado de la accin E< =. En nuestra notacin en pseudocdigo" indicaremos las acciones secuenciales separadas por FGF: Accin =G Accin CG Accin DG Accin HG *as acciones propiamente dichas van desde operaciones de entrada@salida (como ingresar n!meros por teclado o imprimir un n!mero por pantalla)" operaciones matemticas o de manejo de caracteres" otras estructuras algortmicas y hasta otros algoritmos ya resueltos (llamado procedimientos" funciones o subrutinas en los distintos lenguajes). 'or ejemplo: supongamos ue ueremos dividir dos n!meros a y b Ingresar n!mero aG Ingresar n!mero bG #ividir a y bG Imprimir el resultadoG Estr-ct-ra Condiciona& En este caso la solucin del problema conduce a ue" seg!n se cumpla cierta condicin o no" se ejecute una u otra de dos acciones diferentes. 7i 2ondicin Entonces Accin= 7ino AccinC 3in7i Ejemplo: mismo problema anterior" pero slo cuando b es distinto de J. Ingresar n!mero aG Ingresar n!mero bG 7i b es igual a J Imprimir mensaje de errorG 7ino #ividir a y bG Imprimir el resultadoG 3in7i Estr-ct-ra Re"etiti.a En este caso" la solucin del problema consiste en la repeticin de una accin ms sencilla mientras se cumpla cierta condicin. (esulta evidente ue para ue esta sucesin de acciones termine" la accin misma debe modificar por lo menos una de las variables ue intervienen en la condicin. 2ada ve+ ue se ejecuta la accin la llamaremos iteracin. %ientras 2ondicin Kacer Accin 3in%ientras 2omo se observa en el diagrama de bloues" la evaluacin de la condicin se reali+a antes de ejecutar cada una de las iteracionesG es decir ue si la condicin no se cumple la primera ve+ ue llegamos a este la+o" la accin no se ejecutar nunca. Ejemplo: calcular el factorial de un n!mero n. Ingresar n!mero nG Iniciali+ar factorial en =G %ientras n sea mayor ue = multiplicar factorial por nG guardar resultado en factorialG disminuir n en =G 3in%ientras Imprimir factorialG :otar ue hasta este momento no hemos hecho mencin de ning!n lenguaje en particular. Esto se debe a ue el planteo de algoritmos es un paso previo a la escritura del cdigo del programa. 'or supuesto ue los distintos lenguajes brindan otras estructuras algortmicas adems de las bsicas ue pueden facilitarnos la vida a la hora de plantear la solucin ms apropiada. ESTRUCTURAS #E CONTROL Las estructuras de control permiten modificar el flujo de ejecucin de las instrucciones de un programa . Todas las estructuras de control tienen un nico punto de entrada y un nico punto de salida. Las estructuras de control se puede clasificar en: secuencial, alternativas y repetitivas. cada autor usa su propio pseudocdigo con sus respectivas convenciones. Por ejemplo, considere la instruccin "Reemplace el valor de la variable x por el valor de la variable y" algunas de las posibles sinta!is para indicar lo anterior podr"an ser: asigne a el valor de
#in embargo, independientemente de estas diferencias, se pueden considerar tres
estructuras de control para desarrollar los procedimientos: SECUENCIAL: Las instrucciones se siguen en una secuencia fija $ue normalmente viene dada por el nmero de rengln. %s decir $ue las instrucciones se ejecutan de arriba &acia abajo. .nstruccin /
.nstruccin 0
.nstruccin 1
.nstruccin n
ALTERNATIVAS: Selectiva La instruccin selectiva determina si una determinada instruccin se ejecuta o no, segn el cumplimiento de una condicin P. 'iagrama de flujo $ue muestra el funcionamiento de la instruccin condicional si P entonces Instrucciones /
fin si La condicin P es una variable booleana o una funcin reducible a booleana (lgica, )erdadero*+also,. #i esta condicin es cierta se ejecuta Instrucciones - , si no es as", .sta no se ejecuta. Selectiva doble La instruccin selectiva reali/a una instruccin de dos posibles, segn el cumplimiento de una condicin P. 'iagrama de flujo $ue muestra el funcionamiento de la instruccin condicional si P entonces Instrucciones /
si no Instrucciones 0
fin si La condicin P es una variable booleana o una funcin reducible a booleana (lgica, )erdadero*+also,. #i esta condicin es cierta se ejecuta Instrucciones - , si no es as", entonces se ejecuta Instrucciones 0 . Selectiva mltiple Tambi.n es comn el uso de una seleccin mltiple $ue e$uivaldr"a a anidar varias funciones de seleccin. si Condicin / entonces Instrucciones /
si no si Condicin 0 entonces Instrucciones 0
si no si Condicin n entonces Instrucciones n 2 /
si no Instrucciones n
fin si %n este caso &ay una serie de condiciones $ue tienen $ue ser mutuamente e!cluyentes, si una de ellas se cumple las dem1s tienen $ue ser falsas necesariamente, &ay un caso si no $ue ser1 cierto cuando las dem1s condiciones sean falsas. %n esta estructura si Condicin - es cierta, entonces se ejecuta slo Instrucciones - . %n general, si Condicin i es verdadera, entonces slo se ejecuta Instrucciones i Selectiva mltipleCasos 2na construccin similar a la anterior (e$uivalente en algunos casos, es la $ue se muestra a continuacin. seleccionar Indicador caso Valor / : Instrucciones /
caso Valor 0 : Instrucciones 0
caso Valor n2/ : Instrucciones n2/
3en otro caso: Instrucciones n 4 Fin seleccionar Indicador %n este caso &ay un Indicador es una variable o una funcin cuyo valor es comparado en cada caso con los valores "Valor i ", si en algn caso coinciden ambos valores, entonces se ejecutar1n las Instrucciones i correspondientes. La seccin en otro caso es an1loga a la seccin si no del ejemplo anterior. RE!ETITIVA: Las instrucciones iterativas abren la posibilidad de reali/ar una secuencia de instrucciones m1s de una ve/. 'iagrama de flujo $ue muestra el funcionamiento de la instruccin mientras mientras P hacer Instrucciones fin mientras %l bucle se repite mientras la condicin P sea cierta, si al llegar por primera ve/ al bucle mientras la condicin es falsa, el cuerpo del bucle no se ejecuta ninguna ve/. %!isten otras variantes $ue se derivan a partir de la anterior. La estructura de control hacer se utili/a cuando es necesario $ue las instrucciones de una estructura mientras se ejecuten al menos una ve/: hacer Instrucciones mientras P La estructura anterior e$uivaldr"a a escribir Instrucciones mientras P hacer Instrucciones fin mientras 2na estructura de control muy comn es el ciclo para, la cual se usa cuando se desea iterar sobre un "ndice i (por convencin se usa i, sin embargo se puede usar cual$uier identificador,: para hasta n hacer Instrucciones fin para La cual se define como mientras hacer Instrucciones fin mientras Por ltimo, tambi.n es comn usar la estructura de control para cada. %sta sentencia se usa cuando se tiene una lista o un conjunto L y se $uiere iterar por cada uno de sus elementos: para cada hacer Instrucciones fin para #i asumimos $ue los elementos de L son , entonces esta sentencia e$uivaldr"a a para hasta n hacer Instrucciones fin para #in embargo, en la pr1ctica e!isten mejores formas de implementar esta instruccin dependiendo del problema. !RUE"A #E ESCRIT$RI$ 2na prueba de escritorio es la comprobacin lgica, de un algoritmo de resolucin, la cual consiste en &acer un seguimiento manual de los pasos seguidos $ue se definieron en el pseudocdigo y comprobar, con base en sus datos, si el resultado al cual se llega es el esperado. Para desarrollar la prueba de escritorio, se utili/ara el siguiente procedimiento: 3on datos de prueba, se seguir1n cada uno de los pasos propuestos en el algoritmo de resolucin. #i la prueba de escritorio genera resultados ptimos, $uiere decir $ue el algoritmo posee una lgica adecuada, en caso contrario el algoritmo tendr1 $ue ser corregido. Es posible demostrar ue cualuier problema puede reducirse" utili+ando slo las siguientes estructuras algortmicas: Estructura secuencial" Estructura condicional y Estructura repetitiva ( o la+o repetitivo).