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.

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

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

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

. Ì O(2n) Ì O(n!) Ì O(nn) ¿Qué pasa con las omegas? ¿Y con los órdenes exactos? El orden de un polinomio anxn+. d Î R+. El esquema mas sencillo quizás sea el llamado divide y vencerás. +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.. No obstante.+a1x+a0 es O(xn). puede ser muy directo. una tarea difícil. se decir. y a pesar de que resulta mas adecuado en bastantes casos utilizar alguno de estos esquemas que realizar un diseño desde cero.) Ì O(n2) Ì O(n3) Ì . Ejemplo.. El acto de diseñar un algoritmo puede considerarse como una tarea que difícilmente podrá ser del todo automatizada. .Q (f) = O(f) Ç W (f) = { t: N ® R+ / $ c. otra para n/2. 5. independientemente de la base. Este método. å im Î O(nm+1) i=1 i=1 i=1 Si hacemos una operación para n. Los logaritmos son del mismo orden. 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 .001. 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.. llamado de fuerza bruta. å i = n(n+1)/2 Î O(n2). Todo problema algorítmico es un reto para su diseñador. a la vez bastante ineficiente.. basado en la descomposición de un problema en . t(n) = amnm + am-1nm-1 + . a esquemas muy generales que pueden adaptarse a un problema particular al detallar las partes generales del esquema. Muchos problemas pueden resolverse buscando una solución fácil y directa pero. pero con un poco de análisis puede encontrarse algoritmos más eficientes. algunos resultan inmediatos de resolver.. El diseño de un algoritmo que resuelva un problema es... nnn å 1 = n Î O(n). 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...Es necesario en este momento mencionar algo sobre como hacerlo. Una forma de facilitar esta labor consiste en recurrir a técnicas conocidas de diseño de algoritmos. en general. " 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+. $ n0 Î N. otros son bastante complejos. idear un algoritmo continua siendo una labor bastante creativa donde los conocimientos y la experiencia del propio diseñador tiene un papel fundamental.. aparecerá un orden logarítmico O(log2 n). n/4.

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

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

. . Ejemplo. continua aplicándose el mismo criterio para la segunda moneda mas valiosa. subprogramas. estas normas de estilo se dirigen hacia aspectos como la forma de construir los nombres de variables o tipo de datos que aparezcan. 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. El procedimiento se repite sucesivamente hasta encontrar la palabra o decidir que no aparece. y así sucesivamente. se buscara en la segunda mitad. la tipografía seguida ala hora de escribir nombres de variables. el algoritmo debe funcionar. 2. en la búsqueda de caminos mínimos sobre grafos. Estilo y calidad de los programas van fuertemente unidos. 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. Pude aparecer obvio.etc. El proceso finaliza cuando se ha devuelto todo el cambio. en una maquina expendedora de tabaco). si es posterior. etc. También influyen haciendo que nuestro algoritmo resulten más fáciles de leer y entender para otras personas.etc. cuando se pueda. Si no ha encontrado y es anterior se procede a buscarla en la primera mitad. 1. la ordenación de vectores. 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. Suponiendo que se disponga de cantidad suficiente de ciertos tipos diferentes de monedas de curso legal. las siguientes respuestas reflejan. pero resulta difícil de asegurar en algoritmos complejos. Ejemplo. 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.. la planificación en el orden de la ejecución de unos programas en un computador.subproblemas para luego combinar sus soluciones y obtener la solución del problema original. se trata de dar como cambio la menor cantidad posible usando estos tipos de monedas. 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. Ello asegura que tanto algoritmos como programa resulten legibles y puedan modificarse fácilmente en caso de necesidad. cierta medida. Ante la pregunta ¿Cuáles son las característica de un buen algoritmo?. El modo de encolumnar las distintas partes de un algoritmo para facilitar su lectura y comprensión. y la normas sobre como y donde deben de introducirse los comentarios. Esta técnica se puede aplicar con éxito a problemas como la multiplicación de matrices. la búsqueda en estructuras ordenadas.Para ello. Método voraz: Este método trata de producir tipo de mejor resultado a partir de conjunto de opciones candidatas . los factores que identifican la calidad en ellos . Nunca se debe olvidar que la característica más simple e importante de un algoritmo es que funcione. Puede emplearse en problemas de optimización. palabras claves. como el conocido de la mochila. La estrategia voraz aplicada comienza devolviendo. Los criterios de estilo pueden reflejarse en un conjunto de normas de estilo de codificación. la moneda de mayor valor ( es decir. mientras el valor de dicha moneda sea mayor o igual al cambio que resta por dar). Generalmente. Correcció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. se desecha el candidato. Claridad. La eficiencia de un algoritmo se mide por los recursos que este consume. el problema parte de: y Una función objetivo que da el valor de una solución. En cada paso se intenta añadir el mejor de los candidatos restantes a dicha solución parcial. Por lo que se ha descrito del esquema voraz. el problema incluye restricciones adicionales que limitan el número posible de soluciones. dados unos ficheros almacenados en una cinta de que el tiempo de recuperación de un fichero cualquiera sea el mínimo en promedio. la primera solución encontrada es óptima. 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. la solución voraz siempre resulte sencilla. el algoritmo debe estar bien documentación. Un algoritmo voraz sigue el esquema anterior. Normalmente. Si el algoritmo voraz se ha diseñado correctamente. Según esta descripción. Puede haber varias soluciones optimas. Otro ejemplo se da cuando. 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. 4. Es más frecuente que el subconjunto de la solución se vaya formando paso a paso. analizando durante cada etapa que elemento conviene añadir a la solución parcial ya existente. eficiente. 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 única complicación es comprobar que se siguen satisfaciendo las restricciones del problema. En particular.3. es decir. Eficiencia. si satisface las restricciones del problema y. ésta es la función por optimizar. el candidato se incorpora definitivamente. por tanto. Por tanto. La documentación ayuda a comprender el funcionamiento de los algoritmos. Al contrario. estos problemas no se intentan resolver "de golpe ". el algoritmo no debe desaprovechar recursos. sea el problema de encontrar un subconjunto de los arcos de un grafo. Resumiendo. A menudo. Por ejemplo. 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. Inicialmente. fiable y fácil de mantener. se habla de la memoria y del tiempo de ejecución . el conjunto de candidatos que forman la solución está vacío. . Si este conjunto ampliado sigue siendo válido. la calidad de un algoritmo tiene muchas facetas y todas ellas importantes. no hay que desperdiciar estos recursos y tratar de desarrollar algoritmos más eficientes. Para facilitar la descripción de este proceso. Obviamente. permite formar una solución del problema. éste es un proceso repetitivo sencillo que trata sucesivamente los diferentes elementos del problema. Se supone que un problema de esta clasetiene al menos una solución. claro. En realidad. si dicho conjunto no es válido. puede llamarse candidato al elemento tratado en cada paso. encontrando de una sola vez la solución completa y óptima. Esta característica hace que aunque el análisis del problema sea arduo. lo ideal es que nuestro algoritmo resulte correcto. en cuyo caso no importa cual se elija. Ciertos detalles o algunas partes especiales de los mismos pueden olvidarse fácilmente o quedar oscura si no están adecuadamente comentadas.

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

la técnica de divide y vencerás parte la entrada en k subproblemas. 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. considerado el problema como de tipo dato y la solución. 50. Su formación funcional es como sigue. 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. 25. es fácil su generalización a k subproblemas 2<k<=n. se descompone en varias partes más fáciles de resolver. 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. el proceso recursivo nunca terminaría. suponemos que manejamos dineroespañol y. deben existir algunos pasos sencillos cuya solución pueda calcularse fácil y directamente. 5 y 1 pesetas para el desglose. Asimismo. Veamos el esquema de divide y vencerás para dos subproblemas. 1<k<=n. Con esta información se puede comprobar que en este problema están presentes los distintos elementos de la técnica voraz. la moneda de mayor valor de entre las candidatas. podemos utilizar sólo monedas de 500. éste no será nunca excluido de él. mientras sea posible. en particular. en caso contrario.M1 Se supone inicialmente asignados los valores a cada uno de los tipos de monedas. Mas formalmente. 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. Después se resuelven estos subproblemas y se combinan las soluciones para obtener la solución para el problema original. y cuyo valor total es igual al importe a desglosar. Esta restricción permite una formulación y resolución recursiva de los subproblemas. La función de selección establece que hay que elegir. Además. 100. de tipo resultado: TYPEVAR     . Valores -> Integer M500 M1 Cantidades -> Integer M500 . dado un problema al resolver planteando en términos de una entrada de tamaño n. Esquema de Divide y vencerás. 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. 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.Para simplificar. Estos subproblemas se resuelven independientemente y después se combinan sus soluciones parciales para obtener la solución del problema original. Estos valores se definen por medio de un tipo enumerado MONEDAS. cuando un candidato (moneda) se incorpora al conjunto solución. La función objetivo cosiste en minimizar la cantidad total de monedas utilizadas en el desglose. Por supuesto. El caso más frecuente es cuando el número de subproblemas es dos. Su declaración es la siguiente: TYPE Monedas -> M500 I M100 I M50 I M25 I M5 I M1.

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

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

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

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

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

asimismo. porque si hay d opciones para cada una de las n decisiones. Esta vez se necesita producir varias secuencias de decisiones. £ . porque la multiplicación esta relacionada con otras operaciones sobre matrices mas usuales. el número de secuencias de decisión es exponencial sobre el número de decisiones. Podemos formalizar algo más la idea básica. Sin embargo. como inversión de una matriz o hallar su determinante. La resolución de este sistema de ecuaciones nos dice que O(T(n))=OT(n3). conduciendo de forma directa a la solución. 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. 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. aunque fuera a costa de un mayor numero de sumas de matrices. Supongamos que tenemos un problema que satisface el principio de optimalidad. Podría conseguirse mas eficiencia si lográramos realizar menos multiplicaciones de matrices. Solamente al final se sabe cuál es la mejor de todas. Usando una técnica de fuerza bruta. De esta forma se reduce al número total de subsecuencias generadas. tal que Eo es el estado inicial del problema y deben tomarse n decisiones d. una característica es que el programa "aprende "dinámicamente de las decisiones que toma. El método es eficiente porque una vez que se toma una decisión en un paso. 1<i<n. no se reconsidera en el futuro. interesa encontrar algoritmos mas eficientes. 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.vn} el conjunto de valores de decisión posibles para la decisión d1. 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 ". Entonces. El algoritmo de Strassen calcula las cuatro submatrices Cij empleando 7 multiplicaciones y 18 sumas o restas de matrices. los elementos Cij se calculan mediante algunas multiplicaciones y sumas de números. una secuencia óptima de decisiones respecto a E0 es la mejor secuencias de decisión { Vli Sli }. todo problema resoluble con esta técnica debe de satisfacer el principio de optimalidad. La existencia de un algoritmo eficiente para la multiplicación (en realidad. para cualquier operación de las anteriores) significaría la existencia de un algoritmo similar para las demás. sea. Dos submatrices de (n/2)x(n/2) pueden sumarse en un tiempo bn2. pero de una manera menos directa que en el caso voraz. Sea D = { v1 . de forma que no se ha conseguido ningún ahorro sustancial de tiempo. No es fácil establecer una definición de la programación dinámica. 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. 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. no todos los problemas pueden resolverse de esta manera. resultará un total de d secuencias posibles de decisión. 1<i<N1. asegurando que la secuencia de decisiones es la mejor de las posibles.. Además.Para n=2. pero para n>2 las submatrices Cij se calculan mediante multiplicaciones (recursivas) y sumas de submatrices de dimensión (n/2)x(n/2). dado que la complejidad respectiva de estas operaciones es O(n3)n y o(n2). siendo b alguna constante.

.. además. ( 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. El Algoritmo de Vuelta Atrás se especifica de la forma siguiente: PROCEDURE Retroceso (IN k : INTEGER. del gusto del programador.xi) el camino desde la raíz hasta un nodo de un árbol del espacio de estado... 1<i<n. Sea G(x1.. Por lo tanto.n son aquellos valores generados por G que satisfacen A. puede generalizarse la formulación del problema a cualquier subsecuencia de decisiones dk . La expresión inicial de la ecuación de recurrencia. sencillamente.xi+1) es un camino hasta el estado del problema. Supongamos que también existe algún predicado R que determina si un camino (x1. En resumen.xi+1) no puede extenderse para alcanzar un nodo de respuesta.... que es problema ( n.Xn la secuencia de decisiones necesaria para resolver el problema..l). Otros problemas satisfacen el principio de optimalidad.. 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.... todavía hay otros problemas peores que no queda mas remedio que realizar una búsqueda de la solució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.n) -> ¤ ¤¤ ¤ .. Supongamos que existe algún predicado acotador A tal que A(x1.. a partir de la secuencia de decisiones Xi+1 Xn ( es la clase de formulación adoptada hasta ahora ).. la ecuación de base establece el valor para la etapa n+1 en que no queda ninguna decisión Xi. cada solución es el resultado de una secuencia de decisiones. Sea X1 .1 ) resultante de aplicar cada valor de decisión. Además.xi) el conjunto de todos los valores posibles de xi+1 tales que (x1... Tiene sentido centrarse en un subproblema del problema inicial porque éste satisface el principio de optimalidad pero.. La elección de una formulación delantera o trasera depende del problema considerado o.xi+1) termina en un nodo de respuesta. 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. 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.n ). 1<k<n. 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. Esquema de Algoritmos de Vuelta Atrás: Sea (x1.. los candidatos para la posición i+1 del vector desolucion x1. La ecuación de recurrencia puede formularse de dos formas: delantera o trasera..1 ) debe expresarse en términos de los valores de decisión existente para decisiones d1 y el subproblema problema ( k+1.. Sin embargo. a tomar. 1<i<n ....El razonamiento anterior se refiere a la primera decisión d1 tomada desde el estado inicial E0 sin embargo.n ). INOUT solucion : elemento1.dl. 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). si este subproblema de simboliza como problema (k.. pudiéndose aplicar la técnica de programación dinámica. Por supuesto.xi+1) es falso si el camino (xi. partiendo como estado inicial de Ek-1. 1<i<n.. La formulación delantera expresa la decisión de Xl . En algunos problemas de optimización se conoce un criterio óptimo de selección que puede usarse de forma voraz..) Una solución dinámica para problema ( k. a partir de la recurrentes con formulación trasera es igual que e la formulación delantera. sólo que en orden contrario. entonces el problema completo es problema ( l.

se comprueba si se ha encontrado una solucion. 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.k) THEN << guardar µsolucion¶ >>. Así. Después simplemente se llama recursivamente al algoritmo para generar los estados descendientes. k-1) DO Solucion k := nodo. 1. 1. Este mismo proceso se repite en el resto de nodos del árbol. solucion) La llamada inicial del algoritmo es Retroceso(1. se basa en un conocimiento intuitivo del programador sobre un determinado problema. solucion). pues tenemos ya una solucion mayor. k) THEN IF R(solucion. Posibilidades: . 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. Se sale del bucle FOR cuando no quedan mas valores para solución terminando la llamada actual al algoritmo. Algoritmos Heuristicos Existen muchos problemas para los cuales no se conocen algoritmos que puedan encontrar la solución de forma eficiente: problemas NP-completos. 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. pero necesitamos una solución eficiente. IF R(solucion. La estructura de algoritmo voraz se puede utilizar para construir procedimientos heurísticos: hablamos de heurísticas voraces. Normalmente. A). 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). Problema de optimización. Objetivo: obtener buenas soluciones en un tiempo de ejecución corto. 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. k sirve de cota inferior al retroceso. completo y ponderado G = (V. donde la solución está formada por un grupo de elementos en cierto orden: podemos aplicar el esquema voraz. Es un problema NP.VAR nodo : elemento FOR noso IN G(solucion. evitando así la exploración de gran parte de al estructura. La solución exacta puede requerir un orden factorial o exponencial: el problema de la explosión combinatoria. El problema del viajante Problema: Dado un grafo no dirigido. En este punto podemos retroceder (y no seguir avanzando por mas ramas). Retroceso (k+1. encontrar un ciclo simple de costo mínimo que pase por todos los nodos. 1.

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

la recursividad e iteración. su análisis y diseño. también por la propia definición.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¶. entre otros. tipos de algoritmos de búsqueda y ordenación así como sus aplicaciones. divide y vencerás. Con el objetivoinmediato de aprobar con los mejores meritos la asignatura de Algoritmos Computacionales. reglas. ningún vértice perteneciente a M puede recubrir a mas de una arista en M. Objetivos General : Posibilitar la estudiante alcanzar una visión sistemática de lo que conocemos sobre Los Algoritmos Computacionales. vital para el desarrollo de aplicaciones para computadorasy el manejo y dominio de la lógica de programación para resolver problemas. los diseños de estos últimos. De igual forma podremos ver las definiciones y algunas características. El procedimiento para construir un ajuste maximizal de un grafo G consistiría en ir tomando aristas de G. por lo menos la mitad de los vértices de M deben pertenecer a un recubrimiento. su importancia en el mundo de las aplicaciones para computadoras y el manejo de lógica de programación. donde daremos los conceptos básicos de semánticay sus tipos haciendo mayor énfasis en la semántica axiomática. normas. Esto es evidente. Específicos : Introducir los conceptos propios sobre Algoritmo. y seguirá siendo. que desde su aparición hasta nuestros días es. Este nuevo problema garantiza conseguir un recubrimiento que contiene no más de dos vértices del recubrimiento mínimo. los vértices incidentes a las aristas de M son un recubrimiento de G. En el siguiente trabajopretendemos presentar una serie de conceptoy definiciones propios del estudio de los Algoritmos. 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. 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. 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 ese mismo orden encontraremos las diferentes técnicaspara diseñarlos como son el método de la fuerza bruta. de vuelta atrás. el voraz. En consecuencia. programación dinámica. 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. En el mismo podremos encontrar los conceptos de algoritmo y algunos de sus componentes.análisis y diseño. Finalmente veremos los que es la verificación y derivación de programas. . 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. Para poder aplicar el nuevo problema aproximado. Justificacion Es importante el estudio y conocimiento de lo que hoy conocemos como Algoritmos Computacionales.

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

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

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

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

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

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

$ n0 Î N. aparecerá un orden logarítmico O(log2 n).. t(n) = amnm + am-1nm-1 + . Ejemplo.. 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. para valores de n suficientemente grandes. si p es un polinomio de menor grado que q. si p y q son polinomios del mismo grado. 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(2n) Ì O(n!) Ì O(nn) ¿Qué pasa con las omegas? ¿Y con los órdenes exactos? El orden de un polinomio anxn+..+a1x+a0 es O(xn). Orden inferior u omega de f(n): W (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... independientemente de la base. Q (f) = O(f) Ç W (f) = { t: N ® R+ / $ c. nnn å 1 = n Î O(n). t Î O(g) ‡Se cumple que: O(c) = O(d). Orden exacto de f(n): Q (f): Dada una función f: N ® R+.Es necesario en este momento mencionar algo sobre como hacerlo. " 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+.±O(f) £ O(g) Û O(f) Í O(g) Û Para toda t Î O(f).) Ì O(n2) Ì O(n3) Ì . El acto de diseñar un algoritmo puede considerarse como una tarea que difícilmente podrá ser del todo . . Los logaritmos son del mismo orden. Relación de orden: igual que antes. d Î R+. llamamos orden exacto de f al conjunto de todas las funciones de N en R+ que crecen igual que f. $ n0 Î N. 5.. +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. asintóticamente y salvo constantes. O(p) Ì O(q). siendo c y d constantes positivas. n/4. 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(c) Ì O(n) O(cn + b) = O(dn + e) O(p) = O(q).. W (f)= { t: N ® R+ / $ c Î R+. å i = n(n+1)/2 Î O(n2).. " n ³ n0: t(n) ³ c·f(n) } La notación omega se usa para establecer cotas inferiores del tiempo de ejecución.001. otra para n/2...

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

En estos casos. poco reflexionada. y solo se podía usar cuando el vector estuviese ordenado. pero que debe evitarse siempre que se pueda. En realidad. Otro algoritmo realizaba un búsqueda dicotomica o binaria. 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. 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 . Esta es la solución de fuerza bruta: una solución directa. si no mas bien calificativo Para una forma de diseñar algoritmos: tomar una solución directa. Un modo de evitar problema lo proporciona la técnica de los parámetros acumuladores. Parámetros Acumuladores Veamos primero una solución ineficiente que intentaremos mejorar. dad su ineficacia. dichos algoritmos pueden servir como una primera aproximación al algoritmo definitivo. en combinación con otras contrucciones. por lo que uno puede sentirse tentado a usar siempre. Técnicas de los Parámetros Acumuladores y de Tabulacion La recurcion es un mecanismo que permite obtener. la fuerza bruta. pero debe mejorar su rendimiento para que sea práctico. El algoritmo primero responde a un razonamiento más sencillo. Método de fuerza bruta Comenzamos el estudio de esquemas algorítmicos con un método sencillo. La función principal usa una función auxiliar que tiene los parámetros de aquellas más algunos adicionales. aprovechar esta circunstancia para usar el algoritmo más eficiente: el de búsqueda binaria. pero dado que no se ha analizado apenas el problema. pero poco reflexionada. 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. Cada una se ilustra con un ejemplo distinto. pero muy ineficientes. 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. . es muy probable que no se hayan aprovechado propiedades deducibles del problema y que la solución sea terriblemente ineficiente. sobre todo. esto no es malo. Muchos algoritmos recursivos resultan eficientes. con la experiencia. no es un esquema algorítmico. En principio. con complejidad logarítmica. pero no todos: hay algunos fácilmente formulables. Los parámetros adicionales tienen como misión ir acumulando resultados principales durante el proceso recursivo. Lo más razonable es comprobar si el vector esta ordenado y. Uno de ellos realizaba una búsqueda secuencial con complejidad lineal sobre el tamaño del vector y podía usarse con cualquier vector.completarse con otros conocimientos y. cuya idea básica se expone a continuación. una solución funcional a muchos problemas. Una solución por fuerza bruta también puede resultar adecuada como primera aproximación a la solución final. Por ejemplos: Algunos algoritmos de búsqueda de un elemento en un vector.

Para ello. en la búsqueda de caminos mínimos sobre grafos. Método voraz: Este método trata de producir tipo de mejor resultado a partir de conjunto de opciones candidatas . se trata de dar como cambio la menor cantidad posible usando estos tipos de monedas. si es posterior. Divide y vencerás: Consiste en descomponer un problema en un subproblema. y así sucesivamente.etc. El procedimiento se repite sucesivamente hasta encontrar la palabra o decidir que no aparece. Esta técnica también se suele emplear con la programación dinámica. Ejemplo: Sea el problema de la competición. siendo ( n ) mayor que( 0 ). 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. se almacena en una tabla. 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. como el conocido de la mochila. resolver independientemente los subproblemas para luego combinar sus soluciones y obtener la solución del problema original. Si no ha encontrado y es anterior se procede a buscarla en la primera mitad. De forma que cada uno tiene un 50% de posibilidades de ganar cada partido. donde puede consultarse otras veces que se necesite.B. De todas formas. A. La intención es que la primera vez que se realiza un cálculo. cuando se pueda.Tabulacion No todos los algoritmos recursivos ineficientes pueden optimizarse con la técnica de los parámetros acumuladores. mientras el valor de dicha moneda sea mayor o igual al cambio que resta por dar). continua aplicándose el mismo criterio para la segunda moneda mas valiosa. Por sencillez . 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. Ejemplo. en una maquina expendedora de tabaco). Suponiendo que se disponga de cantidad suficiente de ciertos tipos diferentes de monedas de curso legal. Otra técnica útil es el uso de tablas. 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. . Hay dos participantes (deportistas o equipos. 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. El proceso finaliza cuando se ha devuelto todo el cambio. que juegan una competición que es ganada por el primero que venza en n partidos. Esta técnica se puede aplicar con éxito a problemas como la multiplicación de matrices. la planificación en el orden de la ejecución de unos programas en un computador. Puede emplearse en problemas de optimización. la búsqueda en estructuras ordenadas. la modificación para incorporar probabilidades diferentes es evidente y no complica el problema. la moneda de mayor valor ( es decir. La estrategia voraz aplicada comienza devolviendo. la ordenación de vectores.etc. se buscara en la segunda mitad. Ejemplo. no importa que). se supone que ambos participantes tienen cualidades y preparación similar ..

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

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

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

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

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

N-1) -> VAR ¦ . 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.. Sin embargo.N)1. OUT tabla : (1. por ejemplo.. para k>1. Este proceso se repite para el resto de los participantes de numeración inferior.2n .... ya que a unión de los dos calendarios tiene un tamaño 2k x(2k-1 -1). Si el numero de participantes es 2k . PROCEDURE Calendario ( INOUT tabla : (1. la unión de estos subcalendarios no forma un calendario completo para el campeonato de 2k participantes. Por fortuna. es más complejo. superior en orden creciente de numeración.N-1) -> PROCEDURE FormaTabla (IN inf : 1. El caso recursivo.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. rotando dicha secuencia a la derecha. es decir. El algoritmo descrito se expresa a continuación. IN sup :1. Completemos primero la parte de los participantes de numeración inferior.. faltando 2k x2k-1 celdas para completar el calendario total. El subcalendario del primer participante es sencillo porque basta con que compita en días sucesivos con los participantes de numeración. de numeración comprendida entre 1 y 2k-1 y otro para los participantes comprendidos entre 2k-1 +1 y 2k .N. . En efecto. La solución es directa porque se celebra una sola competición entre ambos.. 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.1. 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 resto del calendario se puede construir fácilmente.N) 1. cuando hay más de dos participantes. 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..N..N. El caso básico se da cuando solo hay dos participantes.1. faltan por elaborar las competiciones cruzadas entre los participantes de numeración inferior y los de numeración superior.

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

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

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

puede generalizarse la formulación del problema a cualquier subsecuencia de decisiones dk . Usando una técnica de fuerza bruta. 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. a tomar. una secuencia óptima de decisiones respecto a E0 es la mejor secuencias de decisión { Vli Sli }. Sea D = { v1 .) Una solución dinámica para problema ( k. sencillamente.Xn la secuencia de decisiones necesaria para resolver el problema. Tiene sentido centrarse en un subproblema del problema inicial porque éste satisface el principio de optimalidad pero. 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). Podemos formalizar algo más la idea básica. Supongamos que tenemos un problema que satisface el principio de optimalidad. si este subproblema de simboliza como problema (k. resultará un total de d secuencias posibles de decisión.. a partir de la recurrentes con formulación trasera es igual que e la formulación delantera. De esta forma se reduce al número total de subsecuencias generadas. hay un caso en que la decisión d1 no va seguida por ninguna secuencia de decisiones. 1<i<n. 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.. La formulación trasera expresa la decisión de Xi.dl. 1<i<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 .propiedad de que cualquier subsecuencia de decisiones también debe ser óptima respecto al subproblema que resuelva ". del gusto del programador. asimismo.n ). además. 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. 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. 1<k<n. porque si hay d opciones para cada una de las n decisiones.1 ) resultante de aplicar cada valor de decisión. a partir de la secuencia de decisiones Xi+1 Xn ( es la clase de formulación adoptada hasta ahora ).vn} el conjunto de valores de decisión posibles para la decisión d1. Entonces. entonces el problema completo es problema ( l. El razonamiento anterior se refiere a la primera decisión d1 tomada desde el estado inicial E0 sin embargo. partiendo como estado inicial de Ek-1. La expresión inicial de la ecuación de recurrencia. 1<i<n.. el número de secuencias de decisión es exponencial sobre el número de decisiones. 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.l). En resumen. que es problema ( n. tal que Eo es el estado inicial del problema y deben tomarse n decisiones d. 1<i<n . La formulación delantera expresa la decisión de Xl . La ecuación de recurrencia puede formularse de dos formas: delantera o trasera. 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. sólo que en orden contrario. la ecuación de base establece el valor para la etapa n+1 en que no queda ninguna decisión Xi.1 ) debe expresarse en términos de los valores de decisión existente para decisiones d1 y el subproblema problema ( k+1.. Además. La elección de una formulación delantera o trasera depende del problema considerado o. sea. 1<i<N1.n ).

. solucion).. Este mismo proceso se repite en el resto de nodos del árbol.. k-1) DO Solucion k := nodo. pues tenemos ya una solucion mayor. 1... En algunos problemas de optimización se conoce un criterio óptimo de selección que puede usarse de forma voraz.n) -> VAR nodo : elemento FOR noso IN G(solucion. 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... 1. Así.. En este punto podemos retroceder (y no seguir avanzando por mas ramas). El Algoritmo de Vuelta Atrás se especifica de la forma siguiente: PROCEDURE Retroceso (IN k : INTEGER. todavía hay otros problemas peores que no queda mas remedio que realizar una búsqueda de la solución. Retroceso (k+1. Supongamos que existe algún predicado acotador A tal que A(x1.... Por lo tanto. se comprueba si se ha encontrado una solucion.. Supongamos que también existe algún predicado R que determina si un camino (x1.. pudiéndose aplicar la técnica de programación dinámica. 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..k) THEN << guardar µsolucion¶ >>. Sea G(x1.n son aquellos valores generados por G que satisfacen A.xi+1) no puede extenderse para alcanzar un nodo de respuesta..xi+1) es falso si el camino (xi.. evitando así la exploración de gran parte de al estructura.. INOUT solucion : elemento1. Por supuesto. los candidatos para la posición i+1 del vector desolucion x1. 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..cada solución es el resultado de una secuencia de decisiones.xi) el camino desde la raíz hasta un nodo de un árbol del espacio de estado... . k) THEN IF R(solucion.. 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. Sin embargo. k sirve de cota inferior al retroceso. solucion) La llamada inicial del algoritmo es Retroceso(1.xi+1) es un camino hasta el estado del problema.. Después simplemente se llama recursivamente al algoritmo para generar los estados descendientes. 1. 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). Otros problemas satisfacen el principio de optimalidad.. Se sale del bucle FOR cuando no quedan mas valores para solución terminando la llamada actual al algoritmo..xi) el conjunto de todos los valores posibles de xi+1 tales que (x1. Esquema de Algoritmos de Vuelta Atrás: Sea (x1. Algoritmos Heuristicos Existen muchos problemas para los cuales no se conocen algoritmos que puedan encontrar la solución de forma eficiente: problemas NP-completos.. IF R(solucion.xi+1) termina en un nodo de respuesta.

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

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

Sign up to vote on this title
UsefulNot useful