Conceptos básicos: Algoritmos y aproximaciones

En el siguiente trabajo pretendemos presentar una serie de concepto y definiciones propios del estudio de los Algoritmos, su análisis y diseño. En el mismo podremos encontrar los conceptos de algoritmo y algunos de sus componentes, análisis y diseño. También veremos los diferentes tipos de formas y tamaños o medidas en que se pueden almacenar y representar los datos y estructuras en un algoritmo o programa. En ese mismo orden encontraremos las diferentes técnicas para diseñarlos como son el método de la fuerza bruta, el voraz, divide y vencerás, programación dinámica, de vuelta atrás, entre otros. De igual forma podremos ver las definiciones y algunas características, reglas, normas, tipos de algoritmos de búsqueda y ordenación así como sus aplicaciones. Finalmente veremos los que es la verificación y derivación de programas, donde daremos los conceptos básicos de semántica y sus tipos haciendo mayor énfasis en la semántica axiomática, la recursividad e iteración, los diseños de estos últimos, así como los típicos ciclos utilizados en algoritmos y programas y los paso a tener en cuenta al momento de desarrollar un algoritmo iterativo o recursivo. Es importante el estudio y conocimiento de lo que hoy conocemos como Algoritmos Computacionales, que desde su aparición hasta nuestros días es, y seguirá siendo; vital para el desarrollo de aplicaciones para computadoras y el manejo y dominio de la lógica de programación para resolver problemas. Como estudiantes de la Facultad de Ciencias y Tecnología " Escuela de Informática y Computación " de la Universidad Dominicana Organización y Métodos O&M con aspiraciones de iniciarnos como Ingeniero en Sistemas y Computación. Con el objetivo inmediato de aprobar con los mejores meritos la asignatura de Algoritmos Computacionales. General: Posibilitar la estudiante alcanzar una visión sistemática de lo que conocemos sobre Los Algoritmos Computacionales. Específicos : Introducir los conceptos propios sobre Algoritmo, su importancia en el mundo de las aplicaciones para computadoras y el manejo de lógica de programación.
y y y y y y

Proporcionar una idea de su uso. Visualizar sus ventajas e importancia. Definir sus tipos y variantes. Proporcionar conceptos sobre su análisis y diseño. Proporcionar concepto sobre las técnicas de diseño. Desglosar sus variantes (ordenación, búsqueda, etc. ).

Marco Historico. Un algoritmo es un conjunto de operaciones y procedimientos que deben seguirse para resolver un problema. La palabra algoritmo se deriva del nombre latinizado del gran Matemático Árabe Mohamed Ibn Al Kow Rizmi, el cual escribió sobre los años 800 y 825 su obra Quitad Al Mugabala, donde se recogía el sistema de numeración hindú y el concepto del cero. Fue Fibinacci, el que tradujo la obra al latín y el inicio con la palabra: Algoritmi Dicit. El lenguaje algorítmico es aquel por medio al cual se realiza un análisis previo del problema a resolver y encontrar un método que permita resolverlo. El conjunto de todas las operaciones a realizar y e orden en que se deben efectuarse, se le denomina algoritmo.

Es un método para resolver un problema mediante una serie de datos precisos, definidos y finitos. Generalidades El programador de computadoras es ante que nada una personaque resuelve problemas, por lo que para llegar a ser un programador eficaz se necesita aprender a resolver problemas de un modo riguroso y sistemático. A la metodología necesaria para resolver problemas mediante programas se denomina Metodología de la Programación. El eje central de esta metodología es el concepto, ya tratado, de algoritmo. Un algoritmo es un método para resolver un problema. Aunque la popularización del término ha llegado con el advenimiento de la era informática, algoritmo proviene de Mohammed alKhowarizmi, matemático persa que vivió durante el siglo IX y alcanzo gran reputación por el enunciado de las reglas para sumar, restar, multiplicar y dividir números decimales; la traducciónal latín del apellido de la palabra algorismus derivo posteriormente en algoritmo. Euclides, el gran matemático griego (del siglo IV antes de Cristo) que invento un método para encontrar el máximo común divisor de dos números, se considera con Al-Khowarizmi el otro gran padre de la algoritmia ( ciencia que trata de los algoritmos). El profesor Niklaus Wirth, inventor de Pascal, Modula-2 y Oberon, titulo uno de sus mas famosos libros, Algoritmos + Estructuras de Datos = Programas, significándonos que solo se puede llegar a realizar un buen programa con el diseño de un algoritmo y una correcta estructura de datos. Esta ecuación será de una de las hipótesis fundamentales consideradas en esta obra. La resolución de un problema exige el diseño de un algoritmo que resuelva el problema propuesto. Los pasos para la resolución de un problema son: 1. Diseño de algoritmo, que describe la secuencia ordenada de pasos que conducen a la solución de un problema dado. (Análisis del problema y desarrollo del algoritmo). 2. Expresar el algoritmo como un programa de lenguaje de programación adecuado. (Fase de codificación.) 3. Ejecución y validación del programa por la computadora. Para llegar a la realización de un programa es necesario el diseño previo de algoritmo, de modo que sin algoritmo no puede existir un programa. Los algoritmos son independientes tanto del lenguaje de programación en que se expresan como de la computadoraque lo ejecuta. En cada problema el algoritmo se puede expresar en un lenguaje diferente de programación y ejecutarse en una computadora distinta; sin embargo, el algoritmo será siempre el mismo. Así, por ejemplo, en una analogía con la vida diaria, una receta de un plato de cocina se puede expresar en español, ingles o francés, pero cualquiera que sea el lenguaje, los pasos para la elaboración del plato se realizaran sin importar el idioma del cocinero. En la cienciade la computación y en la programación, los algoritmos son más importantes que los lenguajes de programación o las computadoras. Un lenguaje de programación es tan solo un medio para expresar un algoritmo y una computadora es solo un procesador para ejecutarlo. Tanto el lenguaje de programación como la computadora son los mediospara obtener un fin: conseguir que el algoritmo se ejecute y se efectúe el proceso correspondiente. Dada la importancia del algoritmo en la ciencia de la computación, un aspecto muy importante será el diseño de algoritmos. El diseño de la mayoría de los algoritmos requiere creatividady

conocimientos profundos de la técnica de la programación. En esencia, la solución de un problema se puede expresar mediante un algoritmo. Características de los Algoritmos: Las características fundamentales que debe cumplir todo algoritmo son:
y y y

Un algoritmo debe ser preciso e indicar el orden de realización de cada paso. Un algoritmo debe estar definido. Si se sigue un algoritmo dos veces, se debe obtener el mismo resultado cada vez. Un algoritmo debe ser finito. Si se sigue un algoritmo se debe terminar en algún momento; o sea, debe tener un numero finito de pasos.

La definición de un algoritmo debe definir tres partes: Entrada, Proceso y Salida. En el algoritmo de receta de cocina citado anteriormente se tendrá: Entrada: ingrediente y utensilios empleados. Proceso: elaboración de la receta en la cocina. Salida: terminación del plato (por ejemplo, cordero). Ejemplo de Algoritmo: Un cliente ejecuta un pedido a una fábrica. Esta examina en su banco de datos la ficha del cliente; si el cliente es solvente entonces la empresa acepta el pedido; en caso contrario rechazara el pedido. Redactar el algoritmo correspondiente. Los pasos del algoritmo son: 1. 2. 3. 4. 5. inicio leer el pedido examinar la ficha del cliente si el cliente es solvente aceptar pedido; en caso contrario, rechazar pedido fin

Diseño del Algoritmo: En la etapa de análisis del proceso de programación se determina que hace el programa. En la etapa de diseño se determina como hace el programa la tarea solicitada. Los métodos mas eficaces para el proceso de diseño se basan en el conocido por Divide y Vencerás, es decir, la resolución de un problema complejo se realiza dividiendo el problema en sub problemas y a continuación dividir estos sub problemas en otros de nivel mas bajo, hasta que pueda ser implementada una solución en la computadora. Este método se conoce técnicamente como diseño descendente (Top Down) o modular. El proceso de romper el problema en cada etapa y expresar cada paso en forma más detallada se denomina refinamiento sucesivo. Cada sub programa es resuelto mediante un modulo (sub programa) que tiene un solo punto de entrada y un solo punto de salida. Cualquier programa bien diseñado consta de un programa principal (el modulo de nivel mas alto) que llama a sub programas (módulos de nivel mas bajo) que a su vez pueden llamar a otros sub programas. Los programas estructurados de esta forma se dice que tienen un diseño modular y el método de romper el programa en módulos más pequeño se llama Programación Modular. Los módulos pueden ser planeados, codificados, comprobados y depurados independientemente (incluso por diferentes programadores) y a continuación combinarlos entre si. El proceso implica la ejecución de los siguientes pasos hasta que el programa se termina:

y y y y

programar modulo. Comprobar el modulo. Si es necesario, depurar el modulo. Combinar el modulo con los módulos anteriores.

El proceso que convierte los resultados del análisis del problema en un diseño modular con refinamiento sucesivo que permitan una posterior traducción al lenguaje se denomina diseño de algoritmo. El diseño del algoritmo es independiente del lenguaje de programación en el que se vaya a codificar posteriormente. 4. Análisis De Algoritmos Recursos De Computadores Y Complejidad Algoritmo: Conjunto de reglas para resolver un problema. Su ejecución requiere unos recursos. Un algoritmo es mejor cuantos menos recursos consuma, su facilidad de programarlo, corto, fácil de entender, robusto, etc. Criterio empresarial: Maximizar la eficiencia. Eficiencia: Relación entre los recursos consumidos y los productos conseguidos. Recursos consumidos: Tiempo de ejecución. Memoria principal: Entradas/salidas a disco. Comunicaciones, procesadores, etc. Lo que se consigue: Resolver un problema de forma exacta, forma aproximada o algunos casos. Recursos consumidos: Ejemplo. ¿Cuántos recursos de tiempo y memoria consume el siguiente algoritmo sencillo? i:= 0 a[n+1]:= x repetir i:= i + 1 hasta a[i] = x Respuesta: Depende. ¿De qué depende? De lo que valga n y x, de lo que haya en a, de los tipos de datos, de la máquina... En general los recursos dependen de: Factores externos. El ordenador donde lo ejecutemos: 286, Pentium III, Cray,... El lenguaje de programación y el compilador usado. La implementación que haga el programador del algoritmo. En particular, de las estructuras de datos utilizadas. Tamaño de los datos de entrada. Ejemplo. Calcular la media de una matriz de NxM. Contenido de los datos de entrada. Mejor caso. El contenido favorece una rápida ejecución. Peor caso. La ejecución más lenta posible. Caso promedio. Media de todos los posibles contenidos.

T(8)= 3. pero ¿qué significa T(N)? Tiempo de ejecución en segundos. T(N) = N+1. o alguna constante.Los factores externos no aportan información sobre el algoritmo. si el algoritmo es poco eficiente. o una constante diferente. con los límites del FOR. externos no aportan información sobre el algoritmo. Normalmente usaremos la notación T(N)=.2 s N= 7.5 min ¿Qué conclusiones podemos extraer? Análisis a priori: Evitamos la implementación. Ejemplo. Operaciones básicas (+. Algunas reglas básicas.): Una unidad de tiempo. Asignación de tiempos..... para valores suficientemente grandes (asintóticamente) sin considerar constantes. -. T(4)= 0. u omega de T. :=. Podemos comparar con otros algoritmos. de forma aproximada (y parametrizada). para el conteo de instrucciones. ¿Cuánto tiempo. Programa "cifras..? Sabemos que cada ejecución lleva un tiempo constante. Nos interesa un análisis que sea independiente de esos factores. luego se diferencia en una constante con los anteriores. Notaciones asintóticas: Indican como crece T. T(N) = 2N + 4. T(N) = bN + c.. T(5)= 5 ms N= 6. Medidas Asintoticas Notación asintótica: El tiempo de ejecución T(n) está dado en base a unas constantes que dependen de factores externos. O(T): Orden de complejidad de T. T(6)= 0.exe": N= 4. Conclusión: Estudiar la variación del tiempo y la memoria necesitada por un algoritmo respecto al tamaño de la entrada y a los posibles casos. Orden de complejidad de f(n): O(f) . cuántas instrucciones. ¿Existe una cota inferior y superior del número de ejecuciones? ¿Se puede convertir en un FOR? El análisis de algoritmos también puede ser a posteriori: implementar el algoritmo y contar lo que tarda para distintas entradas. *.. Q (T): Orden exacto de T. Mejor caso y peor caso según la condición. Operaciones de entrada salida: Otra unidad de tiempo. Suponiendo que b y c son constantes. Bucles WHILE y REPEAT: Estudiar lo que puede ocurrir.. ¿Se puede predecir cuándo se cumplirán las condiciones? Llamadas a procedimientos: Calcular primero los procedimientos que no llaman a otros.1 ms N= 5. Podemos hacer previsiones. Bucles FOR: Se pueden expresar como una sumatoria. T(7)= 10 s N= 8. ¿Tardarán todas lo mismo? Ejecuciones del bucle principal. IF y CASE: Estudiar lo que puede ocurrir. W (T): Orden inferior de T.. con los segundos que tardan las operaciones básicas correspondientes. Instrucciones ejecutadas por el algoritmo.

k) = kB+l+n+2kn Orden de complejidad de f(n1. M(B.. llamamos orden de f al conjunto de todas las funciones de Nm en R+ acotadas superiormente por un múltiplo real positivo de f. n Î O(n2) Þ 2n+1 Î O(n2) P2. Dadas f y g de N en R+. se cumple: i) limn¥ ® f(n) Î R+ Þ O(f) = O(g) g(n) ii) limn¥ ® f(n) = 0 Þ O(f) Ì O(g) g(n) iii) limn¥ ® f(n) = +¥ Þ O(f) É O(g) g(n) Notación con varios parámetros: En general.n. n2. .": no nos importa lo que pase para valores pequeños. Dadas f y g de N en R+. Propiedades P1. Si f Î O(g) y g Î O(h) entonces f Î O(h).. de N en R+.Dada una función f: N ® R+. Dadas f y g de N en R+. .) es completa? Dadas f y g... O(f+g) = O(max(f. g)). ¿Cómo es la relación para los W ? P3.xN ® R+) Ej.": nos quitamos las constantes. para valores de (n1. se cumple: i) O(f) = O(g) Û f Î O(g) y g Î O(f) ii) O(f) Í O(g) Û f Î O(g) ¿La relación de orden entre O(. se cumple: i) limn¥ ® f(n) Î R+ Þ O(f)=O(g). -g))? P5. Ej.. W (f)=W (g). nm): O(f) Dada una función f: Nm ® R+. Si f Î O(g) entonces O(f) Í O(g). Dadas f y g de N en R+. nm) suficientemente grandes. el tiempo y la memoria consumidos pueden depender de muchos parámetros.. La definición es aplicable a cualquier función de N en R. " n ³ n0: t(n) £ c·f(n) } Nota: O(f) es un conjunto de funciones. Grandes. O(f)= { t: N ® R+ / $ c Î R+.. Dadas f y g... no una función.. O(f)=O(g) Û Q (f)=Q (g) Û f Î Q (g) Û W (f)=W (g) P7. Memoria en una tabla hash.. f: Nm ® R+ (f: Nx. no sólo tiempos de ejec. ¿Qué relación hay entre O(log2 n) y O(log10 n)? P6. llamamos orden de f al conjunto de todas las funciones de N en R+ acotadas superiormente por un múltiplo real positivo de f. W (g) Í W (f) g(n) P5. Si f Î W (g) y g Î W (h) entonces f Î W (h) Ej. W (f+g) = W (max(f+g)) ¿Y para los Q (f+g)? ¿Es cierto que O(f .g) = O(max(f. $ n0 Î N. para valores de n suficientemente grandes.. "Funciones acotadas superiormente por un múltiplo de f. Q (f)=Q (g) g(n) ii) limn¥ ® f(n) = 0 Þ O(f) Í O(g). 2n+1 Î O(n). ¿se cumple O(f)Í O(g) ó O(g)Í O(f)? P4.m. . "Valores de n sufic. l...

b) = a·N + b El tiempo depende del tamaño del problema N. si p y q son polinomios del mismo grado. $ n0 Î N. Ejemplo. y P: N ® B. a. Orden exacto de f(n): Q (f): Dada una función f: N ® R+." km ³ nm : t(k1. Las propiedades se siguen cumpliendo ® Demostrarlo. ¿O(f) « O(f | P)? Ordenes De Complejidad Uso de los órdenes de complejidad: Dado un tiempo t(n). Orden condicionado de f(n): O(f | P) Dada una función f: N ® R+. ±O(f) £ O(g) Û O(f) Í O(g) Û Para toda t Î O(f). $ n0 Î N. n2. para funciones con varios parámetros. asintóticamente y salvo constantes. y del tiempo de inicialización b y de ejecución de un paso a. k2 ³ n2 ... km) £ c·f(k1.. t(n) = 2n2/5 + 3p /2.. W (f)= { t: N ® R+ / $ c Î R+. y que más se aproxime asintóticamente. O(f) = O(f | true). Podemos suponerlos constantes T(N). " k1 ³ n1 .O(f)= { t: Nm ® R+ / $ c Î R+...a.. " n ³ n0: t(n) ³ c·f(n) } La notación omega se usa para establecer cotas inferiores del tiempo de ejecución. llamamos orden exacto de f al conjunto de todas las funciones de N en R+ que crecen igual que f. .) = Relación de inclusión entre conjuntos. . km) } De la misma forma. Orden inferior u omega de f(n): W (f): Dada una función f: N ® R+. llamamos orden de f según P (o condicionado a P) al conjunto: O(f | P)= { t: N ® R+ / $ c Î R+. tenemos W (f | P) y Q (f | P). T(N) = T(N. llamamos omega de f al conjunto de todas las funciones de N en R+ acotadas inferiormente por un múltiplo real positivo de f. $ n1. t Î O(g) ‡Se cumple que: O(c) = O(d). Para cualquier f y g. . k2. ¿Qué relación hay entre los siguientes órdenes? O(n+m).b). siendo c y d constantes positivas. O(n+2m) Notaciones condicionales: En algunos casos interesa estudiar el tiempo sólo para ciertos tamaños de entrada. O(c) Ì O(n) O(cn + b) = O(dn + e) O(p) = O(q).. O(p) Ì O(q). " n ³ n0: P(n) Þ t(n) £ c·f(n) } De igual forma.. k2. Ejemplo. t(n) Î O(n2). ‡Relación de orden entre O(. Ejemplo. Algoritmo de búsqueda binaria: Si N es potencia de 2 el estudio se simplifica. nm Î N.. si p es un polinomio de menor grado que q. O(nm) O(n2). para valores de n suficientemente grandes. encontrar la función f más simple tal que t Î O(f).. f Î O(g | false). o variables T(N. Relación de orden: igual que antes. podemos extender los conceptos de W (f) y Q (f). ..

El esquema mas sencillo quizás sea el llamado divide y vencerás. a esquemas muy generales que pueden adaptarse a un problema particular al detallar las partes generales del esquema. El acto de diseñar un algoritmo puede considerarse como una tarea que difícilmente podrá ser del todo automatizada.. basado en la descomposición de un problema en .. d Î R+. . No obstante. independientemente de la base. +a1n + a0 t(n) Î o(amnm) ¹ o(nm) ¿o(amnm) Í O(amnm)? ¿o(t) Í O(t)? Costa de complejidad con frecuencia Algunas relaciones entre órdenes frecuentes: O(1) Ì O(log n) Ì O(n) Ì O(n·log n) Ì O(n·(log n)2) Ì O(n1.Es necesario en este momento mencionar algo sobre como hacerlo. algunos resultan inmediatos de resolver. Una forma de facilitar esta labor consiste en recurrir a técnicas conocidas de diseño de algoritmos. $ n0 Î N. Los logaritmos son del mismo orden.Q (f) = O(f) Ç W (f) = { t: N ® R+ / $ c. puede ser muy directo. aparecerá un orden logarítmico O(log2 n). se decir.001.. n/4. en general.. Ì O(2n) Ì O(n!) Ì O(nn) ¿Qué pasa con las omegas? ¿Y con los órdenes exactos? El orden de un polinomio anxn+. å i = n(n+1)/2 Î O(n2). 5. idear un algoritmo continua siendo una labor bastante creativa donde los conocimientos y la experiencia del propio diseñador tiene un papel fundamental. La investigaciónen esta área ha permitido descubrir un conjunto de métodos o esquemas de diseño hacia los cuales puede orientarse la realización de muchos algoritmos. y a pesar de que resulta mas adecuado en bastantes casos utilizar alguno de estos esquemas que realizar un diseño desde cero... nnn å 1 = n Î O(n). Todo problema algorítmico es un reto para su diseñador. otra para n/2.) Ì O(n2) Ì O(n3) Ì . " n ³ n0: c·f(n) ³ t(n) ³ d·f(n) } Notación o pequeña de f(n): o(f): Dada una función f: N ® R+.. å im Î O(nm+1) i=1 i=1 i=1 Si hacemos una operación para n. llamamos o pequeña de f al conjunto de todas las funciones de N en R+ que crecen igual que f asintóticamente: o(f)= { t: N ® R+ / lim t(n)/f(n) = 1}n¥ ® Esta notación conserva las constantes multiplicativas para el término de mayor orden.. Muchos problemas pueden resolverse buscando una solución fácil y directa pero. una tarea difícil.+a1x+a0 es O(xn)... llamado de fuerza bruta. a la vez bastante ineficiente. otros son bastante complejos. Ejemplo. Este método. t(n) = amnm + am-1nm-1 + . El diseño de un algoritmo que resuelva un problema es. pero con un poco de análisis puede encontrarse algoritmos más eficientes.. Técnica de diseño de algoritmos Diseño de Algoritmos: Hasta ahora se han realizado algunos comentarios respecto a la necesidad de diseñar algoritmos correctos y eficientes utilizando los elementos de un lenguaje de programación .

Aprender los principiosbásicos del diseño de algoritmos podemos preguntarnos por un método aceptable. Nos estamos refiriendo a métodos basados en la mejora de la eficiencia (por ejemplo. siendo dicha solución finalmente adaptada al dominio original. puesto que existe un número reducido de esquema y técnicas de diseño. es organizar el diseño sobre un esquema de algoritmo o una técnica de diseño que haya demostrado su utilidad para otros problemas. Consideraciones generales Si el hábil programador dispone de un recetario de algoritmos de donde poder seleccionar el más adecuado para cada problema. se produzca cierto resultado. sobre todo. solo puede tomarse tras considerar varias solucionesde otras etapas mas simples. pero que debe evitarse siempre que se pueda. Una solución por fuerza bruta también puede resultar adecuada como primera aproximación a la solución final. con complejidad . el uso de parámetros de acumulación al resolver problemas utilizando divide y vencerás. que debe completarse con otros conocimientos y. Por ultimo. la fuerza bruta. si la decisión en una etapa. En realidad. pero dado que no se ha analizado apenas el problema. Este método de trabajo es practicable. Si no nos importa la eficiencia del algoritmo. no es un esquema algorítmico. y quizás el mejor. En principio.subproblemas. tenemos una solución voraz. Supongamos que disponemos de una especificación precisa. a pesar de lo complejas que son las operaciones de búsqueda. El conocimiento de técnicas de diseño es solo un primer paso para el diseñador. con la experiencia. El mas entendido. Otros esquemas requieren un análisis minucioso del problema de forma que la solución se vaya construyendo en etapas. conviene conocer otros métodos de diseño de algoritmos que también resultan de utilidad práctica. su uso adecuado mediante el esquema de búsqueda con retroceso (o backtracking) permite ganar gran eficiencia respecto a soluciones de fuerza bruta. Uno de ellos realizaba una búsqueda secuencial con complejidad lineal sobre el tamaño del vector y podía usarse con cualquier vector. Método de fuerza bruta Comenzamos el estudio de esquemas algorítmicos con un método sencillo. Por ejemplos: Algunos algoritmos de búsqueda de un elemento en un vector. esto no es malo. y el empleode tablas como estructura auxiliar para la resolución eficiente de problemas donde se aplica programación dinámica). Aun así. completa y consistente del problema a resolver y queremos obtener un algoritmo en el que. Si puede preverse que decisión conviene en cada etapa para producir cierto tipo de mejor resultado. la solución es dinámica. dad su ineficacia. Otro algoritmo realizaba un búsqueda dicotomica o binaria. si no mas bien calificativo Para una forma de diseñar algoritmos: tomar una solución directa. porque su desarrollo puede permitir profundizar más sobre el problema y conocer propiedades que sean utilizadas para obtener otra versión más eficiente. y a métodos basados en transformaciones del dominio para encontrar una solución mas fácilmente a un problema en un dominio transformado. dados uno datos de entrada valido. su tarea se simplifica. hay problemas cuya solución no puede hallarse sino mediante un proceso de búsqueda. poco reflexionada. podríamos utilizar un algoritmo general llamado algoritmo del museo británico. Se programa un computador de manera que parta de un conjunto de axioma matemáticos y los que use para reducir aleatoriamente teoremas validos. es muy probable que no se hayan aprovechado propiedades deducibles del problema y que la solución sea terriblemente ineficiente.

se almacena en una tabla. Divide y vencerás: Consiste en descomponer un problema en un subproblema. Otra técnica útil es el uso de tablas. donde puede consultarse otras veces que se necesite. La función principal simplemente realiza una llamada a esta función auxiliar en los que los parámetros de aquellas se modifican y los parámetros nuevos toman un valor inicial adecuado . Un modo de evitar problema lo proporciona la técnica de los parámetros acumuladores. se supone que ambos participantes tienen cualidades y preparación similar . siendo ( n ) mayor que( 0 ). cuya idea básica se expone a continuación. La función principal usa una función auxiliar que tiene los parámetros de aquellas más algunos adicionales. De todas formas. Tabulacion No todos los algoritmos recursivos ineficientes pueden optimizarse con la técnica de los parámetros acumuladores. aprovechar esta circunstancia para usar el algoritmo más eficiente: el de búsqueda binaria. pero poco reflexionada. En estos casos. Lo más razonable es comprobar si el vector esta ordenado y. Por sencillez . Cada una se ilustra con un ejemplo distinto. no importa que). El algoritmo primero responde a un razonamiento más sencillo. en combinación con otras contrucciones. A.B. Parámetros Acumuladores Veamos primero una solución ineficiente que intentaremos mejorar. y solo se podía usar cuando el vector estuviese ordenado. pero no todos: hay algunos fácilmente formulables. Hay dos participantes (deportistas o equipos. De forma que cada uno tiene un 50% de posibilidades de ganar cada partido. Ejemplo: Sea el problema de la competición. Esta técnica también se suele emplear con la programación dinámica. dichos algoritmos pueden servir como una primera aproximación al algoritmo definitivo. Veremos dos parámetros para la mejora de eficiencia de algoritmos recursivos: el uso de parámetros acumuladores y el uso de tablas. Ejemplo: Números de Fibonacci Los números de fibonacci suele especificarse como: Fib(0)=1 Fib(1)1 Fib(n+2)=fib(n)+fib(n+1) Esta especificación de los números de fibonacci tienen una formulación recursiva inmediata en estilo funcional. La intención es que la primera vez que se realiza un cálculo.logarítmica. pero muy ineficientes. Los parámetros adicionales tienen como misión ir acumulando resultados principales durante el proceso recursivo. que juegan una competición que es ganada por el primero que venza en n partidos. Esta es la solución de fuerza bruta: una solución directa. una solución funcional a muchos problemas. Técnicas de los Parámetros Acumuladores y de Tabulacion La recurcion es un mecanismo que permite obtener. por lo que uno puede sentirse tentado a usar siempre. la modificación para incorporar probabilidades diferentes es evidente y no complica el problema. Muchos algoritmos recursivos resultan eficientes. resolver independientemente los . pero debe mejorar su rendimiento para que sea práctico. en caso positivo.

la moneda de mayor valor ( es decir. El modo de encolumnar las distintas partes de un algoritmo para facilitar su lectura y comprensión. subprogramas. Si no ha encontrado y es anterior se procede a buscarla en la primera mitad. estas normas de estilo se dirigen hacia aspectos como la forma de construir los nombres de variables o tipo de datos que aparezcan. se trata de dar como cambio la menor cantidad posible usando estos tipos de monedas. los factores que identifican la calidad en ellos . Búsqueda de una palabra en un diccionario Como ejemplo sencillo de aplicación de esta estrategia puede considerarse la búsqueda de una palabra en un diccionariode acuerdo con el siguiente criterio. se buscara en la segunda mitad. la tipografía seguida ala hora de escribir nombres de variables. palabras claves. Se abre el diccionario por la pagina centrar(quedando dividido en dos mitades) y se comprueba si la palabra aparece allí o si es léxico gráficamente anterior o posterior. Los criterios de estilo pueden reflejarse en un conjunto de normas de estilo de codificación. Puede emplearse en problemas de optimización. El procedimiento se repite sucesivamente hasta encontrar la palabra o decidir que no aparece. en la búsqueda de caminos mínimos sobre grafos. Dar un cambioutilizando el menor número de monedas Considérese ahora el problema de la devolución del cambio al realizar una compra (por ejemplo. Suponiendo que se disponga de cantidad suficiente de ciertos tipos diferentes de monedas de curso legal. La estrategia voraz aplicada comienza devolviendo. Ello asegura que tanto algoritmos como programa resulten legibles y puedan modificarse fácilmente en caso de necesidad.. Consideraciones y Criterios para Diseñar Algoritmos Algunas consideraciones estilísticas pueden contribuir a mejor la calidadde los algoritmos (y programas ) mediante la reducción del numero de errores que aparecen al desarrollar los. Corrección. la planificación en el orden de la ejecución de unos programas en un computador. el algoritmo debe funcionar. se va procedimiento paso a paso realizándose la mejor elección (usando una función objetivo que respeta un conjunto de restricciones ) de entre las posibles. 2. También influyen haciendo que nuestro algoritmo resulten más fáciles de leer y entender para otras personas.subproblemas para luego combinar sus soluciones y obtener la solución del problema original. Pude aparecer obvio. Ejemplo. como el conocido de la mochila. Ante la pregunta ¿Cuáles son las característica de un buen algoritmo?. en una maquina expendedora de tabaco). etc. si es posterior. la ordenación de vectores. 1. y así sucesivamente. . mientras el valor de dicha moneda sea mayor o igual al cambio que resta por dar). cuando se pueda. Nunca se debe olvidar que la característica más simple e importante de un algoritmo es que funcione. la búsqueda en estructuras ordenadas. Estilo y calidad de los programas van fuertemente unidos.etc.Para ello. las siguientes respuestas reflejan. Método voraz: Este método trata de producir tipo de mejor resultado a partir de conjunto de opciones candidatas .. Esta técnica se puede aplicar con éxito a problemas como la multiplicación de matrices. pero resulta difícil de asegurar en algoritmos complejos.etc. Ejemplo. Generalmente. cierta medida. El proceso finaliza cuando se ha devuelto todo el cambio. continua aplicándose el mismo criterio para la segunda moneda mas valiosa. y la normas sobre como y donde deben de introducirse los comentarios.

ésta es la función por optimizar. encontrando de una sola vez la solución completa y óptima. el algoritmo no debe desaprovechar recursos. se habla de la memoria y del tiempo de ejecución . Ciertos detalles o algunas partes especiales de los mismos pueden olvidarse fácilmente o quedar oscura si no están adecuadamente comentadas. Normalmente. pero con la fortuna de que cada vez que añade un elemento a la solución se tiene la certeza de haber realizado la mejor elección posible. el conjunto de candidatos que forman la solución está vacío. estos problemas no se intentan resolver "de golpe ". el problema parte de: y Una función objetivo que da el valor de una solución. Se supone que un problema de esta clasetiene al menos una solución. si dicho conjunto no es válido. Es más frecuente que el subconjunto de la solución se vaya formando paso a paso. Obviamente. Según esta descripción. Resumiendo. dados unos ficheros almacenados en una cinta de que el tiempo de recuperación de un fichero cualquiera sea el mínimo en promedio. sea el problema de encontrar un subconjunto de los arcos de un grafo. claro. La documentación ayuda a comprender el funcionamiento de los algoritmos. En cada paso se intenta añadir el mejor de los candidatos restantes a dicha solución parcial. La única complicación es comprobar que se siguen satisfaciendo las restricciones del problema. Puede haber varias soluciones optimas. fiable y fácil de mantener. eficiente. Un algoritmo voraz sigue el esquema anterior. . puede llamarse candidato al elemento tratado en cada paso. A menudo. éste es un proceso repetitivo sencillo que trata sucesivamente los diferentes elementos del problema. lo ideal es que nuestro algoritmo resulte correcto. En realidad. el algoritmo debe estar bien documentación. La dificultad principal para resolver esta clase de problemas estriba en el análisis necesario para poder formular un algoritmo que halle la solución en varios pasos. Inicialmente. Eficiencia. Esta característica hace que aunque el análisis del problema sea arduo. analizando durante cada etapa que elemento conviene añadir a la solución parcial ya existente. Otro ejemplo se da cuando. Claridad. La eficiencia de un algoritmo se mide por los recursos que este consume. la dificultad principal al diseñar un algoritmo voraz reside en encontrar un criterio en encontrar un criterio de selección que garantice la optimalidad de la solución. Al contrario. Algoritmos voraces Esquema voraz Hay muchos problemas en los que se pretende obtener un subconjunto de n elementos que satisfaga ciertas restricciones y que optimice alguna medida. la solución voraz siempre resulte sencilla. Si el algoritmo voraz se ha diseñado correctamente. la calidad de un algoritmo tiene muchas facetas y todas ellas importantes. la primera solución encontrada es óptima. el candidato se incorpora definitivamente. si satisface las restricciones del problema y. por tanto. el problema incluye restricciones adicionales que limitan el número posible de soluciones. 4.3. Si este conjunto ampliado sigue siendo válido. Para facilitar la descripción de este proceso. es decir. en cuyo caso no importa cual se elija. permite formar una solución del problema. En particular. y de acuerdo con los puntos de vista anteriores. A pesar de que con la reducción de los costes del hardware es posible diseñar computadores más rápidos y con más memoria. Por tanto. Por lo que se ha descrito del esquema voraz. no hay que desperdiciar estos recursos y tratar de desarrollar algoritmos más eficientes. se desecha el candidato. Por ejemplo.

Además. la tabla de competición se va completando por filas. Obsérvese que las funciones de validez y completitud no se preocupan de la optimalidad del la solución. solución v (siguiente)) VorazAcumulador (candidatos ± (siguiente). en este caso. Una función que determine si cierto conjunto de candidatos es válido. es decir. De todas formas.n ) : ( 1. el mejor candidato. debe recordarse que puede haber varios criterios alternativos de selección y que de su correcta elección depende que la solución calculada por el algoritmo sea optima. si permite formar alguna solución del problema. sino que se utiliza durante el análisis del problema y es determinante en la elección de la función de selección.. ( ) ) Puede verse por qué estos algoritmos se llaman " voraces " : en cada paso toman el mejor trozo de la solución. se considera el problema de un cambio o desglose en monedas. nunca cambian de opinión: una vez que un candidato es aceptado o rechazado en la solución.n). Como ejercicio. Cada fila resultante puede tener una complejidad de o (n2). tales que sumados sus valores equivalgan al importe... es definitiva. la decisión. de las que se supone que hay cantidad suficiente para realizar el desglose.y Un conjunto de restricciones sobre el valor de los datos de entrada y sobre la solución final del problema.n) -> Cadidatos = ( ) v EsSolución ( solución)-> Value siguiente -> seleccionar ( candidatos ) IN EsVálida (solución v ( siguiente)) => VorazAcumulador (candidatos ± (solución). A su vez. La función objetivo no suele aparecer en el algoritmo final.n) : (1. Se trata de indicar la cantidad (menor) de monedas de los tipos considerados. Como fila primera se toma la secuencia de los índices de los participantes en cualquier orden.n) -> FUNCTION VorazAcumulador ( candidatos : (1. y de un importe. el lector puede intentar encontrar una solución voraz del problema del calendario. es decir. Solución : (1. Desglose en monedas Como primer ejemplo introductorio sencillo al que puede aplicarse la técnica voraz. este algoritmo tiene la ventaja de valer para las situaciones en que el número de participantes no es una potencia de dos... solución) VorazAcumulador (candidatos. cada solución válida y completa es optima. se parte de un conjunto de tipos de monedas válidas. Además. la solución consta de: y y y Un conjunto de candidatos Una función de selección que en cada momento determine que candidato de los aún no usados parece ser el mejor. . Para ello. es decir. Hay que desglosar una cantidad en un conjunto de monedas tratando de cumplir alguna condición. utilizar el menor número de monedas. Podemos representar el esquema voraz de la siguiente forma funcional: FUNCTION Voraz ( candidatos: ( 1. Es fácil encontrar una solución si en cada etapa se genera el subcalendario correspondiente a un equipo. pero si la función de selección es la adecuada.

Con esta información se puede comprobar que en este problema están presentes los distintos elementos de la técnica voraz. Mas formalmente. cuando un candidato (moneda) se incorpora al conjunto solución. Su formación funcional es como sigue. Esta restricción permite una formulación y resolución recursiva de los subproblemas. Después se resuelven estos subproblemas y se combinan las soluciones para obtener la solución para el problema original. 100. éste no será nunca excluido de él. podemos utilizar sólo monedas de 500. la moneda de mayor valor de entre las candidatas. 1<k<=n. es fácil su generalización a k subproblemas 2<k<=n. Estos subproblemas se resuelven independientemente y después se combinan sus soluciones parciales para obtener la solución del problema original. en caso contrario. se declaran los tipos VALORES y CANTIDADES para representar el valor asignado a cada unidad monetaria y la cantidad de cada tipo de moneda que se devolverá en el desglose. Su declaración es la siguiente: TYPE Monedas -> M500 I M100 I M50 I M25 I M5 I M1. Este esquema de partición de problemas se denomina esquema de divide y vencerás solo en el caso en que los problemas sean de la misma clase del problema original. mientras sea posible. Además. La condición de factibilidad de la solución siendo construida establece en el desglose debe ser menor o igual que el importe a desglosar. suponemos que manejamos dineroespañol y. Valores -> Integer M500 M1 Cantidades -> Integer M500 . 5 y 1 pesetas para el desglose.M1 Se supone inicialmente asignados los valores a cada uno de los tipos de monedas. y cuyo valor total es igual al importe a desglosar. Los elementos de la técnica voraz están presentes en este problema de la siguiente forma: y y y y y El conjunto de candidatos está constituido por cada una de las monedas de los diferentes tipos que se pueden usar para realizar el desglose del importe dado. Una solución viene dad por un conjunto de monedas devuelto tras el desglose. 25. Esquema de Divide y vencerás. Asimismo. la técnica de divide y vencerás parte la entrada en k subproblemas. Veamos el esquema de divide y vencerás para dos subproblemas. Divide Y Vencerás La técnica divide y vencerás consiste en descomponer el problema en un conjunto de subproblemas más pequeños. La función de selección establece que hay que elegir. Estos valores se definen por medio de un tipo enumerado MONEDAS. deben existir algunos pasos sencillos cuya solución pueda calcularse fácil y directamente. El caso más frecuente es cuando el número de subproblemas es dos. dado un problema al resolver planteando en términos de una entrada de tamaño n.Para simplificar. La técnica de divide y vencerás es quizás una de las utilizadas debido a su sencillez: si un problema es demasiado grande para resolverlo de una vez. en particular. Por supuesto. el proceso recursivo nunca terminaría. La función objetivo cosiste en minimizar la cantidad total de monedas utilizadas en el desglose. de tipo resultado: TYPEVAR     . 50. considerado el problema como de tipo dato y la solución. se descompone en varias partes más fáciles de resolver.

solución) El esquema general se adapta a un problema concreto al sustituir los metasimbolos EsPequeño. superior : 1. subsolucion1). en caso contrario donde T(n) es la función de tiempo de DivideYVenceras para entradas de tamaño n.. subsolucion2. superior.n. superior. en la que se utiliza un vector de tamaño N. DivideYVenceras (subproblema2)) Se puede hacer una formulación imperativa similar. superior)..N. puede suponerse que las competiciones se celebran en días sucesivos y .Dato. Elaboración de un Calendario Deportivo: Sea un campeonato deportivo. inferior. DyVAux (problema. subproblema2) => Combinar (DivideYVenceras (subproblema1) . es general. superior) THEN ResolverDirectamente (problema. Sin embargo.. Nótese que. para nuestros propósitos resulta indiferente el deporteobjeto de la competición.. 1. OUT solución : resultado) -> PROCEDURE DyVAux (IN problema : dato1. escribiremos una formulación más restrictiva pero bastante usual. inferior.N subsolucion1. ResolverDirectamente. Por concreción. Partir y Combinar por funciones o procedimientos concretos. para que esta técnica resulte eficiente todos los subproblemas deben ser de tamaño parecido. TYPEVAR dato. subsolucion2).n.si n es pequeño T(n) = 2 T(n/2) + f(n). DyVAux (problema. Combinar (subsolucion1. subsolucion2 : resultado IF EsPequeño (inferior. N. La eficiencia final del algoritmo depende de la función f(n) concreta que aparezca durante el análisis. g(n) es el tiempo que tarda la función ResolverDirectamente en resolver problemas de pequeño tamaño (normalmente una constante) y f(n) es el tiempo necesario para partir el problema y combinar las subsoluciones. olución) ELSE Medio := Partir (inferior. y sin perdida de generalidad. IN inferior. Si el tamaño de los dos subproblemas es el mismo (o casi). solución) DyVAux (problema. el tiempo de cómputo de la función DivideYVecneras se describe con la siguiente relación de recurrencia: g(n). medio. así que hablaremos de participantes en vez de deportistas o equipos. OUT solución : resultado) -> VAR medio: 1. El problema consiste en elaborar un calendario de competición de forma que cada participante compita exactamente una vez con cada uno de los demás participantes. resultado FUNCTION DivideYVenceras (problema : dato) : resultado -> EsPequeño (problema) }=> ResolverDirectamente (problema) | VALUE subproblemas -> Partir (problema) IN subproblemas == (subproblema1. medio+1. resultado PROCEDURE DivideYVenceras (IN problema : dato1.

Si hay varios calendarios validos. Cada conjunto P(i) consta de (n-1)! Elementos. se supone que el numero de participantes es una potencia de dos. A su vez. Por tanto. Se necesitan elaborar n-1 competiciones por participantes. el conjunto de permutaciones de los números {1. la columna j también contiene números distintos. Sin embargo la aplicación de la técnica de divide y vencerás produce una solución mas sencillas aun pero muy eficientes. 1<= i<=n. Primero se obtiene para cada participante i. la solución del problema puede representarse en una tabla de dimensión nx(n-1). La siguiente figura describe visualmente parte de la elaboración de la tabla. hay n = 2k participantes para algún entero positivo k. es decir. El método de fuerza bruta resulta sencillo. incluyendo en cada fila i algún ejemplo de P(i). contiene el numero del participante contra el que el participante i-esimo compite el día j-esimo. 1<=i<=n. 1<=j<n. pero es terriblemente ineficiente. el conjunto P(i) de todas las permutaciones posibles del resto de los participantes con los que debe competir. Solo sirve como solución aquellas combinaciones de fila que cumplan las restricciones enunciadas en el párrafoanterior sobre las columnas de la tabla (las restricciones sobre las filas están garantizadas por el modo de generar los conjuntos P(i)).que cada participante compite una vez por día. Obsérvese que los números de participantes incluidos en la fila i de la tabla son distintos porque el participante i-esimo solo debe competir una vez con cada participante restante.. porque el día j-esimo cada participante solo puede competir con otro participante. Dado que el numero de participantes de n. Se dispone de una solución inmediata aplicando fuerza bruta. resultan nx(n-1)!=n! formas de rellenar la tabla. El elemento (i. Para simplificar el problema. es decir.j)±esimo de la tabla. Se supone también que cada participante tiene asignado un número comprendido entre 1 y N.n}-{i} ahora se completan las filas de la tabla de todas las formas posibles. días 1 participantes 1 2 2 1 1 2 3 1 2 3 4 2 1 4 3 3 4 1 2 4 3 2 1 1 2 3 4 5 6 7 1 2 3 4 5 6 7 8 2 1 4 3 8 5 6 7 3 4 1 2 7 8 5 6 4 3 2 1 6 7 8 5 5 6 7 8 1 2 3 4 6 5 8 7 4 1 2 3 7 8 5 6 3 4 1 2 . se elige uno cualquiera.

medio. Por fortuna. medio. Completemos primero la parte de los participantes de numeración inferior. FormarTabla (medio+1. Sin embargo. CompletarTabla (inf. En efecto.N)1.. por ejemplo.. sup. es más complejo. superior en orden creciente de numeración..N) 1.N IF inf = sup-1 THEN tablainf. que es mucho mas eficiente que la solución de fuerza bruta. tabla).1 := inf ELSE medio := (inf + sup) Div 2.sup-1. El caso recursivo. la mitad izquierda de la tabla.1. faltando 2k x2k-1 celdas para completar el calendario total. medio. medio. también de orden de complejidad cuadrática.2n .. de numeración comprendida entre 1 y 2k-1 y otro para los participantes comprendidos entre 2k-1 +1 y 2k . es decir. El problema puede reducirse a dos sub problemas de tamaño 2k-1 si se elaboran independientemente dos subcalendarios de tamaño 2k x(2k-1 -1): uno para los participantes. La idea consiste en añadir inicialmente a la tabla una columna "ficticia" de índice j=0.. sucesivamente con los participantes 2k-1 +1. faltan por elaborar las competiciones cruzadas entre los participantes de numeración inferior y los de numeración superior.8 7 6 5 2 3 4 1 Se distinguen dos casos. sup-1. Si el numero de participantes es 2k . tablasup.N. medio+1. sup.N. donde se aplica divide y vencerás para resolver el problema y que se aprovecha de la simetría de la solución.N-1) -> PROCEDURE FormaTabla (IN inf : 1. . PROCEDURE Calendario ( INOUT tabla : (1. para k>1.1 : = sup. tabla). tabla). La solución es directa porque se celebra una sola competición entre ambos. tabla) Este sistema de ecuacionesdefina una función de tiempo del orden de O(n2). mediante divide y vencerás. Veamos otra estrategia. OUT tabla : (1.N. El algoritmo descrito se expresa a continuación. IN sup :1. Este proceso se repite para el resto de los participantes de numeración inferior. FormarTabla (inf.. El caso básico se da cuando solo hay dos participantes.1. inf... la unión de estos subcalendarios no forma un calendario completo para el campeonato de 2k participantes. rotando dicha secuencia a la derecha.N. el resto del calendario se puede construir fácilmente. que almacena los índices de las filas. cuando hay más de dos participantes. Después se genera.. Finalmente se completa la mitad derecha de la tabla (correspondiente al cruce de los dos ¡ . El calendario de los participantes de numeración superior se completa de forma similar con los números de los participantes de numeración inferior. CompletarTabla (medio+1.N-1) -> VAR medio : 1. puede decirse que el "tamaño" del problema es 2k (sabemos que el calendario tendrá un tamaño de 2k x(2k-1 -1) posiciones). ya que a unión de los dos calendarios tiene un tamaño 2k x(2k-1 -1).. El subcalendario del primer participante es sencillo porque basta con que compita en días sucesivos con los participantes de numeración. El siguiente participante toma esta secuencia y realiza una fácil permutación de la misma que le garantiza el respeto de las restricciones de la solución.

índice : INTEGER i1 := inf. que obviamente ya esta ordenado. sup : 1. inf. inf.. j := inf.= vectori2. medio.N. Este proceso de mezcla es realizado por un procedimiento auxiliar. OrdenarAux (vector. medio). La partición puede hacerse por la mitad si se toma un índice m=[(i+s)/2] y dos subvectores vi.. la combinación de los dos subvectores ya ordenados es fácil..N) -> VAR Medio : 1.... IN inf. El caso básico corresponde a un subvector de un solo elemento.s . 1.. para obtener un único vector ordenado. Para el caso general. sup) OrdenarAux (v.N. sup). basta con mezclar los dos subvectores. i1.j a partir de las casillas tablak.grupos de equipos cuyos subcalendarios se han generado por divide y vencerás). N) El procedimiento para realizar la mezcla de los subvectores ordenados es: PROCEDURE Mezclar ( IN inf : INTEGER..l ya completadas.. i1 :=i1 + 1 ELSE vectorAuxj .l). los componentes tablai. WHILE (i1<=medio) ^ (i2<=sup) DO IF vectori1 << vectori2 THEN vectorAuxj :=vectori1. sea vi. En esta última etapa. i2.N) -> (* ordenación por mezcla *) PROCEDURE OrdenarAux (INOUT Vector : INTEGER1.s un vector de índice inferior i e índice superior s. i2 := medio + 1. los valores de las casillas (k. IN sup : INTEGER.1. Mezclar (vector.N) -> VAR vectorAux : INTEGER1. INOUT vector : INTEGER1. IN medio: INTEGER. j : INTEGER. Ordenación de un Vector por Mezcla: La ordenación de un vector es un problema que se presta fácilmente a la aplicación de la técnica de divide y vencerás. es decir. medio+1. de acuerdo con las siguientes expresiones de los índices: i = (k + n/2) Mod (n+1) j = (1 + n/2) Mod n De esta forma se rellenan las casillas aun vacías.N IF inf < sup THEN medio := (inf+sup) Div 2.m y vm+1. mediante comparaciones de sus elementos sucesivos.. OrdenarAux (vector.N. siendo 1<=k<=n y 0<=l<=(n/2)-1. i2 := i2 + 1 . El algoritmo resultante es: PROCEDURE Ordenar (INOUT v : INTEGER1.

b=cte Si n es una potencia de 2. n>1. las ecuaciones anteriores se resuelven por sustituciones sucesivas. que n es una potencia de dos. El algoritmo anterior.sup DO vectorindice := vectorAuxindice El algoritmo resultante es sencillo conceptualmente... que podemos llamar algoritmo convencional de multiplicación de matrices. es decir. a=cte 2T(n/2) + bn. por sencillez. de forma que las ecuaciones de recurrencia de la función de tiempo son: T(n) = a. Es fácil analizar la complejidad del algoritmo para un vector de longitud n. J := j + 1 FOR índice IN i2. necesita copiar el vector auxiliar completo en el principal. A y B. n=1.medio DO vectorAuxj := vectorindice. J := j + 1 FOR índice In inf. (Si n no es un potencia de dos. es decir. El cálculo de cada elemento Cij requiere n multiplicaciones. además de mezclar.) las submatrices A y B pueden partirse en cuatro submatrices de dimensión (n/2)x(n/2). que existe un entero no negativo k tal que n=2k. La operación de mezcla es proporcional a n. Supongamos. proviene directamente de la definición matemática del producto de matrices. Si el producto AxB tiene la forma: A11 A12 B11 B12 C11 C12 A21 A22 B21 B22 C21 C22 Entonces: C11 = A11*B11 + A12*B21 C12 = A11*B12 + A12*B22 C21 = A21*B11 + A22*B21 C22 = A21*B12 + A22*B22 ¢ .sup DO vectorAuxj := vectorindice . resultando: T(n) = 2T(n/2) + bn= =2K T(n/2K) + kbn = an + bn log2 n El algoritmo de ordenación por mezcla es óptimo en tiempo de ejecución. Los únicos inconvenientes que presenta es que el procedimiento de mezcla necesita gran capacidad de almacenamiento (para dos copias del vector) y que. pero mantenga la complejidad asintótica calculada.j)-esimo se forma multiplicando cada elemento de la final i-esima de A por el elemento correspondiente de la columna j-esima de B y sumando los productos parciales. Puede diseñarse un algoritmo de mezcla más complejo que mejore ambos aspectos. La matriz productoC=AxB también es una matriz de nxn cuyo elemento (i. así que el tiempo total del algoritmo de multiplicación es de orden O(n3). n =2k para algún k. Sin embargo. La matriz C tiene n2 elementos. la técnica de divide y vencerás sugiere un algoritmo distinto. Multiplicación de Matrices: Sean dos matrices. pueden añadirse las filas y columnas de ceros necesarias para formar una dimensión que sea potencia de dos..j := j + FOR índice IN i1. de dimensión nxn.

como inversión de una matriz o hallar su determinante. La existencia de un algoritmo eficiente para la multiplicación (en realidad. todo problema resoluble con esta técnica debe de satisfacer el principio de optimalidad. Podría conseguirse mas eficiencia si lográramos realizar menos multiplicaciones de matrices. para cualquier operación de las anteriores) significaría la existencia de un algoritmo similar para las demás. conduciendo de forma directa a la solución. La resolución de este sistema de ecuaciones nos dice que O(T(n))=OT(n3). tal que Eo es el estado inicial del problema y deben tomarse n decisiones d. Eli el estado del problema tras la elección del valor vli 1<i<n1 y Sli una secuencia óptima de decisiones respecto al estao Eli.vn} el conjunto de valores de decisión posibles para la decisión d1. no se reconsidera en el futuro. el número de secuencias de decisión es exponencial sobre el número de decisiones.. Dos submatrices de (n/2)x(n/2) pueden sumarse en un tiempo bn2. Solamente al final se sabe cuál es la mejor de todas. Este principio establece que "una secuencia óptima de decisiones que resuelve un problema debe cumplir la propiedad de que cualquier subsecuencia de decisiones también debe ser óptima respecto al subproblema que resuelva ". aunque fuera a costa de un mayor numero de sumas de matrices. porque la multiplicación esta relacionada con otras operaciones sobre matrices mas usuales. Programación Dinámica Principios de programación dinámica Se ha visto que la técnica voraz se aplica a problemas cuya solución puede formularse como el resultado de una secuencia de decisiones. Usando una técnica de fuerza bruta. porque si hay d opciones para cada una de las n decisiones. La programación dinámica (también llamada planificación dinámica) es una técnica de programación que también permite resolver problemas mediante una secuencia de decisiones. El algoritmo de Strassen calcula las cuatro submatrices Cij empleando 7 multiplicaciones y 18 sumas o restas de matrices. pero de una manera menos directa que en el caso voraz. 1<i<n. 1<i<N1. siendo b alguna constante. resultará un total de d secuencias posibles de decisión. los elementos Cij se calculan mediante algunas multiplicaciones y sumas de números. interesa encontrar algoritmos mas eficientes. una característica es que el programa "aprende "dinámicamente de las decisiones que toma. Sin embargo. Supongamos que tenemos un problema que satisface el principio de optimalidad. El método es eficiente porque una vez que se toma una decisión en un paso. de forma que no se ha conseguido ningún ahorro sustancial de tiempo. dado que la complejidad respectiva de estas operaciones es O(n3)n y o(n2). asegurando que la secuencia de decisiones es la mejor de las posibles. evitándose una explosión combinatoria en la producción de las secuencias y consiguiéndose soluciones más eficientes en cuanto a tiempo de ejecución. pero para n>2 las submatrices Cij se calculan mediante multiplicaciones (recursivas) y sumas de submatrices de dimensión (n/2)x(n/2).Para n=2. no todos los problemas pueden resolverse de esta manera. Sin embargo. Sea D = { v1 . Entonces. En la programación dinámica todos los subproblemas se resuelven de acuerdo con criterio de tamaño creciente y los resultados de subproblemas más pequeños se almacenan en algún tipo de estructura de datos (normalmente tablas) para facilitar la solución de los problemas más grandes. £ . Esta vez se necesita producir varias secuencias de decisiones. Además. sea. Podemos formalizar algo más la idea básica. asimismo. una secuencia óptima de decisiones respecto a E0 es la mejor secuencias de decisión { Vli Sli }. De esta forma se reduce al número total de subsecuencias generadas. No es fácil establecer una definición de la programación dinámica.

.xi+1) no puede extenderse para alcanzar un nodo de respuesta. los candidatos para la posición i+1 del vector desolucion x1. todavía hay otros problemas peores que no queda mas remedio que realizar una búsqueda de la solución. a partir de la secuencia de decisiones Xi+1 Xn ( es la clase de formulación adoptada hasta ahora ). El Algoritmo de Vuelta Atrás se especifica de la forma siguiente: PROCEDURE Retroceso (IN k : INTEGER.n ). La ecuación general relaciona la secuencia óptima en una etapa i con la decisión tomada en la etapa i y la subsecuencia óptima en la etapa posterior i+1.. la ecuación de base establece el valor para la etapa n+1 en que no queda ninguna decisión Xi.xi+1) termina en un nodo de respuesta. En resumen. tiene la ventaja ( quizás paradójica al tratar de un problema más pequeño ) de que proporciona una visión más general del problema en cuestión. ( Obsérvese que vamos a usar la técnica de resolución de problemas por generalización para después poder realizar una particularización de la solución obtenida. Sea X1 ... La elección de una formulación delantera o trasera depende del problema considerado o. la aplicación de la técnica de programación dinámica a un problema significa comprobar primero el principio de optimalidad y desarrollar después unas ecuaciones recurrentes del estilo de (1) y (2). 1<i<n .Xn la secuencia de decisiones necesaria para resolver el problema. debe existir una función de criterios que debe ser satisfecha por cada secuencia solución u optimizada por dichas secuencias solución si solo queremos la mejor.. Además.n son aquellos valores generados por G que satisfacen A.1 ) debe expresarse en términos de los valores de decisión existente para decisiones d1 y el subproblema problema ( k+1. La formulación trasera expresa la decisión de Xi. hay un caso en que la decisión d1 no va seguida por ninguna secuencia de decisiones.xi) el conjunto de todos los valores posibles de xi+1 tales que (x1.xi) el camino desde la raíz hasta un nodo de un árbol del espacio de estado... 1<i<n.dl..1 ) resultante de aplicar cada valor de decisión.... Supongamos que también existe algún predicado R que determina si un camino (x1...l). La ecuación de recurrencia puede formularse de dos formas: delantera o trasera.. Sin embargo. entonces el problema completo es problema ( l.. La formulación delantera expresa la decisión de Xl .. además. Esquema de Algoritmos de Vuelta Atrás: Sea (x1. 1<k<n. sólo que en orden contrario. Algoritmos De Vuelta Atrás Existen un alto número de problemas que pueden formularse como la búsqueda de la mejor solución o del conjunto de todas las soluciones que satisfacen ciertas condiciones. Sea G(x1. 1<i<n. Por supuesto... pudiéndose aplicar la técnica de programación dinámica.. del gusto del programador.. En algunos problemas de optimización se conoce un criterio óptimo de selección que puede usarse de forma voraz.. Por lo tanto.El razonamiento anterior se refiere a la primera decisión d1 tomada desde el estado inicial E0 sin embargo. Otros problemas satisfacen el principio de optimalidad..xi+1) es falso si el camino (xi. a tomar.xi+1) es un camino hasta el estado del problema. a partir de la recurrentes con formulación trasera es igual que e la formulación delantera.) Una solución dinámica para problema ( k. cada solución es el resultado de una secuencia de decisiones.. INOUT solucion : elemento1. La expresión inicial de la ecuación de recurrencia.. partiendo como estado inicial de Ek-1. Supongamos que existe algún predicado acotador A tal que A(x1. Tiene sentido centrarse en un subproblema del problema inicial porque éste satisface el principio de optimalidad pero. puede generalizarse la formulación del problema a cualquier subsecuencia de decisiones dk .. que es problema ( n.n) -> ¤ ¤¤ ¤ .n ).. sencillamente.. si este subproblema de simboliza como problema (k..

1. IF R(solucion. Retroceso (k+1. Se sale del bucle FOR cuando no quedan mas valores para solución terminando la llamada actual al algoritmo. se basa en un conocimiento intuitivo del programador sobre un determinado problema. Se hace necesario utilizar algoritmos heurísticos: Un algoritmo heurístico (o simplemente heurística) puede producir una buena solución (puede que la óptima) pero también puede que no produzca ninguna solución o dar una solución no muy buena. solucion). Posibilidades: . 1. El problema del viajante Problema: Dado un grafo no dirigido. Normalmente. y que al seguir avanzando en el árbol (mediante la aplicación de varios pasos de retrocesos) se alcanza un nodo que requiere k+1 colores. Ramificación (Bifurcacion) Y Acotación Los métodos de Ramificación y Acotación constituyen un a variante de las técnicas de retroceso para problemas donde se trata de encontrar el valor máximo o mínimo de cierta función objeto (esto suele suceder en los problemas de programación lineal entera). Es un problema NP. Objetivo: obtener buenas soluciones en un tiempo de ejecución corto. La técnica de ramificación y acotacotacion aplica de la siguiente manera: Supóngase que al recorrer un árbol y alcanza una hoja se tiene una solucion con k colores. pues tenemos ya una solucion mayor. Algoritmos Heuristicos Existen muchos problemas para los cuales no se conocen algoritmos que puedan encontrar la solución de forma eficiente: problemas NP-completos.k) THEN << guardar µsolucion¶ >>. completo y ponderado G = (V.VAR nodo : elemento FOR noso IN G(solucion. La estructura de algoritmo voraz se puede utilizar para construir procedimientos heurísticos: hablamos de heurísticas voraces. encontrar un ciclo simple de costo mínimo que pase por todos los nodos. se comprueba si se ha encontrado una solucion. evitando así la exploración de gran parte de al estructura. solucion) La llamada inicial del algoritmo es Retroceso(1. Así. Este mismo proceso se repite en el resto de nodos del árbol. Después simplemente se llama recursivamente al algoritmo para generar los estados descendientes. pero necesitamos una solución eficiente. Problema de optimización. El procedimiento no hace ninguna llamada recursiva cuando k = N+1 o cuando ningún nodo generado por G satisface el elemento posible que satisfacen A se añade una solución particular. k sirve de cota inferior al retroceso. En este punto podemos retroceder (y no seguir avanzando por mas ramas). A). donde la solución está formada por un grupo de elementos en cierto orden: podemos aplicar el esquema voraz. k-1) DO Solucion k := nodo. k) THEN IF R(solucion. La solución exacta puede requerir un orden factorial o exponencial: el problema de la explosión combinatoria. 1.

Solución: ((2. Función de selección: de los nodos candidatos seleccionar el más próximo al último (o al primero) de la secuencia actual (c1. (1. Solución: (5. Algoritmos De Aproximación Dado un problema NP completo. 3. se trata de encontrar un conjunto con el menor numero de vértices tal que toda arista sea incidente por lo menos de un vértice de V. .1. Factible: una arista se puede añadir a la solución actual si no se forma un ciclo (excepto para la última arista añadida) y si los nodos unidos no tienen grado mayor que 2. Se trata de calcular un subconjunto A¶ de aristas tal que dos aristas . repetir la heurística 1 con varios orígenes. 5. an-1) que formen un ciclo hamiltoniano. sin importar el orden.. el orden de visita de los nodos. Los nodos son los candidatos. . Empezar con un grafo sin aristas. Ejemplo. Sin embargo. 2.. (3. 2) Coste: 30+15+25+10+45=125 Empezando en el nodo 3. (1.. Solución: (1. 4).. Acabamos cuando tengamos n nodos. pero garantizando que se forme un ciclo. 5)) Coste = 10+15+20+45+50 = 140 Conclusiones: Ninguno de los dos algoritmos garantiza una solución óptima. . a partir de la solución del algoritmo intentar hacer modificaciones locales para mejorar esa solución. Sin embargo. resulta parcialmente interesante que estos garanticen una cota en el margen de imprecisión. ó bien. 1) Coste: 15+20+10+45+50=140 Heurística voraz 2 ± Una solución será un conjunto de aristas (a1. Inicialización: seleccionar un nodo cualquiera. Hacer igual que en el algoritmo de Kruskal. c2. En cada paso moverse al nodo no visitado más próximo al último nodo seleccionado. Empezando en el nodo 1. Este problema se puede resolver a través de otro aproximado. 3). ‡Ejemplo... Para este tipo de problemas. normalmente ambos dan soluciones buenas. 3. 5)..A). próximas a la óptima. es probable que no sepamos resolverlo de manera precisa y completa utilizando un algoritmo polimico en tiempo. Heurística voraz 1 ± Una solución será un cierto orden en el conjunto de nodos (c1. 4. Posibles mejoras: buscar heurísticas mejores. (4. como es calcular el ajuste maximizal del grafo G. Empezar en un nodo cualquiera. cn).. 2. ca).. A continuación se ilustra este tipo de tratamiento de problemas al problema de recubrimiento de un grafico: Dado un grafo G=(V. 2). 4. los algoritmos que no conducen a una solución óptima se llaman algoritmos de aproximación. Las aristas son los candidatos. c2. a2. Selección: seleccionar la arista candidata de menor coste.

Esto es evidente. entre otros. En consecuencia. tipos de algoritmos de búsqueda y ordenación así como sus aplicaciones. De igual forma podremos ver las definiciones y algunas características. así como los típicos ciclos utilizados en algoritmos y programas y los paso a tener en cuenta al momento de desarrollar un algoritmo iterativo o recursivo. Motivación Como estudiantes de la Facultad de Ciencias y Tecnología " Escuela de Informática y Computación " de la Universidad Dominicana Organización y Métodos O&M con aspiraciones de iniciarnos como Ingeniero en Sistemas y Computación. la recursividad e iteración. También veremos los diferentes tipos de formas y tamaños o medidas en que se pueden almacenar y representar los datos y estructuras en un algoritmo o programa. Para poder aplicar el nuevo problema aproximado. vital para el desarrollo de aplicaciones para computadorasy el manejo y dominio de la lógica de programación para resolver problemas. Finalmente veremos los que es la verificación y derivación de programas. programación dinámica. su análisis y diseño. reglas.cualquiera de A¶ no tengan ningún vértice común y toda arista de A-A¶ comparta algún vértice común con una arista de A¶. los vértices incidentes a las aristas de M son un recubrimiento de G. ya que por la definición de ajuste maximal. Este nuevo problema garantiza conseguir un recubrimiento que contiene no más de dos vértices del recubrimiento mínimo. Objetivos General : Posibilitar la estudiante alcanzar una visión sistemática de lo que conocemos sobre Los Algoritmos Computacionales. Específicos : Introducir los conceptos propios sobre Algoritmo. por lo menos la mitad de los vértices de M deben pertenecer a un recubrimiento. y seguirá siendo. Con el objetivoinmediato de aprobar con los mejores meritos la asignatura de Algoritmos Computacionales. el voraz. En el mismo podremos encontrar los conceptos de algoritmo y algunos de sus componentes. El procedimiento para construir un ajuste maximizal de un grafo G consistiría en ir tomando aristas de G. de una en una y en cualquier orden e ir eliminando las incidentes al conjunto que se esta construyendo hasta recubrir todo en grafo. En el siguiente trabajopretendemos presentar una serie de conceptoy definiciones propios del estudio de los Algoritmos. que desde su aparición hasta nuestros días es. los diseños de estos últimos. también por la propia definición. normas. En ese mismo orden encontraremos las diferentes técnicaspara diseñarlos como son el método de la fuerza bruta. seria necesario demostrar que el conjunto de todos los vértices inciden a las aristas de un ajuste maximal M para un grafo G es un recubrimiento con no mas de dos veces el numero de veces el recubrimiento de tamaño mínimo. su importancia en el mundo de las aplicaciones para computadoras y el manejo de lógica de programación.análisis y diseño. Justificacion Es importante el estudio y conocimiento de lo que hoy conocemos como Algoritmos Computacionales. . donde daremos los conceptos básicos de semánticay sus tipos haciendo mayor énfasis en la semántica axiomática. ningún vértice perteneciente a M puede recubrir a mas de una arista en M. de vuelta atrás. divide y vencerás.

ya tratado. se considera con Al-Khowarizmi el otro gran padre de la algoritmia ( ciencia que trata de los algoritmos). restar. Esta ecuación será de una de las hipótesis fundamentales consideradas en esta obra. Euclides. multiplicar y dividir números decimales. por lo que para llegar a ser un programador eficaz se necesita aprender a resolver problemas de un modo riguroso y sistemático. titulo uno de sus mas famosos libros. el que tradujo la obra al latín y el inicio con la palabra: Algoritmi Dicit. significándonos que solo se puede llegar a realizar un buen programa con el diseño de un algoritmo y una correcta estructura de datos. A la metodología necesaria para resolver problemas mediante programas se denomina Metodología de la Programación. ). que describe la secuencia ordenada de pasos que conducen a la solución de un problema dado. la traducciónal latín del apellido de la palabra algorismus derivo posteriormente en algoritmo. El lenguajealgorítmico es aquel por medio al cual se realiza un análisis previo del problema a resolver y encontrar un método que permita resolverlo. Generalidades El programador de computadoras es ante que nada una personaque resuelve problemas. Desglosar sus variantes (ordenación. Algoritmos + Estructuras de Datos = Programas. Es un método para resolver un problema mediante una serie de datos precisos. Definir sus tipos y variantes. El conjunto de todas las operaciones a realizar y e orden en que se deben efectuarse. inventor de Pascal. .) 3. El profesor Niklaus Wirth. La resolución de un problema exige el diseño de un algoritmo que resuelva el problema propuesto. 2. matemático persa que vivió durante el siglo IX y alcanzo gran reputación por el enunciado de las reglas para sumar. algoritmo proviene de Mohammed alKhowarizmi. La palabra algoritmo se deriva del nombre latinizado del gran Matemático Árabe Mohamed Ibn Al Kow Rizmi. búsqueda. donde se recogía el sistema de numeración hindú y el concepto del cero. etc. el cual escribió sobre los años 800 y 825 su obra Quitad Al Mugabala. El eje central de esta metodología es el concepto. el gran matemático griego (del siglo IV antes de Cristo) que invento un método para encontrar el máximo común divisor de dos números. (Análisis del problema y desarrollo del algoritmo). definidos y finitos. 2. Los pasos para la resolución de un problema son: 1. Un algoritmo es un método para resolver un problema. de algoritmo. Ejecución y validación del programa por la computadora. Modula-2 y Oberon. Fue Fibinacci. Proporcionar conceptos sobre su análisis y diseño. (Fase de codificación. Marco Historico Un algoritmo es un conjunto de operaciones y procedimientosque deben seguirse para resolver un problema. Expresar el algoritmo como un programa de lenguaje de programación adecuado. se le denomina algoritmo. Aunque la popularización del término ha llegado con el advenimiento de la era informática. Proporcionar concepto sobre las técnicas de diseño. 3. Diseño de algoritmo. Visualizar sus ventajas e importancia.y y y y y y Proporcionar una idea de su uso.

Un algoritmo debe ser finito. Así. los algoritmos son más importantes que los lenguajes de programación o las computadoras. sin embargo. Redactar el algoritmo correspondiente. 5. En la etapa de diseño se determina como hace el programa la tarea solicitada. si el cliente es solvente entonces la empresa acepta el pedido. Los métodos mas eficaces para el proceso de diseño se basan en el conocido por Divide y Vencerás. 3. la solución de un problema se puede expresar mediante un algoritmo. Un algoritmo debe estar definido. Esta examina en su banco de datos la ficha del cliente. Proceso y Salida. Si se sigue un algoritmo dos veces. el algoritmo será siempre el mismo. la . Proceso: elaboración de la receta en la cocina. se debe obtener el mismo resultado cada vez. en caso contrario. Un lenguaje de programación es tan solo un medio para expresar un algoritmo y una computadora es solo un procesador para ejecutarlo. 2. pero cualquiera que sea el lenguaje. En cada problema el algoritmo se puede expresar en un lenguaje diferente de programación y ejecutarse en una computadora distinta. Características de los Algoritmos: Las características fundamentales que debe cumplir todo algoritmo son: y y y Un algoritmo debe ser preciso e indicar el orden de realización de cada paso. rechazar pedido fin Diseño del Algoritmo: En la etapa de análisis del proceso de programación se determina que hace el programa. los pasos para la elaboración del plato se realizaran sin importar el idioma del cocinero. En la cienciade la computación y en la programación. un aspecto muy importante será el diseño de algoritmos. Ejemplo de Algoritmo: Un cliente ejecuta un pedido a una fábrica. en caso contrario rechazara el pedido. inicio leer el pedido examinar la ficha del cliente si el cliente es solvente aceptar pedido. ingles o francés. de modo que sin algoritmo no puede existir un programa. Tanto el lenguaje de programación como la computadora son los mediospara obtener un fin: conseguir que el algoritmo se ejecute y se efectúe el proceso correspondiente. cordero). Los algoritmos son independientes tanto del lenguaje de programación en que se expresan como de la computadoraque lo ejecuta. En el algoritmo de receta de cocina citado anteriormente se tendrá: Entrada: ingrediente y utensilios empleados. Dada la importancia del algoritmo en la ciencia de la computación. es decir. debe tener un numero finito de pasos. o sea. Los pasos del algoritmo son: 1. Si se sigue un algoritmo se debe terminar en algún momento. en una analogía con la vida diaria. Salida: terminación del plato (por ejemplo. En esencia. 4. La definición de un algoritmo debe definir tres partes: Entrada. una receta de un plato de cocina se puede expresar en español. por ejemplo. El diseño de la mayoría de los algoritmos requiere creatividady conocimientos profundos de la técnica de la programación.Para llegar a la realización de un programa es necesario el diseño previo de algoritmo.

codificados. Cada sub programa es resuelto mediante un modulo (sub programa) que tiene un solo punto de entrada y un solo punto de salida. Recursos consumidos: Tiempo de ejecución. su facilidad de programarlo. hasta que pueda ser implementada una solución en la computadora. El diseño del algoritmo es independiente del lenguaje de programación en el que se vaya a codificar posteriormente. comprobados y depurados independientemente (incluso por diferentes programadores) y a continuación combinarlos entre si. Los programas estructurados de esta forma se dice que tienen un diseño modular y el método de romper el programa en módulos más pequeño se llama Programación Modular. Comunicaciones. Un algoritmo es mejor cuantos menos recursos consuma. Comprobar el modulo. robusto. Su ejecución requiere unos recursos. procesadores. fácil de entender. ¿Cuántos recursos de tiempo y memoria consume el siguiente algoritmo sencillo? i:= 0 a[n+1]:= x repetir i:= i + 1 . depurar el modulo. Lo que se consigue: Resolver un problema de forma exacta. 4. Combinar el modulo con los módulos anteriores. Cualquier programa bien diseñado consta de un programa principal (el modulo de nivel mas alto) que llama a sub programas (módulos de nivel mas bajo) que a su vez pueden llamar a otros sub programas. Memoria principal: Entradas/salidas a disco. El proceso de romper el problema en cada etapa y expresar cada paso en forma más detallada se denomina refinamiento sucesivo. etc. El proceso que convierte los resultados del análisis del problema en un diseño modular con refinamiento sucesivo que permitan una posterior traducción al lenguaje se denomina diseño de algoritmo. Recursos consumidos: Ejemplo. El proceso implica la ejecución de los siguientes pasos hasta que el programa se termina: y y y y programar modulo. Este método se conoce técnicamente como diseño descendente (Top Down) o modular. etc. Si es necesario. corto.resolución de un problema complejo se realiza dividiendo el problema en sub problemas y a continuación dividir estos sub problemas en otros de nivel mas bajo. Criterio empresarial: Maximizar la eficiencia. Análisis De Algoritmos Recursos De Computadores Y Complejidad Algoritmo: Conjunto de reglas para resolver un problema. Eficiencia: Relación entre los recursos consumidos y los productos conseguidos. forma aproximada o algunos casos. Los módulos pueden ser planeados.

o alguna constante.. Peor caso.. T(N) = N+1. -. Pentium III. Tamaño de los datos de entrada.. Bucles FOR: Se pueden expresar como una sumatoria. para el conteo de instrucciones. con los límites del FOR.2 s . Conclusión: Estudiar la variación del tiempo y la memoria necesitada por un algoritmo respecto al tamaño de la entrada y a los posibles casos. ¿Cuánto tiempo. El lenguaje de programación y el compilador usado. Cray. Bucles WHILE y REPEAT: Estudiar lo que puede ocurrir.. Instrucciones ejecutadas por el algoritmo. Media de todos los posibles contenidos. IF y CASE: Estudiar lo que puede ocurrir. Ejemplo. o una constante diferente. Normalmente usaremos la notación T(N)=.. de lo que haya en a. Mejor caso y peor caso según la condición. pero ¿qué significa T(N)? Tiempo de ejecución en segundos. T(N) = 2N + 4. Suponiendo que b y c son constantes.. En particular.. ¿Se puede predecir cuándo se cumplirán las condiciones? Llamadas a procedimientos: Calcular primero los procedimientos que no llaman a otros.. Operaciones básicas (+. En general los recursos dependen de: Factores externos.. La ejecución más lenta posible.1 ms N= 5. externos no aportan información sobre el algoritmo. El contenido favorece una rápida ejecución.): Una unidad de tiempo. con los segundos que tardan las operaciones básicas correspondientes. Los factores externos no aportan información sobre el algoritmo.. Mejor caso. T(N) = bN + c. Contenido de los datos de entrada. T(6)= 0. *. ¿Tardarán todas lo mismo? Ejecuciones del bucle principal. El ordenador donde lo ejecutemos: 286. Caso promedio. Operaciones de entrada salida: Otra unidad de tiempo.exe": N= 4.. luego se diferencia en una constante con los anteriores. de las estructuras de datos utilizadas. cuántas instrucciones. La implementación que haga el programador del algoritmo. ¿De qué depende? De lo que valga n y x. T(5)= 5 ms N= 6. de los tipos de datos... Algunas reglas básicas. Ejemplo. Programa "cifras. ¿Existe una cota inferior y superior del número de ejecuciones? ¿Se puede convertir en un FOR? El análisis de algoritmos también puede ser a posteriori: implementar el algoritmo y contar lo que tarda para distintas entradas. Asignación de tiempos. Calcular la media de una matriz de NxM. de la máquina. de forma aproximada (y parametrizada). T(4)= 0. :=.? Sabemos que cada ejecución lleva un tiempo constante.hasta a[i] = x Respuesta: Depende..

no sólo tiempos de ejec.": nos quitamos las constantes. La definición es aplicable a cualquier función de N en R.g) = O(max(f.N= 7. Si f Î O(g) entonces O(f) Í O(g). Podemos hacer previsiones. O(f)= { t: N ® R+ / $ c Î R+. W (T): Orden inferior de T. para valores suficientemente grandes (asintóticamente) sin considerar constantes. Q (T): Orden exacto de T. si el algoritmo es poco eficiente. se cumple: i) limn¥ ® f(n) Î R+ Þ O(f)=O(g). se cumple: i) O(f) = O(g) Û f Î O(g) y g Î O(f) ii) O(f) Í O(g) Û f Î O(g) ¿La relación de orden entre O(. Dadas f y g.. W (g) Í W (f) g(n) . W (f)=W (g). W (f+g) = W (max(f+g)) ¿Y para los Q (f+g)? ¿Es cierto que O(f . 2n+1 Î O(n). llamamos orden de f al conjunto de todas las funciones de N en R+ acotadas superiormente por un múltiplo real positivo de f. Notaciones asintóticas: Indican como crece T. "Funciones acotadas superiormente por un múltiplo de f. Dadas f y g de N en R+.. Medidas Asintoticas Notación asintótica: El tiempo de ejecución T(n) está dado en base a unas constantes que dependen de factores externos.. " n ³ n0: t(n) £ c·f(n) } Nota: O(f) es un conjunto de funciones.5 min ¿Qué conclusiones podemos extraer? Análisis a priori: Evitamos la implementación. Si f Î W (g) y g Î W (h) entonces f Î W (h) Ej. Si f Î O(g) y g Î O(h) entonces f Î O(h). ¿se cumple O(f)Í O(g) ó O(g)Í O(f)? P4.": no nos importa lo que pase para valores pequeños. n Î O(n2) Þ 2n+1 Î O(n2) P2. Propiedades P1.) es completa? Dadas f y g. Q (f)=Q (g) g(n) ii) limn¥ ® f(n) = 0 Þ O(f) Í O(g). Podemos comparar con otros algoritmos. O(f+g) = O(max(f. Orden de complejidad de f(n): O(f) Dada una función f: N ® R+. no una función. Grandes. O(T): Orden de complejidad de T. Dadas f y g de N en R+. T(8)= 3.. T(7)= 10 s N= 8. para valores de n suficientemente grandes. -g))? P5. Nos interesa un análisis que sea independiente de esos factores. u omega de T. g)). ¿Cómo es la relación para los W ? P3.. $ n0 Î N. de N en R+. "Valores de n sufic.

llamamos orden de f al conjunto de todas las funciones de Nm en R+ acotadas superiormente por un múltiplo real positivo de f.xN ® R+) Ej.. O(n+2m) Notaciones condicionales: En algunos casos interesa estudiar el tiempo sólo para ciertos tamaños de entrada. tenemos W (f | P) y Q (f | P). T(N) = T(N. .. ¿O(f) « O(f | P)? Ordenes De Complejidad Uso de los órdenes de complejidad: Dado un tiempo t(n). Algoritmo de búsqueda binaria: Si N es potencia de 2 el estudio se simplifica.. encontrar la función f más simple tal que t Î O(f). .n.m.. Ej. t(n) = 2n2/5 + 3p /2. ¿Qué relación hay entre los siguientes órdenes? O(n+m).... k2.a.. Dadas f y g de N en R+. b) = a·N + b El tiempo depende del tamaño del problema N. l. .. ¿Qué relación hay entre O(log2 n) y O(log10 n)? P6. el tiempo y la memoria consumidos pueden depender de muchos parámetros. f Î O(g | false).b). k2 ³ n2 . Memoria en una tabla hash. y del tiempo de inicialización b y de ejecución de un paso a. .. . f: Nm ® R+ (f: Nx. O(f)=O(g) Û Q (f)=Q (g) Û f Î Q (g) Û W (f)=W (g) P7. km) } De la misma forma. Las propiedades se siguen cumpliendo ® Demostrarlo. $ n0 Î N. O(f) = O(f | true). nm Î N...) = Relación de inclusión entre conjuntos. Dadas f y g de N en R+. M(B... Orden condicionado de f(n): O(f | P) Dada una función f: N ® R+.P5. Ejemplo. llamamos orden de f según P (o condicionado a P) al conjunto: O(f | P)= { t: N ® R+ / $ c Î R+. Ejemplo. n2.. para funciones con varios parámetros. n2. podemos extender los conceptos de W (f) y Q (f). Ejemplo. nm): O(f) Dada una función f: Nm ® R+. ‡Relación de orden entre O(. k2." km ³ nm : t(k1. Para cualquier f y g. Podemos suponerlos constantes T(N).. nm) suficientemente grandes. o variables T(N. se cumple: i) limn¥ ® f(n) Î R+ Þ O(f) = O(g) g(n) ii) limn¥ ® f(n) = 0 Þ O(f) Ì O(g) g(n) iii) limn¥ ® f(n) = +¥ Þ O(f) É O(g) g(n) Notación con varios parámetros: En general. " n ³ n0: P(n) Þ t(n) £ c·f(n) } De igual forma. a... t(n) Î O(n2). $ n1. para valores de (n1.. y P: N ® B. O(f)= { t: Nm ® R+ / $ c Î R+. " k1 ³ n1 .. O(nm) O(n2). k) = kB+l+n+2kn Orden de complejidad de f(n1. km) £ c·f(k1. . y que más se aproxime asintóticamente..

aparecerá un orden logarítmico O(log2 n). Relación de orden: igual que antes. El acto de diseñar un algoritmo puede considerarse como una tarea que difícilmente podrá ser del todo .. $ n0 Î N. $ n0 Î N. . t(n) = amnm + am-1nm-1 + . para valores de n suficientemente grandes. llamamos orden exacto de f al conjunto de todas las funciones de N en R+ que crecen igual que f. d Î R+. å im Î O(nm+1) i=1 i=1 i=1 Si hacemos una operación para n... 5. Orden exacto de f(n): Q (f): Dada una función f: N ® R+. independientemente de la base.. si p es un polinomio de menor grado que q. Técnica de diseño de algoritmos Diseño de Algoritmos: Hasta ahora se han realizado algunos comentarios respecto a la necesidad de diseñar algoritmos correctos y eficientes utilizando los elementos de un lenguaje de programación .) Ì O(n2) Ì O(n3) Ì . t Î O(g) ‡Se cumple que: O(c) = O(d). si p y q son polinomios del mismo grado. " n ³ n0: t(n) ³ c·f(n) } La notación omega se usa para establecer cotas inferiores del tiempo de ejecución. +a1n + a0 t(n) Î o(amnm) ¹ o(nm) ¿o(amnm) Í O(amnm)? ¿o(t) Í O(t)? Costa de complejidad con frecuencia Algunas relaciones entre órdenes frecuentes: O(1) Ì O(log n) Ì O(n) Ì O(n·log n) Ì O(n·(log n)2) Ì O(n1. Orden inferior u omega de f(n): W (f): Dada una función f: N ® R+. otra para n/2. asintóticamente y salvo constantes..+a1x+a0 es O(xn). O(p) Ì O(q).. Los logaritmos son del mismo orden. Ejemplo. Q (f) = O(f) Ç W (f) = { t: N ® R+ / $ c. llamamos omega de f al conjunto de todas las funciones de N en R+ acotadas inferiormente por un múltiplo real positivo de f... Ì O(2n) Ì O(n!) Ì O(nn) ¿Qué pasa con las omegas? ¿Y con los órdenes exactos? El orden de un polinomio anxn+.±O(f) £ O(g) Û O(f) Í O(g) Û Para toda t Î O(f). siendo c y d constantes positivas. å i = n(n+1)/2 Î O(n2).001.. O(c) Ì O(n) O(cn + b) = O(dn + e) O(p) = O(q). llamamos o pequeña de f al conjunto de todas las funciones de N en R+ que crecen igual que f asintóticamente: o(f)= { t: N ® R+ / lim t(n)/f(n) = 1}n¥ ® Esta notación conserva las constantes multiplicativas para el término de mayor orden. nnn å 1 = n Î O(n).Es necesario en este momento mencionar algo sobre como hacerlo. W (f)= { t: N ® R+ / $ c Î R+... " n ³ n0: c·f(n) ³ t(n) ³ d·f(n) } Notación o pequeña de f(n): o(f): Dada una función f: N ® R+. n/4.

que debe . puesto que existe un número reducido de esquema y técnicas de diseño. La investigaciónen esta área ha permitido descubrir un conjunto de métodos o esquemas de diseño hacia los cuales puede orientarse la realización de muchos algoritmos. puede ser muy directo. Supongamos que disponemos de una especificación precisa. una tarea difícil. es organizar el diseño sobre un esquema de algoritmo o una técnica de diseño que haya demostrado su utilidad para otros problemas. Aun así. El diseño de un algoritmo que resuelva un problema es. otros son bastante complejos. Este método. El conocimiento de técnicas de diseño es solo un primer paso para el diseñador. Aprender los principiosbásicos del diseño de algoritmos podemos preguntarnos por un método aceptable. dados uno datos de entrada valido. el uso de parámetros de acumulación al resolver problemas utilizando divide y vencerás. tenemos una solución voraz. hay problemas cuya solución no puede hallarse sino mediante un proceso de búsqueda. Si no nos importa la eficiencia del algoritmo.automatizada. Otros esquemas requieren un análisis minucioso del problema de forma que la solución se vaya construyendo en etapas. a pesar de lo complejas que son las operaciones de búsqueda. Una forma de facilitar esta labor consiste en recurrir a técnicas conocidas de diseño de algoritmos. completa y consistente del problema a resolver y queremos obtener un algoritmo en el que. llamado de fuerza bruta. conviene conocer otros métodos de diseño de algoritmos que también resultan de utilidad práctica. y a métodos basados en transformaciones del dominio para encontrar una solución mas fácilmente a un problema en un dominio transformado. se produzca cierto resultado. y a pesar de que resulta mas adecuado en bastantes casos utilizar alguno de estos esquemas que realizar un diseño desde cero. Todo problema algorítmico es un reto para su diseñador. si la decisión en una etapa. a esquemas muy generales que pueden adaptarse a un problema particular al detallar las partes generales del esquema. su tarea se simplifica. No obstante. Se programa un computador de manera que parta de un conjunto de axioma matemáticos y los que use para reducir aleatoriamente teoremas validos. la solución es dinámica. en general. basado en la descomposición de un problema en subproblemas. Este método de trabajo es practicable. Muchos problemas pueden resolverse buscando una solución fácil y directa pero. El mas entendido. Por ultimo. algunos resultan inmediatos de resolver. solo puede tomarse tras considerar varias solucionesde otras etapas mas simples. se decir. podríamos utilizar un algoritmo general llamado algoritmo del museo británico. siendo dicha solución finalmente adaptada al dominio original. Nos estamos refiriendo a métodos basados en la mejora de la eficiencia (por ejemplo. El esquema mas sencillo quizás sea el llamado divide y vencerás. a la vez bastante ineficiente. idear un algoritmo continua siendo una labor bastante creativa donde los conocimientos y la experiencia del propio diseñador tiene un papel fundamental. y quizás el mejor. Consideraciones generales Si el hábil programador dispone de un recetario de algoritmos de donde poder seleccionar el más adecuado para cada problema. pero con un poco de análisis puede encontrarse algoritmos más eficientes. su uso adecuado mediante el esquema de búsqueda con retroceso (o backtracking) permite ganar gran eficiencia respecto a soluciones de fuerza bruta. y el empleode tablas como estructura auxiliar para la resolución eficiente de problemas donde se aplica programación dinámica). Si puede preverse que decisión conviene en cada etapa para producir cierto tipo de mejor resultado.

Un modo de evitar problema lo proporciona la técnica de los parámetros acumuladores. Veremos dos parámetros para la mejora de eficiencia de algoritmos recursivos: el uso de parámetros acumuladores y el uso de tablas. en caso positivo. Método de fuerza bruta Comenzamos el estudio de esquemas algorítmicos con un método sencillo. Técnicas de los Parámetros Acumuladores y de Tabulacion La recurcion es un mecanismo que permite obtener. en combinación con otras contrucciones. dichos algoritmos pueden servir como una primera aproximación al algoritmo definitivo. pero poco reflexionada. En realidad. la fuerza bruta. .completarse con otros conocimientos y. pero dado que no se ha analizado apenas el problema. pero debe mejorar su rendimiento para que sea práctico. Por ejemplos: Algunos algoritmos de búsqueda de un elemento en un vector. Otro algoritmo realizaba un búsqueda dicotomica o binaria. si no mas bien calificativo Para una forma de diseñar algoritmos: tomar una solución directa. una solución funcional a muchos problemas. es muy probable que no se hayan aprovechado propiedades deducibles del problema y que la solución sea terriblemente ineficiente. pero muy ineficientes. Cada una se ilustra con un ejemplo distinto. La función principal simplemente realiza una llamada a esta función auxiliar en los que los parámetros de aquellas se modifican y los parámetros nuevos toman un valor inicial adecuado . Una solución por fuerza bruta también puede resultar adecuada como primera aproximación a la solución final. Muchos algoritmos recursivos resultan eficientes. Uno de ellos realizaba una búsqueda secuencial con complejidad lineal sobre el tamaño del vector y podía usarse con cualquier vector. El algoritmo primero responde a un razonamiento más sencillo. con la experiencia. Esta es la solución de fuerza bruta: una solución directa. Ejemplo: Números de Fibonacci Los números de fibonacci suele especificarse como: Fib(0)=1 Fib(1)1 Fib(n+2)=fib(n)+fib(n+1) Esta especificación de los números de fibonacci tienen una formulación recursiva inmediata en estilo funcional. La función principal usa una función auxiliar que tiene los parámetros de aquellas más algunos adicionales. sobre todo. con complejidad logarítmica. aprovechar esta circunstancia para usar el algoritmo más eficiente: el de búsqueda binaria. y solo se podía usar cuando el vector estuviese ordenado. poco reflexionada. cuya idea básica se expone a continuación. pero no todos: hay algunos fácilmente formulables. no es un esquema algorítmico. porque su desarrollo puede permitir profundizar más sobre el problema y conocer propiedades que sean utilizadas para obtener otra versión más eficiente. por lo que uno puede sentirse tentado a usar siempre. pero que debe evitarse siempre que se pueda. En estos casos. Parámetros Acumuladores Veamos primero una solución ineficiente que intentaremos mejorar. esto no es malo. Lo más razonable es comprobar si el vector esta ordenado y. En principio. dad su ineficacia. Los parámetros adicionales tienen como misión ir acumulando resultados principales durante el proceso recursivo.

Esta técnica se puede aplicar con éxito a problemas como la multiplicación de matrices. Otra técnica útil es el uso de tablas. De forma que cada uno tiene un 50% de posibilidades de ganar cada partido. Hay dos participantes (deportistas o equipos. Ejemplo: Sea el problema de la competición. en una maquina expendedora de tabaco). Método voraz: Este método trata de producir tipo de mejor resultado a partir de conjunto de opciones candidatas . Consideraciones y Criterios para Diseñar Algoritmos Algunas consideraciones estilísticas pueden contribuir a mejor la calidadde los algoritmos (y programas ) mediante la reducción del numero de errores que aparecen al desarrollar los.etc. la planificación en el orden de la ejecución de unos programas en un computador. Por sencillez . Suponiendo que se disponga de cantidad suficiente de ciertos tipos diferentes de monedas de curso legal. Puede emplearse en problemas de optimización. continua aplicándose el mismo criterio para la segunda moneda mas valiosa. se almacena en una tabla. la moneda de mayor valor ( es decir. y así sucesivamente. Ejemplo. se trata de dar como cambio la menor cantidad posible usando estos tipos de monedas. no importa que). se buscara en la segunda mitad. en la búsqueda de caminos mínimos sobre grafos. Búsqueda de una palabra en un diccionario Como ejemplo sencillo de aplicación de esta estrategia puede considerarse la búsqueda de una palabra en un diccionariode acuerdo con el siguiente criterio. Si no ha encontrado y es anterior se procede a buscarla en la primera mitad.Tabulacion No todos los algoritmos recursivos ineficientes pueden optimizarse con la técnica de los parámetros acumuladores. A. . se va procedimiento paso a paso realizándose la mejor elección (usando una función objetivo que respeta un conjunto de restricciones ) de entre las posibles. siendo ( n ) mayor que( 0 ). si es posterior. resolver independientemente los subproblemas para luego combinar sus soluciones y obtener la solución del problema original.. Dar un cambioutilizando el menor número de monedas Considérese ahora el problema de la devolución del cambio al realizar una compra (por ejemplo. La intención es que la primera vez que se realiza un cálculo. El procedimiento se repite sucesivamente hasta encontrar la palabra o decidir que no aparece. la búsqueda en estructuras ordenadas.Para ello. como el conocido de la mochila. Ejemplo. De todas formas. se supone que ambos participantes tienen cualidades y preparación similar . La estrategia voraz aplicada comienza devolviendo. Divide y vencerás: Consiste en descomponer un problema en un subproblema. Se abre el diccionario por la pagina centrar(quedando dividido en dos mitades) y se comprueba si la palabra aparece allí o si es léxico gráficamente anterior o posterior. donde puede consultarse otras veces que se necesite. mientras el valor de dicha moneda sea mayor o igual al cambio que resta por dar). Esta técnica también se suele emplear con la programación dinámica. la ordenación de vectores. la modificación para incorporar probabilidades diferentes es evidente y no complica el problema. cuando se pueda. El proceso finaliza cuando se ha devuelto todo el cambio.etc. que juegan una competición que es ganada por el primero que venza en n partidos.B.

Resumiendo. A pesar de que con la reducción de los costes del hardware es posible diseñar computadores más rápidos y con más memoria. encontrando de una sola vez la solución completa y óptima. y de acuerdo con los puntos de vista anteriores. el problema incluye restricciones adicionales que limitan el número posible de soluciones. fiable y fácil de mantener. Corrección. estos problemas no se intentan resolver "de golpe ". analizando durante cada etapa que elemento conviene añadir a la solución parcial ya existente. lo ideal es que nuestro algoritmo resulte correcto. claro. Ante la pregunta ¿Cuáles son las característica de un buen algoritmo?. En particular. las siguientes respuestas reflejan. Ello asegura que tanto algoritmos como programa resulten legibles y puedan modificarse fácilmente en caso de necesidad. Es más frecuente que el subconjunto de la solución se vaya formando paso a paso. Claridad. La eficiencia de un algoritmo se mide por los recursos que este consume. estas normas de estilo se dirigen hacia aspectos como la forma de construir los nombres de variables o tipo de datos que aparezcan. Normalmente. dados unos ficheros almacenados en una cinta de que el tiempo de recuperación de un fichero cualquiera sea el mínimo en promedio. 4. El modo de encolumnar las distintas partes de un algoritmo para facilitar su lectura y comprensión. el algoritmo no debe desaprovechar recursos. la tipografía seguida ala hora de escribir nombres de variables. Otro ejemplo se da cuando. Ciertos detalles o algunas partes especiales de los mismos pueden olvidarse fácilmente o quedar oscura si no están adecuadamente comentadas. 1. En realidad. Esta característica hace que aunque el análisis del problema sea arduo. sea el problema de encontrar un subconjunto de los arcos de un grafo. cierta medida. Se supone que un problema de esta clasetiene al menos una solución. Generalmente. el algoritmo debe estar bien documentación. la solución voraz siempre . se habla de la memoria y del tiempo de ejecución . subprogramas. pero resulta difícil de asegurar en algoritmos complejos. pero con la fortuna de que cada vez que añade un elemento a la solución se tiene la certeza de haber realizado la mejor elección posible.. Los criterios de estilo pueden reflejarse en un conjunto de normas de estilo de codificación. A menudo. la calidad de un algoritmo tiene muchas facetas y todas ellas importantes. en cuyo caso no importa cual se elija. los factores que identifican la calidad en ellos . La dificultad principal para resolver esta clase de problemas estriba en el análisis necesario para poder formular un algoritmo que halle la solución en varios pasos. no hay que desperdiciar estos recursos y tratar de desarrollar algoritmos más eficientes. etc. palabras claves. Nunca se debe olvidar que la característica más simple e importante de un algoritmo es que funcione. 2.También influyen haciendo que nuestro algoritmo resulten más fáciles de leer y entender para otras personas. y la normas sobre como y donde deben de introducirse los comentarios. Pude aparecer obvio. Un algoritmo voraz sigue el esquema anterior. eficiente. Puede haber varias soluciones optimas. Eficiencia. Por ejemplo. el algoritmo debe funcionar. 3. Estilo y calidad de los programas van fuertemente unidos. Algoritmos voraces Esquema voraz Hay muchos problemas en los que se pretende obtener un subconjunto de n elementos que satisfaga ciertas restricciones y que optimice alguna medida. La documentación ayuda a comprender el funcionamiento de los algoritmos.

Por lo que se ha descrito del esquema voraz. el candidato se incorpora definitivamente. Solución : (1. la primera solución encontrada es óptima.. pero si la función de selección es la adecuada.n). la decisión. es definitiva. Al contrario. ( ) ) Puede verse por qué estos algoritmos se llaman " voraces " : en cada paso toman el mejor trozo de la solución. es decir. el problema parte de: y y Una función objetivo que da el valor de una solución. ésta es la función por optimizar. por tanto.. sino que se utiliza durante el análisis del problema y es determinante en la elección de la función de selección. el conjunto de candidatos que forman la solución está vacío. si dicho conjunto no es válido. De todas formas. Inicialmente. el mejor candidato. solución) VorazAcumulador (candidatos. Una función que determine si cierto conjunto de candidatos es válido. permite formar una solución del problema. Por tanto. debe recordarse que puede haber varios criterios alternativos de selección y que de su . Si este conjunto ampliado sigue siendo válido.n) -> Cadidatos = ( ) v EsSolución ( solución)-> Value siguiente -> seleccionar ( candidatos ) IN EsVálida (solución v ( siguiente)) => VorazAcumulador (candidatos ± (solución). la solución consta de: y y y Un conjunto de candidatos Una función de selección que en cada momento determine que candidato de los aún no usados parece ser el mejor. En cada paso se intenta añadir el mejor de los candidatos restantes a dicha solución parcial. Podemos representar el esquema voraz de la siguiente forma funcional: FUNCTION Voraz ( candidatos: ( 1. La única complicación es comprobar que se siguen satisfaciendo las restricciones del problema. se desecha el candidato. Obsérvese que las funciones de validez y completitud no se preocupan de la optimalidad del la solución. si permite formar alguna solución del problema. éste es un proceso repetitivo sencillo que trata sucesivamente los diferentes elementos del problema.. la dificultad principal al diseñar un algoritmo voraz reside en encontrar un criterio en encontrar un criterio de selección que garantice la optimalidad de la solución.n) : (1.n ) : ( 1. es decir. Además. Un conjunto de restricciones sobre el valor de los datos de entrada y sobre la solución final del problema. nunca cambian de opinión: una vez que un candidato es aceptado o rechazado en la solución. Para facilitar la descripción de este proceso.n) -> FUNCTION VorazAcumulador ( candidatos : (1. si satisface las restricciones del problema y..resulte sencilla. Obviamente. Según esta descripción.. A su vez. solución v (siguiente)) VorazAcumulador (candidatos ± (siguiente). La función objetivo no suele aparecer en el algoritmo final. cada solución válida y completa es optima. Si el algoritmo voraz se ha diseñado correctamente. es decir. puede llamarse candidato al elemento tratado en cada paso.

utilizar el menor número de monedas. este algoritmo tiene la ventaja de valer para las situaciones en que el número de participantes no es una potencia de dos. se considera el problema de un cambio o desglose en monedas. Además. Con esta información se puede comprobar que en este problema están presentes los distintos elementos de la técnica voraz. Hay que desglosar una cantidad en un conjunto de monedas tratando de cumplir alguna condición. 50. Una solución viene dad por un conjunto de monedas devuelto tras el desglose. 100. ¥ ¥ . Asimismo. de las que se supone que hay cantidad suficiente para realizar el desglose. la tabla de competición se va completando por filas. se declaran los tipos VALORES y CANTIDADES para representar el valor asignado a cada unidad monetaria y la cantidad de cada tipo de moneda que se devolverá en el desglose. Divide Y Vencerás La técnica divide y vencerás consiste en descomponer el problema en un conjunto de subproblemas más pequeños. La condición de factibilidad de la solución siendo construida establece en el desglose debe ser menor o igual que el importe a desglosar. La función objetivo cosiste en minimizar la cantidad total de monedas utilizadas en el desglose. Se trata de indicar la cantidad (menor) de monedas de los tipos considerados. en este caso.correcta elección depende que la solución calculada por el algoritmo sea optima. Valores -> Integer M500 M1 Cantidades -> Integer M500 . y de un importe. 5 y 1 pesetas para el desglose. La función de selección establece que hay que elegir. Estos valores se definen por medio de un tipo enumerado MONEDAS. Su declaración es la siguiente: TYPE Monedas -> M500 I M100 I M50 I M25 I M5 I M1. mientras sea posible. suponemos que manejamos dineroespañol y. 25. la moneda de mayor valor de entre las candidatas. Cada fila resultante puede tener una complejidad de o (n2). Después se resuelven estos subproblemas y se combinan las soluciones para obtener la solución para el problema original. tales que sumados sus valores equivalgan al importe. el lector puede intentar encontrar una solución voraz del problema del calendario. podemos utilizar sólo monedas de 500.M1 Se supone inicialmente asignados los valores a cada uno de los tipos de monedas. cuando un candidato (moneda) se incorpora al conjunto solución. Es fácil encontrar una solución si en cada etapa se genera el subcalendario correspondiente a un equipo. en particular. Desglose en monedas Como primer ejemplo introductorio sencillo al que puede aplicarse la técnica voraz. es decir. Para simplificar. y cuyo valor total es igual al importe a desglosar. se parte de un conjunto de tipos de monedas válidas. Como ejercicio. Como fila primera se toma la secuencia de los índices de los participantes en cualquier orden. Los elementos de la técnica voraz están presentes en este problema de la siguiente forma: y y y y y El conjunto de candidatos está constituido por cada una de las monedas de los diferentes tipos que se pueden usar para realizar el desglose del importe dado. Además. Para ello. éste no será nunca excluido de él.

Veamos el esquema de divide y vencerás para dos subproblemas. Por supuesto. inferior. se descompone en varias partes más fáciles de resolver. OUT solución : resultado) -> PROCEDURE DyVAux (IN problema : dato1. deben existir algunos pasos sencillos cuya solución pueda calcularse fácil y directamente.. en caso contrario. solución) . 1<k<=n.. resultado PROCEDURE DivideYVenceras (IN problema : dato1. es fácil su generalización a k subproblemas 2<k<=n. Estos subproblemas se resuelven independientemente y después se combinan sus soluciones parciales para obtener la solución del problema original. 1. TYPEVAR dato. IN inferior. Su formación funcional es como sigue. resultado FUNCTION DivideYVenceras (problema : dato) : resultado -> EsPequeño (problema) }=> ResolverDirectamente (problema) | VALUE subproblemas -> Partir (problema) IN subproblemas == (subproblema1.Esquema de Divide y vencerás. OUT solución : resultado) -> VAR medio: 1. superior. Sin embargo. dado un problema al resolver planteando en términos de una entrada de tamaño n. solución) DyVAux (problema. escribiremos una formulación más restrictiva pero bastante usual. N. DivideYVenceras (subproblema2)) Se puede hacer una formulación imperativa similar. considerado el problema como de tipo dato y la solución. Combinar (subsolucion1. superior : 1. Mas formalmente.N.. el proceso recursivo nunca terminaría. DyVAux (problema. medio+1. Esta restricción permite una formulación y resolución recursiva de los subproblemas. superior. La técnica de divide y vencerás es quizás una de las utilizadas debido a su sencillez: si un problema es demasiado grande para resolverlo de una vez. superior) THEN ResolverDirectamente (problema. en la que se utiliza un vector de tamaño N. medio. subsolucion2. de tipo resultado: TYPEVAR Dato. subsolucion1)..n. subsolucion2).N subsolucion1.n. la técnica de divide y vencerás parte la entrada en k subproblemas. olución) ELSE Medio := Partir (inferior. DyVAux (problema. subproblema2) => Combinar (DivideYVenceras (subproblema1) . El caso más frecuente es cuando el número de subproblemas es dos. Este esquema de partición de problemas se denomina esquema de divide y vencerás solo en el caso en que los problemas sean de la misma clase del problema original. superior). inferior. subsolucion2 : resultado IF EsPequeño (inferior.

pero es terriblemente ineficiente.si n es pequeño T(n) = 2 T(n/2) + f(n). se elige uno cualquiera. 1<= i<=n. es decir. se supone que el numero de participantes es una potencia de dos. La eficiencia final del algoritmo depende de la función f(n) concreta que aparezca durante el análisis. Obsérvese que los números de participantes incluidos en la fila i de la tabla son distintos porque el participante i-esimo solo debe competir una vez con cada participante restante. El problema consiste en elaborar un calendario de competición de forma que cada participante compita exactamente una vez con cada uno de los demás participantes. Elaboración de un Calendario Deportivo: Sea un campeonato deportivo. en caso contrario donde T(n) es la función de tiempo de DivideYVenceras para entradas de tamaño n. Se supone también que cada participante tiene asignado un número comprendido entre 1 y N.n}-{i} ahora se completan las filas de la tabla de todas las formas posibles. Solo sirve como solución aquellas combinaciones de fila que cumplan las restricciones enunciadas en el párrafoanterior sobre las columnas de la tabla (las restricciones sobre las filas están garantizadas por el modo de generar los conjuntos P(i)). g(n) es el tiempo que tarda la función ResolverDirectamente en resolver problemas de pequeño tamaño (normalmente una constante) y f(n) es el tiempo necesario para partir el problema y combinar las subsoluciones. es decir.El esquema general se adapta a un problema concreto al sustituir los metasimbolos EsPequeño. Nótese que. resultan nx(n-1)!=n! formas de rellenar la tabla. 1<=j<n. el tiempo de cómputo de la función DivideYVecneras se describe con la siguiente relación de recurrencia: g(n). Partir y Combinar por funciones o procedimientos concretos. hay n = 2k participantes para algún entero positivo k. La siguiente figura describe visualmente parte de la elaboración de la tabla. el conjunto de permutaciones de los números {1. Si el tamaño de los dos subproblemas es el mismo (o casi). Si hay varios calendarios validos.. la columna j también contiene números distintos. El elemento (i. El método de fuerza bruta resulta sencillo. así que hablaremos de participantes en vez de deportistas o equipos. Sin embargo la aplicación de la técnica de divide y vencerás produce una solución mas sencillas aun pero muy eficientes. incluyendo en cada fila i algún ejemplo de P(i). puede suponerse que las competiciones se celebran en días sucesivos y que cada participante compite una vez por día. ResolverDirectamente. la solución del problema puede representarse en una tabla de dimensión nx(n-1). Primero se obtiene para cada participante i. contiene el numero del participante contra el que el participante i-esimo compite el día j-esimo.j)±esimo de la tabla. y sin perdida de generalidad. 1<=i<=n. Se necesitan elaborar n-1 competiciones por participantes. Por concreción. para nuestros propósitos resulta indiferente el deporteobjeto de la competición. el conjunto P(i) de todas las permutaciones posibles del resto de los participantes con los que debe competir. días . Por tanto. A su vez. Cada conjunto P(i) consta de (n-1)! Elementos. porque el día j-esimo cada participante solo puede competir con otro participante. Para simplificar el problema. Dado que el numero de participantes de n. es general. Se dispone de una solución inmediata aplicando fuerza bruta. para que esta técnica resulte eficiente todos los subproblemas deben ser de tamaño parecido.

1.. . puede decirse que el "tamaño" del problema es 2k (sabemos que el calendario tendrá un tamaño de 2k x(2k-1 -1) posiciones).N. El subcalendario del primer participante es sencillo porque basta con que compita en días sucesivos con los participantes de numeración. la unión de estos subcalendarios no forma un calendario completo para el campeonato de 2k participantes.N. El caso básico se da cuando solo hay dos participantes..N. es más complejo. PROCEDURE Calendario ( INOUT tabla : (1. superior en orden creciente de numeración. El algoritmo descrito se expresa a continuación..N)1.N) 1.2n . el resto del calendario se puede construir fácilmente. para k>1. de numeración comprendida entre 1 y 2k-1 y otro para los participantes comprendidos entre 2k-1 +1 y 2k .N-1) -> PROCEDURE FormaTabla (IN inf : 1.. cuando hay más de dos participantes. Este proceso se repite para el resto de los participantes de numeración inferior. faltan por elaborar las competiciones cruzadas entre los participantes de numeración inferior y los de numeración superior. Si el numero de participantes es 2k . rotando dicha secuencia a la derecha. El calendario de los participantes de numeración superior se completa de forma similar con los números de los participantes de numeración inferior. Completemos primero la parte de los participantes de numeración inferior. Por fortuna. por ejemplo. El caso recursivo. ya que a unión de los dos calendarios tiene un tamaño 2k x(2k-1 -1). faltando 2k x2k-1 celdas para completar el calendario total.. El siguiente participante toma esta secuencia y realiza una fácil permutación de la misma que le garantiza el respeto de las restricciones de la solución. sucesivamente con los participantes 2k-1 +1. El problema puede reducirse a dos sub problemas de tamaño 2k-1 si se elaboran independientemente dos subcalendarios de tamaño 2k x(2k-1 -1): uno para los participantes. La solución es directa porque se celebra una sola competición entre ambos. OUT tabla : (1.1... En efecto..N. Sin embargo.1 participantes 1 2 2 1 1 2 3 1 2 3 4 2 1 4 3 3 4 1 2 4 3 2 1 1 2 3 4 5 6 7 1 2 3 4 5 6 7 8 2 1 4 3 8 5 6 7 3 4 1 2 7 8 5 6 4 3 2 1 6 7 8 5 5 6 7 8 1 2 3 4 6 5 8 7 4 1 2 3 7 8 5 6 3 4 1 2 8 7 6 5 2 3 4 1 Se distinguen dos casos. es decir.N-1) -> VAR ¦ . IN sup :1..

medio. Después se genera.1 := inf ELSE medio := (inf + sup) Div 2. tabla) Este sistema de ecuacionesdefina una función de tiempo del orden de O(n2).N) -> (* ordenación por mezcla *) PROCEDURE OrdenarAux (INOUT Vector : INTEGER1. FormarTabla (inf. N) . Veamos otra estrategia. La idea consiste en añadir inicialmente a la tabla una columna "ficticia" de índice j=0.N IF inf = sup-1 THEN tablainf. CompletarTabla (inf. Mezclar (vector. medio. La partición puede hacerse por la mitad si se toma un índice m=[(i+s)/2] y dos subvectores vi.1 : = sup. tabla). Para el caso general.. medio+1.. medio+1.. Este proceso de mezcla es realizado por un procedimiento auxiliar. El algoritmo resultante es: PROCEDURE Ordenar (INOUT v : INTEGER1.sup-1. Finalmente se completa la mitad derecha de la tabla (correspondiente al cruce de los dos grupos de equipos cuyos subcalendarios se han generado por divide y vencerás). que es mucho mas eficiente que la solución de fuerza bruta. medio).N.s .l). Ordenación de un Vector por Mezcla: La ordenación de un vector es un problema que se presta fácilmente a la aplicación de la técnica de divide y vencerás. de acuerdo con las siguientes expresiones de los índices: i = (k + n/2) Mod (n+1) j = (1 + n/2) Mod n De esta forma se rellenan las casillas aun vacías. mediante comparaciones de sus elementos sucesivos. sup.N) -> VAR Medio : 1. para obtener un único vector ordenado. En esta última etapa.1.. los valores de las casillas (k. también de orden de complejidad cuadrática. tabla).m y vm+1. sup : 1. OrdenarAux (vector. sup.l ya completadas. mediante divide y vencerás. basta con mezclar los dos subvectores.medio : 1..... OrdenarAux (vector. sea vi. es decir. 1. sup-1. FormarTabla (medio+1. los componentes tablai. tablasup. que almacena los índices de las filas.j a partir de las casillas tablak.s un vector de índice inferior i e índice superior s. medio. IN inf. medio. tabla). medio.N. El caso básico corresponde a un subvector de un solo elemento.. CompletarTabla (medio+1.N IF inf < sup THEN medio := (inf+sup) Div 2. sup). donde se aplica divide y vencerás para resolver el problema y que se aprovecha de la simetría de la solución. que obviamente ya esta ordenado. la mitad izquierda de la tabla. siendo 1<=k<=n y 0<=l<=(n/2)-1. la combinación de los dos subvectores ya ordenados es fácil. inf. inf. sup) OrdenarAux (v. inf.

N) -> VAR vectorAux : INTEGER1. Los únicos inconvenientes que presenta es que el procedimiento de mezcla necesita gran capacidad de almacenamiento (para dos copias del vector) y que. i2 := i2 + 1 j := j + FOR índice IN i1. J := j + 1 FOR índice IN i2. i2 := medio + 1.. necesita copiar el vector auxiliar completo en el principal. n>1.j)-esimo se forma multiplicando cada elemento de la final i-esima de A por el elemento correspondiente de la columna j-esima de B y sumando los productos § . n=1. J := j + 1 FOR índice In inf.sup DO vectorAuxj := vectorindice .. de dimensión nxn.medio DO vectorAuxj := vectorindice. Multiplicación de Matrices: Sean dos matrices. IN medio: INTEGER. de forma que las ecuaciones de recurrencia de la función de tiempo son: T(n) = a. j := inf. i2. Puede diseñarse un algoritmo de mezcla más complejo que mejore ambos aspectos. IN sup : INTEGER. índice : INTEGER i1 := inf. A y B. La operación de mezcla es proporcional a n.. INOUT vector : INTEGER1. Es fácil analizar la complejidad del algoritmo para un vector de longitud n..N.El procedimiento para realizar la mezcla de los subvectores ordenados es: PROCEDURE Mezclar ( IN inf : INTEGER. WHILE (i1<=medio) ^ (i2<=sup) DO IF vectori1 << vectori2 THEN vectorAuxj :=vectori1. pero mantenga la complejidad asintótica calculada. es decir. además de mezclar. i1. resultando: T(n) = 2T(n/2) + bn= =2K T(n/2K) + kbn = an + bn log2 n El algoritmo de ordenación por mezcla es óptimo en tiempo de ejecución. b=cte Si n es una potencia de 2.. i1 :=i1 + 1 ELSE vectorAuxj . las ecuaciones anteriores se resuelven por sustituciones sucesivas.= vectori2. a=cte 2T(n/2) + bn.sup DO vectorindice := vectorAuxindice El algoritmo resultante es sencillo conceptualmente. n =2k para algún k. La matriz productoC=AxB también es una matriz de nxn cuyo elemento (i. j : INTEGER.

parciales. Podría conseguirse mas eficiencia si lográramos realizar menos multiplicaciones de matrices. Además. El algoritmo anterior. todo problema resoluble con esta técnica debe de satisfacer el principio de optimalidad. es decir. Supongamos. no se reconsidera en el futuro. Dos submatrices de (n/2)x(n/2) pueden sumarse en un tiempo bn2. que n es una potencia de dos. que podemos llamar algoritmo convencional de multiplicación de matrices. pueden añadirse las filas y columnas de ceros necesarias para formar una dimensión que sea potencia de dos. siendo b alguna constante. Sin embargo. La programación dinámica (también llamada planificación dinámica) es una técnica de programación que también permite resolver problemas mediante una secuencia de decisiones. Sin embargo. Programación Dinámica Principios de programación dinámica Se ha visto que la técnica voraz se aplica a problemas cuya solución puede formularse como el resultado de una secuencia de decisiones. La existencia de un algoritmo eficiente para la multiplicación (en realidad. El cálculo de cada elemento Cij requiere n multiplicaciones. Solamente al final se sabe cuál es la mejor de todas. La resolución de este sistema de ecuaciones nos dice que O(T(n))=OT(n3). Esta vez se necesita producir varias secuencias de decisiones. La matriz C tiene n2 elementos. asegurando que la secuencia de decisiones es la mejor de las posibles. Sin embargo.) las submatrices A y B pueden partirse en cuatro submatrices de dimensión (n/2)x(n/2). dado que la complejidad respectiva de estas operaciones es O(n3)n y o(n2). pero para n>2 las submatrices Cij se calculan mediante multiplicaciones (recursivas) y sumas de submatrices de dimensión (n/2)x(n/2). por sencillez. la técnica de divide y vencerás sugiere un algoritmo distinto. Si el producto AxB tiene la forma: A11 A12 B11 B12 C11 C12 A21 A22 B21 B22 C21 C22 Entonces: C11 = A11*B11 + A12*B21 C12 = A11*B12 + A12*B22 C21 = A21*B11 + A22*B21 C22 = A21*B12 + A22*B22 Para n=2. proviene directamente de la definición matemática del producto de matrices. así que el tiempo total del algoritmo de multiplicación es de orden O(n3). no todos los problemas pueden resolverse de esta manera. conduciendo de forma directa a la solución. porque la multiplicación esta relacionada con otras operaciones sobre matrices mas usuales. El algoritmo de Strassen calcula las cuatro submatrices Cij empleando 7 multiplicaciones y 18 sumas o restas de matrices. No es fácil establecer una definición de la programación dinámica. una característica es que el programa "aprende "dinámicamente de las decisiones que toma. de forma que no se ha conseguido ningún ahorro sustancial de tiempo. pero de una manera menos directa que en el caso voraz. los elementos Cij se calculan mediante algunas multiplicaciones y sumas de números. como inversión de una matriz o hallar su determinante. interesa encontrar algoritmos mas eficientes. aunque fuera a costa de un mayor numero de sumas de matrices. que existe un entero no negativo k tal que n=2k. Este principio establece que "una secuencia óptima de decisiones que resuelve un problema debe cumplir la . (Si n no es un potencia de dos. El método es eficiente porque una vez que se toma una decisión en un paso. para cualquier operación de las anteriores) significaría la existencia de un algoritmo similar para las demás.

. En la programación dinámica todos los subproblemas se resuelven de acuerdo con criterio de tamaño creciente y los resultados de subproblemas más pequeños se almacenan en algún tipo de estructura de datos (normalmente tablas) para facilitar la solución de los problemas más grandes.) Una solución dinámica para problema ( k. evitándose una explosión combinatoria en la producción de las secuencias y consiguiéndose soluciones más eficientes en cuanto a tiempo de ejecución. 1<i<N1. a partir de la recurrentes con formulación trasera es igual que e la formulación delantera. porque si hay d opciones para cada una de las n decisiones. sólo que en orden contrario. además. Eli el estado del problema tras la elección del valor vli 1<i<n1 y Sli una secuencia óptima de decisiones respecto al estao Eli. si este subproblema de simboliza como problema (k. En resumen. La expresión inicial de la ecuación de recurrencia.1 ) resultante de aplicar cada valor de decisión. 1<i<n . 1<i<n.. Podemos formalizar algo más la idea básica. la ecuación de base establece el valor para la etapa n+1 en que no queda ninguna decisión Xi. Sea D = { v1 .. que es problema ( n. ( Obsérvese que vamos a usar la técnica de resolución de problemas por generalización para después poder realizar una particularización de la solución obtenida.n ). a partir de la secuencia de decisiones Xi+1 Xn ( es la clase de formulación adoptada hasta ahora ). La ecuación general relaciona la secuencia óptima en una etapa i con la decisión tomada en la etapa i y la subsecuencia óptima en la etapa posterior i+1. Usando una técnica de fuerza bruta. La elección de una formulación delantera o trasera depende del problema considerado o. del gusto del programador. La ecuación de recurrencia puede formularse de dos formas: delantera o trasera. 1<i<n. Supongamos que tenemos un problema que satisface el principio de optimalidad.l). la aplicación de la técnica de programación dinámica a un problema significa comprobar primero el principio de optimalidad y desarrollar después unas ecuaciones recurrentes del estilo de (1) y (2). 1<k<n. La formulación delantera expresa la decisión de Xl . hay un caso en que la decisión d1 no va seguida por ninguna secuencia de decisiones. asimismo.Xn la secuencia de decisiones necesaria para resolver el problema.dl. tal que Eo es el estado inicial del problema y deben tomarse n decisiones d.n ).1 ) debe expresarse en términos de los valores de decisión existente para decisiones d1 y el subproblema problema ( k+1. sencillamente. La formulación trasera expresa la decisión de Xi. 1<i<n. una secuencia óptima de decisiones respecto a E0 es la mejor secuencias de decisión { Vli Sli }. Tiene sentido centrarse en un subproblema del problema inicial porque éste satisface el principio de optimalidad pero. ¨ ¨¨ ¨ ¨ . Algoritmos De Vuelta Atrás Existen un alto número de problemas que pueden formularse como la búsqueda de la mejor solución o del conjunto de todas las soluciones que satisfacen ciertas condiciones. partiendo como estado inicial de Ek-1. puede generalizarse la formulación del problema a cualquier subsecuencia de decisiones dk . Además. a tomar.propiedad de que cualquier subsecuencia de decisiones también debe ser óptima respecto al subproblema que resuelva ". Sea X1 . Entonces. sea. De esta forma se reduce al número total de subsecuencias generadas.vn} el conjunto de valores de decisión posibles para la decisión d1. entonces el problema completo es problema ( l. el número de secuencias de decisión es exponencial sobre el número de decisiones. resultará un total de d secuencias posibles de decisión. tiene la ventaja ( quizás paradójica al tratar de un problema más pequeño ) de que proporciona una visión más general del problema en cuestión. El razonamiento anterior se refiere a la primera decisión d1 tomada desde el estado inicial E0 sin embargo..

k-1) DO Solucion k := nodo.. Después simplemente se llama recursivamente al algoritmo para generar los estados descendientes. k) THEN IF R(solucion.. solucion).xi+1) es falso si el camino (xi. Así.xi+1) es un camino hasta el estado del problema. Esquema de Algoritmos de Vuelta Atrás: Sea (x1.. 1. El procedimiento no hace ninguna llamada recursiva cuando k = N+1 o cuando ningún nodo generado por G satisface el elemento posible que satisfacen A se añade una solución particular. evitando así la exploración de gran parte de al estructura.n) -> VAR nodo : elemento FOR noso IN G(solucion... debe existir una función de criterios que debe ser satisfecha por cada secuencia solución u optimizada por dichas secuencias solución si solo queremos la mejor.xi+1) no puede extenderse para alcanzar un nodo de respuesta. Por supuesto.. solucion) La llamada inicial del algoritmo es Retroceso(1. Por lo tanto. 1...xi) el camino desde la raíz hasta un nodo de un árbol del espacio de estado.xi+1) termina en un nodo de respuesta. INOUT solucion : elemento1. Este mismo proceso se repite en el resto de nodos del árbol. se comprueba si se ha encontrado una solucion.. los candidatos para la posición i+1 del vector desolucion x1. La técnica de ramificación y acotacotacion aplica de la siguiente manera: Supóngase que al recorrer un árbol y alcanza una hoja se tiene una solucion con k colores. Otros problemas satisfacen el principio de optimalidad.... Supongamos que también existe algún predicado R que determina si un camino (x1.. k sirve de cota inferior al retroceso.xi) el conjunto de todos los valores posibles de xi+1 tales que (x1.n son aquellos valores generados por G que satisfacen A. y que al seguir avanzando en el árbol (mediante la aplicación de varios pasos de retrocesos) se alcanza un nodo que requiere k+1 colores. Ramificación (Bifurcacion) Y Acotación Los métodos de Ramificación y Acotación constituyen un a variante de las técnicas de retroceso para problemas donde se trata de encontrar el valor máximo o mínimo de cierta función objeto (esto suele suceder en los problemas de programación lineal entera). pues tenemos ya una solucion mayor.cada solución es el resultado de una secuencia de decisiones. Supongamos que existe algún predicado acotador A tal que A(x1.. Sin embargo. Algoritmos Heuristicos Existen muchos problemas para los cuales no se conocen algoritmos que puedan encontrar la solución de forma eficiente: problemas NP-completos.k) THEN << guardar µsolucion¶ >>... En este punto podemos retroceder (y no seguir avanzando por mas ramas).. En algunos problemas de optimización se conoce un criterio óptimo de selección que puede usarse de forma voraz.. IF R(solucion.. Se sale del bucle FOR cuando no quedan mas valores para solución terminando la llamada actual al algoritmo.. pudiéndose aplicar la técnica de programación dinámica.. . Retroceso (k+1... Sea G(x1. 1.. todavía hay otros problemas peores que no queda mas remedio que realizar una búsqueda de la solución. El Algoritmo de Vuelta Atrás se especifica de la forma siguiente: PROCEDURE Retroceso (IN k : INTEGER..

A). pero garantizando que se forme un ciclo. cn). a2. 2).. 2. Función de selección: de los nodos candidatos seleccionar el más próximo al último (o al primero) de la secuencia actual (c1. pero necesitamos una solución eficiente. Empezar en un nodo cualquiera. Heurística voraz 1 ± Una solución será un cierto orden en el conjunto de nodos (c1.. c2. Solución: (1.. donde la solución está formada por un grupo de elementos en cierto orden: podemos aplicar el esquema voraz. . Normalmente. se basa en un conocimiento intuitivo del programador sobre un determinado problema. (4. Solución: ((2. Factible: una arista se puede añadir a la solución actual si no se forma un ciclo (excepto para la última arista añadida) y si los nodos unidos no tienen grado mayor que 2. Empezando en el nodo 1. (3.. 2. 1) Coste: 15+20+10+45+50=140 Heurística voraz 2 ± Una solución será un conjunto de aristas (a1. completo y ponderado G = (V. Ejemplo. 3. Hacer igual que en el algoritmo de Kruskal. En cada paso moverse al nodo no visitado más próximo al último nodo seleccionado.. Los nodos son los candidatos. 5. Objetivo: obtener buenas soluciones en un tiempo de ejecución corto. sin importar el orden. 4. an-1) que formen un ciclo hamiltoniano. La estructura de algoritmo voraz se puede utilizar para construir procedimientos heurísticos: hablamos de heurísticas voraces. Se hace necesario utilizar algoritmos heurísticos: Un algoritmo heurístico (o simplemente heurística) puede producir una buena solución (puede que la óptima) pero también puede que no produzca ninguna solución o dar una solución no muy buena. 3. 5)) Coste = 10+15+20+45+50 = 140 . ‡Ejemplo. (1. c2. Solución: (5.La solución exacta puede requerir un orden factorial o exponencial: el problema de la explosión combinatoria. Selección: seleccionar la arista candidata de menor coste. Empezar con un grafo sin aristas. Inicialización: seleccionar un nodo cualquiera... Las aristas son los candidatos. 2) Coste: 30+15+25+10+45=125 Empezando en el nodo 3. el orden de visita de los nodos. ca). encontrar un ciclo simple de costo mínimo que pase por todos los nodos. . Es un problema NP. Problema de optimización. Posibilidades: 1.. 3). Acabamos cuando tengamos n nodos. 4). 4. .. El problema del viajante Problema: Dado un grafo no dirigido. 5). (1.

resulta parcialmente interesante que estos garanticen una cota en el margen de imprecisión. seria necesario demostrar que el conjunto de todos los vértices inciden a las aristas de un ajuste maximal M para un grafo G es un recubrimiento con no mas de dos veces el numero de veces el recubrimiento de tamaño mínimo. ya que por la definición de ajuste maximal. Este nuevo problema garantiza conseguir un recubrimiento que contiene no más de dos vértices del recubrimiento mínimo. repetir la heurística 1 con varios orígenes. por lo menos la mitad de los vértices de M deben pertenecer a un recubrimiento. los algoritmos que no conducen a una solución óptima se llaman algoritmos de aproximación. El procedimiento para construir un ajuste maximizal de un grafo G consistiría en ir tomando aristas de G. próximas a la óptima. a partir de la solución del algoritmo intentar hacer modificaciones locales para mejorar esa solución. En consecuencia. . Sin embargo. como es calcular el ajuste maximizal del grafo G. los vértices incidentes a las aristas de M son un recubrimiento de G. se trata de encontrar un conjunto con el menor numero de vértices tal que toda arista sea incidente por lo menos de un vértice de V. A continuación se ilustra este tipo de tratamiento de problemas al problema de recubrimiento de un grafico: Dado un grafo G=(V. de una en una y en cualquier orden e ir eliminando las incidentes al conjunto que se esta construyendo hasta recubrir todo en grafo. normalmente ambos dan soluciones buenas. Esto es evidente. Este problema se puede resolver a través de otro aproximado. Se trata de calcular un subconjunto A¶ de aristas tal que dos aristas cualquiera de A¶ no tengan ningún vértice común y toda arista de A-A¶ comparta algún vértice común con una arista de A¶.A). también por la propia definición. Para poder aplicar el nuevo problema aproximado. Para este tipo de problemas. ó bien. Sin embargo. es probable que no sepamos resolverlo de manera precisa y completa utilizando un algoritmo polimico en tiempo.Conclusiones: Ninguno de los dos algoritmos garantiza una solución óptima. Algoritmos De Aproximación Dado un problema NP completo. Posibles mejoras: buscar heurísticas mejores. ningún vértice perteneciente a M puede recubrir a mas de una arista en M.

Sign up to vote on this title
UsefulNot useful