Manual de Analisis y Diseño de Algoritmos V 1.0

download Manual de Analisis y Diseño de Algoritmos V 1.0

of 127

Transcript of Manual de Analisis y Diseño de Algoritmos V 1.0

  • 8/7/2019 Manual de Analisis y Diseo de Algoritmos V 1.0

    1/127

    MMAANNUUAALL DDEE AANNLLIISSIISS YY DDIISSEEOODDEE AALLGGOORRIITTMMOOSS

    VVeerrssiinn 11..00

    DDiirreecccciinn ddee rreeaa IInnffoorrmmttiiccaawwwwww .. iinnffoorrmmaattiiccaa..iinnaaccaapp..ccll

  • 8/7/2019 Manual de Analisis y Diseo de Algoritmos V 1.0

    2/127

    Pgina 1

    Colaboraron en el presente manual:

    Vctor Valenzuela Ruz

    [email protected]

    Ingeniera en Gestin InformticaINACAP Copiap

  • 8/7/2019 Manual de Analisis y Diseo de Algoritmos V 1.0

    3/127

    Pgina 2

    Copyright 2003 de Instituto Nacional de Capacitacin. Todos los derechos reservados. Copiap, Chile.

    Este documento puede ser distribuido libre y gratuitamente bajo cualquier soporte siempre ycuando se respete su integridad.

    Queda prohibida su venta y reproduccin sin permiso expreso del autor.

  • 8/7/2019 Manual de Analisis y Diseo de Algoritmos V 1.0

    4/127

    Pgina 3

    PPrr ee ffaacciioo

    "Lo que debemos aprender a hacer lo aprendemos hacindolo".

    Aristteles, Ethica Nicomachea II (325 A.C.)

    El presente documento ha sido elaborado originalmente como apoyo a laasignatura de Anlisis y Diseo de Algoritmos del sptimo semestre de lacarrera de Ingeniera en Gestin Informtica, del Instituto Nacional deCapacitacin (INACAP). Este documento engloba la mayor parte de la materiade este curso troncal e incluye ejemplos resueltos y algunos ejercicios que serndesarrollados en clases.

    El manual ha sido concebido para ser ledo en forma secuencial, pero tambinpara ser de fcil consulta para verificar algn tema especfico.

    No se pretende que estos apuntes sustituyan a la bibliografa de la asignatura nia las clases tericas, sino que sirvan ms bien como complemento a las notas

    que el alumno debe tomar en clases. Asimismo, no debe considerarse undocumento definitivo y exento de errores, si bien ha sido elaborado condetenimiento y revisado exhaustivamente.

    El autor pretende que sea mejorado, actualizado y ampliado con ciertafrecuencia, lo que probablemente desembocar en sucesivas versiones, y paraello nadie mejor que los propios lectores para plantear dudas, buscar errores ysugerir mejoras.

    El Autor.

    Copiap, Enero 2003

  • 8/7/2019 Manual de Analisis y Diseo de Algoritmos V 1.0

    5/127

    Pgina 4

    nn dd iicc ee GGeenn eerr aallPgina

    Presentacin 7

    1 . Introduccin1.1. Motivacin y Objetivos 81.2. Algunas Notas sobre la Historia de los Algoritmos 101.3. Fundamentos Matemticos 11

    2.Algoritmos y Problem as2.1. Definicin de Algoritmo 182.2. Formulacin y Resolucin de Problemas 192.3. Razones para Estudiar los Algoritmos 222.4. Formas de Representacin de Algoritmos 232.5. La Mquina de Turing 24

    3.Eficiencia de Algoritmos3.1. Introduccin 253.2. Concepto de Eficiencia 253.3. Medidas de Eficiencia 263.4. AnlisisA Priori y PruebaA Posteriori 27

    3.5. Concepto de Instancia 273.6. Tamao de los Datos 283.7. Clculo de Costos de Algoritmos

    3.7.1. Clculo de eficiencia en anlisis iterativo 293.7.2. Clculo de eficiencia en anlisis recursivo 29

    3.8. Principio de Invarianza 313.9. Anlisis Peor Caso, Mejor Caso y Caso Promedio 31

    4. Anlisis de Algoritm os4.1. Introduccin 34

    4.2. Tiempos de Ejecucin 344.3. Concepto de Complejidad 364.4. rdenes de Complejidad 374.5. Notacin Asinttica

    4.5.1. La O Mayscula 394.5.2. La o Minscula 394.5.3. Diferencias entre O yo 424.5.4. Las Notaciones y 424.5.5. Propiedades y Cotas ms Usuales 42

    4.6. Ecuaciones de Recurrencias4.6.1. Introduccin 454.6.2. Resolucin de Recurrecias 45

  • 8/7/2019 Manual de Analisis y Diseo de Algoritmos V 1.0

    6/127

    Pgina 5

    4.6.3. Mtodo del Teorema Maestro 454.6.4. Mtodo de la Ecuacin Caracterstica 464.6.5. Cambio de Variable 48

    4.7. Ejemplos y Ejercicios 49

    5. Estrategias de Diseo de Algoritmos5.1. Introduccin 515.2. Recursin 515.3. Dividir para Conquistar 555.4. Programacin Dinmica 575.5. Algoritmos vidos 5.6. Mtodo de Retroceso (backtracking) 605.7. Mtodo Branch and Bound 61

    6. Algoritmos de Or denamiento6.1. Concepto de Ordenamiento 636.2. Ordenamiento por Insercin 636.3. Ordenamiento por Seleccin 646.4. Ordenamiento de la Burbuja (Bublesort) 656.5. Ordenamiento Rpido (Quicksort) 656.6. Ordenamiento por Montculo (Heapsort) 686.7. Otros Mtodos de Ordenamiento

    6.7.1. Ordenamiento por Incrementos Decrecientes 746.7.2. Ordenamiento por Mezclas Sucesivas 75

    7.Algoritmos de Bsqu eda7.1. Introduccin 787.2. Bsqueda Lineal 787.3. Bsqueda Binaria 807.4. rboles de Bsqueda 817.5. Bsqueda por Transformacin de Claves (Hashing) 817.6. Bsqueda en Textos

    7.6.1. Algoritmo de Fuerza Bruta 887.6.2. Algoritmo de Knuth-Morris-Pratt 887.6.3. Algoritmo de Boyer-Moore 92

    8. Teora de Grafos8.1. Definiciones Bsicas 978.2. Representaciones de Grafos

    8.2.1. Matriz y Lista de Adyacencia 1018.2.2. Matriz y Lista de Incidencia 103

    8.3. Recorridos de Grafos8.3.1. Recorridos en Amplitud 1048.3.2. Recorridos en Profundidad 106

    8.4. Grafos con Pesos 1088.5. rboles

  • 8/7/2019 Manual de Analisis y Diseo de Algoritmos V 1.0

    7/127

    Pgina 6

    8.6. rbol Cobertor Mnimo8.6.1. Algoritmo de Kruskal 1098.6.2. Algoritmo de Prim 111

    8.7. Distancias Mnimas en un Grafo Dirigido8.7.1. Algoritmo de Dijkstra 1138.7.2. Algoritmo de Ford 1148.7.3. Algoritmo de Floyd-Warshall 115

    9. Complejidad Computacional9.1. Introduccin 1189.2. Algoritmos y Complejidad 1189.3. Problemas NP Completos 1189.4. Problemas Intratables 1219.5. Problemas de Decisin 123

    9.6. Algoritmos No Determinsticos 124

    Bibliografa 126

  • 8/7/2019 Manual de Analisis y Diseo de Algoritmos V 1.0

    8/127

    Pgina 7

    Presentacin

    El curso de Anlisis y Diseo de Algoritmos (ADA) tiene como propsitofundamental proporcionar al estudiante las estructuras y tcnicas de manejo dedatos ms usuales y los criterios que le permitan decidir, ante un problemadeterminado, cul es la estructura y los algoritmos ptimos para manipular losdatos.

    El curso est diseado para proporcionar al alumno la madurez y losconocimientos necesarios para enfrentar, tanto una gran variedad de losproblemas que se le presentarn en su vida profesional futura, como aquellos quese le presentarn en los cursos ms avanzados.

    El temario gira en torno a dos temas principales: estructuras de datos y anlisis dealgoritmos. Haciendo nfasis en la abstraccin, se presentan las estructuras dedatos ms usuales (tanto en el sentido de tiles como en el de comunes), susdefiniciones, sus especificaciones como tipos de datos abstractos (TDA's), suimplantacin, anlisis de su complejidad en tiempo y espacio y finalmente algunasde sus aplicaciones. Se presentan tambin algunos algoritmos de ordenacin, debsqueda, de recorridos en grficas y para resolver problemas mediante recursin y retroceso mnimo analizando tambin su complejidad, lo que constituye unaprimera experiencia del alumno con el anlisis de algoritmos y le proporcionarherramientas y madurez que le sern tiles el resto de su carrera.

    Hay que enfatizar que el curso no es un curso de programacin avanzada, suobjetivo es preparar al estudiante brindndole una visin amplia de lasherramientas y mtodos ms usuales para la solucin de problemas y el anlisis dela eficiencia de dichas soluciones. Al terminar el curso el alumno poseer unnutrido "arsenal" de conocimientos de los que puede echar mano cuando lorequiera en su futura vida acadmica y profesional. Sin embargo, dadas estascaractersticas del curso, marca generalmente la frontera entre un programadorprincipiante y uno maduro, capaz de analizar, entender y programar sistemas desoftware ms o menos complejos.

    Para realizar las implantaciones de las distintas estructuras de datos y de los

    algoritmos que se presentan en el curso se har uso del lenguaje de programacinMODULA- 2, C++ y Java.

  • 8/7/2019 Manual de Analisis y Diseo de Algoritmos V 1.0

    9/127

    Pgina 8

    Captulo 1

    Introduccin

    1.1 Motivacin y Objetivos

    La representacin de informacin es fundamental para las Ciencias de laComputacin.

    La Ciencia de la Computacin (Computer Science), es mucho ms que el

    estudio de cmo usar o programar las computadoras. Se ocupa dealgoritmos, mtodos de calcular resultados y mquinas autmatas.

    Antes de las computadoras, exista la computacin, que se refiere al uso demtodos sistemticos para encontrar soluciones a problemas algebraicos osimblicos.

    Los babilonios, egipcios y griegos, desarrollaron una gran variedad demtodos para calcular cosas, por ejemplo el rea de un crculo o cmocalcular el mximo comn divisor de dos nmeros enteros (teorema deEuclides).

    En el siglo XIX, Charles Babbage describi una mquina que poda liberar alos hombres del tedio de los clculos y al mismo tiempo realizar clculosconfiables.

    La motivacin principal de la computacin por muchos aos fue la dedesarrollar cmputo numrico ms preciso. La Ciencia de la Computacincreci del inters en sistemas formales para razonar y la mecanizacin de lalgica, as cmo tambin del procesamiento de datos de negocios. Sinembargo, el verdadero impacto de la computacin vino de la habilidad de lascomputadoras de representar, almacenar y transformar la informacin.

    La computacin ha creado muchas nuevas reas como las de correoelectrnico, publicacin electrnica y multimedia.

    La solucin de problemas del mundo real, ha requerido estudiar ms decerca cmo se realiza la computacin. Este estudio ha ampliado la gama deproblemas que pueden ser resueltos.

    Por otro lado, la construccin de algoritmos es una habilidad elegante de ungran significado prctico. Computadoras ms poderosas no disminuyen elsignificado de algoritmos veloces. En la mayora de las aplicaciones no es elhardware el cuello de botella sino ms bien el software inefectivo.

  • 8/7/2019 Manual de Analisis y Diseo de Algoritmos V 1.0

    10/127

    Pgina 9

    Este curso trata de tres preguntas centrales que aparecen cuando uno quiereque un computador haga algo: Es posible hacerlo? Cmo se hace? y Cunrpido puede hacerse? El curso da conocimientos y mtodos para responderestas preguntas, al mismo tiempo intenta aumentar la capacidad deencontrar algoritmos efectivos. Los problemas para resolver, son unentrenamiento en la solucin algortmica de problemas, y para estimular elaprendizaje de la materia.

    Objetivos Gener ales:

    1. Introducir al alumno en el anlisis de complejidad de los algoritmos,as como en el diseo e implementacin de stos con las tcnicas ymtodos ms usados.

    2. Desarrollar habilidades en el uso de las tcnicas de anlisis y diseode algoritmos computacionales.

    3. Analizar la eficiencia de diversos algoritmos para resolver unavariedad de problemas, principalmente no numricos.

    4. Ensear al alumno a disear y analizar nuevos algoritmos.

    5. Reconocer y clasificar los problemas de complejidad polinmica y nopolinmica.

    Metas del curso :

    Al finalizar este curso, el estudiante debe estar capacitado para:

    analizar, disear e implementar algoritmos iterativos y recursivoscorrectos.

    medir la eficiencia de algoritmos iterativos y recursivos, y de tipos oclases de datos orientados por objetos.

    utilizar la tcnica de diseo de algoritmos ms adecuada para una

    aplicacin en particular. definir la aplicabilidad de las diferentes tcnicas de bsqueda y

    ordenamiento, del procesamiento de cadenas de caracteres, de losmtodos geomtricos, del uso de los algoritmos de grafos, de losalgoritmos paralelos y de los algoritmos de complejidad nopolinmica.

    diferenciar entre los algoritmos de complejidad polinmica y nopolinmica.

  • 8/7/2019 Manual de Analisis y Diseo de Algoritmos V 1.0

    11/127

    Pgina 10

    1.2 Algunas Notas sobre la Historia de los Algoritmos

    El trmino proviene del matemtico rabe Al'Khwarizmi, que escribi untratado sobre los nmeros. Este texto se perdi, pero su versin latina,Algoritmi de Numero Indorum, s se conoce.

    El trabajo deAl'Khwarizmi permiti preservar y difundir el conocimiento delos griegos (con la notable excepcin del trabajo de Diofanto) e indios,pilares de nuestra civilizacin. Rescat de los griegos la rigurosidad y de losindios la simplicidad (en vez de una larga demostracin, usar un diagramajunto a la palabra Mira). Sus libros son intuitivos y prcticos y su principalcontribucin fue simplificar las matemticas a un nivel entendible por noexpertos. En particular muestran las ventajas de usar el sistema decimalindio, un atrevimiento para su poca, dado lo tradicional de la cultura rabe.

    La exposicin clara de cmo calcular de una manera sistemtica a travs dealgoritmos diseados para ser usados con algn tipo de dispositivo mecnicosimilar a un baco, ms que con lpiz y papel, muestra la intuicin y el poderde abstraccin de Al'Khwarizmi. Hasta se preocupaba de reducir el nmerode operaciones necesarias en cada clculo. Por esta razn, aunque no hayasido l el inventor del primer algoritmo, merece que este concepto estasociado a su nombre.

    Los babilonios que habitaron en la antigua Mesopotania, empleaban unaspequeas bolas hechas de semillas o pequeas piedras, a manera de

    "cuentas" y que eran agrupadas en carriles de caa. Ms an, en 1.800 A.C.un matemtico babilnico invent los algoritmos que le permitieron resolverproblemas de clculo numrico.

    En 1850 A.C., un algoritmo de multiplicacin similar al de expansin binariaes usado por los egipcios.

    La teora de las ciencias de la computacin trata cualquier objetocomputacional para el cual se puede crear un buen modelo. La investigacinen modelos formales de computacin se inici en los 30's y 40's por Turing,Post, Kleene, Church y otros. En los 50's y 60's los lenguajes de

    programacin, compiladores y sistemas operativos estaban en desarrollo,por lo tanto, se convirtieron tanto en el sujeto como la base para la mayoradel trabajo terico.

    El poder de las computadoras en este perodo estaba limitado porprocesadores lentos y por pequeas cantidades de memoria. As, sedesarrollaron teoras (modelos, algoritmos y anlisis) para hacer un usoeficiente de ellas. Esto dio origen al desarrollo del rea que ahora se conocecomo "Algoritmos y Estructuras de Datos". Al mismo tiempo se hicieronestudios para comprender la complejidad inherente en la solucin dealgunos problemas. Esto di origen a lo que se conoce como la jerarqua deproblemas computacionales y al rea de "Complejidad Computacional".

  • 8/7/2019 Manual de Analisis y Diseo de Algoritmos V 1.0

    12/127

    Pgina 11

    1.3 Fundamentos Matemticos

    Monotonicidad

    Una funcin fes montona si es creciente o decreciente. Es c r e c i e n t e sirige la implicacin siguiente:

    n0, n1 : (n1 = n2) f(n1) = f(n2 )

    Es decrec i en t e si rige la implicacin siguiente:

    n0, n1 : (n1 = n2) f(n1) = f(n2 )

    Una funcin f(n) es monotnicamente creciente si m n implica quef(m) f(n). Similarmente, es mono tnicamente decr eciente si m nimplica que f(m) f(n). Una funcin f(n) es estrictamente creciente sim < n implica que f(m) < f(n) y estrictamente decreciente si m < nimplica que f(m) > f(n).

    Conjuntos

    Un conjunto es una coleccin de miembros o elementos distinguibles. Losmiembros se toman tpicamente de alguna poblacin ms grande conocidacomo tipo base . Cada miembro del conjunto es un elemento primitivodel tipo base o es un conjunto. No hay concepto de duplicacin en unconjunto.

    Un orden lineal tiene las siguientes propiedades:

    Para cualesquier elemento a yb en el conjunto S , exactamente uno dea b es verdadero.

    Para todos los elementos a, b y c en el conjunto S , si a < b, yb < c,entonces a < c. Esto es conocido como la propiedad detransitividad .

    Permutacin

    Una permutacin de una secuencia es simplemente los elementos de lasecuencia arreglados en cualquier orden. Si la secuencia contiene nelementos, existe n! permutaciones.

  • 8/7/2019 Manual de Analisis y Diseo de Algoritmos V 1.0

    13/127

    Pgina 12

    Funciones Piso y Techo

    Piso ( f loor) ytecho (cei l ing ) de un nmero real x. Son respectivamenteel mayor entero menor o igual que x, y el menor entero mayor o igual a x.

    Para cualquier nmero real x, denotamos al mayor entero, menor que o iguala x como f loor(x), y al menor entero, mayor que o igual a x comocei l ing (x); (floor=piso, ceiling=techo). Para toda x real,

    x - 1 < f loor(x) x ce i l ing (x) < x + 1

    Para cualquier entero n,

    ce i l ing (x/2) + floor(x/2) = n,

    y para cualquier entero n y enteros a 0 yb0,

    ce i l ing (ce i l ing (n/a)/b) = ce i l i ng(n/ab) yfloor( f loor(n/a)/b) = f loor(n/ab).

    Las funciones f loorycei l ing son montonas crecientes.

    Operador mdulo

    Esta funcin regresa el residuo de una divisin entera. Generalmente seescribe n m o d m, y el resultado es el entero r, tal que n= qm+r para q unentero y/0 menor o igual que r yr < m.

    Por ejemplo: 5 mod 3 = 2 y 25 mod 3 = 1

    Polinomios

    Dado un entero positivo d, un polinomio en n de grado d es una funcinp(n) de la forma:

    p(n) = d*a inii=0

    donde las constantes a0 , a1 ,..., ad son los coeficientes del polinimio yad 0. Un polinomio es asintticame nte p ositivo si y slo si ad > 0. Para unpolinomio asintticamente positivo p(n) de grado d, tenemos que p(n) =O(nd). Para cualquier constante real a 0, la funcin na es montonacreciente, y para cualquier constante real a 0, la funcin na es montonadecreciente. Decimos que una funcin f(n) es polinomialmente acotada si f(n) = nO(1 ), que es equivalente en decir que f(n) = O(nk) para alguna

    constante k.

  • 8/7/2019 Manual de Analisis y Diseo de Algoritmos V 1.0

    14/127

    Pgina 13

    Exponenciales

    Para toda a 0, m yn, tenemos las siguientes identidades:

    a = 1a = aa(-1) = 1/a(a m) n = a m n(a m) n = (a n) ma ma n = a m + n

    Para todo n ya ,1

    lim n nb/an = 0

    de lo que concluimos que nb=o (an).

    Entonces, cualquier funcin exponencial positiva crece ms rpido quecualquier polinomio.

    i= 0

    e xp(x) = x i /(i!)

    Logaritmos

    Un logaritmo de base b para el valor y, es la potencia al cual debe elevarseb para obtener y. Logb y = x bx =y.

    Usos para los logaritmos:

    Cul es el nmero mnimo de bits necesarios para codificar unacoleccin de objetos? La respuesta es techo(log2 n).

    Por ejemplo, si se necesitan 1000 cdigos que almacenar, serequerirn al menos techo(log2 1000) = 10 bits para tener 1000cdigos distintos. De hecho con 10 bits hay 1024 cdigos distintosdisponibles.

    Anlisis de algoritmos que trabajan rompiendo un problema ensubproblemas ms pequeos. Por ejemplo, la bsqueda binaria de un valor dado en una lista ordenada por valor. Cuntas veces puedeuna lista de tamao n ser divida a la mitad hasta que un sloelemento quede en la lista final? La respuesta es log2 n.

  • 8/7/2019 Manual de Analisis y Diseo de Algoritmos V 1.0

    15/127

    Pgina 14

    Los logaritmos tienen las siguientes propiedades:

    log nm = log n + log m log n/m = log n log m log nr = r log n loga n = logb n/ logb a (para a yb enteros)

    Esta ltima propiedad dice que el logaritmo de n en distintas bases, estrelacionado por una constante (que es logaritmo de una base en la otra). Asque anlisis de complejidad que se hacen en una base de logaritmos, puedenfcilmente traducirse en otra, simplemente con un factor deproporcionalidad.

    Factoriales

    La notacin n! se define para los enteros n 0 como:

    1 si n=0n! =

    n(n-1)! si n>0

    Entonces, n!=1 234 n.

    Una cota superior dbil de la funcin factorial es n! nn, pues cada uno delos n trminos en el producto factorial es a lo ms n. La aproximacin deS t i r l i ng , proporciona una cota superior ajustada, y tambin una cotainferior:

    n! = sqrt{2pn} (n/e)n (1 + Q(1/n))

    donde e es la base del logaritmo natural. Usando la aproximacin deStirling, podemos demostrar que:

    n! = o (nn)n! = (2n)lg(n!) = Q(n lgn)

    Nmeros de F i bonacc i

    Los nmeros de Fibonacc i se definen por la siguiente recurrencia:

    F0 = 0F1 = 1

    Fi = Fi-1 + Fi-2 para i 2

  • 8/7/2019 Manual de Analisis y Diseo de Algoritmos V 1.0

    16/127

    Pgina 15

    Entonces cada nmero de Fibonacci es la suma de los nmeros previos,produciendo la sucesin:

    0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, ...

    Recursin

    Un algoritmo es recursivo si se llama a s mismo para hacer parte deltrabajo. Para que este enfoque sea exitoso, la llamada debe ser en unproblema menor que al originalmente intentado.

    En general, un algoritmo recursivo tiene dos partes:

    El caso base, que maneja una entrada simple que puede ser resueltasin una llamada recursiva

    La parte recursiva , que contiene una o ms llamadas recursivas alalgoritmo, donde los parmetros estn en un sentido ms cercano alcaso base, que la llamada original.

    Ejemplos de aplicacin: clculo del factorial, torres de Hanoi y funcin deAckermann.

    Sumatorias y recurrencias

    Las sumatorias se usan mucho para el anlisis de la complejidad deprogramas, en especial de ciclos, ya que realizan conteos de operacionescada vez que se entra al ciclo.

    Cuando se conoce una ecuacin que calcula el resultado de una sumatoria,se dice que esta ecuacin representa una solucin en form a cerrada .

    Ejemplos de soluciones en forma cerrada:

    i = n(n+1)/2 I 2 = (2n 3 +3n 2 + n)/6 1 log n n = nlog n a i = 1/(1-a)

    El tiempo de ejecucin para un algoritmo recursivo est ms fcilmenteexpresado por una expresin recursiva.

    Una relacin de recurr encia define una funcin mediante una expresin

    que incluye una o ms instancias (ms pequeas) de si misma. Por ejemplo:

  • 8/7/2019 Manual de Analisis y Diseo de Algoritmos V 1.0

    17/127

    Pgina 16

    n! = (n-1)! n , 1! = 0! = 1

    La secuencia de Fibonacci:

    Fib(n)=Fib(n-1)+Fib(n-2); Fib(1)=Fib(2)=1

    1,1,2,3,5,8,13,...

    Tcnicas de Demostracin Matemtica

    Prueba por contradiccin

    Es la forma ms fcil de refutar un teorema o enunciado, es mediante uncontra-ejemplo. Desafortunadamente, no importa el nmero de ejemplosque soporte un teorema, esto no es suficiente para probar que es correcto.

    Para probar un teorema por contradiccin, primero suponemos que elteorema es falso. Luego encontramos una contradiccin lgica que surja deesta suposicin. Si la lgica usada para encontrar la contradiccin escorrecta, entonces la nica forma de resolver la contradiccin es suponer quela suposicin hecha fue incorrecta, esto es, concluir que el teorema debe serverdad.

    Prueba por induccin matemtica

    La induccin matemtica es como recursin y es aplicable a una variedad deproblemas.

    La induccin proporciona una forma til de pensar en diseo de algoritmos,ya que lo estimula a pensar en resolver un problema, construyendo a partirde pequeos subproblemas.

    Sea T un teorema a probar, y expresemos T en trminos de un parmetroentero positivo n. La induccin matemtica expresa que T es verdad para

    cualquier valor de n, si las siguientes condiciones se cumplen:

    Caso base. T es verdad para n = 1

    Paso inductivo. Si T es verdad para n-1 , => T es verdad para n.

    Ejemplo de demostracin del teorema:

    La suma de los primeros n nmeros enteros es n(n+1)/2.

  • 8/7/2019 Manual de Analisis y Diseo de Algoritmos V 1.0

    18/127

    Pgina 17

    Estimacin

    Consiste en hacer estimaciones rpidas para resolver un problema. Puedeformalizarse en tres pasos:

    Determine los parmetros principales que afectan el problema. Derive una ecuacin que relacione los parmetros al problema. Seleccione valores para los parmetros, y aplique la ecuacin para

    obtener una solucin estimada.

    Ejemplo: Cuntos libreros se necesitan para guardar libros que contienenen total un milln de pginas?

    Se estiman que 500 pginas de un libro requieren cerca de una pulgada en larepisa del librero, con lo cual da 2000 pulgadas de repisa. Lo cual da 167pies de repisa (aprox. 200 pies). Si una repisa es alrededor de 4 pies deancho, entonces se necesitan 50 repisas. Si un librero contiene 5 repisas,entonces se necesitan 10 libreros.

  • 8/7/2019 Manual de Analisis y Diseo de Algoritmos V 1.0

    19/127

    Pgina 18

    Captulo 2

    Algor itm os y Problemas

    2.1 Definicin de Algoritmo

    El concepto intuitivo de algoritmo, lo tenemos prcticamente todos: Unalgoritmo es una serie finita de pasos para resolver un problema.

    Hay que hacer nfasis en dos aspectos para que un algoritmo exista:

    1 . El nmero de pasos debe ser finito. De esta manera el algoritmo debeterminar en un tiempo finito con la solucin del problema,

    2. El algoritmo debe ser capaz de determinar la solucin del problema.

    De este modo, podemos definir algoritmo como un "conjunto de reglasoperacionales inherentes a un cmputo". Se trata de un mtodo sistemtico,susceptible de ser realizado mecnicamente, para resolver un problemadado.

    Sera un error creer que los algoritmos son exclusivos de la informtica.Tambin son algoritmos los que aprendemos en la escuela para multiplicar ydividir nmeros de varias cifras. De hecho, el algoritmo ms famoso de lahistoria se remonta a la antigedad: se trata del algoritmo de Euclides paracalcular el mximo comn divisor.

    Siempre que se desee resolver un problema hay que plantearse qualgoritmo utilizar. La respuesta a esta cuestin puede depender denumerosos factores, a saber, el tamao del problema, el modo en que estplanteado y el tipo y la potencia del equipo disponible para su resolucin.

    Caractersticas de un algoritmo

    1. Entrada: definir lo que necesita el algoritmo2. Salida : definir lo que produce.3. No ambiguo: explcito, siempre sabe qu comando ejecutar.4. Finito: El algoritmo termina en un nmero finito de pasos.5. Correcto: Hace lo que se supone que debe hacer. La solucin es

    correcta6. Efectividad: Cada instruccin se completa en tiempo finito. Cada

    instruccin debe ser lo suficientemente bsica como para que enprincipio pueda ser ejecutada por cualquier persona usando papel ylpiz.

  • 8/7/2019 Manual de Analisis y Diseo de Algoritmos V 1.0

    20/127

    Pgina 19

    7. General: Debe ser lo suficientemente general como para contemplartodos los casos de entrada.

    As podemos, decir que unA l gor i t m o es un conjunto finito deinstrucciones precisas para resolver un pr oblema .

    Un algoritmo es un mtodo o proceso seguido para resolver un problema.Si el problema es visto como una funcin, entonces el algoritmo toma unaentrada y la transforma en la salida.

    Un problema es una funcin o asociacin de entradas con salidas. Unproblema puede tener muchos algoritmos.

    Por tanto, un algoritmo es un procedimiento para resolver un problemacuyos pasos son concretos y no ambiguos. El algoritmo debe ser correcto, de

    longitud finita y debe terminar para todas las entradas. Un programa esuna instanciacin de un algoritmo en un lenguaje de programacin.

    2.2 Formulacin y Resolucin de Problemas

    Los algoritmos son los procedimientos que se construyen para la resolucinde cualquier problema. De este modo, cuando se refiere a la construccin deun programa, nos estamos refirindo a la construccin de un algoritmo. Elalgoritmo no es un concepto proveniente del campo de la computacin, sinoque es un trmino matemtico.

    Los algoritmos los encontramos, o mejor, los ejecutamos a lo largo denuestras actividades diarias; por ejemplo, cuando hacemos una llamadatelefnica, tenemos en cuenta un conjunto de instrucciones mnimas y elorden en el cual debemos ejecutarlas para conseguir comunicarnos conalguien en particular; o cuando consultamos un diccionario, cuando seprepara un men, etc.

    Podemos conceptuar que un algoritmo es un procedimiento que contiene unconjunto finito de pasos que se deben ejecutar en un orden especfico ylgico, para solucionar los problemas.

    Un algoritmo puede ser caracterizado por una funcin lo cual asocia unasalida: s= f (E) a cada entrada E.

    Se dice entonces que un algoritmo calcula una funcin f. Entonces la entradaes una variable independiente bsica en relacin a la que se producen lassalidas del algoritmo, y tambin los anlisis de tiempo y espacio.

  • 8/7/2019 Manual de Analisis y Diseo de Algoritmos V 1.0

    21/127

    Pgina 20

    Cuando se tiene un problema para el cual debemos especificar un algoritmosolucin, tendremos en cuenta varios puntos:

    o Si no se conoce un mtodo para solucionar el problema en cuestin,debemos hacer un anlisis del mismo para llegar a una solucin,despus de evaluar alternativas, exigencias y excepciones.

    o Si se conoce un "buen" mtodo de solucin al problema, se debeespecificar exacta y completamente el mtodo o procedimiento desolucin en un lenguaje que se pueda interpretar fcilmente.

    o Los problemas pueden agruparse en conjunto de problemas que sonsemejantes.

    o En algn sentido, en general, un mtodo para solucionar todos los

    problemas de un conjunto dado, se considera superior a un mtodopara solucionar solamente un problema del conjunto.

    o Hay criterios para determinar que tan "buena" es una solucin,distintos de ver si trabaja o no, o hasta qu punto es general laaplicabilidad del mtodo. Estos criterios involucran aspectos talescomo: eficiencia, elegancia, velocidad, etc.

    Al definir con exactitud un mtodo de solucin para un problema, este debeestar en capacidad de encontrarla si existe; en caso de que no exista, elmtodo debe reconocer esta situacin y suspender cualquier accin.

    Formular y resolver problemas constituye una actividad esencial de la vida.Los modelos educativos se han dedicado a plantear problemas y ensearcomo solucionarlos. Sin embargo, no se ensea nunca tcnicas de cmoresolver problemas en general.

    La formulacin y resolucin de problemas ha sido preocupacin de lospsiclogos cuando hablan de la inteligencia del hombre. Ellos han concebidoesta capacidad como el concurso de ciertas destrezas mentales relacionadascon lo que ya se ha aprendido y que incluyen:

    o Capacidad de analizar los problemas.o La rapidez y precisin con que acude al pensamiento.o Una organizacin de ideas para garantizar que se posee la

    informacin esencial que asegura el aprendizaje.o Una retencin clara del incremento de conocimiento.

    No se trata de almacenar problemas y sus correspondientes soluciones, sinode desarrollar una capacidad para hacer frente con xito a situacionesnuevas o desconocidas en la vida del hombre. Ante situaciones nuevas, elque no sabe buscar soluciones se sentir confuso y angustiado y entonces nobusca una estrategia y dar una primera solucin para poner punto final a suagona.

  • 8/7/2019 Manual de Analisis y Diseo de Algoritmos V 1.0

    22/127

    Pgina 21

    El que sabe buscar soluciones, selecciona la estrategia que le parece mscercana a la requerida y hace una hbil adaptacin que se ajusta a la nuevademanda.

    Al movernos dentro de la informtica no siempre encontramos losproblemas a punto de resolverlos, es necesario empezar por hacer suformulacin. Se exige hacerlo en trminos concisos y claros partiendo de lasbases o supuestos que se dispone para especificar sus requerimientos.

    Slo a partir de una buena formulacin ser posible disear una estrategiade solucin. Es necesario aprender a desligar estos dos procesos. No sedeben hacer formulaciones pensando paralelamente en posibles soluciones.Es necesario darle consistencia e independencia para determinar conprecisin a qu se quiere dar solucin y luego canalizar una gama de

    alternativas posibles.

    Si ya se ha realizado la formulacin del problema podemos cuestionarla conel fin de entender bien la naturaleza del problema.

    En nuestra rea, el anlisis de un problema tiene dos etapas claramentedefinidas y relacionadas:

    o Formulacin o planteamiento del problema.o Resolucin del problema.

    A su vez, la formulacin la podemos descomponer en tres etapas:

    o Definicin del problema.o Supuestos: aserciones y limitaciones suministradas.o Resultados esperados.

    La fase de planteamiento del problema lo que pretende un algoritmo essintetizar de alguna forma una tarea, clculo o mecanismo antes de sertranscrito al computador. Los pasos que hay que seguir son los siguientes:

    o Anlisis previo del problema.

    o Primera visin del mtodo de resolucin.o Descomposicin en mdulos.o Programacin estructurada.o Bsqueda de soluciones parciales.o Ensamblaje de soluciones finales.

    La fase de resolucin del problema se puede descomponer en tresetapas:

    o Anlisis de alternativas y seleccin de la solucin.o Especificacin detallada del procedimiento solucin.

  • 8/7/2019 Manual de Analisis y Diseo de Algoritmos V 1.0

    23/127

    Pgina 22

    o Adopcin o utilizacin de una herramienta para suimplementacin, si es necesaria.

    Hay que notar que el computador es un medio y no es el fin en la solucin deproblemas.

    En otras palabras, no es el computador el que soluciona los problemas,somos nosotros quienes lo hacemos y de alguna manera le contamos comoes la cosa para que l con su velocidad y exactitud trabaje con grandesvolmenes de datos.

    En el campo de las ciencias de la computacin la solucin de problemas sedescribe mediante el diseo de procedimientos llamados a l g o r it m o s , loscuales posteriormente se implementan como p r o g r a m a s. Los

    p r o g r a m a s son procedimientos que solucionan problemas y que se

    expresan en un lenguaje conocido por el computador.

    Se pueden dar problemas que por su tamao es necesario subdividirlos enproblemas ms simples para solucionarlos, utilizando la filosofa de "Dividirpara conquistar". Se parte del principio de que es ms fcil solucionar variosproblemas simples como partes de un todo que seguir una implantacin de"Todo o Nada". Desarrollar la capacidad de formular y resolver problemasnos prepara para enfrentar situaciones desconocidas.

    2.3 Razones p ara Estudiar los Algoritmos

    Con el logro de computadores cada vez ms rpidos se podra caer en latentacin de preguntarse si vale la pena preocuparse por aumentar laeficiencia de los algoritmos. No sera ms sencillo aguardar a la siguientegeneracin de computadores?. Vamos a demostrar que esto no es as.

    Supongamos que se dispone, para resolver un problema dado, de unalgoritmo que necesita un tiempo exponencial y que, en un ciertocomputador, una implementacin del mismo emplea 10-4 x 2n segundos.Este programa podr resolver un ejemplar de tamao n=10 en una dcimade segundo. Necesitar casi 10 minutos para resolver un ejemplar de tamao

    20. Un da entero no bastar para resolver uno de tamao 30. En un ao declculo ininterrumpido, a duras penas se resolver uno de tamao 38.Imaginemos que necesitamos resolver ejemplares ms grandes ycompramos para ello un computador cien veces ms rpido. El mismoalgoritmo conseguir resolver ahora un ejemplar de tamao n en slo 10-6 2nsegundos. Qu decepcin al constatar que, en un ao, apenas se consigueresolver un ejemplar de tamao 45!

    En general, si en un tiempo dado se poda resolver un ejemplar de tamao n,con el nuevo computador se resolver uno de tamao n+7 en ese mismotiempo.

  • 8/7/2019 Manual de Analisis y Diseo de Algoritmos V 1.0

    24/127

    Pgina 23

    Imaginemos, en cambio, que investigamos en algortmica y encontramos unalgoritmo capaz de resolver el mismo problema en un tiempo cbico. Laimplementacin de este algoritmo en el computador inicial podra necesitar,por ejemplo, 10-2 n3 segundos. Ahora se podra resolver en un da unejemplar de un tamao superior a 200. Un ao permitira alcanzar casi eltamao 1500.

    Por tanto, el nuevo algoritmo no slo permite una aceleracin msespectacular que la compra de un equipo ms rpido, sino que hace dichacompra ms rentable.

    Dado estos argumentos, podemos resumir las siguientes razones parajustificar el estudiar los algoritmos:

    1. Evitar reinventar la rueda.

    Para algunos problemas de programacin ya existen buenos algoritmospara solucionarlos. Para esos algoritmos ya fueron analizadas suspropiedades. Por ejemplo, confianza en su correctitud y eficiencia.

    2. Para ayudar cuando desarrollen sus propios algoritmos.

    No siempre existe un algoritmo desarrollado para resolver un problema.No existe regla general de creacin de algoritmos. Muchos de losprincipios de proyecto de algoritmos ilustrados por algunos de losalgoritmos que estudiaremos son importantes en todos los problemas de

    programacin. El conocimiento de los algoritmos bien definidos proveeuna fuente de ideas que pueden ser aplicadas a nuevos algoritmos.

    3. Ayudar a entender herramientas que usan algoritmos particulares. Porejemplo, herramientas de compresin de datos:

    Packusa Cdigos Huffman. Compress usa LZW. Gzip usa Lempel-Ziv.

    4. til conocer tcnicas empleadas para resolver problemas de

    determinados tipos.

    2.4 Form as de Represen tacin de Algoritmos

    Existen diversas formas de representacin de algoritmos, pero no hay unconsenso con relacin a cul de ellas es mejor.

    Algunas formas de representacin de algoritmos tratan los problemas a unnivel lgico, abstrayndose de detalles de implementacin, muchas vecesrelacionados con un lenguaje de programacin especfico. Por otro lado,

    existen formas de representacin de algoritmos que poseen una mayor

  • 8/7/2019 Manual de Analisis y Diseo de Algoritmos V 1.0

    25/127

    Pgina 24

    riqueza de detalles y muchas veces acaban por oscurecer la idea principal, elalgoritmo, dificultando su entendimiento.

    Dentro de las formas de representacin de algoritmos ms conocidas,sobresalen:

    La descripcin narrativa El Flujograma convencional El diagrama Chapin El pseudocdigo, o tambin conocido como lenguaje estructurado.

    2.5 La Mquina de T u r i n g

    Alan Turing, en 1936 desarroll su Mquina de T u r i n g (la cual se cubre

    en los cursos denominados Teora de la Computacin o Teora deAutomtas), estableciendo que cualquier algoritmo puede ser representadopor ella.

    Turing mostr tambin que existen problemas matemticos bien definidospara los cuales no hay un algoritmo. Hay muchos ejemplos de problemaspara los cuales no existe un algoritmo. Un problema de este tipo es elllamado problema de paro (halting problem):

    Dado un programa de computadora con sus entradas, parar estealguna vez?

    Turing prob que no hay un algoritmo que pueda resolver correctamentetodas las instancias de este problema.

    Alguien podra pensar en encontrar algunos mtodos para detectar patronesque permitan examinar el programa para cualquier entrada. Sin embargo,siempre habr sutilezas que escapen al anlisis correspondiente.

    Alguna persona ms suspicaz, podra proponer simplemente correr elprograma y reportar xito si se alcanza una declaracin de fin.Desgraciadamente, este esquema no garantiza por s mismo un paro y enconsecuencia el problema no puede ser resuelto con los pasos propuestos.

    Como consecuencia de acuerdo con la definicin anterior, ese ltimoprocedimiento no es un algoritmo, pues no se llega a una solucin.

    Muchas veces aunque exista un algoritmo que pueda solucionarcorrectamente cualquier instancia de un problema dado, no siempre dichoalgoritmo es satisfactorio porque puede requerir de tiempos exageradamenteexcesivos para llegar a la solucin.

  • 8/7/2019 Manual de Analisis y Diseo de Algoritmos V 1.0

    26/127

    Pgina 25

    Captulo 3

    Eficiencia de Algor itm os

    3.1 Introduccin

    Un objetivo natural en el desarrollo de un programa computacional esmantener tan bajo como sea posible el consumo de los diversos recursos,aprovechndolos de la mejor manera que se encuentre. Se desea un buenuso, eficiente, de los recursos disponibles, sin desperdiciarlos.

    Para que un programa sea prctico, en trminos de requerimientos dealmacenamiento y tiempo de ejecucin, debe organizar sus datos en unaforma que apoye el procesamiento eficiente.

    Siempre que se trata de resolver un problema, puede interesar considerardistintos algoritmos, con el fin de utilizar el ms eficiente. Pero, cmodeterminar cul es "el mejor"?. La estrategia emprica consiste enprogramar los algoritmos y ejecutarlos en un computador sobre algunosejemplares de prueba. La estrategia terica consiste en determinarmatemticamente la cantidad de recursos (tiempo, espacio, etc.) quenecesitar el algoritmo e n f u n c i n d e l t a m a o del ejemplar considerado.

    El tamao de un ejemplar x corresponde formalmente al nmero de dgitos binarios necesarios para representarlo en el computador. Pero a nivelalgortmico consideraremos el tamao como el nmero de elementos lgicoscontenidos en el ejemplar.

    3.2 Concep to de Eficiencia

    Un algoritmo es eficiente cuando logra llegar a sus objetivos planteadosutilizando la menor cantidad de recursos posibles, es decir, minimizando eluso memoria, de pasos y de esfuerzo humano.

    Un algoritmo es eficaz cuando alcanza el objetivo primordial, el anlisis deresolucin del problema se lo realiza prioritariamente.

    Puede darse el caso de que exista un algoritmo eficaz pero no eficiente, en loposible debemos de manejar estos dos conceptos conjuntamente.

    La eficiencia de un programa tiene dos ingredientes fundamentales:espacio yt iempo.

    La e f ic ienc i a en e spa c io es una medida de la cantidad de memoria

    requerida por un programa.

  • 8/7/2019 Manual de Analisis y Diseo de Algoritmos V 1.0

    27/127

    Pgina 26

    La e f ic ienc i a en t i em po se mide en trminos de la cantidad detiempo de ejecucin del programa.

    Ambas dependen del tipo de computador y compilador, por lo que no seestudiar aqu la eficiencia de los programas, sino la eficiencia de losalgoritmos. Asimismo, este anlisis depender de si trabajamos conmquinas de un solo procesador o de varios de ellos. Centraremos nuestraatencin en los algoritmos para mquinas de un solo procesador queejecutan una instruccin y luego otra.

    3.3 Medidas de Eficiencia

    Inventar algoritmos es relativamente fcil. En la prctica, sin embargo, nose pretende slo disear algoritmos, si no ms bien quebuenos algoritmos. As, el objetivo es inventar algoritmos y probar que ellos mismos sonbuenos.

    La calidad de un algoritmo puede ser avalada utilizando varios criterios.Uno de los criterios ms importantes es el tiempo utilizado en la ejecucindel algoritmos. Existen varios aspectos a considerar en cada criterio detiempo. Uno de ellos est relacionado con el tiempo de ejecucin requerido por los diferentes algoritmos, para encontrar la solucin final deun problema o clculo particular.

    Normalmente, un problema se puede resolver por mtodos distintos, condiferentes grados de eficiencia. Por ejemplo: bsqueda de un nmero enuna gua telefnica.

    Cuando se usa un computador es importante limitar el consumo derecursos.

    Recurso Tiempo:

    Aplicaciones informticas que trabajan en t iempo rea l requierenque los clculos se realicen en el menor tiempo posible.

    Aplicaciones que manejan un gran volumen de informacin sino se tratan adecuadamente pueden necesitar tiemposimpracticables.

    Recurso Memoria :

    Las mquinas tienen una mem oria limitada .

  • 8/7/2019 Manual de Analisis y Diseo de Algoritmos V 1.0

    28/127

  • 8/7/2019 Manual de Analisis y Diseo de Algoritmos V 1.0

    29/127

    Pgina 28

    Un problema computacional abarca a otro problema computacional si lasinstancias del segundo pueden ser resueltas como instancias del primero enforma directa.

    Ejemplo: Problema del Vendedor Viajero.

    3.6 Tama o de los Datos

    Variable o expresin en funcin de la cual intentaremos medir lacomplejidad del algoritmo.

    Es claro que para cada algoritmo la cantidad de recurso (tiempo, memoria)utilizados depende fuertemente de los datos de entrada. En general, lacantidad de recursos crece a medida que crece el tamao de la entrada.

    El anlisis de esta cantidad de recursos no es viable de ser realizadoinstancia por instancia.

    Se definen entonces las funciones de cantidad de recursos en base altamao (o talla) de la entrada . Suele depender del nmero de datos delproblema. Este tamao puede ser la cantidad de dgitos para un nmero, la

    cantidad de elementos para un arreglo, la cantidad de caracteres de unacadena, en problemas de ordenacin es el nmero de elementos a ordenar,en matrices puede ser el nmero de filas, columnas o elementos totales, enalgoritmos recursivos es el nmero de recursiones o llamadas propias quehace la funcin.

    En ocasiones es til definir el tamao de la entrada en base a dos o msmagnitudes. Por ejemplo, para un grafo es frecuente utilizar la cantidad denodos y de arcos.

    En cualquier caso, se debe elegir la misma variable para comparar

    algoritmos distintos aplicados a los mismos datos.

    C1

    C2

    C3

    C4

    Una instancia de solucinsera:

    con una longitud de 27.10

    5

    6

    9

    3

    9

  • 8/7/2019 Manual de Analisis y Diseo de Algoritmos V 1.0

    30/127

    Pgina 29

    3.7 Clculo de Costos de Algoritmo s

    Queremos saber la eficiencia de los algoritmos, no del computador. Por ello,en lugar de medir el tiempo de ejecucin en microsegundos o algo por elestilo, nos preocuparemos del nmero de veces que se ejecuta una operacinprimitiva (de tiempo fijo).

    Para estimar la eficiencia de este algoritmo, podemos preguntarnos, "si elargumento es una frase de N nmeros, cuntas multiplicacionesrealizaremos?" La respuesta es que hacemos una multiplicacin por cadanmero en el argumento, por lo que hacemos N multiplicaciones. Lacantidad de tiempo que se necesitara para el doble de nmeros sera eldoble.

    3.7.1 Clculo de eficiencia en anlisis iterativo

    Cuando se analiza la eficiencia, en tiempo de ejecucin, de un algoritmo sonposibles distintas aproximaciones: desde el clculo detallado (que puedecomplicarse en muchos algoritmos si se realiza un anlisis para distintoscontenidos de los datos de entrada, casos ms favorables, caso peor,hiptesis de distribucin probabilstica para los contenidos de los datos deentrada, etc.) hasta el anlisis asinttico simplificado aplicando reglasprcticas.

    En estos apuntes se seguir el criterio de anlisis asinttico simplificado, si bien nunca se ha de dejar de aplicar el sentido comn. Como en todos losmodelos simplificados se ha mantener la alerta para no establecer hiptesissimplificadoras que no se correspondan con la realidad.

    En lo que sigue se realizar una exposicin basada en el criterio de exponeren un apartado inicial una serie de reglas y planteamientos bsicosaplicables al anlisis de eficiencia en algoritmos iterativos, en un segundoapartado se presenta una lista de ejemplos que permitan comprenderalgunas de las aproximaciones y tcnicas expuestas.

    3.7.2Clculo de eficiencia en anlisis recursivo

    Retomando aqu el socorrido ejemplo del factorial, tratemos de analizar elcoste de dicho algoritmo, en su versin iterativa , se tiene:

    PROCEDURE Factorial(n : CARDINAL) : CARDINALBEGINVAR Resultado,i : CARDINAL ;Resultado :=1 ;FOR i :=1 TO n DO

    Resultado :=Resultado*i ;

  • 8/7/2019 Manual de Analisis y Diseo de Algoritmos V 1.0

    31/127

    Pgina 30

    END ;RETURN Resultado

    END Factorial ;

    Aplicando las tcnicas de anlisis de coste en algoritmos iterativos de formarpida y mentalmente (es como se han de llegar a analizar algoritmos tansimples como ste), se tiene: hay una inicializacin antes de bucle, de costeconstante. El bucle se repite un nmero de veces n y en su interior se realizauna operacin de coste constante. Por tanto el algoritmo es de coste lineal oexpresado con algo ms de detalle y rigor, si la funcin de coste delalgoritmo se expresa por T(n), se tiene que T(n) ? T.

    Una versin recursiva del mismo algoritmo, es:

    PROCEDURE Factorial(n: CARDINAL): CARDINAL;BEGIN

    IF n=0 THENRETURN 1

    ELSERETURN ( n * Fac tor ial( n-1) )

    ENDEND Factorial;

    Al aplicar el anlisis de coste aprendido para anlisis de algoritmos iterativosse tiene: hay una instruccin de alternativa, en una de las alternativassimplemente se devuelve un valor (operacin de coste constante). En la otra

    alternativa se realiza una operacin de coste constante (multiplicacin) condos operandos. El primer operando se obtiene por una operacin de costeconstante (acceso a la variable n), el coste de la operacin que permiteobtener el segundo operando es el coste que estamos calculando!, es decir esel coste de la propia funcin factorial (solo que para parmetro n -1).

    Por tanto, para conocer el orden de la funcin de coste de este algoritmodebemos conocer previamente el orden de la funcin de coste de estealgoritmo?, entramos en una recurrencia.

    Y efectivamente, el asunto est en saber resolver recurrencias. Si T( n) es la

    funcin de coste de este algoritmo se puede decir que T( n) es igual a unaoperacin de coste constante c cuando n vale 0 y a una operacin de costeT(n -1) ms una operacin de coste constante (el acceso a n y lamultiplicacin) cuando n es mayor que 0, es decir:

    c si n = 0T(n) =

    T(n-1) + c si n > 0

    Se trata entonces de encontrar soluciones a recurrencias como sta.Entendiendo por solucin una funcin simplef( n ) tal que se pueda asegurar

    que T(n ) es del orden def( n) .

  • 8/7/2019 Manual de Analisis y Diseo de Algoritmos V 1.0

    32/127

    Pgina 31

    En este ejemplo puede comprobarse que T( n ) es de orden lineal, es decir delorden de la funcin f( n ) =n , ya que cualquier funcin lineal T(n )= a n +b siendo a yb constantes, es solucin de la recurrencia :

    T(0)= b , es decir una constante

    T( n)= a .n +b = an -a + b +a = a ( n-1)+b +a = T( n -1)+a , es decir elcoste de T( n ) es igual al de T( n-1 ) ms una constante.

    3.8 Principio de Invarianza

    Dado un algoritmo y dos implementaciones I1 y I2 (mquinas distintas ocdigos distintos) que tardan T1(n) yT2(n) respectivamente, el principio deinvarianza afirma que existe una constante real c>0 y un nmero natural n0

    tales que para todo n>=n0 se verifica que T1(n)0 y una implementacin I del algoritmo que tardamenos que cT (n), para todo n tamao de entrada.

    El comportamiento de un algoritmo puede variar notablemente paradiferentes secuencias de entrada. Suelen estudiarse tres casos para un

    mismo algoritmo: caso mejor, caso peor, caso medio.

    3.9 Anlisis Peor Caso, Mejor Caso y Caso Pr omedio

    Puede analizarse un algoritmo particular o una clase de ellos. Una clase dealgoritmo para un problema son aquellos algoritmos que se puedenclasificar por el tipo de operacin fundamental que realizan.

    Ejemplo:

    Problema: OrdenamientoClase: Ordenamiento por comparacin

    Para algunos algoritmos, diferentes entradas (inputs) para un tamao dadopueden requerir diferentes cantidades de tiempo.

    Por ejemplo, consideremos el problema de encontrar la posicin particularde un valor K, dentro de un arreglo de n elementos. Suponiendo que sloocurre una vez. Comentar sobre el mejor, peor y caso promedio.

    Cul es la ventaja de analizar cada caso? Si examinamos el peor de los

    casos, sabemos que al menos el algoritmo se desempear de esa forma.

  • 8/7/2019 Manual de Analisis y Diseo de Algoritmos V 1.0

    33/127

    Pgina 32

    En cambio, cuando un algoritmo se ejecuta muchas veces en muchos tiposde entrada, estamos interesados en el comportamiento promedio o tpico.Desafortunadamente, esto supone que sabemos cmo estn distribuidos losdatos.

    Si conocemos la distribucin de los datos, podemos sacar provecho de esto,para un mejor anlisis y diseo del algoritmo. Por otra parte, sinoconocemos la distribucin, entonces lo mejor es considerar el peor de loscasos.

    Tipos de anlisis :

    o Peor caso: indica el mayor tiempo obtenido, teniendo en

    consideracin todas las entradas pos ibles.

    o Mejor caso: indica el menor tiempo obtenido, teniendo enconsideracin todas las entradas posibles.

    o Media: indica el tiempo medio obtenido, considerando todas lasentradas posibles.

    Como no se puede analizar el comportamiento sobre todas las entradas posibles,va a existir para cada problema particular un anlisis en l:

    - peor caso

    - mejor caso

    - caso promedio (o medio)

    El caso promedio es la medida ms realista de la performance, pero es msdifcil de calcular pues establece que todas las entradas son igualmenteprobables, lo cual puede ser cierto o no. Trabajaremos especficamente con

    el peor caso.

  • 8/7/2019 Manual de Analisis y Diseo de Algoritmos V 1.0

    34/127

    Pgina 33

    Ejemplo

    SeaAuna lista de n elementosA1 ,A2 ,A3, ... , An. Ordenar significa permutarestos elementos de tal forma que los mismos queden de acuerdo con unorden preestablecido.

    AscendenteA1=An

    Caso peor: Que el vector est ordenado en sentido inverso.

    Caso mejor: Que el vector est ordenado.

    Caso medio: Cuando el vector est desordenado aleatoriamente.

  • 8/7/2019 Manual de Analisis y Diseo de Algoritmos V 1.0

    35/127

    Pgina 34

    Captulo 4

    Anlisis de Algoritmos

    4.1 Introduccin

    Como hemos visto, existen muchos enfoques para resolver un problema.Cmo escogemos entre ellos? Generalmente hay dos metas en el diseo deprogramas de cmputo:

    El diseo de un algoritmo que sea fcil de entender, codificar y

    depurar (Ingeniera de Software ). El diseo de un algoritmo que haga uso eficiente de los recursos de la

    computadora (Anlisis y Diseo de algoritmos).

    El an lisis de algoritmos nos permite medir la dificultad inherente deun problema y evaluar la eficiencia de un algoritmo.

    4.2 Tiempos de Ejecucin

    Una medida que suele ser til conocer es el tiempo de ejecucin de unalgoritmo en funcin de N, lo que denominaremos T(N). Esta funcin sepuede medir fsicamente (ejecutando el programa, reloj en mano), ocalcularse sobre el cdigo contando instrucciones a ejecutar y multiplicandopor el tiempo requerido por cada instruccin.

    As, un trozo sencillo de programa como:

    S1; FOR i:= 1 TO N DO S2 END;

    requiere:

    T(N):= t1 + t2*N

    siendo t1 el tiempo que lleve ejecutar la serie "S1" de sentencias, yt2 el quelleve la serie "S2".

    Prcticamente todos los programas reales incluyen alguna sentenciacondicional, haciendo que las sentencias efectivamente ejecutadasdependan de los datos concretos que se le presenten. Esto hace que ms queun valor T(N) debamos hablar de un rango de valores:

    Tmin(N)

  • 8/7/2019 Manual de Analisis y Diseo de Algoritmos V 1.0

    36/127

    Pgina 35

    los extremos son habitualmente conocidos como "caso peor" y "caso mejor".

    Entre ambos se hallar algn "caso promedio" o ms frecuente. Cualquierfrmula T(N) incluye referencias al parmetro N y a una serie de constantes"Ti" que dependen de factores externos al algoritmo como pueden ser lacalidad del cdigo generado por el compilador y la velocidad de ejecucin deinstrucciones del computador que lo ejecuta.

    Dado que es fcil cambiar de compilador y que la potencia de loscomputadores crece a un ritmo vertiginoso (en la actualidad, se duplicaanualmente), intentaremos analizar los algoritmos con algn nivel deindependencia de estos factores; es decir, buscaremos estimacionesgenerales ampliamente vlidas.

    No se puede medir el tiempo en segundos porque no existe un computadorestndar de referencia, en su lugar medimos el nmero de operacionesbsicas o elementales .

    Las operaciones bsicas son las que realiza el computador en tiempo acotadopor una constante, por ejemplo:

    Operaciones aritmticas bsicas Asignaciones de tipos predefinidos Saltos (llamadas a funciones, procedimientos y retorno) Comparaciones lgicas Acceso a estructuras indexadas bsicas (vectores y matrices)

    Es posible realizar el estudio de la complejidad de un algoritmo slo en basea un conjunto reducido de sentencias, por ejemplo, las que ms influyen enel tiempo de ejecucin.

    Para medir el tiempo de ejecucin de un algoritmo existen varios mtodos.Veamos algunos de ellos:

    a) BenchmarkingLa tcnica de benchmark considera una coleccin de entradas tpicasrepresentativas de una carga de trabajo para un programa.

    b) ProfilingConsiste en asociar a cada instruccin de un programa un nmero querepresenta la fraccin del tiempo total tomada para ejecutar esainstruccin particular. Una de las tcnicas ms conocidas (e informal) esla Regla 90-10, que afirma que el 90% del tiempo de ejecucin seinvierte en el 10% del cdigo.

  • 8/7/2019 Manual de Analisis y Diseo de Algoritmos V 1.0

    37/127

    Pgina 36

    c) AnlisisConsiste en agrupar las entradas de acuerdo a su tamao, y estimar eltiempo de ejecucin del programa en entradas de ese tamao, T(n). Estaes la tcnica que se estudiar en el curso.

    De este modo, el tiempo de ejecucin puede ser definido como unafuncin de la entrada. Denotaremos T(n) como el tiempo de ejecucin de unalgoritmo para una entrada de tamao n.

    4.3 Concepto de Complejidad

    La complejidad (o costo) de un algoritmo es una medida de la cantidad derecursos (tiempo, memoria) que el algoritmo necesita. La complejidad de un

    algoritmo se expresa en funcin del tamao (o talla) del problema.

    La funcin de complejidad tiene como variable independiente el tamao delproblema y sirve para medir la complejidad (espacial o temporal). Mide eltiempo/espacio relativo en funcin del tamao del problema.

    El comportamiento de la funcin determina la eficiencia. No es nica paraun algoritmo: depende de los datos. Para un mismo tamao del problema,las distintas presentaciones iniciales de los datos dan lugar a distintasfunciones de complejidad. Es el caso de una ordenacin si los datos estntodos inicialmente desordenados, parcialmente ordenados o en orden

    inverso.

    Ejemplo: f(n)= 3n2+2n+1 , en donde n es el tamao del problema y expresael tiempo en unidades de tiempo.

    Una computadora ms r pida o un algoritmo m s rpido?

    Si compramos una computadora diez veces ms rpida, en qu tiempopodremos ahora ejecutar un algoritmo?

    La respuesta depende del tamao de la entrada de datos, as como de larazn de crecimiento del algoritmo.

    Si la razn de crecimiento es l ineal (es decir, T(n)=cn) entonces porejemplo, 100.000 nmeros sern procesados en la nueva mquina en elmismo tiempo que 10.000 nmeros en la antigua computadora.

    De qu tamao (valor de n) es el problema que podemos resolver con unacomputadora X veces ms rpida (en un intervalo de tiempo fijo)?

    Por ejemplo, supongamos que una computadora resuelve un problema detamao n en una hora. Ahora supongamos que tenemos una computadora

  • 8/7/2019 Manual de Analisis y Diseo de Algoritmos V 1.0

    38/127

    Pgina 37

    10 veces ms rpida, de qu tamao es el problema que podemosresolver?

    f( n ) n n cambio n /n 10n 1000 10000 n=10n 1020n 500 5000 n=10n 105n log n 250 1842 (10)n

    2)O(n!) orden factorial

    Es ms, se puede identificar una jerarqua de rdenes de complejidad quecoincide con el orden de la tabla anterior; jerarqua en el sentido de que

    cada orden de complejidad superior tiene a los inferiores como

  • 8/7/2019 Manual de Analisis y Diseo de Algoritmos V 1.0

    39/127

    Pgina 38

    subconjuntos. Si un algoritmo Ase puede demostrar de un cierto orden O1 ,es cierto que tambin pertenece a todos los rdenes superiores (la relacinde orden cota superior es transitiva); pero en la prctica lo til es encontrarla "menor cota superior", es decir el menor orden de complejidad que locubra.

    Antes de realizar un programa conviene elegir un buen algoritmo, dondepor bueno entendemos que utilice pocos recursos, siendo usualmente losms importantes el tiempo que lleve ejecutarse y la cantidad de espacio enmemoria que requiera. Es engaoso pensar que todos los algoritmos son"ms o menos iguales" y confiar en nuestra habilidad como programadorespara convertir un mal algoritmo en un producto eficaz. Es asimismoengaoso confiar en la creciente potencia de las mquinas y elabaratamiento de las mismas como remedio de todos los problemas quepuedan aparecer.

    Un ejemplo de algunas de las funciones ms comunes en anlisis dealgoritmos son:

    La mejor tcnica para diferenciar la eficiencia de los algoritmos es el estudiode los rdenes de complejidad . El orden de complejidad se expresa

    generalmente en trminos de la cantidad de datos procesados por elprograma, denominada n , que puede ser el tamao dado o estimado.

    En el anlisis de algoritmos se considera usualmente el caso peor, si bien aveces conviene analizar igualmente el caso mejor y hacer alguna estimacinsobre un caso promedio. Para independizarse de factores coyunturales, talescomo el lenguaje de programacin, la habilidad del codificador, la mquinade soporte, etc. se suele trabajar con un clculo asinttico que indicacmo se comporta el algoritmo para datos muy grandes y salvo algncoeficiente multiplicativo. Para problemas pequeos es cierto que casi todoslos algoritmos son "ms o menos iguales", primando otros aspectos comoesfuerzo de codificacin, legibilidad, etc. Los rdenes de complejidad sloson importantes para grandes problemas.

  • 8/7/2019 Manual de Analisis y Diseo de Algoritmos V 1.0

    40/127

    Pgina 39

    4.5 Notacin Asinttica

    El inters principal del anlisis de algoritmos radica en saber cmo crece eltiempo de ejecucin, cuando el tamao de la entrada crece. Esto es laeficiencia asinttica del algoritmo. Se denomina asinttica porque analizael comportamiento de las funciones en el lmite, es decir, su tasa decrecimiento.

    La notacin asinttica se describe por medio de una funcin cuyo dominioes los nmeros naturales ( ) estimado a partir de tiempo de ejecucin o deespacio de memoria de algoritmos en base a la longitud de la entrada. Seconsideran las funciones asintticamente no negativas.

    La notacin asinttica captura el comportamiento de la funcin paravalores grandes de N.

    Las notaciones no son dependientes de los tres casos anteriormente vistos,es por eso que una notacin que determine el peor caso puede estarpresente en una o en todas las situaciones.

    4.5.1 La O Mayscula

    La notacin O se utiliza para comparar funciones. Resulta particularmentetil cuando se quiere analizar la complejidad de un algoritmo, en otraspalabras, la cantidad de tiempo que le toma a un computador ejecutar un

    programa.

    Definicin : Sean f yg funciones con dominio en R 0 oNesimagen enR . Si existen constantes C y k tales que:

    x > k,| f(x) | C | g (x) |

    es decir, que para x > k,f es menor o igual a un multiplo de g, decimos que:

    f(x) = O ( g (x) )

    La definicin formal es:

    f(x) = O ( g (x) ) k, N | x > N,| f(x) | k| g (x) |

    Qu quiere decir todo esto? Bsicamente, que una funcin es siempremenor que otra funcin (por ejemplo, el tiempo en ejecutar tu programa esmenor que x2 ) si no tenemos en cuenta los factores constantes (eso es lo quesignifica la k) y si no tenemos en cuenta los valores pequeos (eso es lo quesignifica la N).

  • 8/7/2019 Manual de Analisis y Diseo de Algoritmos V 1.0

    41/127

    Pgina 40

    Por qu no tenemos en cuenta los valores pequeos de N? Porqu paraentradas pequeas, el tiempo que tarda el programa no es significativo ycasi siempre el algoritmo ser suficientemente rpido para lo que queremos.

    As 3N3 + 5N2 9 = O (N3) no significa que existe una funcin O(N3) que

    es igual a 3N 3 + 5N 2 9.

    Debe leerse como:

    3N 3+5N 2 9 es O-Grande de N3

    que significa:

    3N3

    +5N2

    9 est asintticamente dominada por N3

    La notacin puede resultar un poco confusa. Veamos algunos ejemplos.

    Ejemplo 1: Muestre que 3N 3 + 5N 2 9 = O (N 3).

    De nuestra experiencia anterior pareciera tener sentido que C = 5.Encontremos k tal que:

    3N 3 + 5N 2 9 5N 3 for N > k:

    1. Agrupamos: 5N2 = 2N 3 + 9

    2. Cul kasegura que 5N2 = N3 para N > k?3. k= 5

    4. As que para N > 5, 5N2 = N3 = 2N3 + 9.5. C = 5, k= 5 (no es nico!)

    Ejemplo 2: Muestre que N 4 O (3N3 + 5N2 9) .

    Hay que mostrar que no existen C y k tales que para N > k, C* (3N3 + 5N2

    9) N4 es siempre cierto (usamos lmites, recordando el curso de Clculo).

    lim x4 / C(3x3 + 5 x2 9) = lim x / C(3 + 5/x 9/x3)x x

    = lim x / C(3 + 0 0) = (1/3C) . lim x = x x

  • 8/7/2019 Manual de Analisis y Diseo de Algoritmos V 1.0

    42/127

    Pgina 41

    As que sin importar cual sea el C que se elija, N4 siempre alcanzar y

    rebasar C* (3N3 + 5N2 9).

    Podemos considerarnos afortunados porque sabemos calcular lmites!Lmites sern tiles para probar relaciones (como veremos en el prximoteorema).

    L e m a: Si el lmite cuando x del cociente |f(x)/g (x)| existe (es finito)entonces f(x) = O ( g (x) ).

    Ejemplo 3: 3N3 + 5N2 9 = O (N3 ). Calculamos:

    lim x3 / (3x3 + 5 x2 9) = lim 1 /(3 + 5/x 9/x3) = 1 /3x x

    Listo!

    4.5.2 La o Minscula

    La cota superior asinttica dada por la notacin O puede o no ser ajustada

    asintticamente. La cota 2n = O(n) es ajustada asintticamente, pero lacota 2n = O(n) no lo es. Utilizaremos la notacin o para denotar una cotasuperior que no es ajustada asintticamente.

    Definimos formalmente o (g(n)) ("o pequea") como el conjunto:

    o(g(n)) = {f(n): para cualquier constante positiva c > 0, existe una constanten0 > 0 tal que: 0 f(n) cg(n) para toda n n0 }.

    Por ejemplo, 2n = o(n), pero 2nno pertenece a o(n).

    Las notaciones de O yo son similares. La diferencia principal es, que en f(n)= O (g(n)), la cota 0 f(n) cg(n) se cumple para alguna constante c > 0,pero en f(n) = o (g(n)), la cota 0 f(n) cg(n) se cumple para todas lasconstantes c> 0. Intuitivamente en la notacin o , la funcin f(n) se vuelveinsignificante con respecto a g(n) a medida que n se acerca a infinito, esdecir:

    lim (f(n)/g(n)) = 0.x

  • 8/7/2019 Manual de Analisis y Diseo de Algoritmos V 1.0

    43/127

    Pgina 42

    4.5.3 Diferencia entre O yo

    Para o la desigualdad se mantiene para todas las constantes positivas,mientras que para O la desigualdad se mantiene slo para algunasconstantes positivas.

    4.5.4 Las Notaciones y

    Es el reverso de O.

    f(x ) = (g (x ))g (x ) = O (f(x ))

    Grande dice que asintticamente f(x ) domina a g (x ).

    Grande dice que ambas funciones se dominan mutuamente, en otraspalabras, son asintticamente equivalentes.

    f(x ) = (g (x ))

    f(x ) = O (g (x )) f(x ) =(g (x ))

    f= (g): f es de ordeng

    4.5.5 Propiedades y Cotas ms Usuales

    Prop iedades de las notaciones asintticas

    Relaciones de orden

    La notacin asinttica nos permite definir relaciones de orden entre elconjunto de las funciones sobre los enteros positivos:

    f O (g (x )) fg (se dice que fes asintticamente menor o igual que g) f o (g (x )) f< g f (g (x )) f= g f (g (x )) fg f (g (x )) f> g

  • 8/7/2019 Manual de Analisis y Diseo de Algoritmos V 1.0

    44/127

  • 8/7/2019 Manual de Analisis y Diseo de Algoritmos V 1.0

    45/127

    Pgina 44

    Propiedades de clausura

    El conjunto de funciones del orden de f(n) es cerrado respecto de la suma yla multiplicacin de funciones:

    1. f1(n) O(g1(n)) f2(n) O(g2(n)) f1(n) + f2(n) O(g1(n) + g2(n))

    2. f1(n) O(g1(n)) f2(n) O(g2(n)) f1(n) * f2(n) O(g1(n) * g2(n))

    3. f1(n) O(g1(n)) f2(n) O(g2(n)) f1(n)+f2(n) O(max(g1(n), g2(n))

    como consecuencia es que los polinomios de grado k en n son exactamente

    del orden de nkaknk + + a 1n + a0 (nk)

    Cotas Asintticas Ms Usuales

    1. c(1) cR 0

    n

    2. i = (n/2)(n+1) (n2 )i=1

    n

    3. i2 = (n/3)(n+1) (n+1/2) (n3)i=1

    n4. ik(nk+1) kN

    i=1

    n5. log i (n log n)

    i=1

    n6. (n- i)k(nk+1) ) kN

    i=1

  • 8/7/2019 Manual de Analisis y Diseo de Algoritmos V 1.0

    46/127

    Pgina 45

    4.6 Ecuaciones de Recurrencias

    4.6.1 Introduccin

    Como ya hemos indicado, el anlisis del tiempo de ejecucin de unprograma recursivo vendr en funcin del tiempo requerido por la(s)llamada(s) recursiva(s) que aparezcan en l. De la misma manera que la verificacin de programas recursivos requiere de razonar por induccin,para tratar apropiadamente estas llamadas, el clculo de su eficienciarequiere un concepto anlogo: el de ecuacin de recurrencia.Demostraciones por induccin y ecuaciones de recurrencia son por tanto losconceptos bsicos para tratar programas recursivos.

    Supongamos que se est analizando el coste de un algoritmo recursivo,intentando calcular una funcin que indique el uso de recursos, por ejemplo

    el tiempo, en trminos del tamao de los datos; denominmosla T(n) paradatos de tamao n. Nos encontramos con que este coste se define a su vez enfuncin del coste de las llamadas recursivas, es decir, de T(m) para otrostamaos m (usualmente menores que n). Esta manera de expresar el coste Ten funcin de s misma es lo que denominaremos una ecuacin recurrente ysu resolucin, es decir, la obtencin para T de una frmula cerrada(independiente de T) puede ser dificultosa.

    4.6.2 Resolucin de Recurrencias

    Las ecuaciones de recurrencia son utilizadas para determinar cotasasintticas en algoritmos que presentan recursividad.

    Veremos dos tcnicas bsicas y una auxiliar que se aplican a diferentesclases de recurrencias:

    Mtodo del teorema maestro Mtodo de la ecuacin caracterstica Cambio de variable

    No analizaremos su demostracin formal, slo consideraremos su

    aplicacin para las recurrencias generadas a partir del anlisis dealgoritmos.

    4.6.3 Mtodo del Teorem a Maestro

    Se aplica en casos como:

    5 si n=0T(n) =

    9T(n/3) + n si n 0

  • 8/7/2019 Manual de Analisis y Diseo de Algoritmos V 1.0

    47/127

    Pgina 46

    Teorema: Sean a = 1, b > 1 constantes, f(n) una funcin y T(n) unarecurrencia definida sobre los enteros no negativos de la forma T(n) =aT(n/b) + f(n), donde n/b puede interpretarse como n/b o n/b.

    Entonces valen:

    1. Si f(n) O(mlogba - ) para algn > 0 entonces T(n) (nlogba).2.Si f(n) (nlogba) entonces T(n) (nlogba lgn).3.Si f(n) (nlogba + ) para algn >0, y satisface af(n/b) cf(n) para

    alguna constante c < 1, entonces T(n) (f(n)).

    Ejemplos:

    1 . Si T(n)=9T(n/3)+n entonces a=9, b=3, se aplica el caso 1 con =1 y

    T(n) (n2 ).2.Si T(n)=T(2n/3)+1 entonces a=1, b=3/2, se aplica el caso 2 yT(n) =

    (lgn).

    3.Si T(n)=3T(n/4)+nlgn entonces a=3, b=4, f(n) (nlog43 + 0,2 ) y3(n/4) lg(n/4) 3/4n lgn, por lo que se aplica el caso 3 yT(n) (nlgn)

    4.6.4 Mtodo de la Ecuacin Cara cterstica

    Se aplica a ciertas recurrencias lineales con coeficientes constantes como:

    5 si n=0T(n) = 10 si n=1

    5T(n-1) + 8T(n-2)+2n si n >0

    En general, para recurrencias de la forma:

    T(n) = a1T(n-1) + a2T(n-2) + + akT(n-k) +bnp(n)

    donde a i, 1 ik,b son constantes yp(n) es un polinomio en n de grado s.Ejemplos:

    1. En T(n)=2t(n-1)+3n, a1 =2,b=3, p(n)=1, s=0.2.En T(n)=t(n-1)+ t(n-2)+n, a1=1, a2 =1,b=1, p(n)=n, s=1 .

    En general, para:

    T(n) = a1T(n-1) + a2T(n-2) + + akT(n-k) +bnp(n)

  • 8/7/2019 Manual de Analisis y Diseo de Algoritmos V 1.0

    48/127

    Pgina 47

    Paso 1: Encontrar las races no nulas de la ecuacin caracterstica:

    (xk- a1xk-1 - a2xk-2 - - ak)(x-b)s+1 = 0

    Races: ri, 1 ilk, cada una con multiplicidad mi.

    Paso 2: Las soluciones son de la forma de combinaciones lineales deestas races de acuerdo a su multiplicidad.

    T(n) = -----

    Paso 3: Se encuentran valores para las constantes cij, tal que:

    1 il, 0jmi- 1

    y di, 0 i s 1 segn la recurrencia original y las condicionesiniciales (valores de la recurrencia para n=0,1, ).

    Ejemplo: Resolver la ecuacin de recurrencia siguiente:

    0 si n=0T(n) =

    2T(n-1) + 1 si n>0

    dondeb=1 yp(n)=1 de grado 0.

    La ecuacin caracterstica (x-2)(x-1)0+1 = 0, con races 2 y 1 demultiplicidad 1.

    La solucin general es entonces de la forma: T(n)=c112n + c211n.

    A partir de las condiciones iniciales se encuentra el siguiente sistema deecuaciones que sirve para hallar c11 yc21:

    c11 + c21 = 0 de n = 0

    2c11 + c21 = 1 de n = 1

    de donde c11 = 1 y c21 = -1.

    La solucin es entonces: T(n) = 2n 1.

  • 8/7/2019 Manual de Analisis y Diseo de Algoritmos V 1.0

    49/127

    Pgina 48

    4.6.5 Cambio de Var iable

    Dada la siguiente ecuacin de recurrencia:

    a si n=1T(n) =

    2T(n/2) + nlog2 n si n = 2k

    No se puede aplicar el teorema maestro ni la ecuacin caracterstica.

    Se define una nueva recurrencia S(i) = T(2i), con el objetivo de llevarla a unaforma en la que se pueda resolver siguiendo algn mtodo anterior.

    Entonces el caso general queda:

    S(i) = T(2i) = 2T(2i /2) + 2ii = 2T(2i-1 ) + i2i = 2S(i-1) + i2i

    Con b=2 y p(i) = i de grado 1.

    La ecuacin caracterstica de esta recurrencia es:

    (x - 2)(x - 2)i+1 = 0,

    con raz 2 de grado 3.

    La solucin es entonces S(i) = c1 12i + c12 i2i + c13 i22i, con lo que volviendo a lavariable original queda:

    T(n) - 2T(n/2) = nlog2 n = (c12 - c13)n + 2c13n(log2n).

    Se pueden obtener los valores de las constantes sustituyendo esta solucinen la recurrencia original:

    T(n) = c11 n + c12(log2n)n + c13(log2n)2n.

    de donde c12 = c13 y 2c12 = 1 .

    Por tanto T(n) (nlog2 n|nes potencia de 2).

    Si se puede probar que T(n) es eventualmente no decreciente, por la reglade las funciones de crecim iento suave se puede extender el resultadoa todos los n (dado que nlog2n es de crecimiento suave).

    En este caso T(n) (nlog2n).

  • 8/7/2019 Manual de Analisis y Diseo de Algoritmos V 1.0

    50/127

    Pgina 49

    4.7 Ejemplos y Ejercicios

    Ejemplos de clculo del t iempo de ejecucin de un programa

    Veamos el anlisis de un simple enunciado de asignacin a una variableentera:

    a =b;

    Como el enunciado de asignacin toma tiempo constante, est en (1).

    Consideremos un simple ciclo for:

    sum=0;for (i=1; i

  • 8/7/2019 Manual de Analisis y Diseo de Algoritmos V 1.0

    51/127

    Pgina 50

    Comparemos el anlisis asinttico de los siguientes fragmentos de cdigo:

    sum1=0;for(i=1; i

  • 8/7/2019 Manual de Analisis y Diseo de Algoritmos V 1.0

    52/127

    Pgina 51

    Captulo 5

    Estrategias de Diseo deAlgoritmos

    5.1 Introduccin

    A travs de los aos, los cientficos de la computacin han identificadodiversas tcnicas generales que a menudo producen algoritmos eficientespara la resolucin de muchas clases de problemas. Este captulo presentaalgunas de las tcnicas ms importantes como son: recursin, dividir paraconquistar, tcnicas vidas, el mtodo de retroceso y programacindinmica.

    Se debe, sin embargo, destacar que hay algunos problemas, como los NPcompletos, para los cuales ni stas ni otras tcnicas conocidas producirnsoluciones eficientes. Cuando se encuentra algn problema de este tipo,suele ser til determinar si las entradas al problema tienen caractersticasespeciales que se puedan explotar en la bsqueda de una solucin, o si puedeusarse alguna solucin aproximada sencilla, en vez de la solucin exacta,difcil de calcular.

    5.2 Recursin

    La recursividad es una tcnica fundamental en el diseo de algoritmoseficientes, que est basada en la solucin de versiones ms pequeas delproblema, para obtener la solucin general del mismo. Una instancia delproblema se soluciona segn la solucin de una o ms instancias diferentesyms pequeas que ella.

    Es una herramienta poderosa que sirve para resolver cierto tipo deproblemas reduciendo la complejidad y ocultando los detalles del problema.

    Esta herramienta consiste en que una funcin o procedimiento se llama a smismo.

    Una gran cantidad de algoritmos pueden ser descritos con mayor claridad entrminos de recursividad, tpicamente el resultado ser que sus programassern ms pequeos.

    La recursividad es una alternativa a la iteracin o repeticin, y aunque entiempo de computadora y en ocupacin en memoria es la solucin recursivamenos eficiente que la solucin iterativa, existen numerosas situaciones enlas que la recursividad es una solucin simple y natural a un problema que

    en caso contrario ser difcil de resolver. Por esta razn se puede decir que la

  • 8/7/2019 Manual de Analisis y Diseo de Algoritmos V 1.0

    53/127

    Pgina 52

    recursividad es una herramienta potente y til en la resolucin de problemasque tengan naturaleza recursiva y, por ende, en la programacin.

    Existen numerosas definiciones de recursividad , algunas de las msimportantes o sencillas son stas:

    Un objeto es recursivo si figura en su propia definicin.

    Una definicin recursiva es aquella en la que el objeto que se defineforma parte de la definicin (recuerde la regla gramatical: lo definidonunca debe formar parte de la definicin)

    La caracterstica importante de la recursividad es que siempre existe unmedio de salir de la definicin, mediante la cual se termina el procesorecursivo.

    Ventajas:

    Puede resolver problemas complejos. Solucin ms natural.

    Desventajas:

    Se puede llegar a un ciclo infinito. Versin no recursiva ms difcil de desarrollar. Para la gente sin experiencia es difcil de programar.

    Tipos de R ecursividad

    Directa o simple: un subprograma se llama a si mismo una o msveces directamente.

  • 8/7/2019 Manual de Analisis y Diseo de Algoritmos V 1.0

    54/127

    Pgina 53

    Indirecta o mu tua: un subprograma A llama a otro subprograma By ste a su vez llama al subprograma A.

    a)Propiedades para un Procedimiento Recursivo

    Debe de existir cierto criterio (criterio base) en donde elprocedimiento no se llama a s mismo. Debe existir al menos unasolucin no recursiva.

    En cada llamada se debe de acercar al criterio base (reducir rango). Elproblema debe reducirse en tamao, expresando el nuevo problemaen trminos del propio problema, pero ms pequeo.

    Los algoritmos de divide y vencers pueden ser procedimientosrecursivos.

    b) Propiedades para una Funcin Recursiva

    Debe de haber ciertos argumentos, llamados valores base para los quela funcin no se refiera a s misma.

    Cada vez que la funcin se refiera as misma el argumento de lafuncin debe de acercarse ms al valor base.

    Ejemplos:

    F ac t or i a l

    n! = 1 * 2 * 3 ... * (n-2) * (n-1) * n0! = 11! = 12! = 1 * 23! = 1 * 2 * 3...n! = 1 * 2 * 3 ... * (n-2) * (n-1) * n

    n! = n* (n-1)!

  • 8/7/2019 Manual de Analisis y Diseo de Algoritmos V 1.0

    55/127

    Pgina 54

    si n = 0 entonces n! = 1si n > 0 entonces n! = n * (n-1)!

    Function factorial( n:integer):longint:begin

    if ( n = 0 ) thenfactorial:=1

    elsefactorial:= n * factorial( n-1);

    end;

    Rastreo de ejecucin:

    Si n = 6

    Nivel

    1) Factorial(6)= 6 * factorial(5) = 7202) Factorial(5)=5 * factorial(4) = 1203) Factorial(4)=4 * factorial(3) = 244) Factorial(3)=3 * factorial(2) = 65) Factorial(2)=2 * factorial(1) = 26) Factorial(1)=1 * factorial(0) = 17) Factorial(0)=1

    La profundidad de un procedimiento recursivo es el nmero de veces que sellama a s mismo.

    Ser i e de Fi bon acc i

    0, 1, 1, 2, 3, 5, 8, ...

    F0 = 0F1 = 1

    F2 = F1 + F0 = 1F3 = F2 + F1 = 2F4 = F3 + F2 = 3...Fn = Fn-1 + Fn-2

    si n= 0, 1 Fn = n

    si n >1 Fn = Fn-1 + Fn-2

  • 8/7/2019 Manual de Analisis y Diseo de Algoritmos V 1.0

    56/127

    Pgina 55

    Procedure fibo(var fib:longint; n:integer);var

    fibA, fibB : integer;begin

    if( n = 0) or ( n = 1) then fib:=nelsebegin

    fibo(fibA,n-1);fibo(fibB,n-2);fib:=fibA + FibB;

    end;end;

    function fibo ( n:integer) : integer;begin

    if( n = 0) or ( n = 1) thenfibo:=n

    elsefibo:=fibo(n-1) + fibo(n-2);

    end;end;

    No todos los ambientes de programacin proveen las facilidades necesariaspara la recursin y adicionalmente, a veces su uso es una fuente deineficiencia inaceptable. Por lo cual se prefiere eliminar la recursin. Para

    ello, se sustituye la llamada recursiva por un lazo, donde se incluyen algunasasignaciones para recolocar los parmetros dirigidos a la funcin.

    Remover la recursin es complicado cuando existe ms de una llamadarecursiva, pero una vez hecha sta, la versin del algoritmo es siempre mseficiente.

    5.3 Dividir para Conquistar

    Muchos algoritmos tiles tienen una estructura recursiva , de modo que para

    resolver un problema se llaman recursivamente a s mismos una o ms vecespara solucionar subproblemas muy similares.

    Esta estructura obedece a una estrategia dividir-y-conquistar, en que seejecuta tres pasos en cada nivel de la recursin:

    Dividir. Dividen el problema en varios subproblemas similares alproblema original pero de menor tamao;

    Conquistar . Resuelven recursivamente los subproblemas si lostamaos de los subproblemas son suficientemente pequeos, entonces

    resuelven los subproblemas de manera directa; y luego,

  • 8/7/2019 Manual de Analisis y Diseo de Algoritmos V 1.0

    57/127

    Pgina 56

    Combinar. Combinan estas soluciones para crear una solucin alproblema original.

    La tcnica Dividir para Conquistar (o Divide y Vencers) consiste endescomponer el caso que hay que resolver en subcasos ms pequeos,resolver independientemente los subcasos y por ltimo combinar lassoluciones de los subcasos para obtener la solucin del caso original.

    Caso General

    Consideremos un problema arbitrario, y seaAun algoritmo sencillo capaz deresolver el problema. A debe ser eficiente para casos pequeos y lodenominamos subalgoritmo bsico.

    El caso general de los algoritmos de Divide y Vencers (DV) es como sigue:

    funcin DV(x){

    si x es suficientemente pequeo o sencillo entoncesdevolverA(x)

    descomponer x en casos ms pequeos x1, x2, x3 , ... , xlpara i1 hasta l hacer

    yi DV(xi)recombinar losyipara obtener una solucinyde xdevolver y

    }

    El nmero de subejemplares l suele ser pequeo e independiente del casoparticular que haya que resolverse.

    Para aplicar la estrategia Divide y Vencers es necesario que se cumplan trescondiciones:

    La decisin de utilizar el subalgoritmo bsico en lugar de hacerllamadas recursivas debe tomarse cuidadosamente.

    Tiene que ser posible descomponer el caso en subcasos y recomponerlas soluciones parciales de forma eficiente.

    Los subcasos deben ser en lo posible aproximadamente del mismotamao.

    En la mayora de los algoritmos de Divide y Vencers el tamao de los lsubcasos es aproximadamente m/b, para alguna constante b, en donde m esel tamao del caso (o subcaso) original (cada subproblema esaproximadamente del tamao 1/b del problema original).

  • 8/7/2019 Manual de Analisis y Diseo de Algoritmos V 1.0

    58/127

    Pgina 57

    El anlisis de tiempos de ejecucin para estos algoritmos es el siguiente:

    Sea g(n) el tiempo requerido por DV en casos de tamao n, sin contar eltiempo necesario para llamadas recursivas. El tiempo total t(n) requeridopor este algoritmo de Divide y Vencers es parecido a:

    t(n) = lt(n/ b) + g(n) para l = 1 yb = 2

    siempre que n sea suficientemente grande. Si existe un entero k= 0tal que:

    g(n)(nk),

    se puede concluir que:

    T(nk) si l bk

    Se deja propuesta la demostracin de esta ecuacin de recurrencia usandoanlisis asinttico.

    5.4 Program acin Dinmica

    Frecuentemente para resolver un problema complejo se tiende a dividir este

    en subproblemas ms pequeos, resolver estos ltimos (recurriendoposiblemente a nuevas subdivisiones) y combinar las soluciones obtenidaspara calcular la solucin del problema inicial.

    Puede ocurrir que la divisin natural del problema conduzca a un grannmero de subejemplares idnticos. Si se resuelve cada uno de ellos sintener en cuenta las posibles repeticiones, resulta un algoritmo ineficiente;en cambio si se resuelve cada ejemplar distinto una sola vez y se conserva elresultado, el algoritmo obtenido es mucho mejor.

    Esta es la idea de la programacin dinmica: no calcular dos veces lo mismo

    y utilizar normalmente una tabla de resultados que se va rellenando amedida que se resuelven los subejemplares.

    La programacin dinmica es un mtodo ascendente. Se resuelven primerolos subejemplares ms pequeos y por tanto ms simples. Combinando lassoluciones se obtienen las soluciones de ejemplares sucesivamente msgrandes hasta llegar al ejemplar original.

  • 8/7/2019 Manual de Analisis y Diseo de Algoritmos V 1.0

    59/127

    Pgina 58

    Ejemplo:

    Consideremos el clculo de nmeros combinatorios. El algoritmo sera:

    funcinC(n, k)s i k=0 o k=nentonces devolver 1sino devolver C(n-1, k-1) + C(n-1, k)

    Ocurre que muchos valores C(i,j), con i < n yj < kse calculan y recalculanvarias veces.

    Un fenmeno similar ocurre con el algoritmo de Fibonacci.

    La programacin dinmica se emplea a menudo para resolver problemas deoptimizacin que satisfacen el principio de optimalidad: en una secuenciaptima de decisiones toda subsecuencia ha de ser tambin ptima.

    Ejemplo:

    Si el camino ms corto de Santiago a Copiap pasa por La Serena, la partedel camino de Santiago a La Serena ha de ser necesariamente el caminomnimo entre estas dos ciudades.

    Podemos aplicar esta tcnica en:

    Camino mnimo en un grafo orientado

    rboles de bsqueda ptimos

    5.5 Algoritmos vidos

    Los algoritmos vidos o voraces (Greedy Algorithms) son algoritmos quetoman decisiones de corto alcance, basadas en informacin inmediatamentedisponible, sin importar consecuencias futuras.

    Suelen ser bastante simples y se emplean sobre todo para resolver problemasde optimizacin, como por ejemplo, encontrar la secuencia ptima para

    procesar un conjunto de tareas por un computador, hallar el camino mnimode un grafo, etc.

    Habitualmente, los elementos que intervienen son:

    un conjunto o lista de c a n d i d a t o s (tareas a procesar, vrtices delgrafo, etc.);

    un conjunto de dec i s i ones ya tomadas (candidatos ya escogidos);

    una f unc i n que determina si un conjunto de candidatos es unas o l u c i n al problema (aunque no tiene por qu ser la ptima);

  • 8/7/2019 Manual de Analisis y Diseo de Algoritmos V 1.0

    60/127

    Pgina 59

    una f unc i n que determina si un conjunto es c o m p l et a b l e, esdecir, si aadiendo a este conjunto nuevos candidatos es posiblealcanzar una solucin al problema, suponiendo que esta exista;

    una f unc i n de seleccin que escoge el candidato an noseleccionado que es msp r o m e t ed o r ;

    unaf un c i n ob j e t i vo que da el valor/coste de una solucin (tiempototal del proceso, la longitud del camino, etc.) y que es la que sepretende maximizar o minimizar;

    Para resolver el problema de optimizacin hay que encontrar un conjunto decandidatos que optimiza la funcin objetivo. Los algoritmos voraces

    proceden por pasos.

    Inicialmente el conjunto de candidatos es vaco. A continuacin, en cadapaso, se intenta aadir al conjunto el mejor candidato de los an noescogidos, utilizando la funcin de seleccin. Si el conjunto resultante no escompletable, se rechaza el candidato y no se le vuelve a considerar en elfuturo. En caso contrario, se incorpora al conjunto de candidatos escogidos ypermanece siempre en l. Tras cada incorporacin se comprueba si elconjunto resultante es una solucin del problema. Un algoritmo voraz escorrecto si la solucin as encontrada es siempre ptima.

    El esquema genrico del algoritmo voraz es:

    funcion voraz(C:conjunto):conjunto{ C es el conjunto de todos los candidatos }S

  • 8/7/2019 Manual de Analisis y Diseo de Algoritmos V 1.0

    61/127

    Pgina 60

    Ejemplo: Mnimo nmero de monedas

    Se desea pagar una cantidad de dinero a un cliente empleando el menornmero posible de monedas. Los elementos del esquema anterior seconvierten en:

    candidato: conjunto finito de monedas de, por ejemplo, 1, 5, 10 y 25unidades, con una moneda de cada tipo por lo menos;

    solucin: conjunto de monedas cuya suma es la cantidad a pagar;

    completable: la suma de las monedas escogidas en un momento dadono supe