Está en la página 1de 56
Capitulo Anilisis de algoritmos 4.1 INTRODUCCION El objetivo principal de este libro es ensefiarle a disefiar sus propios algoritmos efi- cientes. Sin embargo, cuando uno se enfrenta con varios algoritmos distintos para resolver el mismo problema, es preciso decidir cual de ellos es el mas adecuado para la aplicacién considerada. Una herramienta esencial para este propdsito es el anilisis de algoritmos. S6lo después de haber determinado la eficiencia de los dis- tintos algoritmos serd posible tomar una decisién bien informada. Pero no hay una f6rmula magica para analizar la eficiencia de los algoritmos. En su mayor parte, es una cuestidn de juicio, intuicién y experiencia. Sin embargo, existen algunas téc- nicas basicas que suelen resultar utiles, tales como saber la forma de enfrentarse a estructuras de control y a ecuaciones de recurrencia. Este capitulo abarca las téc- nicas de uso mas frecuente, y las ilustra con ejemplos. Se hallaran mds ejemplos a lo largo de todo el libro. 4.2 ANALISIS DE LAS ESTRUCTURAS DE CONTROL El andlisis de los algoritmos suele efectuarse desde dentro hacia afuera. En primer lugar, se determina el tiempo requerido por las instrucciones individua- les (este tiempo suele estar acotado por una constante); después se combinan estos tiempos de acuerdo con las estructuras de control que enlazan las ins- trucciones del programa. Algunas estructuras de control, como la composicién secuencial—poner una instruccién tras otra—son faciles de analizar, mientras que los bucles mientras’ son mas sutiles. En esta seccién, ofreceremos unos principios generales que resultan utiles en aquellos andlisis relacionados con las estructuras de control de uso mas frecuente, asi como ejemplos de la aplicacion de estos principios. 112 Andlisis de Algoritmos Capitulo 4 4.2.1 Secuencias Sean P, y P, dos fragmentos de un algoritmo, Pueden ser instrucciones indivi- duales 0 bien subalgoritmos complicados. Sean f, y t, los tiempos requeridos por P, y P, respectivamente. Estos tiempos pueden depender de distintos parémetros, tales como el tamajio del caso. La regla de la composici6n secuencial dice que el tiempo necesario para calcular “P,; P,”, esto es, primero P, y después P., es sim- plemente /, + #,. Por la regla del maximo este tiempo esta en O(méax (t,, !,)). A pesar de su sencillez, la aplicacin de esta regla puede ser menos facil de lo que parece en principio. Por ejemplo, puede ser que uno de los pardmetros que controlan t, dependa del resultado del calculo efectuado por P,. Por tanto, el andlisis de “P,; P,” no siempre se puede efectuar considerando P, y P, inde- pendientemente. 4.2.2 Bucles “para” (desde) Los bucles? (lazos) para (desde)' son los bucles mds faciles de analizar. Consi- dérese el bucle siguiente. para i < 1 hasta m hacer P(i) Tanto aqui como en el resto del libro adoptamos el convenio de que = 0 no es un error; significa simplemente que la instruccién controlada P(i) no se ejecuta ni una sola vez. Supongamos que este bucle es parte de un algoritmo més extenso, que trabaja en un ejemplar de tamafio w. (Tenga cuidado para no confundir n con m.) El caso mas sencillo es aquel en el cual el tiempo requerido por P(/) no depende real- mente de /, aun cuando pudiera depender del tamafio del ejemplar 0, mas general- mente, del ejemplar en si. Supongamos que # denota el tiempo requerido para calcular P(j). En este caso, el andlisis evidente del bucle es que P(i) se efecttia m ve- ces, cada una de las cuales tiene un coste f, y por tanto el tiempo total requerido por el bucle es simplemente / = mt. Aun cuando este enfoque suele ser apropiado, exis- te un posible problema: no hemos tenido en cuenta el tiempo necesario para el coir- trol del bucle. Después de todo, nuestro bucle for es una abreviatura de algo pareci- do al siguiente bucle mientras: jel mientras i < #1 hacer PG) iei+t En casi todas las situaciones es razonable asignar un coste unitario a la com- probacion i 1. El problema de este argumento es que si estamos realmen- te analizando todo un algoritmo y no simplemente el bucle para, entonces el umbral implicito en la notacién © concierne a 1, el tamafio del caso, y no a m, el ntimero de veces que pasamos por el bucle, y m = 0 podria suceder para va- lores arbitrariamente grandes de n. Por otra parte, siempre y cuando f esté aco- tado inferiormente por alguna constante (lo cual siempre es cierto en la practica), y siempre y cuando exista un umbral 1), tal que m > 1 siempre que 1! 2 ity, el pro- blema 4.3 pide demostrar que / esta ciertamente en Q(t) cuando /, mt y | se con- sideran como funciones de 11. El anilisis de bucles para es mas interesante cuando el tiempo f(/) requerido por P(i) varia como funcién de i. (En general, el tiempo requerido por P(i) podria de- pender no sélo de i sino también del tamajfio del caso, 1, 0 incluso del caso en si.) Si despreciamos el tiempo requerido por el bucle de control, lo cual suele ser co- rrecto siempre que m > 1, entonces ese mismo bucle para requiere un tiempo que no esta dado por una multiplicacién, sino por una suma: se tratade L” Hi), Lax técnicas de la Seccién 1.7.2 suelen resultar titiles para traducir estas sumas a la no- tacion asintética, mas sencilla. Ilustraremos el anélisis de bucles para con un sencillo algoritmo para calcular la sucesién de Fibonacci que evaludbamos empiricamente en la Seccidn 2.7.5. Re- petimos a continuaci6n el algoritmo: funcidn Fibiter() ie 1;foo0 para k <1 hasta 1 hacer j 1. Si despreciamos el tiempo requerido por el control del bucle y por las instrucciones que preceden al bucle (y por las que lo siguen), con- cluiremos que el tiempo requerido por el algoritmo esta acotado superiormente por Yekac Sec? €O(n") Un razonamiento similar indica que este tiempo se encuentra en 2(77), y que por tanto esta en @(v). Por tanto, contar 0 no como de coste unitario las opera ciones aritméticas supone una diferencia crucial en el andlisis de Fibiter. El anilisis de bucles para que empiezan en un valor que no sea 1, o que avan- zan con pasos mayores, deberia resultar evidente a partir de lo dicho. Considére- se el siguiente ejemplo de bucle: para i — 5 hasta m paso 2 hacer P(i) Aqui, P(i) se ejecuta ((m — 5) + 2) + 1 veces siempre que m > 3. (Para que un bu- cle para tenga sentido, el punto final siempre deberia ser tan grande como el pun- to inicial menos el paso.) 4.2.3 Llamadas recursivas El andlisis de algoritmos recursivos suele ser sencillo, al menos hasta cierto punto. Una inspeccién sencilla del algoritmo suele dar lugar a una ecuacién de Seccion 4.2 Anilisis de las estructuras de control recurrencia que “remeda” (imita) el flujo de control dentro del algoritmo. Una vez que se ha obtenido la ecuacién de recurrencia, se pueden aplicar las ténicas ge- nerales descritas en la Seccién 4.7 para transformar la ecuacién en la ecuacién asintotica no recursiva, que es mas sencilla. Como ejemplo, considérese de nuevo el problema consistente en calcular la su- cesién de Fibonacci, pero esta vez con el algoritmo recursivo Fibrec, que compa- rabamos con Fibiter en la Seccién 2.7.5. funcién Fibrec(1) sin <2 entonces devolver 1: sino devolver Fibrec(i - 1) + Fibrec(n - 2) Sea TU) el tiempo requerido por una llamada a Fibrec(s1). Si 1 < 2, el algoritmo devuelve simplemente #, lo cual requiere algtin tiempo constante a. En caso con- trario, la mayor parte del trabajo se invierte en las dos llamadas recursivas, que requieren un tiempo T(7-1) y T(n-2) respectivamente. Ademés, hay que efectuar una suma de f,,, yf,» (que son los valores proporcionados por las llamadas recur- sivas), y también hay que efectuar el control de la recursividad y la comprobacién “sin <2”. Sea h(n) el trabajo implicado en esta suma y en este control, esto es, el tiempo requerido por una Slamada a Fibrec(#) ignorando los tiempos invertidos dentro de las dos llamadas recursivas. Por definicién de T() y de /i(m), obtenemos Ta siguiente recurrencia: Tu) = a sin=O06n=1 P=) T(n=1)+TU—2)4 Hn) en caso contrario av Si contamos las sumas con coste unitario, f(11) esta acatado por una constante, y la ecuacién de recurrencia para T(ir) es muy similar a la que ya hemos encon- trado para g(t) en la Seccién 1.6.4. La induccién constructiva se aplica igualmen- te bien para alcanzar la misma conclusién: T(17) € O(f,). Sin embargo, es mas sen- cillo en este caso aplicar la técnica de la Seccién 4.7 para resolver la recurrencia 4.1. Un razonamiento similar muestra que T(1) € Q(f,), y por tanto TG) € O(f,). Em- pleando la formula de Moivre, concluimos que Fibrec(1) requiere un tiempo e.- ponencial en 1. Es decir doblemente exponencial en el tamaiio del caso, puesto que el valor de es exponencial en el tamario de n. Si no se cuentan las adiciones con un coste unitario, (11) ya no queda acotado por una constante. En lugar de ocurrir esto, h(u) esté dominado por el tiempu re- querido para la adicién de f,_, y f,. para 1 suficientemente grande. Ya hemos vis- to que esta adicién requiere un tiempo que es del orden exacto de 1. Por tanto /1(7) € (1). Las técnicas de la Seccion 4.7 son aplicables una vez mas para resolver la recurrencia 4.1. Sorprendentemente, el resultado es el mismo independientemen- te de si () es constante o lineal: sigue sucediendo que T(n) € O(f,). En conclu- sién, Fibrec(n) requiere un tiempo exponencial en 17 (jtanto si se cuentan las adi- ciones con coste unitario como si no!). La unica diferencia es la constante multi- plicativa oculta en la notacién 0. Capitulo 4 4.2.4 Bucles “mientras” (while) y “repetir” (repeat) Los bucles mientras (while) y repetir (repeat) suelen ser mas dificiles de ana- lizar que los bucles para (for), porque no existe una forma evidente a priori de sa- ber cudntas veces tendremos que pasar por el bucle. La técnica est4ndar para ana- lizar estos bucles es hallar una funcién de las variables implicadas cuyo valor se decremente en cada pasada. Para concluir que el bucle terminaré por acabar, bas- ta con saber que este valor debe ser un entero positivo. (No se puede seguir de- crementando indefinidamente un minimo natural.) Para determinar el nimero de veces que se repite el bucle, sin embargo, necesitamos conocer mejor la forma en que disminuye el valor de esta funcién. Una aproximacién alternativa al ana- lisis del bucle mientras consiste en tratarlo como un algoritmo recursivo. Ilustra- remos ambas técnicas con el mismo ejemplo. El andlisis de bucles repetir se efec- ttia de manera similar; no daremos ejemplos de ellos en esta seccién. Estudiaremos con detalle la busqueda binaria en la Secci6n 7.3. Sin embargo, la utilizamos ahora porque ilustra perfectamente el andlisis de los bucles mientras. El objetivo de la basqueda binaria es hallar un elemento x de un vector T[1..n] que esté ordenado de modo no decreciente. Supongamos por sencillez que esta garan- tizado que x aparece al menos una vez en T. (El caso general se trata en la Seccién 7.3.) Se nos pide buscar un entero i tal que 1 si sm y T[i] = x. La idea basica que subyace a la biisqueda binaria es comparar x con el elemento y que esté en la po- sicién media de T, La basqueda concluye si x = y; se puede limitar a la mitad su- perior de la matriz si x > y; en caso contrario resulta suficiente examinar la mitad inferior. Obtenemos el siguiente algoritmo (en la Seccién 7.3 se da un algoritmo un poco mejor; véase el problema 7.11): funcién Biisqueda binaria(T(1..1], x) { Este algoritmo supone que x se encuentra en T} iedjjen mientras i < j hacer {T[i] Tiki kel devolver i Recuerde que para analizar el tiempo de ejecucién de un bucle mientras hay que hallar una funci6én de las variables nombradas en el bucle cuyo valor ira de- creciendo en cada pasada por el bucle. En este caso, resulta natural considerar j-i+1, expresi6n que lamaremos d. Por tanto d representa el namero de ele- mentos restantes de T que hay que examinar. Inicialmente, d = n, El bucle con- cluye cuando i 2 j, lo cual es equivalente ad = 1. (De hecho, d nunca puede ser menor que 1, pero no utilizaremos esto.) Cada vez que se pasa por el bucle, hay tres posibilidades: 0 bien se da a j el valor k -1, 0 bien se da a i el valor k + 1,0 Seccion 4.2 . . _ Andlisis de las estructuras de control bien tanto i como j reciben el valor k. Supongamos que d y d representan respecti- vamente los valores de j — i + 1 antes y después de la iteracién que estamos consi- derando. Utilizaremos i, j, fy j de forma similar. Si x < TIk], entonces se ejecuta la instruccién "j —k-1” y por tanto 7 = iy j= [( +j) + 21-1. Por consiguiente, d=j-f+1=G+ps2-isG+p/2-i TIk| entonces se ejecuta la instruccién “i — k + 1” y por tanto ee a, felit fs2]+1yjsj Por tanto, d=j-i+1l=j-(G+p+2 1, y sea d, = 1. Puesto que d,_, es el valor de j - i + 1 antes de comenzar la (-ésima iteracién, hemos demostrado que d, 1. Se sigue in- mediatamente por induccién matematica que d, Oyx 0 y x < TIj]) del bucle mientras. Consideremos un valor fijo de i. Sea x = T[i], como en el algoritmo. El caso peor surge cuando x es menor que T|j] para todo j entre 1 e i-1, puesto que en este caso tenemos que comparar x con Tli- 1], Tli -21,...,TI1] antes de poder salir del bucle mientras, porque j = 0. Por tanto el bucle mientras se efecttia i veces en el caso peor. Este caso peor sucede para todos los valores de i entre 2 yn cuando el vector esta ordenado inicialmente por orden decreciente. En- tonces la comprobacién del barémetro se efecttia Ei-2 i = n(n + 1)/2-1 veces en total, lo cual esta en @). Esto muestra que la ordenacién por insercién requiere también un tiempo que est en (i?) para ordenar 11 objetos en el ca- SO peor. Algoritmo de Euclides Se recordar de la Seccién 2.7.4 que el algoritmo de Euclides se utilizaba para calcular el maximo comtin divisor de dos enteros. fancién Euclid(m, n) mientras 1 > 0 hacer fom m m, siempre es cierto que m mod m1 < 1/2: 0 Sim > 1/2, entonces 1 < n/m <2, y por tanto n +m = 1, lo cual implica que > mod m =Hn-mx (rem) sn—m my por tan- to vuelve a ser aplicable el mismo razonamiento: si el algoritmo no se ha deteni- do antes, otras dos pasadas por el bucle haran que el valor de 1» sea al menos dos veces mas pequefo. Con cierta experiencia, la conclusién es ahora inmediata: en el bucle se va a entrar como maximo, aproximadamente, 2 lg 1 veces. Formalmente, lo mejor es completar el andlisis del algoritmo de Euclides tra- tando al bucle mientras como si fuese un algoritmo recursivo. Sea f(/) el maximo numero de veces que el algoritmo pasa por el bucle con unas entradas m y n cuan- do es m <<, Sin S$ 2, pasamos por el bucle o bien cero veces (si m = 0) o bien una vez. En caso contrario, o bien pasamos por el bucle menas de dos veces (si m = 0.6m divide a 1 exactamente), o al menos dos veces. En este ultimo caso, el va- lor de n se divide al menos por dos (y por tanto pasa a ser como mucho / + 2) y el de m pasa a no ser mayor que el nuevo valor de 11. Por tanto, se necesitan como maximo f(/ + 2) pasadas adicionales por el bucle para completar el cdlculo. Esto produce la recurrencia siguiente: noalt sil <2 © |2+H' +2) encaso contrario Esto es un caso especial de la Ecuacion 4.2 y las técnicas de la Seccién 4.7 se aplican igualmente bien, para concluir que H/) € O(log /}, lo cual demuestra que el algoritmo de Buclides se ejecuta en un tiempo lineal con respecto al tamaiio de la entrada proporcionada, siempre y cuando sea razonable considerar como ele- mentales todas las operaciones aritméticas. Es interesante saber que este algorit- mo tiene su peor rendimiento con entradas de cualquier tamano dado cuando m y 1 son dos nimeros consecutivos de la sucesién de Fibonacci. Quizé se pregunte el lector por qué hemos usado i(/) para acotar el néimero de ve- ces que pasa el algoritmo por el bucle con unas entradas m y # cuando mS nS ¢, en lugar de definir # directamente como una funcién de 1, el mayor de los dos operan- dos. Pareceria més natural definir (12) como el maximo numero de veces que pasa el algoritmo por el bucle con unas entradas m y » cuando m < w. El problema es que es- ta definicidn no nos permitiria concluir que f(r) <2 + t(n + 2) partiendo del hecho de que ite divide cuando menos por dos después de hacer dos pasadas por el bucle. Por ejemplo, (13) = 5 con Euclid(8, 13) como caso peor, mientras que #(13 = 2) = H6) = 2. Esto sucede porque dos pasadas por el bucle después de una llamada a [uclid(8, 1° 124 Anilisis de Algoritmos . Capitulo 4 no nos deja con 1 = 6 sino con nt = 5 (y m = 3), y en efecto (13) <2 + #6) porque #5) = 3 (precisamente con Euclid(3, 5) como caso peor). El origen del problema es que la de- finicién “mas natural” para t no proporciona una funcién no decreciente puesto que 16) > 4), y por tanto la existencia de algdn n’ 0 entonces Hanoi(m - 1, i, 6 -i-j) escribir i “> “j Hanoi(m - 1, 6-i-j, j) Para analizar el tiempo de ejecucién de este algoritmo, utilizamos la instruccién escribir como barémetro. Supongamos que f(m) denota el ntimero de veces que se Secci6n 4.4 Ejemplos adicionales 125 ejecuta en una llamada a Hanoi(m, -, :). Por inspeccién del algoritmo, obtenemos la recurrencia siguiente: 0 sim=0 t(m) = “ 2t(m-1)+1 en caso contrario (43) a partir de la cual la técnica de la Seccién 4.7 produce t(m)=2"— 1; véase el Ejemplo 4.7.6. Dado que el namero de ejecuciones de la instruccién escribirt es una buena medida del tiempo requerido por el algoritmo, concluimos que se ne- cesita un tiempo que est4 en @(2") para resolver el problema con 1 anillos. De he- cho, se puede demostrar que el problema con n anillos no se puede resolver en menos de 2”-1 movimientos y por tanto el algoritmo es 6ptimo si uno insiste en imprimir toda la secuencia de movimientos. 21 (PLL l>ltle Lldeliirv> ltl l£l7l a) Figura 4.1. Las torres de Hanoi Calculo de determinantes Otro ejemplo mas de anilisis de Ja recursividad es el que concierne al algoritmo recursivo para calcular un determinante. Recuérdese que el determinante de una ma- triz n x n se puede calcular a partir de los determinantes de m matrices mas peque- fias, (n — 1) x (n— 1) que se obtienen borrando la primera fila y alguna columna de la matriz original. Una vez, que se han calculado los n subdeterminantes, el determi- nante de la matriz original se calcula con mucha rapidez. Ademés de las llamadas re- cursivas, la operacién dominante que se necesita consiste en crear las n submatrices cuyos determinantes es preciso calcular. Esto requiere un tiempo que esta en @(7) si se implementa directamente, pero basta un tiempo @(n) si se utilizan punteros en lu- gar de copiar elementos. Por tanto, el tiempo total t(7) que se necesita para calcular el determinante de una matriz n x n mediante el algoritmo recursivo est4 dado por la recurrencia i(7) = ni(n-1) + h(n) para n = 2, donde h(n) € @(n). Esta recurrencia no se puede tratar mediante las técnicas de la Seccién 4.7. Sin embargo, vimos en el pro- blema 1.31 que la induccién constructiva es aplicable para concluir que t(7) € @(n!), lo cual muestra que este algoritmo es muy ineficiente. La misma conclusién es vali- da si somos menos inteligentes y necesitamos h(7) € @(1°). Recuérdese de la Seccion 2.7.1 que el determinante se puede calcular en un tiempo que est4 en (n°) por eli- minacién de Gauss-jordan, e incluso mas deprisa mediante otro algoritmo recursivo de la familia “divide y vencerds”. Se precisa mas esfuerzo para analizar estos algo- ritmos si se tiene en cuenta el tiempo requerido para las operaciones aritméticas. 126 Anilisis de Algoritmos Capitulo 4 4.5 ANALISIS DEL CASO MEDIO Vimos que la ordenacion por insercién requiere un tiempo cuadratico en el ca- so peor. Por otra parte, es facil mostrar que concluye en un tiempo lineal en el ca- so mejor. Es natural preguntarse por su eficiencia ei ef caso medio. Para que esta pregunta tenga sentido, debemos ser precisos acerca del significado de “en el ca- so medio”. Esto requiere suponer a priori una distribucion de probabilidad para los casos en que se pedir que resuelva nuestro algoritmo. La conclusién del ana lisis en el caso medio puede depender crucialmente de esta suposicién, y este ana- lisis puede inducir a error si de hecho nuestras suposiciones no se corresponden con la realidad de la aplicaci6n que utiliza el algoritmo. Este tema tan importan- te se discutia con mds extensi6n en la Seccién 2.4, y volveremos a él en la Seccién 10.7. En la mayoria de las ocasiones, los andlisis en el caso medio se efecttian ha- ciendo la suposicién (mas 0 menos realista) consistente en que todas los ejempla- res de un tamano dado son igualmente probables. Para los problemas de ordena- cién, resulta mas sencillo suponer también que todos los elementos que hay que ordenar son distintos. Supongamos que se tienen que ordenar 1 elementos distintos por insercién, y que las #! permutaciones de estos elementos son igualmente probables. Para de- terminar el tiempo requerido en el caso medio por el algoritmo, podriamos sumar los tiempos requeridos para ordenar todas y cada una de las permutaciones posi bles y dividir entonces por #7! la respuesta obtenida. Una aproximacién alternati- va, mas sencilla en este caso, consiste en analizar directamente el tiempo requeri- do por el algoritmo, razonando probabilisticamente a medida que vayamos avan- zando. Para todo i, con 2 0 y x < TIj]) del bucle mientras. Por definicién del rango parcial, y dado que T[1../ - 1] esta ordenado, esta comproba- cidn se efecttia exactamente i - k + 1 veces. Dado que todo valor de k entre 1 e; tiene una probabilidad de ocurrir igual a 1/i, el numero medio de veces que se efecttia la comprobacién barémetro para cualquier valor dado de i es Seccion 4.6 amortizado 127 idee Estos sucesos son independientes para distintos valores de i. El nimero total medio de veces que se efecttia la comprobacién barémetro cuando se ordenan 1 elementos es por tanto que esté en @(17). Concluimos entonces que la ordenacién por insercién hace en el caso medio aproximadamente la mitad de comparaciones que en el caso peor, pe- ro este naimero sigue siendo cuadratico. 4.6 ANALISIS AMORTIZADO En algunas ocasiones, el andlisis del caso peor es excesivamente pesimista. Considérese por ejemplo un proceso P que tiene efectos secundarios, lo cual sig- nifica que P modifica el valor de variables globales. Como resultado de los efectos secundarios, dos lamadas sucesivas e idénticas a P podrian requerir cantidades de tiempo radicalmente diferentes. Cuando se esté analizando un algoritmo que tenga a P como subalgoritmo, lo faci] seria analizar P en el caso peor, y suponer que sucede lo peor cada vez que se llama a P. Este enfoque produce una respues- ta correcta suponiendo que estemos satisfechos con un analisis en notacién O, por oposicién a la notacién @, pero la respuesta seria pesimista. Considérese por ejem- plo el bucle siguiente: para i < 1 hasta 1 hacer P Si P requiere un tiempo en @(log 7) en el caso peor, es correcto concluir que el bucle requiere un tiempo en O(n log 1), pero puede suceder que sea mucho mas rapido incluso en el caso peor. Esto podria suceder si P no puede tardar mucho tiem- po (Q(log n)) a no ser que haya sido invocado muchas veces anteriormente, con un coste pequenio en todas las llamadas. Por ejemplo, podria suceder que P requirie- ra un tiempo constante en el caso medio, en cuyo caso el bucle completo se ejecu- taria en un tiempo lineal. En este caso, el significado de “en el caso medio” es completamente distin- to del que se encontraba en la Seccién 4.5. En lugar de tomar la media sobre to- das las posibles entradas, lo cual requiere una suposicién acerca de la distri- bucién de probabilidad de los casos, tomamos la media sobre llamadas sucesi- vas. Aqui los tiempos requeridos por las diferentes llamadas tienen una fuerte relacién entre si, mientras que en la Seccién 4.5 suponiamos implicitamente 128 Anilisis de Algoritmos . Capitulo 4 que cada Ilamada era independiente de las demas. Para evitar confusiones, di- remos en este contexto que toda llamada a P requiere un tiempo constante amortizado en lugar de decir que requiere un tiempo constante en el caso me- dio. Decir que un proceso requiere un tiempo constante amortizado significa que existe una constante c (que s6lo dependerd de Ja implementacién) tal que para todo n positivo y para cualquier secuencia de n llamadas al proceso, el tiempo total para esas llamadas esta acotado superiormente por cn. Por tanto, se permi- te un tiempo excesivo para una llamada sdlo si se han registrado tiempos muy breves anteriormente, y 110 si tan sélo las llamadas posteriores fueran mas rdpi- das. De hecho, si permitiéramos que una llamada fuera costosa basdndonos en que nos prepara para llamadas posteriores mucho més rdpidas, entonces el gas- to se desperdiciaria si esa llamada fuera la ultima. Considérese por ejemplo el tiempo necesario para conseguir una taza de ca- fé en la sala de profesores. La mayor parte de las veces basta entrar, coger la cafetera y poner el café en nuestra taza. De vez en cuando, sin embargo, tiene uno la mala suerte de encontrar vacia la cafetera: hay que hacer otra, lo cual re- quiere bastante mds tiempo. Y ya de paso, puede uno hacer un poco de lim- pieza. Por tanto, el algoritmo para tomar café requiere una cantidad notable de tiempo en el caso peor, y sin embargo es rapido en el sentido amortizadg, por- que sdlo se tarda mucho tiempo después de haber obtenido répidamente bas- tantes tazas. (Para que esta analogia funcione correctamente, es preciso asumir con muy poco realismo que la cafetera esté llena cuando entra la primera per- sona; en caso contrario precisamente la primera taza requeriria demasiado tiempo.) Un ejemplo clasico de este comportamiento en programacién concierne a la reserva de espacio con una necesidad ocasional de “recogida de basura”. Un ejemplo ms sencillo es el que concierne a la actualizacién de un contador bina- rio. Supongamos que se desea manejar el contador como si fuera un vector de bits que representan el valor del contador en notacién binaria: el vector C[1..m] representa 2”", 2"4C [j]. Por ejemplo, el vector [0, 1, 1, 0, 1, 1] representa el 27. Dado que uno de estos contadores sdlo puede llegar hasta 2"— 1, supondremos que nos basta con contar el médulo 2” (alternativamente, podriamos generar un mensaje de error en caso de desbordamiento). Lo que sigue es el algoritmo para afadir 1 al contador: procedimiento contar (C[1..m]) {Este procedimiento supone que m 21 y que Clj] € (0, 1} para todo 1 0 bits posterior- mente, entonces el niimero de fichas disponibles en la cuenta después de la Ila- mada se habra incrementado en j - i (contando los incrementos negativos como decrementos). Consiguientemente, el nimero de fichas que hay en la cuenta es siempre exactamente igual al ntimero de bits puestos a 1 en el contador en ese momento (salvo que el contador se haya puesto a cero, en cuyo caso habré més fichas en la cuenta). Esto demuestra que la cuenta nunca queda en descubierto, puesto que el ntimero de bits puestos a 1 no puede ser negativo, y por tanto to- da llamada a contar costara como maximo dos fichas en el sentido amortizado. Utilizaremos esta técnica en la Seccién 5.8 para analizar la eficiencia amortizada de los monticulos binomiales. 4.7 RESOLUCION DE RECURRENCIAS El uJtimo paso indispensable cuando se esta analizando un algoritmo es fre- cuentemente la resolucién de una ecuacién de recurrencia. Con un poco de expe- riencia y de intuicién, la mayoria de las recurrencias se puede resolver mediante suposiciones inteligentes. Sin embargo, existe una potente técnica que se puede utilizar para resolver de forma casi automética ciertas clases de recurrencias, es e] tema principal de esta seccién: la técnica de la ecuacién caracteristica. 4.7.1 Suposiciones inteligentes Este enfoque suele desarrollarse en cuatro etapas: calcular los primeros valores de la recurrencia, buscar una regularidad, inventar una forma general adecuada y demostrar finalmente por induccién matematica (quiza por induccién construc- tiva) que esta forma es correcta. Considérese la recurrencia siguiente: 0 sin=0 TH= ™ {srive2ven en caso contrario Una de las primeras lecciones que le ensefiard la experiencia ver recutrencias es que las funciones discontinuas tales como la funcién trunca- Seccién 4.7 Resolucin de recurrencias 133 cién (implicita en n + 2) son dificiles de analizar. Nuestro primer paso es susti- tuir n +2 por “n/2”, que tiene mejor comportamiento, aplicando una restriccién adecuada al conjunto de valores de n que consideremos inicialmente. Resulta tentador restringir n a valores pares, porque en este caso n + 2 = n/2, pero la di- visién recursiva de un numero par por 2 puede producir un namero impar ma- yor que 1. Por tanto, es mejor idea restringir n a una potencia de 2. Una vez que hayamos tratado este caso especial, el caso general se sigue facilmente en nota- ci6n asintética a partir de la regla de suavidad dada en la Seccién 3.4. En primer lugar, tabulamos la recurrencia de las primeras potencias de 2: n 1 2 4 8 16 32 Tin) | 1 5 19 65 2 665 Todos los términos de esta tabla menos el primero se calculan a partir del tér- mino anterior, Por ejemplo, T(16) = 3 x T(8) + 16 = 3 x 65 + 16 = 211. zPero es util esta tabla? jDecididamente, en la secuencia no sigue un patrén evidente! Qué re- gularidad podemos encontrar? La solucién se vuelve evidente si guardamos mas “historia” acerca del valor de T(n). En lugar de escribir T(2) = 5, resulta mds util escribir T(2) = 3x 1+ 2. Entonces, TA) = 3x T(2)+4=3x@Gx1+2) +4=Px143x244 Continuamos de esta manera, escribiendo n como potencia explicita de 2: 1 3x14+2 ¥x1+3x2P Belt ¥Px2+3x P+ B 3x14 Bx2+ Px2+3x B+ 2 Bx14+ 3x2+ Rx P+ Px 2+ 3x H+ B 1 2 2 2 a 2 Ahora la regla resulta evidente: T(2*) = 342° +3412) + 372? +... + 312k + 39k ik k = Yat! - 32/3)! ms i =3* x (1-(2/3")/(1-2/3) Proposici6n 1.7.10) a aR _ ket (45) 134 Andlisis de Algoritmos Capitulo 4 Es facil cotejar esta formula con nuestra tabulacién anterior. Por induccién (no por induccién matemética), ahora estamos convencidos de que la ecuacién 4.5 es correcta. ‘Sin embargo, vimos en la Seccién 1.6 que no siempre hay que confiar en la in- duccién. Por tanto, el andlisis de nuestra recurrencia cuando n es una potencia de 2 estaré incompleto mientras no demostremos la ecuacién 4.5 por induccién ma- tematica. Este ejercicio sencillo se deja para el lector. Volviendo la vista atrds, se podria haber adivinado la Ecuacién 4.5 con s6lo un poquito més de intuicién. Para esto habria bastado tabular el valor de T(n) + in pa- ra pequefios valores de i, tales como -2 0 y por tanto que #(m) € @(2”). Para es- to, obsérvese que t(m), el namero de movimientos de un anillo que se neces tan, no puede ciertamente ser negativo ni una constante, puesto que clara- mente f(t) 2 m. Qa Ejemplo 4.7.7, Considérese la recurrencia t,=2t,+n Esto se puede reescribir en la forma t,-2t,,=1 Seccion 4.7 Resolucién de recurrencias 145 que es de la forma de la Ecuacién 4.10 con b = 1 y p(t) = n, un polinomio de gra- do 1. El polinomio caracteristico es entonces (x= 2)(-1P con raices 2 (de multiplicidad 1) y 1 (de multiplicidad 2). Todas las soluciones son entonces de la forma £,=¢,2" +61" + cynl” (4.20) Siempre y cuando f, = 0, y por tanto f, = 0 para todo n, concluimos inmediata- mente que f, € O(2"), Se necesita un andlisis posterior para afirmar que f, € @(2"). Si sustituimos la ecuaci6n 4.20 en la recurrencia original, obtenemos n=t,-2t, = (c,2" ey Fn) —2(c,2"" ey #E2= D) = (2¢, =) - en de lo cual se obtiene directamente que 2c, ~ ¢, = 0 y -c, = 1, independientemente de Ja condicién inicial. Esto implica que c, = -1 yc, = -2. A primera vista, nos sentimos decepcionados porque es c, quien resulta ser relevante para determinar el orden exacto de t,, segtin se ve en la ecuacién 4.20, y lo que hemos obtenido son precisa- mente las otras dos constantes. Sin embargo, estas constantes transforman la ecua- cién 4.20 en t, =¢,2"-n-2. (421) Siempre y cuando f, = 0 y por tanto t, = 0 para todo n, la ecuacién 4.21 implica que c, debe ser estrictamente positivo. Por tanto, tenemos derecho a concluir que t, € @(2*) sin necesidad de resolver explicitamente para c,. Por supuesto, c, se pue- de obtener ahora con facilidad a partir de la condici6n inicial, si se desea. Alternativamente, se pueden determinar las tres constantes como funciones de ¢,, preparando y resolviendo el oportuno sistema de ecuaciones lineales que se obtiene de Ja ecuacién 4.20 y del valor de f, y t, calculados a partir de la recurrencia original. O Llegados aqui, quiz4 piense que a efectos practicos no tiene sentido preocupar- se por las constantes: el orden exacto de f, siempre se puede leer directamente a partir de la solucién general. {No es asi! O quiz piense que las constantes obteni- das por la técnica més sencilla de sustituir la solucién general en la recurrencia ori- ginal van a ser siempre suficientes para determinar su orden exacto. ;Tampoco es asi! Considere el ejemplo siguiente. 146 Andlisis de Algaritmos _ Capitulo 4 Ejemplo 4.7.8. Considérese la recurrencia 1 sin=0 n= "= V4r,,-2" en-caso contrario En primer lugar, se reescribe la recurrencia en la forma t,-4t,,=-2", que es la forma de la ecuaci6n 4.10 con b = 2 y p(n) = -1, un polinomio de grado 0. Por tanto el polinomio caracteristico es (x—4)(x - 2) con races 4 y 2, ambas de multiplicidad 1. Todas las soluciones, por tanto, son de la forma £,=¢4" + 0,2" (4.22) Quiza se sienta tentado de afirmar sin mas que ¢, € ©(4"), puesto que éste es claramente el término dominante de la ecuacién 4.22. Si tiene menos prisa, quiz4 desee sustituir la ecuacién 4.22 en la recurrencia ori- ginal, para ver lo que sale: -2" =1,-41,., = 6,4" +0,2" - 46,4" +052") 0,2" Por tanto, c, = 1 independientemente de la condicién inicial. El conocimiento de c, no es relevante directamente para determinar el orden exacto de f, dado por la ecuacién 4.22. A diferencia del ejemplo anterior, sin embargo, no se puede afirmar nada concluyente a partir del simple hecho de que c, sea positiva. Aun cuando hu- biéramos averiguado que c, era negativa, seguiriamos sin poder concluir nada acerca de c, de forma inmediata, porque esta vez no hay raz6n evidente que nos haga suponer que t, debe ser positivo. Dado que ha fallado todo lo demas, nos vemos obligados a determinar las cons- tantes. Podriamos preparar el sistema habitual de dos ecuaciones lineales con dos incégnitas que se obtiene a partir de la ecuacién 4.22 y de los valores de t, y t,, pe- x0 gpor qué vamos a despreciar el conocimiento que ya tenemos acerca de ¢,? Sa- bemos que f, = ¢,4" + 2”, Sustituyendo la condici6n inicial t, = 1 se tiene 1 = ¢, +1 y por tanto c, = 0. La conclusi6n es que la solucién exacta para esta recurrencia es simplemente f, = 2", y que jla afirmaci6n anterior, {t, € @(1‘), es incorrecta! Obsér- vese sin embargo que ¢, estaria en @(4") s se especificaré como condicién inicial al- Seccién 4.7 Resolucién de recurrencias_ 147 gun valor mds grande de t,, puesto que en general c, = t, — 1. Por otra parte, con una condici6n inicial t, < 1, f, toma valores negativos que crecen con rapidez ex- ponencial. Este ejemplo ilustra la importancia de la condicién inicial para algunas recurrencias, mientras que los ejemplos anteriores habian mostrado que el com- portamiento asintético de muchas recurrencias no se ve afectado por la condicién inicial, a] menos cuando tf, = 0. Una generalizacién adicional del mismo tipo de argumento nos permite resol- ver finalmente las recurrencias de la forma Aly + Uy tee tO» = Bip (n) + bY p, (n+... (4.23) donde los b, son constantes distintas y los p() son polinomios en n de grado d,. Estas recurrencias se resuelven empleando el siguiente polinomio caracte- ristico: (agx! ax "4. 4a, Ma Ber = be, que contiene un factor correspondiente al lado izquierdo y un factor correspon- diente a cada término del lado derecho. Una vez que se ha obtenido el polinomio caracteristico, la recurrencia se resuelve igual que antes. Ejemplo 4.7.9. Considérese la recurrencia 0 sin=0 a . " )2t,.+n+2" encaso contrario En primer lugar, se reescribe la recurrencia en la forma ft ha = nt 2", que es la forma de la ecuacién 4.23 con b, = 1, p(n) = 1, b, = 2y p,() = 1. El grado de p,(1t) es d, = 1 y el grado de p,(x) es d, = 0. El polinomio caracteristico es (2) -1)*(x-2), que tiene las raices 1 y 2, ambas con multiplicidad 2. Todas las soluciones de la re- currencia, por tanto, tienen la forma t, =e)" +¢,n1" +¢,2" +¢,n2", (4.24) A partir de esta ecuacién, concluimos que f, € O(n2") sin calcular las cons- tantes, pero necesitamos saber si c, > 0 0 no para determinar el orden exacto de 148 Andlisis de Algoritmos Capitulo 4 t,, Para hacer esto, se sustituye la ecuacién 4.24 en la recurrencia original, lo cual nos da n+2" = (2c, -¢,)-c,n + 6,2" Igualando los coeficientes de 2", se obtiene inmediatamente que c, = 1 y por tan- to ¢, € @(72"). Las constantes c, y c, se pueden leer con igual facilidad si se desea. La constante c, se puede obtener a partir de la Ecuacién 4.24, del valor de las de- més constantes y de la condicién inicial f, = 0. Alternativamente, se pueden determinar las cuatro constantes resolviendo cuatro ecuaciones lineales en cuatro incégnitas. Dado que se necesitan cuatro ecuaciones y que s6lo se tiene una ecuacién inicial, utilizamos la recurrencia pa- ra calcular los valores de los otros tres puntos: t, = 3, f, = 12 y f, = 35. Esto da lu- gar al siguiente sistema: G t+ G 0 n=0 G + G + Bw + 2, 3 n=l G + Wy + 4 + 8, = 12 n=2 c + 3c, + Be, + Ue, = 35 a=3 Al resolver este sistema se obtiene c, = -2, c, = -1, c, = 2 y c, = 1. Por tanto, ob- tenemos finalmente t, =n2" 42"! -n-2 4.7.4 Cambios de variable A veces es posible resolver recurrencias mds complicadas efectuando un cambio de variable. En los ejemplos siguientes, escribiremos T(7) para el término de una Te- currencia general, y ¢, para el término de una nueva recurrencia obtenida a partir de la primera mediante un cambio de variable. Asegtirese de estudiar el Ejemplo 4.7.13, que se encuentra entre las recurrencias m4s importantes a efectos de la Al- goritmica. Ejemplo 4.7.10 Reconsidere la recurrencia que se resolvid mediante suposicio- nes inteligentes en la Seccidn 4.7.1, pero sdlo para el caso en el cual 1 es una po- tencia de 2. Tn) 1 sin=1 " {arius2yen sim es una potencia de 2, n>1 Para traducila a una forma que sepamos resolver, sustituimos 1 por 2). Esto se consigue introduciendo una nueva recurrencia t, definida como f,=T(2'). Esta Seccion 4.7 - _ Resolucién de recurrencias 149 transformacién resulta util porque n/2 pasa a ser (2')/2 = 24, En otras palabras, nuestra recurrencia original en la que T(n) se define como una funcién de T(#/2) da lugar a una en la cual t, esté definido como una funcién de f, ,, que es precisa- mente el tipo de recurrencia que hemos aprendido a resolver: t, =T(2')=37(2'')+2' = 34,42! Una vez reescrita en la forma 1,-3t_,=2' esta recurrencia tiene la forma de la Ecuacién 4.10. E) polinomio caracteristico es (x-3)(x-2) y por tanto todas las soluciones para ti son de la forma t= 63) +2), Utilizamos ahora el hecho de que T(2')=1, y por tanto T(n) n = 2 para obtener ‘ign Cuando T(n) = 6,38" 0,2" =on® +en cuando n es una potencia de 2, lo cual basta para concluir que T(n) €O(n'*'In es una potencia de 2) Sin embargo, necesitamos mostrar que ¢, es estrictamente positivo antes de que podamos afirmar algo acerca del orden exacto de T(n). Ahora estamos familiarizados con dos técnicas para determinar las constantes. Para ejercitarlas, vamos a aplicar las dos a esta situacion. La aproximacién mas di- recta, que no siempre proporciona la informacién deseada, consiste en sustituir la solucién proporcionada por la ecuacién 4.25 en la recurrencia original. Si tenemos en cuenta que (1/2)* = 1/3, esto da lugar a n=T(n)~3T(n/ 2) = (qyn'®? + cn) - (c,(n/ 2) +.0,(2/2)) =-c,n/2 150 Anilisis de Algoritmos _ Capftulo 4 y por tanto c, = -2. Aun cuando no hemos obtenido el valor de c,, que es la cons- tante mAs relevante, estamos sin embargo en condiciones de afirmar que debe de ser estrictamente positiva, porque en caso contrario la ecuacién 4,25 implicaria erréneamente que T(1) es negativo. El hecho consistente en que T(n) €O(n"**ln es una potencia de 2) (4.26) queda por tanto demostrado. Por supuesto, ahora seria facil obtener el valor de c, a partir de la Ecuacién 4.25, del hecho consistente en que c, = -2, y de la condicién inicial T(1) = 1, pero esto no es necesario si nos conformamos con resolver la recu- rrencia en notacién asintética. Ademds, hemos aprendido que la ecuacién 4.26 es valida independientemente de la condicién inicial, siempre y cuando T(1) sea po- sitivo. El enfoque alternativo consiste en preparar dos ecuaciones lineales en las dos incégnitas c, y c,. Se garantiza que produciré el valor de ambas constantes. Para esto necesitamos el valor de T(t) en dos puntos. Ya sabemos que T(1) = 1. Para ob- tener otro punto, utilizamos la propia recurrencia: T(2) = 3T(1) + 2 = 5. Sustitu- yendo 1 = 1 yn =2 en la ecuaci6n 4.25, se tiene el sistema siguiente G + G =l n=1 3c, + 2c, =5 n=2 Resolviendo estas ecuaciones, obtenemos c, = 3 y ¢, = -2. Por tanto: T(n) = 3n'? -2n cuando n es una potencia de 2, lo cual desde luego es exactamente lo que se obte- nia en la Seccidn 4.7.1 mediante suposiciones inteligentes. a Ejemplo 4.7.11. Considérese la recurrencia T(n) =4T(n/ 2) 4° en donde 1 es una potencia de dos, y 1 2 2. Procederemos igual que en el ejemplo anterior: 4 =T72')=4TQ)4(2'P =4t,,4+4 Reescribimos esto en la forma de la ecuaci6n 4.10: 4-41, =4 Seccion 4.7 Resolucién de recurrencias 151 El polinomio caracteristico es (x-4)* y por tanto todas las soluciones son de la forma =O 4 4014 En términos de T(?), esta ecuacién es equivalente T(n) = cn? + yn? Ign. (4.27) Al sustituir la Ecuacién 4.27 en Ja recurrencia original, tenemos Ww =T(n)-4T(n/2)= cn" y por tanto c, = 1. Es decir, T(n) EOC? log nin es una potencia de 2), independientemente de las condiciones iniciales (incluso si T(1) es negativo). Ejemplo 4.7.12. Considérese la recurrencia T(n) =2T(n/2)+nlgn donde 1 es una potencia de 2, n 2 2. Tal como antes, obtenemos 1, = T(2!) = 2T(2'") + i2' = 21, , +2! Reescribimos esto en la forma de la ecuacién 4.10: t,-21_, 3/2! El polinomio caracteristico es (x-2)(x-2) = (x-2)* y por tanto todas las soluciones son de la forma t= ¢,2' +012! +¢,7°2! En términos de T(n), esta ecuacién equivale Tin) =ontenlgnscynlg?n. (4.28) 152 Analisis de Algoritmos - - __ Capitulo 4 Al sustituir la ecuacién 4.28 en la recurrencia original, se obtiene nga = T()- 27/2) =(c; ~ cn + 2cynlgn, . Por tanto: T(a) €O(i log? nln es una potencia de 2), lo cual implica que c, = c, y que 2c, = 1, luego c, independientemente de las condiciones iniciales. a Comentario: En los capitulos anteriores, la recurrencia dada para T(s) sélo es aplicable cuando n es una potencia de 2. Por tanto, es inevitable que la solu- cién obtenida deba estar en notacién asintética condicional. En todos los ca- sos, sin embargo, es suficiente anadir la condicién de que T(J) sea asintética- mente no decreciente para poder concluir que los resultados asintéticos obte- nidos son aplicables incondicionalmente a todos los valores de . Esta condi- cién se sigue de la regla de uniformidad (Seccién 3.4) puesto que las funcio- nes 18, 1? logn y nlog?n son suaves. Ejemplo 4.7.13. Ahora estamos preparados para resolver una de las recurrencias més importantes a efectos algoritmicos. Esta recurrencia es especialmente atil pa- ra el andlisis de algoritmos de divide y vencerds, como se vera en el Capitulo 7. Las constantes n, 2 1, / 2 1, b2 2 yk 20 son enteros, mientras que c es un némero real estrictamente positivo. Sea T: — R* una funcién asintéticamente no decre- ciente tal que Tin) = fTinib)+en* n>n, (4.29) cuando 11/1, es una potencia exacta de b, esto es, cuando 1 Elbiy.b°n,.b"Ny Esta vez, el cambio de variable adecuado es n = b'ny. t= Thin) = (Ib ny) + lb ng) = lt, + enip" Reescribimos esto en la forma de la Ecuacidn 4.10. 1, ~ t, = (em (bY El lado derecho es de la forma deseada, a'p(i) en donde p(i) = cnf es un polinomio constante (de grado 0) y a,=b'. Por tanto, el polinomio caracteristico es (x - f)(x - b’), cuyas raices son fy bt, A partir de esto, resulta tentador (jpero es falso en general!) concluir que todas las soluciones son de la forma Seccion 4.7 Resolucién de recurrencias 153 aol eee, (4.30) Para escribir esto en términos de T(n), obsérvese que i = log,(n/1,) cuando n es de Ja forma adecuada, y por tanto d! = (n /1,)"8" para valores positivos arbitrarios de d. Por tanto: Tan) = Ce, finger" yn?! +(e Link yn = en en’ (431) para unas nuevas constantes adecuadas c, y c,. Para conocer estas constantes, sus- tituimos la ecuacién 4.31 en la recurrencia original: cont = T(n) — ¢T(nfb) c, nlar’ + ch — F(c, (n/byox' + c, (n/b)*) ( +) c, nt Por tanto, c, = / (1 — ¢/b’). Para expresar T(n) en notacién asintstica, necesitamos mantener solamente el término dominante de la ecuacién 4.31. Hay que conside- rar tres casos, dependiendo de si / es menor, igual o mayor que b‘. 0 Si’ 0 y k > log, /. Por tanto el término c, n' domina la ecuacién 4.31. Concluimos que T() € © (it | (1/1) es una potencia de b). Pero n! es una funcidn suave, y T(n) es asintéticamente no decreciente por hipétesis. Por tanto, T(n) € O(n), Si! > b entonces c, < 0 y log, / > k. El hecho de que c, sea negativo implica que ces positive, porque en caso contrario la ecuacién 4.31 implicaria que T(1) es negativo, lo cual va a en contra de la especificacién T: S—i:”. Por tanto el tér- miino c; 7% ‘ domina la ecuaci6n 4.31. Mas atin 175" es una funcién suave y TU!) es eventualmente no decreciente. Por tanto T(vi) € © (1'%"). 0 Si’ =D, sin embargo, tenemos problemas, porque jla f6rmula de c,implica una 6n por cero! Lo que ha ido mal en este caso es que el polinomio caracte- ristico tiene una sola raiz de multiplicidad 2, en lugar de tener dos raices dis- tintas. Por tanto, la ecuacién 4.30 no proporciona la solucin general de la recu- rrencia. En este caso, la solucién general es mas bien BY # iby En términos de T(n), esto equivale a T(n) = e,n' + on’ log,(n/ ng) (432) 154 Andlisis de Algoritmos __ Capitulo 4 para unas constantes ¢, y c, adecuadas. Al sustituir esto en la recurrencia original, nuestra manipulacion habitual produce un ¢, = ¢ sorprendentemente sencillo. Por tanto, cv‘ log, 1 es el término dominante de la ecuaci6n 4.32 porque al principio de este ejercicio se suponia que c era estrictamente positiva. Como né es suave y T(n) es asintéticamente no decreciente, concluimos que T(n) € @(n* logan). Resumiendo, @(n') sifb (433) El Problema 4.44 da una generalizaci6n de este ejemplo. a Comentario: En el andlisis de algoritmos, suele ocurrir que las recurrencias se de- rivan en forma de desigualdades. Por ejemplo, se puede obtener Tin) < PT (n | b) + cnt n> Mo en donde n/n, es una potencia exacta de b, en lugar de la ecuacién 4.29. ;Qué se puede decir acerca del comportamiento asintético de esta recurrencia? Obsérvese en primer lugar que no se dispone de informacién suficiente para determinar el orden exacto de T(), porque solamente se nos da una cota superior de su valor. (Por lo que nosotros sabemos, podria ser T(11) = 1 para todo r.) En este caso, lo me- jor que podemos hacer es analizar la recurrencia en términos de la notacién O. Pa- ra esto, introduciremos una recurrencia auxiliar modelada a partir del original, pe- ro definida en términos de una ecuacién (no de una inecuaci6n). En este caso: Fim T(M) sin=n, {rte /b)+cn* sin/ny es una potencia de b, n> ny. Esta nueva recurrencia se encuentra en el ambito del ejemplo 4.7.13, salvo que no tenemos evidencia de que fim) sea asintéticamente no decreciente. Por tanto. Ta ecuacién 4.33 es valida para 7(n, siempre y cuando utilicemos la notacién asin- t6tica condicional para restringir n/n, de tal modo que sea una potencia de b. Aho- ra bien, es facil probar por induccién matematica que T(n) < T() patatodo n2 1 tal que n/n, sea una potencia de b. Ahora bien, esta claro que si fin) © O(H(n) | POD) y gin) < f(r) para todo 1 tal que P(z) sea valido, entonces g(n) € O(¢(n) | P(n)). Por tanto, nuestra conclusién acerca del comportamiento asintético condicional di Seccién 4.7 _ . ___ Resolucién de recurrencias 155 T(w es v4lida también para T(n), siempre y cuando sustituyamos la @ por una O. Finalmente, siempre que sepamos que T() es asintéticamente no decreciente, po- demos invocar la suavidad de las funciones implicadas para concluir que la ecua- cidn 4.33 es valida incondicionalmente para T(1), siempre y cuando una vez mas sustituyamos @ por O. La solucién de la recurrencia es, por tanto: O(n") sifdt Estudiaremos otras recurrencias que implican desigualdades en la Secci6n 4.7.6. Hasta el momento, los cambios de variable que hemos efectuado han sido to- dos ellos de naturaleza logaritmica. En algunas ocasiones resultan titiles otros cambios de variable muy distintos. [lustraremos esto con un ejemplo que provie- ne del algoritmo de divide y vencerds aplicado a la multiplicacion de enteros muy grandes (véase la Seccién 7.1). Ejemplo 4.7.14. Considérese una funcién asintéticamente no decreciente T(ji) tal que Tn) $ Thi /2h + TEn/2D + 70 + [0/20 + en (4.34) para todo n suficientemente grande, donde c es alguna constante real y positiva. Tal como se explicaba en el comentario que sigue al ejemplo anterior, tenemos que conformarnos con analizar la recurrencia en términos de la notacién O, y no de la notacién ©. Sea ny 2 1 suficientemente grande para que T(m) > T(n) para todo m 2 1 2 no/2, y para que la ecuacién 4.34 sea valida para todo n > np. Considérese cual- quier n > Mo. Obsérvese primero que Ln/2| ry. 156 Andlisis de Algoritmos Capitulo 4 F(n) =T(n+2)s 371+ [in + 2)/2]) + (n+ 2) s3T(2+[n/2])+2cn (porque m +25 2n) = 3f([n/2})+2cn En particular, Fin) < 37(n/2)+ dn n> cuando n/n, es una potencia de 2, en donde d = 2c. Este es un caso especial de la recurrencia que se analizaba en el comentario que sigue al Ejemplo 4.7.13, con £=3,b=2y k= 1. Dado que < b*, obtenemos que T(u) € O(w'#4). Finalmente, utilizaremos por tltima vez el hecho consistente en que T(n) es eventualmente no decreciente: T() < T(n + 2) = T(») para todo » suficientemente grande. Por tanto, toda cota superior asintética de T(n) es aplicable igualmente a T(n), lo cual concluye la demostracién de que T(#) € O(n's?). a 4.7.5 Transformaciones de intervalo Cuando se hace un cambio de variable, se transforma el dominio de la recu- trencia. En lugar de hacer esto, puede resultar dtil transformar el intervalo para obtener una recurrencia que tenga una forma que sepamos resolver. Ambas trans- formaciones pueden utilizarse a la vez en algunas ocasiones. Daremos un ejemplo de este enfoque. Ejemplo 4.7.15. Considérese la siguiente recurrencia, que define T(n) cuando n es una potencia de 2: Tin) 1/3 sin=l (n [a%en12) en caso contrario E] primer paso es un cambio de variable. Supongamos que #; denota T(2'): 4 =T(2)=2'T?(2'7) a2, A primera vista, ninguna de las técnicas vistas hasta el momento parece ser apli- cable a esta recurrencia, puesto que no es lineal, y ademas el coeficiente 2 no es constante. Para transformar el intervalo (rango), creamos otra recurrencia mas em- pleando u, para denotar Igt; u, = lgt, =i+2lgt_, =i+2u,, Seccién 4.7 Resolucién de recurrencias 157 Ahora, una vez reescrita en la forma u;— 2; = i, Ja recurrencia se ajusta a la Ecuacién 4.10, El polinomio caracteristico es (x-2)(2-1? y por tanto todas las soluciones son de la forma u, = C,2' + cyl +e,il'. Sustituyendo esta solucién en la recurrencia para u, se obtiene isu,-2u,, = 62! 406, 40 -2(¢,2'! +0, +71) = (2¢, - 6) — cy y por tanto c, = -L yc, = 2c, = no se tiene en cuenta la condi ci6n general para f, y para T(n). . En consecuencia, la solucién general para u, si m inicial, es u, = ¢,2'-i-2. Esto nos da la solu- 1a ayer? am PCI) = gg = 20 a Utilizamos la condicién inicial T(1) = 1/3 para determinar c,: TQ) =2° /4=1/3 implica que c, = 1g(4/3) = 2- Ig 3. La solucién final es, por tanto: 20 T(n)= a 4n3' a 4.7.6 Recurrencias asintoticas Cuando surgen recurrencias en el andlisis de algoritmos, es frecuente que no sean tan “elegantes” como sin) a sin=1 n {ésta-2)+ on sin>l (4.35) para unas constantes reales y positivas a y b especificas. En su lugar, lo normal es tener que enfrentarse con algo menos preciso, tal como T(n) = 4T(n +2) + f(a) (4.36) 158 Andlisis de Algoritmos - Capitulo 4 cuando n es suficientemente grande, y en donde lo tnico que sabemos de f(71) es- ta en el orden exacto de 1, y no sabemos nada acerca de la condicién inicial que define T(1/) salvo que es positiva para todo u. Este tipo de ecuacién se denomina recurrencia asintética. Afortunadamente, la solucion asintética de una recurrencia tal como la ecuacién 4.36 es practicamente siempre idéntica a la forma de la ecua- cién 4.35, mas sencilla. La técnica general para resolver una recurrencia asintotica consiste en “emparedar” la funcién que define entre dos recurrencias del tipo mas sencillo. Cuando las dos recurrencias mas sencillas tienen la misma soluci6n asin- tética, la recurrencia asinttica debe de tener también la misma solucién. Dustra- remos esto con nuestro ejemplo. Para las constantes reales y positivas a y b, se define la recurrencia sinel a Tl" Lar nedtbn sin>l, Las técnicas que ya nos resultan familiares se aplican para dar T,,(0) = (at by? bn siempre y cuando # sea una potencia de 2. Dado que 7 es una funcién suave y que T,,(®) es no decreciente (facil de probar por induccién matemitica), se sigue que T,,(n)€O(n’)_ independientemente de los valores (positivos) de a y b. De hecho, nv hay necesidad de resolver explicitamente la recurrencia porque el resultado del Ejemplo 4.7.13 se aplica directamente una vez que se ha establecido que T, (1) es no decreciente. Para alcanzar nuestra meta, basta demostrar la existencia de cuatro constante~ reales y positivas r, , uy v tales que T,,(n) s TQ) $7, (4.37 para todo n 2 1. Dado que tanto T,,(n) como T,,,(n) estan en el orden exacto de 1- se seguira que también T() € @(n?). Un beneficio interesante de este enfoque e- que T, ,() es no decreciente para cualesquiera valores positivos fijados para a yt lo cual hace posible aplicar la regla de suavidad. Por otra parte, esta regla no st podria haber invocado para simplificar directamente el andlisis de T(n) restrin- giendo nuestra atenci6n al caso en el cual n es una potencia de 2, porque la ecua- cién 4.36 no ofrece informacion suficiente para asegurar que T(n) sea no decre- ciente. Todavia queda por probar la existencia de r, s, u y v. Para esto, obsérvese que T,,,() = aT, ,(n) para todoa, y que T,,,(n) $7, y(n) cuandoasa’ yb sb’ (otray dos demostraciones sencillas por induccién matemitica). Sean c y d constantes re- Seccién 4.7 Resolucién de recurrencias ales y positivas, y sea n, un entero suficientemente grande para que cn = fi) s dn y ademas T(n) = 4T(n = 2) + f(n) para todo n > n,. Seleccionamos r = min(T(n)/T,,(llsasny), s=mini.c), ¥ v = max(u,d). Por definicin, T(n)2rT,(n) =T, 2 T, (2) y ademas T(n) suT, (0) =T, (0) ST, (0) para todo n s n,. Esta ecuacin constituye la base de la demostracién de que la ecuaci6n 4.37 es valida, por induccién matemitica. Para el paso de induccién con- sidérese un n > n, arbitrario y supongamos por la hipotesis de induccién que T,,(m) sT(m)sT,,,(m) para todo m < n, Entonces: Tia) = 4T(n +2) + f(n) s47T(n+2)+dn 47,,(n+2)+dn_ por hipétesis de induccién 47, ,(n+2)+9n puesto qued sv l Resulta facil mostrar por induccién matematica que T,,,(”) es no decreciente. Por tanto, el ejemplo 4.7.13 es aplicable a su andlisis con el mismo resultado en 160 Anilisis de Algoritmos Capitulo 4 notacién ©, independientemente del valor de x e y. Por ultimo, podemos mostrar con el enfoque empleado mis arriba que nuestra funcién original T(n) tiene que estar emparedada entre T,,,(”) y T,,,(1) para una eleccién adecuada de r, s, uy v. La conclusién es que en) sit bt exactamente igual que en el caso de la recurrencia més especifica que se daba en el ejemplo 4.7.13. Ademis, si lo Gnico que sabemos acerca de f(j1) es que esta en el orden de n‘, en lugar de conocer su orden exacto, seguimos teniendo derecho a al- canzar la misma conclusion en lo concerniente a T(1), salvo que hay que sustituir la @ por una O en todas partes. (Esta situacién es sutilmente distinta de la que st investigaba en el comentario que sigue al ejemplo 4.7.13.) 4 4.8 Problemas Problema 4.1 ;Cuénto tiempo requiere el siguiente “algoritmo” como funcién de 11?: f<-0 parai <1 hasta » hacer para j — 1 hasta n° hacer para k <1 hasta 1° hacer tele] Exprese su respuesta en la notacién @, de Ja forma mis sencilla posible. Puede considerar que cada instruccién individual (incluyendo el bucle de control) es elemental. Problema 4.2 ;Cudnto tiempo requiere el siguiente “algoritmo” como funcion de n?: <0 para i< 1 hasta» hacer para j I hasta i hacer para k — j hasta 1 hacer e 0 entonces para i < 1 hasta 4 hacer desperdiviar (122) Sea T(n) el nGmero de lineas de salida gene- radas por una llamada a desperdiciar(n). Pro- porcionar una ecuaci6n de recurrencia para T(n), y utilizar el ejemplo 4.7.16 para deter- minar el orden exacto de T() en la forma més sencilla posible. (No le pedimos que re- suelva exactamente la recurrencia.) Problema 4.10. Demostrar por induccién matematica que sid, = 11 y d, sd__,/2 para to- do ‘21, entonces d, 1. a sin=O0 anf jnt(n —1)+ bn encaso contrario Se admite un término de la forma Z). I/i! en la solucién. Demuestre su respuesta por in- duccién matematica. Exprese #(”) en nota- cién © en la forma més sencilla posible. {Cuil es el valor del lim,_.. Kn) / n! en fun- cin de a y 8? (Nota: Z7 Mi! =e L, en don- de e = 2.7182818... es la base de los logarit- Secci6n 4.8 mos naturales.) Aunque hemos determinado el comportamiento asintético de esta recu- mrencia en el problema 1.31, empleando una induccién constructiva, obsérvese que esta vez hemos obtenido una férmula més preci- sa para #(n). En particular, hemos obtenido el limite de t(n)/m! cuando a tiende a infinito. Recuerde que este problema es relevante pa- ra el andlisis del algoritmo recursivo para calcular determinantes. Problema 4.22. Resolver la recurrencia del ejemplo 4.7.2 por suposiciones inteligentes. iResista la tentaci6n de “hacer trampa” miran- do la solucién antes de resolver el problema! Problema 4.23. Demostrar que la ecua~ cién 4.7 (Seccién 4.7.2) sélo tiene soluciones de la forma k = Sort siempre y cuando las raices r,, ry ...,", del po- linomio caracteristico sean distintas. Problema 4.24. Completar la solucién del ejemplo 4.7.7 determinando el valor de c, en funcién de t,, Problema 4.25. Completar la solucién del ejemplo 4.7.11 determinando el valor de c, en funcién de ty. Problema 4.26. Completar la solucién del ejemplo 4.7.12 determinando el valor de c, en funci6n de ty. Problema 4.27. Completar la solucién del Ejemplo 4.7.13 demostrando que ¢ = ¢. Problema 4.28. Completar el comentario que sigue al ejemplo 4.7.13, demostrando por induccién matematica que T(#) <= 7(7) pa- ra todo mz n, tal que n/n, sea una potencia de b. Problema 4.29. Resolver exactamente la siguiente recurrencia exActamente: io! sin=Oonel ""15t,.,- 61, encaso contrario Exprese su respuesta del modo mas sencillo posible empleando la notacién @. Problema 4.30. Resolver exactamente la siguiente recurrencia. sin=0.102 24,., en caso contrario. 9n? -15n +106 i #21, Exprese su respuesta del modo més sencillo posible empleando la notacion 8. Problema 4.31. Considere la siguiente re- currencia. sin=Qon= 1-24 en caso contrario. m2 Demostrar que es /, = 2° sin(nm/ 4), no por induccién matematica sino utilizando la técnica de la ecuacién caracteristica. Problema 4.32. Resolver exactamente la siguiente recurrencia. ,!" sin=0.1,203 "Va tar athe @n caso contrario Exprese su respuesta del modo mas sencillo posible empleando la notacidn @. Problema 4.33, Resolver exactamente la siguiente recurrencia. Problemas 163 sin-Oon=1 2g. + 3x2"? en-caso contrario Exprese su respuesta del modo més sencillo posible empleando la notacién @. Problema 4.34, Resolver exactamente la siguiente recurrencia. ‘a sin=Qon=1 Tin)= ™ fra-sre-2+6 en caso contrario Exprese su respuesta del modo mas sencillo posible empleando la notacién @ y la razén du- rea $= (I+ V5)/2. Obsérvese que esta es la recurrencia 4.1 de la Seccién 4.2.3 si h(n) = ¢, Jo cual representa el tiempo invertido por una llamada a Fibrec(n) si no se cuentan las sumas con coste unitario. Problema 4.35. Resolver exactamente la siguiente recurrencia: @ sin=Oon=) Tone Tin =1)+T(1=2)4cn encaso contrario. Exprese su respuesta del modo més sencillo posible empleando la notacién @ y la razén aurea @ = (1+V5)/2. Obsérvese que esto es la Recurrencia 4.1 de la Seccién 4.2.3 si h(n) = cn, lo cual representa el tiempo inver- tido por una llamada a Fibrec(n) si no se cuentan las sumas con coste unitario. Com- pare su respuesta con la del Problema 4.34, en el cual se contaban las sumas con coste unitario. Problema 4.36. Resolver exactamente la si- guiente recurrencia, siendo n una potencia de 2. 1 sin=l TM a. 4T(n/2)+n en caso contrario Capitulo 4 Exprese su respuesta del modo mis sencillo posible empleando la notacin @. Problema 4.37. Resolver exactamente la si- guiente recurrencia, siendo n una potencia de 2: Tr 1 sinel we fare /2)41gn en caso contrario Exprese su respuesta del modo més sencillo posible empleando la notacion @. Problema 4.38. Resolver exactamente la siguiente recurrencia, siendo n una potencia de2 1 sinel T= forens 2)+(nlgn)" en caso contrario Exprese su respuesta del modo més sencillo posible empleando la notacién ®. Problema 4.39. Resolver exactamente la siguiente recurrencia, siendo 1 de la forma 2 r= ft sin=2 ")or(yn) en caso contrario. Exprese su respuesta del modo mas sencillo posible empleando la notacién 8. Problema 4.40. Resolver exactamente la siguiente recurrencia _ sins Donel me *in-W44Tn- i fe +5 T%(n- 214m encaso contaio Tine Exprese su respuesta del modo més sencillo posible empleando la notacién 9. Secci6n 4.8 Problema 4.41. Resolver exactamente la si- sguiente recurrencia, siendo n una potencia de 2. 1 sinel rem~ |32 sine? F012) 70014)-11 9 en caso comtaria Problema 4.42. Resolver exactamente la siguiente recurrencia. (0 sim=1 1/(4=1,,) en -caso contrario Problema 4.43. Resolver exactamente la siguiente recurrencia, en funcién de las con- diciones iniciales @ y b. (a sin=0 Tina tb sin=l Kl +7(1-1))/ T= 2) en caso contrario Problema 4.44. Vimos en el ejemplo 4.7.13 la solucién de una recurrencia impor- tante, que es especialmente util para el ané- lisis de algoritmos tipo divide y vencerds. En algunos casos, sin embargo, se precisa un resultado més general, y la técnica de la ecuaci6n caracteristica no siempre es aplica- ble. Sean m 2 1 y b> 2 dos enteros, y sean a y b constantes reales y positivas. Definimos: X={neX|Gie N)[n=nb} Sea f : X — Je” una funcién arbitraria. Se define la funcién T : X > >" mediante la re- currencia royal’ sin=n, me firm /b)+ fn) sinEX.n>n, Sea p=log,@. Resulta que la forma més sencilla de expresar T(i) en notacién asint6ti- Problemas 165 ca depende de la relacién entre fn) y n?. En lo que sigue, toda la notacién asintética es im- plicitamente condicional con respecto a que n © X, Demostrar que 1. Si se hace f(r) = d, lo cual no tiene impor- tancia a efectos de la definicién de T, enton- ces el valor de T(n) est4 dado por una simple suma cuando n € X: lopatn/na T= Sa'frsoy a : 2. Sea e cualquier constante real estricta- mente positiva; entonces a(n") sifo O(n" (Mog nm)" Tene] Oemlognlogiogm si fore Otn" /logm) OCfn)logn) si fin) O(n! /logny ) erfin) sifieOn™), La tercera alternativa incluye a f(x) € @(") al seleccionar ¢ = 1. 3. Como caso especial de la primera alterna- tiva, (st) € © (#") siempre que f(m) € O(rr) pa- ra alguna constante real positiva r < p. 4, La primera alternativa se puede generali- zar para admitir casos tales como fn) © O(n" / (log n)(log log n)""); también se obtiene T(n) € ti’) si fin) € O(n" g(n)), en donde g(n) es no creciente y LDacx gi) converge. 5. La ultima alternativa se puede generalizar para incluir casos tales como F(n) En" logn) o bien f(x) EO(n"™* / logn) también se obtiene T(n) €O(f(x)) si fm EQ(n?™ } y si f(a) 2 akf(n/b) para alguna constante k>1y para todos los me X suticientemente grandes. 166 Analisis de Algoritmos _ Capitulo 4 4.9 REFERENCIAS Y TEXTOS MAS AVANZADOS E] nombre Torres de Hanoi corresponde a un juguete inventado por el matemidtico francés Edouard Lucas en 1883: véase Gardner (1959). Buneman y Levy (1980) y Dewdney (1984) dan soluciones para el problema 4.17. El anilisis amortizado ha sido popularizado por Tarjan (1985). Los principales aspectos matemiticos del andlisis de algoritmos se pueden hallar en Greene y Knuth (1981). En Purdom y Brown (1985) y Rawlins (1992) se hallara una buena cantidad de téc- nicas para el anélisis de algoritmos. Se explican varias técnicas para resolver recurrencias, incluyendo la ecuaciOn caracteristica y el cambio de variable, en Lueker (1980). Para un tratamiento mateméatico mds rigurosos, véase Knuth (1968) 0 bien Purdom y Brown (1985). El articulo de Bentley, Haken y Saxe (1980) es es- pecialmente relevante para las recurrencias que surgen del andlisis de algoritmos de divide y vencerds (véase el Capitulo 7). El problema 4.44 procede parcialmente de Verma (1994), que pre- senta otros resultados generales.

También podría gustarte