22.06.2015 Views

Capítulo 3 Complejidad de algoritmos recursivos ⎩ ⎨ ⎧ = > − = 0 1 0 ...

Capítulo 3 Complejidad de algoritmos recursivos ⎩ ⎨ ⎧ = > − = 0 1 0 ...

Capítulo 3 Complejidad de algoritmos recursivos ⎩ ⎨ ⎧ = > − = 0 1 0 ...

SHOW MORE
SHOW LESS

You also want an ePaper? Increase the reach of your titles

YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.

Instituto Tecnológico <strong>de</strong> Ciudad Ma<strong>de</strong>ro<br />

Unidad I COMPLEJIDAD DE ALGORITMOS<br />

Dra. Laura Cruz Reyes<br />

Capítulo 3 <strong>Complejidad</strong> <strong>de</strong> <strong>algoritmos</strong> <strong>recursivos</strong><br />

Capítulo 3 <strong>Complejidad</strong> <strong>de</strong> <strong>algoritmos</strong> <strong>recursivos</strong><br />

3.1 Definición <strong>de</strong> función <strong>de</strong> recurrencia<br />

Una recurrencia es una ecuación o una <strong>de</strong>sigualdad que <strong>de</strong>scribe una función en términos <strong>de</strong><br />

su propio valor sobre entradas más pequeñas. Por ejemplo, el cálculo <strong>de</strong>l Factorial <strong>de</strong> un<br />

número se pue<strong>de</strong> <strong>de</strong>scribir con la ecuación <strong>de</strong> recurrencia F(n).<br />

F<br />

( n)<br />

⎧nF<br />

= ⎨<br />

⎩ 1<br />

( n −1)<br />

if<br />

if<br />

n > 0<br />

n = 0<br />

La solución <strong>de</strong>l Factorial <strong>de</strong> 4 se pue<strong>de</strong> obtener siguiendo las reglas <strong>de</strong> la ecuación <strong>de</strong><br />

recurrencia.<br />

F(4) = 4·F(3)<br />

F(3) = 3·F(2)<br />

F(2) = 2·F(1)<br />

F(1) = 1·F(0)<br />

F(0) = 1<br />

F(4) = 4·3·2·1·1 = 24<br />

Una recurrencia es lineal, si cada llamada recursiva genera cuando mucho otra llamada<br />

recursiva, en caso contrario es no-lineal.<br />

3.2 Deducción <strong>de</strong> recurrencias a partir <strong>de</strong> <strong>algoritmos</strong><br />

Los recursos empleados por <strong>algoritmos</strong> <strong>recursivos</strong> (por ejemplo, el número <strong>de</strong> comparaciones<br />

<strong>de</strong> clave y el número <strong>de</strong> multiplicaciones) se pue<strong>de</strong>n <strong>de</strong>scribir con la recurrencia T(n), la cual<br />

tiene una estructura inductiva: a) complejidad <strong>de</strong> los casos base y b) complejidad <strong>de</strong> los casos<br />

progresivos. Los casos base <strong>de</strong>tienen la recursividad, mientras los casos progresivos la<br />

reactivan.<br />

⎧complejidad <strong>de</strong> los casos base si n correspon<strong>de</strong> a los casos base<br />

Tn ( ) = ⎨<br />

⎩ complejidad <strong>de</strong> los casos progresivos si n correspon<strong>de</strong> a los casos progresivos<br />

Siguiendo con el ejemplo <strong>de</strong>l Factorial, ahora se analiza el <strong>de</strong>sempeño <strong>de</strong>l algoritmo<br />

recursivo correspondiente.<br />

Algoritmo Factorial (n)<br />

Entradas: un número entero n<br />

Salidas: un número entero correspondiente al factorial <strong>de</strong> n<br />

1 si n = 0 entonces //caso base<br />

2 Factorial ← 1<br />

3 sino // caso progresivo<br />

4 Factorial ← n*Factorial(n-1)


Instituto Tecnológico <strong>de</strong> Ciudad Ma<strong>de</strong>ro<br />

Unidad I COMPLEJIDAD DE ALGORITMOS<br />

Dra. Laura Cruz Reyes<br />

Capítulo 3 <strong>Complejidad</strong> <strong>de</strong> <strong>algoritmos</strong> <strong>recursivos</strong><br />

Si la operación básica es el número <strong>de</strong> multiplicaciones, entonces la recurrencia que mi<strong>de</strong> el<br />

<strong>de</strong>sempeño <strong>de</strong> algoritmo Factorial se obtiene i<strong>de</strong>ntificando sus casos y escribiendo las<br />

reglas que <strong>de</strong>terminan cada caso y las funciones <strong>de</strong> <strong>de</strong>sempeño correspondientes. En el caso<br />

base (n=0) no se realiza ninguna multiplicación y en el caso progresivo (n>0) se realiza una<br />

multiplicación más las multiplicaciones que el algoritmo ejecuta al ser llamado recursivamente<br />

con un valor <strong>de</strong> n-1, este último calculo se <strong>de</strong>nota con T(n-1).<br />

⎧0 si n = 0 (caso base)<br />

Tn ( ) = ⎨<br />

⎩1 + Tn ( − 1) si n > 0 (caso progresivo)<br />

Antes se expandió la recurrencia F(n) para <strong>de</strong>terminar el factorial <strong>de</strong> 4, ahora se expan<strong>de</strong> la<br />

recurrencia T(n) para calcular el número <strong>de</strong> multiplicaciones.<br />

T(4) = 1 + T(3)=4<br />

T(3) = 1 + T(2)=3<br />

T(2) = 1 + T(1)=2<br />

T(1) = 1 + T(0)=1<br />

T(0) = 0<br />

T(4) = 1 + 1 +1 +1 = 4<br />

Se pue<strong>de</strong> observar que para calcular el factorial <strong>de</strong> 4, el algoritmo realiza cuatro<br />

multiplicaciones: Factorial(4)=4·3·2·1·1. Este número <strong>de</strong> multiplicaciones coinci<strong>de</strong> con<br />

el obtenido por la recurrencia T(4)=4.<br />

3.2.1 Recurrencia <strong>de</strong> peor caso <strong>de</strong>l algoritmo <strong>de</strong> búsqueda secuencial recursivo<br />

Una versión ineficiente <strong>de</strong>l algoritmo <strong>de</strong> búsqueda secuencial es su implementación recursiva. A<br />

pesar <strong>de</strong> sus limitaciones, esta versión es sencilla y simplifica la introducción <strong>de</strong> los casos <strong>de</strong> un<br />

problema al análisis <strong>de</strong> <strong>algoritmos</strong> <strong>recursivos</strong>.<br />

Algoritmo busquedaSecRec(E,p,u,k)<br />

Entradas: Arreglo E, e índices p y u que <strong>de</strong>limitan el subarreglo a<br />

or<strong>de</strong>nar contenido en E[p,...,u].<br />

Salidas: E[p,...,u] en or<strong>de</strong>n ascen<strong>de</strong>nte.<br />

1 si p>u entonces //caso base <strong>de</strong> fracaso<br />

2 respuesta = -1<br />

3 sino si (E[p]=k) entonces //caso base <strong>de</strong> éxito<br />

4 respuesta ← p<br />

5 sino<br />

6 respuesta ← busquedaSecRec(E,p+1,u,k)//caso progresivo<br />

7 <strong>de</strong>volver respuesta<br />

El peor <strong>de</strong>sempeño <strong>de</strong>l algoritmo busquedaSecRec suce<strong>de</strong> cuando la búsqueda fracasa.<br />

Este comportamiento se pue<strong>de</strong> i<strong>de</strong>ntificar fácilmente en el algoritmo. Primero la recursividad se<br />

activa varias veces porque la llave k no ha sido encontrada (caso progresivo). Finalmente el<br />

algoritmo se <strong>de</strong>tiene cuando no existen más datos para analizar (caso base <strong>de</strong> fracaso). A<br />

continuación se <strong>de</strong>talla el análisis <strong>de</strong>l peor caso.


Instituto Tecnológico <strong>de</strong> Ciudad Ma<strong>de</strong>ro<br />

Unidad I COMPLEJIDAD DE ALGORITMOS<br />

Dra. Laura Cruz Reyes<br />

Capítulo 3 <strong>Complejidad</strong> <strong>de</strong> <strong>algoritmos</strong> <strong>recursivos</strong><br />

a) Caso base <strong>de</strong> fracaso: p>u<br />

En el paso 1, cuando todos los elementos <strong>de</strong> E ya han sido analizados, el índice p rebasa el<br />

valor <strong>de</strong>l índice u.<br />

E<br />

0 1 2 3 4 5<br />

u<br />

p<br />

En estas condiciones el algoritmo se <strong>de</strong>tiene porque no tuvo éxito, así que el número <strong>de</strong><br />

comparaciones es cero porque no se tienen elementos en el segmento <strong>de</strong> búsqueda ya que<br />

p>u. Es importante notar que la condición si p>u equivale a la condición si n=0.<br />

W(n) paso 1 = 0, si n=0<br />

b) Caso progresivo (invocación <strong>de</strong> recursividad): p≤u y E[p]≠k<br />

Después que en el paso 1 se encontró que p≤u, en el paso 3 se realiza una comparación no<br />

exitosa ya que E[p]≠k. En este paso el subarreglo sí tiene elementos ya que p≤u. De igual<br />

manera la condición si p≤u equivale a la condición si n>0.<br />

W(n) paso 3 = 1, n>0<br />

En el paso 6 se ejecuta una invocación recursiva con un subarreglo disminuido en una<br />

unidad; en este paso el subarreglo también tiene elementos.<br />

W(n) paso 6 = W(n-1), n>0<br />

c) Recurrencia <strong>de</strong>l peor caso<br />

Consi<strong>de</strong>rando todos los casos involucrados (caso base <strong>de</strong> fracaso y caso progresivo), la<br />

recurrencia <strong>de</strong>l peor caso queda como sigue:<br />

( )<br />

W n<br />

⎧0 si n = 0<br />

= ⎨<br />

⎩1 + W( n − 1) si n > 0<br />

Intuitivamente se pue<strong>de</strong> observar que en cada llamada recursiva se realiza una<br />

comparación. Dado que se realizan n invocaciones al algoritmo, la solución <strong>de</strong> la recurrencia<br />

es n.<br />

W( n) = 1+ 1+ 1+ 1 + ... + 1 = n=Θ<br />

( n)


Instituto Tecnológico <strong>de</strong> Ciudad Ma<strong>de</strong>ro<br />

Dra. Laura Cruz Reyes<br />

Unidad I COMPLEJIDAD DE ALGORITMOS<br />

3.2.2 Recurrencia <strong>de</strong> peor caso <strong>de</strong>l algoritmo <strong>de</strong> búsqueda binaria<br />

Capítulo 3 <strong>Complejidad</strong> <strong>de</strong> <strong>algoritmos</strong> <strong>recursivos</strong><br />

Un algoritmo muy popular es el <strong>de</strong> búsqueda binaria. La aplicación <strong>de</strong> este algoritmo<br />

requiere un or<strong>de</strong>namiento previo <strong>de</strong> los datos.<br />

Algoritmo búsquedaBinaria (E,p,u,k)<br />

Entradas: Arreglo E, e índices p y u que <strong>de</strong>limitan el subarreglo a<br />

or<strong>de</strong>nar contenido en E[p,...,u].<br />

Salidas: E[p,...,u] en or<strong>de</strong>n ascen<strong>de</strong>nte.<br />

1 si (p>u)entonces //caso base <strong>de</strong> fracaso<br />

2 <strong>de</strong>volver -1<br />

3 medio ← ⎣(p + u)/2⎦<br />

4 si k = E(medio) entonces //caso base <strong>de</strong> éxito<br />

5 índice ← medio<br />

6 sino si (k < E[medio]) entonces<br />

7 índice ← búsquedaBinaria(E,p,medio–1,k) //caso progresivo<br />

8 sino<br />

9 índice ← búsquedaBinaria(E,medio+1,u,k) //caso progresivo<br />

10 <strong>de</strong>volver índice<br />

El peor <strong>de</strong>sempeño <strong>de</strong>l algoritmo búsquedaBinaria suce<strong>de</strong> cuando la búsqueda fracasa.<br />

Primero la recursividad se activa varias veces porque la llave k no ha sido encontrada en la<br />

posición media (caso recursivo). Finalmente el algoritmo se <strong>de</strong>tiene cuando no existen más<br />

datos para analizar (caso base <strong>de</strong> fracaso).<br />

a) Caso base <strong>de</strong> fracaso : p > u<br />

Cuando todos los elementos <strong>de</strong> E ya han sido analizados, el valor <strong>de</strong> p rebasa al <strong>de</strong> u; así<br />

que el número <strong>de</strong> elementos <strong>de</strong>l segmento <strong>de</strong> búsquedas es cero.<br />

W(n) paso 1 = 0, si n=0<br />

b) Caso progresivo (invocación <strong>de</strong> recursividad): p≤u y E[medio]≠k<br />

En el paso 5 <strong>de</strong>l algoritmo se realiza una comparación no exitosa.<br />

W(n) paso 5 = 1, si n>0<br />

En el paso 7 se realiza una comparación para ubicar la siguiente búsqueda.<br />

W(n) paso 7 = 1, si n>0<br />

En las líneas 8 y 9 las invocaciones recursivas se realizan con subarreglos <strong>de</strong> diferentes<br />

tamaños. Cuando n es par: el segmento izquierdo es n/2 y el <strong>de</strong>recho es (n/2)-1. Cuando n<br />

es impar: los segmentos izquierdo y <strong>de</strong>recho son (n-1)/2. El mayor <strong>de</strong> cada tipo <strong>de</strong> tamaño<br />

es n/2 y (n-1)/2. Ambos tamaños máximos quedan expresados con ⎣n/2⎦.<br />

W(n) paso 8 o paso 9 = W(⎣n/2⎦), si n>0


Instituto Tecnológico <strong>de</strong> Ciudad Ma<strong>de</strong>ro<br />

Unidad I COMPLEJIDAD DE ALGORITMOS<br />

c) Recurrencia <strong>de</strong>l peor caso<br />

Dra. Laura Cruz Reyes<br />

Capítulo 3 <strong>Complejidad</strong> <strong>de</strong> <strong>algoritmos</strong> <strong>recursivos</strong><br />

La siguiente recurrencia expresa el número <strong>de</strong> comparaciones <strong>de</strong> clave en el peor caso:<br />

⎧ 0 si n = 0<br />

⎪<br />

W ( n)<br />

= ⎨ ⎛⎢n<br />

⎥⎞<br />

⎪2 + W ⎜⎢ si n > 0<br />

2⎥⎟<br />

⎩ ⎝⎣<br />

⎦⎠<br />

3.3 Ecuaciones <strong>de</strong> recurrencia comunes<br />

Muchos <strong>algoritmos</strong> clásicos han sido diseñados en base a dos técnicas que permiten plantear la<br />

solución <strong>de</strong> un problema en términos <strong>de</strong> varios subproblemas <strong>de</strong> menor dimensión.<br />

3.3.1 Algoritmos basados en divi<strong>de</strong>-y-vencerás<br />

Usando la técnica <strong>de</strong> divi<strong>de</strong>-y-vencerás, si un problema es <strong>de</strong>masiado gran<strong>de</strong> para resolverlo<br />

<strong>de</strong> una vez, se <strong>de</strong>scompone en varias partes más fáciles <strong>de</strong> resolver. Con más formalidad, dado<br />

un problema a resolver planteado en términos <strong>de</strong> una entrada <strong>de</strong> tamaño n, la técnica <strong>de</strong> divi<strong>de</strong><br />

la entrada en b subproblemas, 1


Instituto Tecnológico <strong>de</strong> Ciudad Ma<strong>de</strong>ro<br />

Dra. Laura Cruz Reyes<br />

Unidad I COMPLEJIDAD DE ALGORITMOS<br />

Capítulo 3 <strong>Complejidad</strong> <strong>de</strong> <strong>algoritmos</strong> <strong>recursivos</strong><br />

Cuando el arreglo es <strong>de</strong> tamaño mayor <strong>de</strong> n, el número <strong>de</strong> comparaciones se pue<strong>de</strong> <strong>de</strong>rivar<br />

aplicando la fórmula para los <strong>algoritmos</strong> <strong>de</strong> tipo divi<strong>de</strong>-y-venceras.<br />

(<br />

⎢n<br />

⎥)<br />

W( n) = 2 W + ( n−1)<br />

, si n>1<br />

⎣ 2⎦<br />

Comparaciones para or<strong>de</strong>nar por<br />

separado las parte <strong>de</strong>recha e izquierda<br />

que son <strong>de</strong> tamaño ⎣n/2⎦ (b=2, c=2).<br />

Comparaciones para fusionar dos subarreglos<br />

or<strong>de</strong>nados <strong>de</strong> tamaño ⎣n/2⎦. En el peor caso se toma<br />

alternadamente un elemento <strong>de</strong> cada subarreglo,<br />

requiriendose n-1 comparaciones ( f(n) = n-1 ).<br />

Reuniendo en una sola expresión los casos base y recursivo, la complejidad <strong>de</strong>l algoritmo<br />

mergeSort en el peor caso es como sigue.<br />

( )<br />

W n<br />

⎧0 si n = 0<br />

⎪<br />

= ⎨ ⎛⎢n<br />

⎥ ⎞<br />

⎪2 W ⎜⎢ + ( n − 1) si n > 0<br />

2⎥⎟<br />

⎩ ⎝⎣<br />

⎦⎠<br />

3.3.2 Algoritmos basados en recorta-y-vencerás<br />

El problema principal <strong>de</strong> tamaño n se pue<strong>de</strong> recortar a b subproblemas (1


Instituto Tecnológico <strong>de</strong> Ciudad Ma<strong>de</strong>ro<br />

Dra. Laura Cruz Reyes<br />

Unidad I COMPLEJIDAD DE ALGORITMOS<br />

Capítulo 3 <strong>Complejidad</strong> <strong>de</strong> <strong>algoritmos</strong> <strong>recursivos</strong><br />

fuera <strong>de</strong> la base. Para simplificar la explicación <strong>de</strong>l método usaremos la siguiente estructura <strong>de</strong><br />

recurrencia que genera en cada nivel b problemas y <strong>de</strong>notaremos con n i al tamaño <strong>de</strong>l<br />

problema en el nivel <strong>de</strong> recurrencia i.<br />

⎧c<br />

si ni<br />

correspon<strong>de</strong> al caso base<br />

Tn (<br />

i<br />

) = ⎨<br />

⎩bT ( ni+<br />

1) + f ( ni) si ni<br />

correspon<strong>de</strong> al caso progresivo<br />

Paso 2. Evaluar la función T(n) <strong>de</strong>l caso progresivo con un conjunto pequeño <strong>de</strong> valores<br />

consecutivos <strong>de</strong> n.<br />

T(n 0 ) = f(n 0 ) + bT(n 1 )<br />

T(n 1 ) = f(n 1 ) + bT(n 2 )<br />

T(n 2 ) = f(n 2 ) + bT(n 3 )<br />

T(n 3 ) = f(n 3 ) + bT(n 4 )<br />

T(n 4 ) = f(n 4 ) + bT(n 4 )<br />

Paso 3. Sustituir los resultados <strong>de</strong>l punto anterior en cada expresión antecesora.<br />

T(n 0 ) = f(n 0 ) + bf(n 1 ) +b 2 f(n 2 ) + b 3 f(n 3 ) + b 4 T(n 4 )<br />

Paso 4. I<strong>de</strong>ntificar un patrón con el cual pueda generalizarse la representación <strong>de</strong> los términos<br />

<strong>de</strong>l <strong>de</strong>sarrollo.<br />

Paso 5. Expresar en notación <strong>de</strong> sumatorias el patrón i<strong>de</strong>ntificado, <strong>de</strong>stacando dos partes en la<br />

expresión: un conjunto <strong>de</strong> términos inductivos y un término llamado <strong>de</strong> base o <strong>de</strong> paro,<br />

referenciado por m.<br />

Paso 6. Determinar un valor <strong>de</strong> m para el cual se satisfaga o al menos se aproxime a la igualdad<br />

⎛tamaño <strong>de</strong> problema ⎞ ⎛tamaño <strong>de</strong> problema ⎞<br />

⎜ ⎟ ⎜ ⎟<br />

<strong>de</strong>l término =<br />

que <strong>de</strong>tiene la<br />

⎜ referenciado por m ⎟ ⎜ recursividad ⎟<br />

⎝ ⎠ ⎝ ⎠<br />

Paso 7. Sustituir m en la expresión <strong>de</strong> sumatoria obtenida en el paso 5.<br />

Paso 8. Resolver la sumatoria con una expresión equivalente o aproximada cuya única variable<br />

in<strong>de</strong>pendiente es n. Para esta tarea pue<strong>de</strong> ser <strong>de</strong> gran ayuda utilizar programas<br />

computacionales como Derive.<br />

3.4.2 Ejemplos <strong>de</strong> recurrencias resueltas con el método iterativo<br />

La siguiente recurrencia se utilizará para ilustrar el método iterativo.<br />

( )<br />

T n<br />

⎧ ⎛n<br />

⎞<br />

⎪2T + n n > 1<br />

=<br />

⎜ ⎟<br />

⎨ ⎝2<br />

⎠<br />

⎪<br />

⎩ 1 n = 1


Instituto Tecnológico <strong>de</strong> Ciudad Ma<strong>de</strong>ro<br />

Dra. Laura Cruz Reyes<br />

Unidad I COMPLEJIDAD DE ALGORITMOS<br />

Capítulo 3 <strong>Complejidad</strong> <strong>de</strong> <strong>algoritmos</strong> <strong>recursivos</strong><br />

Primero se generan cuatro recurrencias para tamaños <strong>de</strong> problema consecutivos.<br />

( ) = + 2 (<br />

n<br />

2)<br />

(<br />

n n<br />

) = + 2T( n<br />

2 4)<br />

2<br />

(<br />

n n<br />

) = + 2T<br />

4 (<br />

n<br />

8)<br />

4<br />

n<br />

(<br />

n<br />

) = + 2T( n<br />

)<br />

T n n T<br />

T<br />

T<br />

T<br />

8 8 16<br />

Enseguida se usan las recurrencias <strong>de</strong> anteriores para hacer la expansión <strong>de</strong> la recurrencia<br />

original.<br />

( ) = + 2n<br />

+ 2⋅2<br />

(<br />

n<br />

2 4)<br />

( ) = + 2n + 2⋅ 2n + 2⋅2⋅2<br />

2 4 (<br />

n<br />

8)<br />

( ) = + 2n + 22 ⋅ n + 222 ⋅ ⋅ n + 2222 ⋅ ⋅ ⋅ (<br />

n<br />

)<br />

Tn n T<br />

T n n T<br />

T n n T<br />

2 4 8 16<br />

( ) = + 2 ( )<br />

1 n 2 3 4<br />

1+ 2 n<br />

2 + 2 n<br />

3+<br />

2 n<br />

4<br />

T n n T<br />

2 2 2 2<br />

Dado que se <strong>de</strong>sconoce en cuántos términos la función T(n) <strong>de</strong>be ser expandida para<br />

alcanzar el caso base, se usará el índice m para hacer referencia al término correspondiente a<br />

la condición <strong>de</strong> paro.<br />

[ ]<br />

1 2 3<br />

Tn ( ) = ⎡n 2 n<br />

1 2 n<br />

2 2 n<br />

3 ... término ⎤<br />

⎢<br />

+ + + + +<br />

m−1<br />

+ términom<br />

⎣ 2 2 2 ⎥⎦<br />

Se forma una sumatoria cuyo patrón <strong>de</strong> regularidad es 2 i i<br />

( /2 )<br />

n con i= 0…m-1. Posterior a<br />

esta sumatoria sigue el término <strong>de</strong> paro, cuyo coeficiente y tamaño <strong>de</strong> problema siguen un<br />

patrón similar con i=m.<br />

m−1<br />

i=<br />

0<br />

n<br />

m n<br />

( m−1) T( m−1)<br />

m<br />

( m−<br />

) ( m−<br />

)<br />

1 2 3 1<br />

( ) 2 n<br />

1 2 n<br />

2 2 n m−<br />

Tn= ⎡n+ + + 3+ ... + 2 n ⎤<br />

1 + ⎡2<br />

T n ⎤<br />

1<br />

⎢⎣ 2 2 2 2 ⎥⎦ ⎢⎣ 2 ⎥⎦<br />

∑<br />

i<br />

Tn ( ) = 2 + 2<br />

2 2<br />

La sumatoria se simplifica al consi<strong>de</strong>rar que el último termino correspon<strong>de</strong> al caso base con<br />

n=1 y T(1)=1.<br />

n n<br />

( i) ( m−1<br />

) ()<br />

m−1 m−1 m−1<br />

i m m m<br />

∑ ∑ ∑<br />

Tn ( ) = 2 + 2 T = n+ 2 T1 = n+<br />

2<br />

2 2<br />

i= 0 i= 0 i=<br />

0<br />

Encontramos el valor <strong>de</strong> m igualando las dos condiciones <strong>de</strong> paro.


Instituto Tecnológico <strong>de</strong> Ciudad Ma<strong>de</strong>ro<br />

Unidad I COMPLEJIDAD DE ALGORITMOS<br />

Dra. Laura Cruz Reyes<br />

Capítulo 3 <strong>Complejidad</strong> <strong>de</strong> <strong>algoritmos</strong> <strong>recursivos</strong><br />

n<br />

( m )<br />

T<br />

n<br />

m<br />

2<br />

2<br />

= 1<br />

m<br />

2 = n<br />

m<br />

2 2<br />

2<br />

= T(1)<br />

log (2 ) = log ( n)<br />

m=<br />

log ( n)<br />

La solución <strong>de</strong> la recurrencia indica que el algoritmo tiene un crecimiento n-logarítmico.<br />

log 2 ( n) −1<br />

∑<br />

Tn ( ) = n+<br />

2<br />

i=<br />

0<br />

log n<br />

Tn n n n n n n n n<br />

log 2<br />

( ) = log + = log + =Θ( log )<br />

Enseguida, un segundo ejemplo para clarificar el método iterativo.<br />

( )<br />

T n<br />

⎧ ⎛ n ⎞<br />

⎪3T<br />

⎢ ⎥ + n n > 1<br />

=<br />

⎜⎢4<br />

⎥⎟<br />

⎨ ⎝⎣ ⎦⎠<br />

⎪<br />

⎩ θ (1) n = 1<br />

Primero se generan recurrencias para diferentes tamaños <strong>de</strong> problema.<br />

( ) = + 3 (<br />

⎢n<br />

⎥<br />

⎣ 4⎦)<br />

(<br />

⎢n<br />

⎥<br />

n<br />

) = + 3T<br />

4 (<br />

⎢n<br />

⎥<br />

⎣ ⎦ 16 )<br />

4 ⎣ ⎦<br />

n n<br />

(<br />

⎢ ⎥) = + 3T<br />

n<br />

16 (<br />

⎢ ⎥<br />

⎣ ⎦ 64 )<br />

16 ⎣ ⎦<br />

n n<br />

(<br />

⎢ ⎥) = + 3T<br />

n<br />

(<br />

⎢ ⎥)<br />

Tn n T<br />

T<br />

T<br />

T<br />

⎣ 64⎦ 64 ⎣ 256⎦<br />

Enseguida se usan las recurrencias anteriores para hacer la expansión <strong>de</strong> la recurrencia<br />

original.<br />

Tn ( ) = n+<br />

3 T<br />

(<br />

⎢n<br />

⎥<br />

⎣ 4⎦)<br />

(<br />

⎢n<br />

⎥<br />

⎣ 16⎦)<br />

(<br />

⎢ ⎥<br />

⎣ 64⎦)<br />

(<br />

⎢ ⎥)<br />

3n<br />

Tn ( ) = n+ + 9T<br />

4<br />

3n 9n Tn ( ) = n+ + + 27T<br />

n<br />

4 16<br />

3n 9n 27n Tn ( ) = n+ + + + 81T<br />

n<br />

4 16 64 ⎣ 256⎦


Instituto Tecnológico <strong>de</strong> Ciudad Ma<strong>de</strong>ro<br />

Dra. Laura Cruz Reyes<br />

Unidad I COMPLEJIDAD DE ALGORITMOS<br />

Capítulo 3 <strong>Complejidad</strong> <strong>de</strong> <strong>algoritmos</strong> <strong>recursivos</strong><br />

Dado que se <strong>de</strong>sconoce en cuántos términos la función T(n) <strong>de</strong>be ser expandida para<br />

alcanzar el caso base, se usará el índice m para hacer referencia al término correspondiente a<br />

la condición <strong>de</strong> paro.<br />

3n 9n 27n<br />

Tn ( ) ⎛<br />

⎞<br />

= ⎜n+ + + + ... ⎟+<br />

término referenciado por m<br />

⎝ 4 16 64 ⎠<br />

[ ]<br />

Antes <strong>de</strong> la última llamada recursiva se forma una sumatoria cuyo patrón <strong>de</strong> regularidad<br />

i i<br />

(término general) es 3 ⎢<br />

⎣n<br />

/4 ⎥<br />

⎦ con i= 0…m-1. Después sigue el término asociado a la<br />

condición <strong>de</strong> paro, cuyo coeficiente y tamaño <strong>de</strong> problema siguen un patrón similar con i=m.<br />

i=<br />

0<br />

( m )<br />

⎛ 3n 9n 27n m−1<br />

( ) ...+ 3 n ⎞ m<br />

Tn= n ⎛<br />

m 1 3 T<br />

n<br />

⎞<br />

⎜ + + + + −<br />

4 16 64<br />

4 ⎟+⎜ 4<br />

⎟<br />

⎝<br />

⎢⎣ ⎥⎦⎠<br />

⎝ ⎢⎣ ⎥⎦<br />

⎠<br />

m−1<br />

i<br />

m<br />

Tn ( ) = 3 n<br />

i 3 T<br />

n<br />

∑ ⎢<br />

+<br />

4 ( m<br />

⎣ ⎥⎦ ⎢⎣ 4 ⎥⎦)<br />

El último término <strong>de</strong> la sumatoria se simplifica ya que éste correspon<strong>de</strong> al caso base con n=1<br />

y T(1)=Θ(1).<br />

m−1<br />

∑<br />

i=<br />

0<br />

()<br />

i<br />

m<br />

Tn ( ) = 3 n<br />

⎢<br />

i + 3 T1<br />

⎣ 4 ⎥⎦<br />

Usando el límite<br />

n<br />

n<br />

⎢<br />

m ≤<br />

⎣ 4 ⎥⎦<br />

4<br />

término <strong>de</strong> la sumatoria.<br />

m<br />

, encontramos el valor <strong>de</strong> m que hace referencia al último<br />

n n n n<br />

( ⎢<br />

m⎥) ( m) ( ⎢<br />

m⎥) ( m)<br />

T ≤ T , como T = T(1), entonces T ≥T(1)<br />

⎣ 4 ⎦ 4 ⎣ 4 ⎦<br />

4<br />

n<br />

m ≥1<br />

4<br />

m<br />

4 ≤ n<br />

m<br />

log<br />

4(4 ) ≤ log<br />

4( n)<br />

m≤<br />

log ( n)<br />

4<br />

El valor <strong>de</strong> m se sustituye en la recurrencia expandida.<br />

log 4 ( n) −1<br />

i<br />

log 4 ( n)<br />

( ) ≤ 3 n<br />

∑ ⎢<br />

i + 3 Θ()<br />

1<br />

⎣ 4 ⎥⎦<br />

i=<br />

0<br />

log 4 ( n) −1<br />

i<br />

log 4 ( n)<br />

( ) ≤ 3 n<br />

∑ ⎢<br />

i +Θ( 3 )<br />

⎣ 4 ⎥⎦<br />

i=<br />

0<br />

log 4 ( n) −1<br />

i<br />

log 4 (3)<br />

( ) ≤ 3<br />

n<br />

∑ ⎢<br />

i +Θ( n )<br />

⎣ 4 ⎥⎦<br />

i=<br />

0<br />

Tn<br />

Tn<br />

Tn


Instituto Tecnológico <strong>de</strong> Ciudad Ma<strong>de</strong>ro<br />

Dra. Laura Cruz Reyes<br />

Unidad I COMPLEJIDAD DE ALGORITMOS<br />

Capítulo 3 <strong>Complejidad</strong> <strong>de</strong> <strong>algoritmos</strong> <strong>recursivos</strong><br />

El límite superior <strong>de</strong> la sumatoria <strong>de</strong> T(n) se pue<strong>de</strong> sustituir por infinito para utilizar una serie<br />

geométrica infinita.<br />

∞<br />

i<br />

∑ r = 1 con r = 3/4<br />

1 − r<br />

i=<br />

0<br />

∞<br />

∑<br />

i<br />

Tn ( ) ≤ n (3/4) +Θ n<br />

i=<br />

0<br />

⎛ 1<br />

Tn ( ) ≤ n⎜<br />

+Θ n<br />

⎝1−<br />

3/4<br />

Tn ( ) ≤ 4n+Θ<br />

n<br />

Tn ( ) = On ( )<br />

log 4 (3)<br />

( )<br />

⎞ log 4 (3)<br />

⎟ ( )<br />

⎠<br />

log 4 (3)<br />

( )<br />

Un límite superior más ajustado para T(n) se obtiene con una serie geométrica finita.<br />

k+<br />

(( 1 1)/( 1) )<br />

k<br />

i<br />

ar a r r<br />

i=<br />

0<br />

∑ = − − .<br />

Con las series geométricas <strong>de</strong>crecientes, la suma total es a lo más un factor constante mayor<br />

que el primer término. Por lo tanto en la solución prevalece el primer término n que es menor<br />

que 4n por un factor <strong>de</strong> 4.<br />

∞<br />

i 3n 9n 27n<br />

n∑<br />

(3/ 4) = n+ + + + ... = 4n<br />

4 16 64<br />

i=<br />

0<br />

3.5 Solución <strong>de</strong> recurrencias mediante el método <strong>de</strong> árbol <strong>de</strong> recursión<br />

Los árboles <strong>de</strong> recursión son una herramienta visual para analizar el costo <strong>de</strong> procedimientos<br />

<strong>recursivos</strong> asociados a una estructura <strong>de</strong> árbol, por ejemplo los <strong>algoritmos</strong> <strong>de</strong> divi<strong>de</strong>-y-venceras.<br />

3.5.1 Descripción <strong>de</strong>l método <strong>de</strong> árbol <strong>de</strong> recursión<br />

Se construye el árbol para organizar por niveles las operaciones algebraicas necesarias para<br />

resolver la recurrencia. Cada nodo <strong>de</strong>l árbol tiene una estructura <strong>de</strong> dos componentes: la<br />

función <strong>de</strong> costos y el costo no-recursivo.<br />

Los nodos nodos<br />

intermedios se<br />

expan<strong>de</strong>n con los<br />

casos progresivo<br />

…<br />

Función <strong>de</strong> costo<br />

Costo no-recursivo<br />

Los nodos<br />

hoja son los<br />

casos base.<br />

…<br />


Instituto Tecnológico <strong>de</strong> Ciudad Ma<strong>de</strong>ro<br />

Dra. Laura Cruz Reyes<br />

Unidad I COMPLEJIDAD DE ALGORITMOS<br />

Capítulo 3 <strong>Complejidad</strong> <strong>de</strong> <strong>algoritmos</strong> <strong>recursivos</strong><br />

3.5.2 Ejemplos <strong>de</strong> recurrencias resueltas con el método <strong>de</strong> árbol <strong>de</strong> recursión<br />

El siguiente ejemplo ilustra el método <strong>de</strong> solución <strong>de</strong> recurrencias basado en árbol <strong>de</strong> recursión.<br />

2<br />

⎧ 2 Tn ( /2) + n n><br />

1<br />

Tn ( ) = ⎨<br />

⎩0 n = 1<br />

Primero se construye el árbol <strong>de</strong> recurrencia <strong>de</strong>terminando para cada nodo la función <strong>de</strong><br />

costos y el costo no recursivo. Para cada nivel se calcula el costo total.<br />

T nivel0 = n 2<br />

T(n) n 2<br />

T(n/4) (n/4) 2 T(n/4) (n/4) 2 T(n/4) (n/4) 2 T(n/4) (n/4) 2 T nivel2 = 4(n/4) 2 =n 2 /4<br />

log 2 (n)<br />

T(n/2) (n/2) 2 T(n/2) (n/2) 2<br />

T nivel1 = 2(n/2) 2 =n 2 /2<br />

T(1) 0 T nivelm = 0<br />

Un análisis visual <strong>de</strong>l árbol revela que en cada nivel el número <strong>de</strong> subproblemas aumenta en<br />

potencias <strong>de</strong> dos.<br />

( 2 0 ) →( 2 1 ) →( 2 2<br />

) →... → ( 2 m<br />

)<br />

En cada nivel el tamaño <strong>de</strong> los problemas disminuye en potencias <strong>de</strong> dos.<br />

⎛ 1 ⎞ ⎛ 1 ⎞ ⎛ 1 ⎞ ⎛ 1 ⎞<br />

⎜ n n n ... n<br />

0 ⎟→⎜ 1 ⎟→⎜ → →<br />

2 ⎟ ⎜<br />

2 2 2 2 m ⎟<br />

⎝ ⎠ ⎝ ⎠ ⎝ ⎠ ⎝ ⎠<br />

En cada nivel la complejidad algorítmica total incrementa en potencias <strong>de</strong> dos. Es importante<br />

observar que en el último nivel se tienen 2 m nodos y cada nodo es <strong>de</strong> tamaño (1/2 m )n.<br />

⎛ 1 2⎞ ⎛ 1 2⎞ ⎛ 1 2⎞ m ⎛ 1 ⎞<br />

⎜ n ...<br />

0 ⎟→⎜ n n<br />

1 ⎟→⎜ 2 ⎟→ →( 2 ) T⎜ n<br />

m ⎟<br />

⎝2 ⎠ ⎝2 ⎠ ⎝2 ⎠ ⎝2<br />

⎠<br />

Usando el patrón <strong>de</strong> complejidad y las condiciones <strong>de</strong> terminación, la recurrencia se expresa<br />

como una sumatoria.<br />

⎛ 2 1 2 1 2 1 2⎞ m ⎛ 1 ⎞<br />

Tn ( ) = ⎜n+ n+ n+ ... + n 2 T n<br />

m−1<br />

⎟+<br />

⎜ m ⎟<br />

⎝ 2 4 2 ⎠ ⎝2<br />

⎠<br />

m−1<br />

⎛ 2 1 2 1 2 1 2⎞<br />

2 1<br />

Tn ( ) = ⎜n+ n+ n+ ... + n 0 n 0<br />

m−1<br />

⎟+ = ∑ +<br />

i<br />

⎝ 2 4 2 ⎠<br />

i=<br />

0 2


Instituto Tecnológico <strong>de</strong> Ciudad Ma<strong>de</strong>ro<br />

Dra. Laura Cruz Reyes<br />

Unidad I COMPLEJIDAD DE ALGORITMOS<br />

El valor <strong>de</strong> m se <strong>de</strong>termina igualando las dos expresiones <strong>de</strong>l caso base.<br />

⎛ 1 ⎞<br />

T⎜<br />

n (1)<br />

m ⎟ = T<br />

⎝2<br />

⎠<br />

1<br />

m<br />

m<br />

n= 1; 2 = n; log 2 = log n<br />

m<br />

2<br />

m=<br />

log n<br />

Para la solución <strong>de</strong> T(n) se usa la serie geométrica con r=1/2.<br />

k+<br />

(( 1 1)/( 1) )<br />

k<br />

i<br />

∑ ar a r r<br />

i=<br />

0<br />

k<br />

∑<br />

i=<br />

0<br />

1<br />

i<br />

2<br />

= − −<br />

1<br />

= 2 −<br />

k<br />

2<br />

Capítulo 3 <strong>Complejidad</strong> <strong>de</strong> <strong>algoritmos</strong> <strong>recursivos</strong><br />

La solución <strong>de</strong> la recurrencia T(n) revela que el algoritmo tiene una velocidad <strong>de</strong> crecimiento<br />

cuadrática<br />

(log n) −1<br />

2 1 2⎛ ⎛ 1 ⎞⎞ 2⎛ ⎛2⎞⎞<br />

2<br />

Tn ( ) = n ∑ = n 2 n 2 2n 2n<br />

i<br />

(log n) −1<br />

i=<br />

0 2<br />

⎜ − ⎜ ⎟ = − ⎜ ⎟ = −<br />

2<br />

⎟ ⎜<br />

n<br />

⎟<br />

⎝ ⎝ ⎠⎠ ⎝ ⎝ ⎠⎠<br />

Tn<br />

2<br />

( ) =Θ ( n)<br />

Con un segundo ejemplo se ilustra el método <strong>de</strong> árbol <strong>de</strong> recursión.<br />

⎧Tn ( /3) + T(2 n/3) + n n><br />

1<br />

Tn ( ) = ⎨<br />

⎩0 n = 1<br />

Primero se construye el árbol <strong>de</strong> recurrencia <strong>de</strong>terminando para cada nodo la función <strong>de</strong><br />

costos y el costo no recursivo. Para cada nivel se calcula el costo total.<br />

T(n)<br />

n<br />

T nivel0 = n<br />

log 3/2 (n)<br />

T(n/3) (n/3) T(2n/3) (2n/3)<br />

T nivel1 = (n/3)+ (2n/3)=n<br />

T(n/9) (n/9) T(2n/9) (2n/9) T(2n/9) (2n/9) T(4n/9) (4n/9)<br />

T nivel2 = (n/9)+…+ (4n/9) =n<br />

T(1) 0 T nivelm = 0


Instituto Tecnológico <strong>de</strong> Ciudad Ma<strong>de</strong>ro<br />

Dra. Laura Cruz Reyes<br />

Unidad I COMPLEJIDAD DE ALGORITMOS<br />

Capítulo 3 <strong>Complejidad</strong> <strong>de</strong> <strong>algoritmos</strong> <strong>recursivos</strong><br />

En cada nivel el número <strong>de</strong> subproblemas aumenta en potencias <strong>de</strong> dos.<br />

( 2 0 ) →( 2 1 ) →( 2 2<br />

) →... → ( 2 m<br />

)<br />

En cada nivel el tamaño más gran<strong>de</strong> <strong>de</strong> problema disminuye por un factor <strong>de</strong> (2/3) i .<br />

0 1 2 m−1<br />

⎛2⎞ ⎛2⎞ ⎛2⎞ ⎛2⎞ ⎛2⎞<br />

⎜ ⎟ n→⎜ ⎟ n→⎜ ⎟ n→...<br />

→⎜ ⎟ n→⎜ ⎟ n<br />

⎝3⎠ ⎝3⎠ ⎝3⎠ ⎝3⎠ ⎝3⎠<br />

En cada nivel la complejidad algorítmica permanece constante.<br />

m<br />

⎛⎛2<br />

⎞ ⎞<br />

n → n → n → → T n<br />

⎜⎜<br />

⎟<br />

⎝3<br />

⎠ ⎟<br />

⎝ ⎠<br />

m<br />

( ) ( ) ( ) ... ( 2 )<br />

Usando el patrón <strong>de</strong> complejidad y las condiciones <strong>de</strong> terminación, la recurrencia se expresa<br />

como una sumatoria. Dado que esta sumatoria correspon<strong>de</strong> a la trayectoria más larga<br />

(subproblemas mayores), se obtiene una cota superior <strong>de</strong> las trayectorias restantes.<br />

m<br />

⎛<br />

m ⎛2<br />

⎞ ⎞<br />

Tn ( ) ≤ n+ n+ n+ ... + n+ ( 2 ) T n<br />

⎜⎜<br />

⎟<br />

⎝3<br />

⎠ ⎟<br />

⎝ ⎠<br />

m−1<br />

∑<br />

Tn ( ) ≤ ( n) + 0<br />

i=<br />

0<br />

El valor <strong>de</strong> m se <strong>de</strong>termina igualando las dos expresiones que representan la condición <strong>de</strong><br />

paro.<br />

m<br />

⎛2<br />

⎞<br />

T⎜<br />

⎟ n=<br />

T(1)<br />

⎝3<br />

⎠<br />

⎛2<br />

⎞<br />

⎜ ⎟<br />

⎝3<br />

⎠<br />

⎛3<br />

⎞<br />

⎜ ⎟<br />

⎝2<br />

⎠<br />

m<br />

m<br />

m<br />

n = 1<br />

= n<br />

⎛3<br />

⎞<br />

log ⎜ ⎟ = log<br />

⎝2<br />

⎠<br />

m=<br />

log n<br />

3/2 3/2<br />

3/2<br />

m<br />

n<br />

Para la solución <strong>de</strong> T(n) se usa una diferencia <strong>de</strong> límites.


Instituto Tecnológico <strong>de</strong> Ciudad Ma<strong>de</strong>ro<br />

Unidad I COMPLEJIDAD DE ALGORITMOS<br />

Dra. Laura Cruz Reyes<br />

Capítulo 3 <strong>Complejidad</strong> <strong>de</strong> <strong>algoritmos</strong> <strong>recursivos</strong><br />

m−1<br />

∑<br />

Tn ( ) ≤ ( n)<br />

i=<br />

0<br />

log 3/2( n) −1<br />

∑<br />

Tn ( ) ≤ ( n)<br />

i=<br />

0<br />

log 3/2( n) −1<br />

∑<br />

Tn ( ) ≤ n (1)<br />

i=<br />

0<br />

Tn ( ) ≤n(log ( n) − 1+<br />

1)<br />

3/2<br />

Tn ( ) ≤ nlog ( n)<br />

3/2<br />

Tn ( ) = On ( log n)<br />

Con un tercer ejemplo se ilustra el método <strong>de</strong> árbol <strong>de</strong> recursión.<br />

⎧2 Tn ( /2) + n n><br />

1<br />

Tn ( ) = ⎨<br />

⎩0 n = 1<br />

Primero se construye el árbol <strong>de</strong> recurrencia <strong>de</strong>terminando para cada nodo la función <strong>de</strong><br />

costos y el costo no recursivo acor<strong>de</strong>s al nivel <strong>de</strong> recursividad que le corresponda. Para cada<br />

nivel se calcula el costo total.<br />

T(n)<br />

n<br />

T nivel0 = n<br />

log 2 (n)<br />

T(n/2) (n/2) T(n/2) (n/2)<br />

T nivel1 = (n/2)+ (n/2)=n<br />

T(n/4) (n/4) T(n/4) (n/4) T(n/4) (n/4) T(n/4) (n/4)<br />

T nivel2 = (n/4)+…+ (n/4) =n<br />

T(1) 0 T nivelm = 0<br />

En cada nivel el número <strong>de</strong> subproblemas aumenta en potencias <strong>de</strong> dos.<br />

( 2 0 ) →( 2 1 ) →( 2 2<br />

) →... → ( 2 m<br />

)<br />

Estableciendo el supuesto que en todos los niveles <strong>de</strong>l árbol n es par, en cada nivel el tamaño<br />

<strong>de</strong>l problema disminuye en potencias <strong>de</strong> dos.<br />

⎛ 1 ⎞ ⎛ 1 ⎞ ⎛ 1 ⎞ ⎛ 1 ⎞<br />

⎜ n n n ... n<br />

0 ⎟→⎜ 1 ⎟→⎜ → →<br />

2 ⎟ ⎜<br />

2 2 2 2 m ⎟<br />

⎝ ⎠ ⎝ ⎠ ⎝ ⎠ ⎝ ⎠


Instituto Tecnológico <strong>de</strong> Ciudad Ma<strong>de</strong>ro<br />

Dra. Laura Cruz Reyes<br />

Unidad I COMPLEJIDAD DE ALGORITMOS<br />

En cada nivel la complejidad algorítmica permanece constante.<br />

⎛ 1 ⎞<br />

n → n → n → → T⎜ n<br />

m ⎟<br />

⎝2<br />

⎠<br />

m<br />

( ) ( ) ( ) ... ( 2 )<br />

Capítulo 3 <strong>Complejidad</strong> <strong>de</strong> <strong>algoritmos</strong> <strong>recursivos</strong><br />

Usando el patrón <strong>de</strong> complejidad y las condiciones <strong>de</strong> terminación, la recurrencia se expresa<br />

como una sumatoria.<br />

m−1<br />

m ⎛ 1 ⎞<br />

Tn ( ) = n+ n+ n+ ... + n+ ( 2 ) T⎜<br />

n ( n) 0<br />

m ⎟= ∑ +<br />

⎝2<br />

⎠ i=<br />

0<br />

El valor <strong>de</strong> m se <strong>de</strong>termina igualando las dos expresiones que representan la condición <strong>de</strong><br />

paro.<br />

⎛ n ⎞<br />

T ⎜ 1<br />

m ⎟ =<br />

⎝2<br />

⎠<br />

n<br />

m<br />

2<br />

m<br />

2<br />

log<br />

= 1<br />

= n<br />

2 = log<br />

m<br />

( )<br />

2 2<br />

m=<br />

log<br />

2<br />

n<br />

n<br />

Para la solución <strong>de</strong> T(n) se usa una diferencia <strong>de</strong> límites.<br />

Tn ( ) = n+ n+ n+ ... + n+<br />

0<br />

m−1<br />

log 2( n) −1 log 2( n) −1<br />

∑ ∑ ∑<br />

Tn ( ) = ( n) = Tn ( ) = ( n) = Tn ( ) = n (1)<br />

i= 0 i= 0 i=<br />

0<br />

Tn ( ) = nlog 2( n)<br />

Tn ( ) =Θ( nlog n)<br />

3.6 Solución <strong>de</strong> recurrencias mediante el método maestro<br />

El método maestro es una receta para resolver recurrencias <strong>de</strong>rivadas <strong>de</strong> aplicar la técnica <strong>de</strong><br />

divi<strong>de</strong>-y-vencerás.<br />

T(n) = b T( n/c ) + f(n)<br />

3.6.1 Descripción <strong>de</strong>l método maestro<br />

En la aplicación <strong>de</strong>l método se pue<strong>de</strong> omitir el piso y techo <strong>de</strong>l tamaño <strong>de</strong>l problema ya que no<br />

afecta a la solución <strong>de</strong> la recurrencia porque ésta se expresa con funciones asintóticas.


Instituto Tecnológico <strong>de</strong> Ciudad Ma<strong>de</strong>ro<br />

Unidad I COMPLEJIDAD DE ALGORITMOS<br />

n/ c≈⎢⎣n/ c⎥⎦ ≈ ⎡⎢n/<br />

c⎤⎥<br />

Dra. Laura Cruz Reyes<br />

Capítulo 3 <strong>Complejidad</strong> <strong>de</strong> <strong>algoritmos</strong> <strong>recursivos</strong><br />

La solución <strong>de</strong> una recurrencia está sujeta al caso que le corresponda. Se pue<strong>de</strong>n probar<br />

cada uno <strong>de</strong> los casos, o usar el árbol <strong>de</strong> recursividad para i<strong>de</strong>ntificar la serie que mejor lo<br />

<strong>de</strong>scribe.<br />

Caso 1: La complejidad es una serie geométrica creciente<br />

si<br />

f n<br />

logc ( ) ( b −ε<br />

n )<br />

=Ο para alguna constante ε > 0<br />

logc entonces Tn ( ) =Θ ( n<br />

b )<br />

Caso 2: La complejidad es constante en cada nivel<br />

si<br />

f n<br />

logc ( ) =Θ ( n<br />

b )<br />

logc entonces Tn ( ) =Θ ( n b lg n)<br />

Caso 3: La complejidad es una serie geométrica <strong>de</strong>creciente<br />

si<br />

f n<br />

logc ( ) ( b +ε<br />

n )<br />

=Ω para alguna constante ε > 0, y<br />

si bf(n/c)≤c´f(n) para alguna constante c´


Instituto Tecnológico <strong>de</strong> Ciudad Ma<strong>de</strong>ro<br />

Dra. Laura Cruz Reyes<br />

Unidad I COMPLEJIDAD DE ALGORITMOS<br />

Capítulo 3 <strong>Complejidad</strong> <strong>de</strong> <strong>algoritmos</strong> <strong>recursivos</strong><br />

c) En el caso 3 la función f(n) es polinomialmente más gran<strong>de</strong> que n log cb por un factor <strong>de</strong> n ε .<br />

Esto es, f(n) es asintóticamente más gran<strong>de</strong> por un factor <strong>de</strong> n ε . esto suce<strong>de</strong> en las series<br />

geometricas <strong>de</strong>crecientes.<br />

La superioridad <strong>de</strong> una función h(n) sobre otra g(n) se dice que es polinomial, si es<br />

significativa. Esto es, existe una constante ε>0 tal que g(n) es asintóticamente más pequeña<br />

que h(n) por un factor n ε .<br />

ε<br />

ngn ( ) ≤ hn ( )<br />

En el caso 1:<br />

logc<br />

b<br />

hn ( ) = n , gn ( ) = f( n)<br />

ε<br />

logc<br />

b<br />

n f( n)<br />

≤ n<br />

logc<br />

b−ε<br />

f( n)<br />

≤ n<br />

En el caso 3:<br />

hn ( ) = f( n), gn ( ) = n<br />

ε logc<br />

b<br />

nn ≤ f( n)<br />

logc<br />

b+ε<br />

f( n)<br />

≥ n<br />

logc<br />

b<br />

Las recurrencias en las que f(n) es superior o inferior por un factor que no es polinomial, no<br />

<strong>de</strong>ben ser resueltas con el método maestro.<br />

3.6.3 Ejemplos <strong>de</strong> recurrencias resueltas con el método maestro<br />

El siguiente ejemplo ilustra el primer caso correspondiente a una serie geométrica creciente.<br />

⎧9 Tn ( /3) + n n><br />

1<br />

Tn ( ) = ⎨<br />

⎩1 n = 1<br />

De la fórmula general <strong>de</strong> divi<strong>de</strong>-y-vencerás:<br />

T(n) = b T( n/c ) + f(n)<br />

b=9, c=3, f(n) =n,<br />

Para <strong>de</strong>terminar que la recurrencia correspon<strong>de</strong> al caso 1 <strong>de</strong>l Teorema Maestro, sea:<br />

f( n)<br />

= n<br />

c<br />

gn ( ) = n b = n = n<br />

log − log3<br />

9− 2−<br />

ε ε ε<br />

Se <strong>de</strong>muestra que f(n) = O(g(n)):


Instituto Tecnológico <strong>de</strong> Ciudad Ma<strong>de</strong>ro<br />

Unidad I COMPLEJIDAD DE ALGORITMOS<br />

Dra. Laura Cruz Reyes<br />

Capítulo 3 <strong>Complejidad</strong> <strong>de</strong> <strong>algoritmos</strong> <strong>recursivos</strong><br />

⎛ f( n)<br />

⎞ ⎛ n ⎞<br />

lim ⎜ ⎟=<br />

lim ⎜<br />

x<br />

2<br />

( ) x<br />

−ε<br />

⎟<br />

→∞ gn →∞<br />

⎝ ⎠ ⎝n<br />

⎠<br />

⎛ n ⎞ 1<br />

lim ⎜<br />

1 si ε 1<br />

x<br />

2−ε<br />

⎟ =<br />

→∞<br />

1−ε<br />

= =<br />

⎝n<br />

⎠ n<br />

⎛ n ⎞ 1<br />

lim ⎜<br />

0 si 0> ε 1<br />

x→∞<br />

2−ε<br />

⎟ =<br />

1−ε<br />

= <<br />

⎝n<br />

⎠ n<br />

logc<br />

b−ε<br />

( n )<br />

∴ f( n) = Ο para ε > 0<br />

Por lo anterior, entonces el último término <strong>de</strong> la recurrencia es el dominante,<br />

∴ Tn=Θ n =Θ n =Θ n<br />

logc log3<br />

9 2<br />

( ) ( b<br />

) ( ) ( )<br />

Alternativamente se pue<strong>de</strong> resolver la recurrencia mediante la construcción <strong>de</strong>l árbol <strong>de</strong><br />

recursión.<br />

T(n)<br />

n<br />

T nivel0 = n<br />

log 3 (n)<br />

T(n/3) (n/3) ….<br />

T(n/3) (n/3)<br />

….<br />

….<br />

T(n/9) (n/9) T(n/9) (n/9) T(n/9) (n/9) T(n/9) (n/9)<br />

…. …. …. ….<br />

T(1) 1<br />

T nivel1 = (n/3)+ …+(n/3)=9n/3=3n<br />

T nivel2 = (n/9)+…+ (n/9) =81n/3=9n<br />

T nivelm = 1+…+1=3 m n=3 log 3 n n=n 2<br />

Se obtiene el patrón <strong>de</strong>l tamaño <strong>de</strong> problema: n/3 i<br />

0 1 2 m−1<br />

⎛1⎞ ⎛1⎞ ⎛1⎞ ⎛1⎞ ⎛1⎞<br />

⎜ ⎟ n→⎜ ⎟ n→⎜ ⎟ n→...<br />

→⎜ ⎟ n→⎜ ⎟<br />

⎝3⎠ ⎝3⎠ ⎝3⎠ ⎝3⎠ ⎝3⎠<br />

n<br />

En la profundidad i=m <strong>de</strong>l árbol el tamaño <strong>de</strong>l problema es 1<br />

n<br />

m<br />

3<br />

= 1<br />

m<br />

3 = n<br />

m<br />

( )<br />

log 2 = log<br />

3 3<br />

m=<br />

log<br />

3<br />

n<br />

n<br />

m<br />

Se obtiene el patrón <strong>de</strong> complejidad 3 i n, que da lugar a una serie creciente don<strong>de</strong> el último<br />

término n 2 es el dominante.


Instituto Tecnológico <strong>de</strong> Ciudad Ma<strong>de</strong>ro<br />

Dra. Laura Cruz Reyes<br />

Unidad I COMPLEJIDAD DE ALGORITMOS<br />

Capítulo 3 <strong>Complejidad</strong> <strong>de</strong> <strong>algoritmos</strong> <strong>recursivos</strong><br />

T n n n n n<br />

m−1<br />

( ) = + 3 + 9 + ... + 3 + 0<br />

(log 3 n) −1<br />

T( n) = n+ 3n+ 9 n+ ... + 3 n<br />

(log 3 n) −1<br />

i<br />

Tn ( ) = n∑<br />

(3 )<br />

i=<br />

0<br />

k<br />

i<br />

k+<br />

Usando la serie ∑ ar = a (( r 1 −1)/( r −1)<br />

)<br />

i=<br />

0<br />

, se resuelve la recurrencia.<br />

log 3 ( n) 2<br />

⎛(3 −1) ⎞ nn ( −1)<br />

n −n<br />

Tn ( ) = n⎜<br />

⎟= ==<br />

⎝ 3−1 ⎠ 2 2<br />

Tn<br />

2<br />

( ) =Θ( n)<br />

El siguiente ejemplo ilustra el segundo caso correspondiente a una serie constante.<br />

⎧T(2 n/3) + 1 n><br />

1<br />

Tn ( ) = ⎨<br />

⎩0 n = 1<br />

De la fórmula general <strong>de</strong> divi<strong>de</strong>-y-vencerás:<br />

T(n) = b T( n/c ) + f(n),<br />

b=1, c=3/2, f(n) =1,<br />

Para <strong>de</strong>terminar que la recurrencia correspon<strong>de</strong> al caso 2 <strong>de</strong>l Teorema Maestro, sea,<br />

f( n) = 1<br />

gn n n n<br />

log c log 3/2<br />

( ) = b = 1 = 0 = 1<br />

Se <strong>de</strong>muestra que f(n) = Θ(g(n)):<br />

⎛ f( n) ⎞ ⎛1⎞<br />

lim ⎜ ⎟= lim ⎜ ⎟=<br />

1<br />

x→∞<br />

gn ( ) x→∞<br />

⎝ ⎠ ⎝1⎠<br />

c<br />

∴ f( n) =Θ n<br />

log b<br />

( )<br />

logc Como f( n ) =Θ ( n<br />

b ), entonces todos los lgn términos <strong>de</strong> la recurrencia son iguales al<br />

último término,<br />

∴ Tn=Θ n n=Θ n n=Θ<br />

n<br />

logc log3/21<br />

( ) ( b<br />

lg ) ( lg ) (lg )<br />

Alternativamente se pue<strong>de</strong> resolver la recurrencia mediante la construcción <strong>de</strong>l árbol <strong>de</strong><br />

recursión.


Instituto Tecnológico <strong>de</strong> Ciudad Ma<strong>de</strong>ro<br />

Unidad I COMPLEJIDAD DE ALGORITMOS<br />

Dra. Laura Cruz Reyes<br />

Capítulo 3 <strong>Complejidad</strong> <strong>de</strong> <strong>algoritmos</strong> <strong>recursivos</strong><br />

T(n) 1<br />

T nivel0 = 1<br />

log 3/2 (n)<br />

T(2n/3) 1<br />

T nivel1 = 1<br />

T(4n/9) 1<br />

T nivel2 = 1<br />

T(1) 1<br />

T nivelm = 1<br />

Se obtiene el patrón <strong>de</strong>l tamaño <strong>de</strong> problema: (2/3) i n.<br />

0 1 2 m−1<br />

⎛2⎞ ⎛2⎞ ⎛2⎞ ⎛1⎞ ⎛2⎞<br />

⎜ ⎟ n→⎜ ⎟ n→⎜ ⎟ n→... →⎜ ⎟ n→ ⎜ ⎟ n=<br />

1<br />

⎝3⎠ ⎝3⎠ ⎝3⎠ ⎝3⎠ ⎝3⎠<br />

En la profundidad i=m <strong>de</strong>l árbol, el tamaño <strong>de</strong>l problema es 1.<br />

m<br />

m<br />

⎛2<br />

⎞<br />

⎜ ⎟ n = 1<br />

⎝3<br />

⎠<br />

m<br />

⎛3<br />

⎞<br />

⎜ ⎟ = n<br />

⎝2<br />

⎠<br />

m<br />

⎛3<br />

⎞<br />

log ⎜ ⎟ = log<br />

⎝2<br />

⎠<br />

m=<br />

log n<br />

3/2 3/2<br />

3/2<br />

n<br />

Se obtiene como patrón <strong>de</strong> complejidad una constante que prevalece hasta la profundidad <strong>de</strong>l<br />

árbol.<br />

Tn ( ) = 1+ 1+ 1 + ... + 1<br />

log 3/2 n<br />

Tn ( ) = ∑ 1<br />

i=<br />

0<br />

Tn ( ) = log<br />

3/2( n) + 1<br />

Tn ( ) =Θ(lg n)<br />

El siguiente ejemplo ilustra el tercer caso correspondiente a una serie geométrica <strong>de</strong>creciente.<br />

⎧3 Tn ( /4) + nlgn n><br />

0<br />

Tn ( ) = ⎨<br />

⎩0 n = 0


Instituto Tecnológico <strong>de</strong> Ciudad Ma<strong>de</strong>ro<br />

Unidad I COMPLEJIDAD DE ALGORITMOS<br />

Dra. Laura Cruz Reyes<br />

Capítulo 3 <strong>Complejidad</strong> <strong>de</strong> <strong>algoritmos</strong> <strong>recursivos</strong><br />

De la fórmula general <strong>de</strong> divi<strong>de</strong>-y-venceras:<br />

T(n) = b T( n/c ) + f(n),<br />

b=3, c=4, f(n) =nlgn.<br />

Para <strong>de</strong>terminar que la recurrencia correspon<strong>de</strong> al caso 3 <strong>de</strong>l Teorema Maestro, sea<br />

f( n) = nlgn<br />

c<br />

gn ( ) = n b = n<br />

log + ε log4<br />

3+<br />

ε<br />

Se <strong>de</strong>muestra que f(n) = Ω(g(n))<br />

⎛ f( n) ⎞ ⎛ nlgn<br />

⎞<br />

lim ⎜ ⎟=<br />

lim ⎜<br />

x<br />

log4<br />

3<br />

( ) x<br />

+ ε ⎟<br />

→∞ gn →∞<br />

⎝ ⎠ ⎝n<br />

⎠<br />

⎛ nlg<br />

n ⎞<br />

lim ⎜ lim lg n si ε 0.207<br />

x→∞<br />

0.793 ε ⎟ = =∞ =<br />

n n x→∞<br />

⎝ ⎠<br />

⎛ nlg<br />

n ⎞<br />

lim ⎜<br />

si 0< ε 0.207<br />

x→∞<br />

0.793 ε ⎟ =∞ ≤<br />

⎝n<br />

n ⎠<br />

logc<br />

b+<br />

ε<br />

( )<br />

∴ f( n) =Ω n para ε > 0<br />

A<strong>de</strong>más, se <strong>de</strong>muestra que bf(n/c)≤c´f(n) para alguna constante c´


Instituto Tecnológico <strong>de</strong> Ciudad Ma<strong>de</strong>ro<br />

Dra. Laura Cruz Reyes<br />

Unidad I COMPLEJIDAD DE ALGORITMOS<br />

Se conjetura que la solución <strong>de</strong> T(n) pertenece a algún or<strong>de</strong>n <strong>de</strong> O(f(n)).<br />

Paso2: Prueba inductiva<br />

a) Hipótesis: La función adivinada se establece como hipótesis inductiva<br />

T(n) ≤ cf(n) para una c>0<br />

b) Caso Base: Para n pequeña se prueba T(n) ≤ cf(n).<br />

Capítulo 3 <strong>Complejidad</strong> <strong>de</strong> <strong>algoritmos</strong> <strong>recursivos</strong><br />

La hipótesis inductiva se prueba con el tamaño <strong>de</strong> problema más pequeño. Como la<br />

solución adivinada se expresa en notación asintótica sólo basta encontrar una n 0 , tal que la<br />

hipótesis inductiva se cumpla para cualquier n > n 0 . El valor <strong>de</strong> n 0 se substituye en la<br />

recurrencia para encontrar su solución con n pequeña. La prueba es correcta si la hipótesis<br />

y la recurrencia coinci<strong>de</strong>n en alguna constante c.<br />

c) Caso General: Suponiendo T(n) ≤ cf(n) verda<strong>de</strong>ra <strong>de</strong>mostrar que T(n-1) ≤ cf(n-1)<br />

La hipótesis inductiva se prueba con un valor <strong>de</strong> problema gran<strong>de</strong>. Para ello se asume que<br />

dicha hipótesis es válida con el tamaño anterior k f-1 al <strong>de</strong>l más gran<strong>de</strong> que es k f . Esta se<br />

substituye en la recurrencia evaluada en k f , y se consi<strong>de</strong>ra correcta si alcanza la forma<br />

exacta <strong>de</strong> la hipótesis inductiva.<br />

3.7.2 Ejemplos <strong>de</strong> recurrencias resueltas con el método <strong>de</strong> sustitución<br />

El siguiente ejemplo ilustra el método <strong>de</strong> sustitución.<br />

⎧ ⎪2 T( ⎢n/2 ⎥) + n n><br />

1<br />

Tn ( ) =<br />

⎣ ⎦<br />

⎨<br />

⎪⎩ 1 n = 1<br />

Paso 1: Adivinación<br />

Sea T(n) = O(nlgn) la solución adivinada<br />

Paso 2: Prueba inductiva<br />

a) Como hipótesis inductiva se establece la función<br />

T(n) ≤ c(nlgn) para una c>0.<br />

b) Para probar que la hipótesis inductiva es válida con un tamaño <strong>de</strong> problema gran<strong>de</strong> k f =n,<br />

primero se asume que esta hipótesis es valida con un valor k f-1 =⎣n/2⎦ anterior al <strong>de</strong> k f .<br />

La hipótesis inductiva <strong>de</strong> la solución adivinada es:


Instituto Tecnológico <strong>de</strong> Ciudad Ma<strong>de</strong>ro<br />

Unidad I COMPLEJIDAD DE ALGORITMOS<br />

Tn ( ) = On ( log n)<br />

Tn ( ) ≤ cn ( log n)<br />

Dra. Laura Cruz Reyes<br />

Capítulo 3 <strong>Complejidad</strong> <strong>de</strong> <strong>algoritmos</strong> <strong>recursivos</strong><br />

La hipótesis inductiva para k f-1 =⎣n/2⎦ queda:<br />

( )<br />

T ⎢⎣n/2 ⎥⎦ ≤ c⎢⎣n/2⎥⎦lg ⎢⎣n/2⎥⎦<br />

La recurrencia original para k f =n es:<br />

Tn ( ) = 2 T( ⎢⎣n/2 ⎥⎦<br />

) + n<br />

La hipótesis inductiva que es valida en k f-1 se sustituye en la recurrencia especificada en el<br />

tamaño <strong>de</strong> problema más gran<strong>de</strong> k f . La recurrencia original, con la sustitución <strong>de</strong> la hipótesis<br />

inductiva, queda<br />

( )<br />

( )<br />

( )<br />

( )<br />

T n ≤ 2 c⎢⎣n/2⎥⎦lg ⎢⎣n/2⎥⎦+<br />

n<br />

T n ≤ cn lg( n / 2) + n<br />

T n ≤cn lg n − cn lg 2 + n<br />

T n ≤cn lg n − cn + n<br />

Para c=1 se encuentra la forma exacta <strong>de</strong> la hipótesis inductiva:<br />

( )<br />

( )<br />

T n<br />

T n<br />

≤(1) nlg n− (1) n+<br />

n<br />

≤ nlg<br />

n<br />

c) Se busca un valor pequeño <strong>de</strong> n para el cual la hipótesis inductiva es válida.<br />

Para n 0 =1, que es el tamaño <strong>de</strong> problema más pequeño, la hipótesis inductiva queda:<br />

( )<br />

() 1<br />

T n ≤ cn lg n<br />

T ≤ c(1) lg(1) = 0<br />

La hipótesis es inconsistente con el caso base <strong>de</strong> la recurrencia ya que no existe una c que<br />

pueda obtener su condición límite T(1)=1.<br />

∴Cuando n 0 =1 la hipótesis inductiva no se cumple.<br />

Para n 0 =2, la hipótesis inductiva queda:<br />

( )<br />

( 2)<br />

T n<br />

T<br />

≤ cn lg n<br />

≤ c(2)lg(2) = 2c<br />

El valor <strong>de</strong> n 0 =2 se sustituye en la recurrencia:


Instituto Tecnológico <strong>de</strong> Ciudad Ma<strong>de</strong>ro<br />

Unidad I COMPLEJIDAD DE ALGORITMOS<br />

Dra. Laura Cruz Reyes<br />

Capítulo 3 <strong>Complejidad</strong> <strong>de</strong> <strong>algoritmos</strong> <strong>recursivos</strong><br />

Tn ( ) = 2 T( ⎢⎣n/2 ⎥⎦)<br />

+ n<br />

T = 2 T ( ⎢⎣2/2 ⎥⎦) + 2<br />

T = 2(1) + 2 = 4<br />

( 2)<br />

( 2)<br />

Para c =2 la hipótesis inductiva correspon<strong>de</strong> con la recurrencia.<br />

T<br />

T<br />

( 2)<br />

( 2)<br />

≤ 2c<br />

≤ 2(2) = 4<br />

∴Cuando n 0 =2 la hipótesis inductiva se cumple.<br />

Dado que se encontró la forma exacta <strong>de</strong> la hipótesis con n gran<strong>de</strong> y no se llegó a<br />

inconsistencias con n pequeña, queda <strong>de</strong>mostrado que Tn ( ) = On ( log n)<br />

.<br />

3.7.3 Consejos para una buena adivinación<br />

a) Usar la solución <strong>de</strong> una recurrencia similar a la recurrencia con solución conocida.<br />

Recurrencia con solución conocida<br />

Tn ( )<br />

c<br />

= 2 T( ⎢⎣n/2 ⎥⎦<br />

) + n<br />

T(n) c = O(nlgn)<br />

Recurrencia con solución <strong>de</strong>sconocida<br />

Tn ( )<br />

c<br />

= 2 T( ⎢⎣n/2 ⎥⎦<br />

) + 32+<br />

n<br />

Probar la solución<br />

T(n) c = O(nlgn)<br />

b) Probar límites superiores e inferiores holgados y <strong>de</strong>spués reducirlos hasta que converjan.<br />

Para la recurrencia<br />

Tn ( ) = 2 T( ⎢⎣n/2 ⎥⎦<br />

) + n<br />

Probar como límite inferior el costo no recursivo<br />

Tn ( ) =Ω( ⎢⎣n⎥⎦<br />

)<br />

Probar como límite superior una potencia <strong>de</strong>l costo no recursivo


Instituto Tecnológico <strong>de</strong> Ciudad Ma<strong>de</strong>ro<br />

Unidad I COMPLEJIDAD DE ALGORITMOS<br />

Dra. Laura Cruz Reyes<br />

Capítulo 3 <strong>Complejidad</strong> <strong>de</strong> <strong>algoritmos</strong> <strong>recursivos</strong><br />

Tn ( ) =Ο( ⎢⎣n⎥⎦<br />

)<br />

Reducir el límite superior y elevar el límite inferior hasta que converjan en el correcto<br />

T(n) = Θ(nlgn)<br />

c) Convertir una suposición inductiva débil en una fuerte, restando el término <strong>de</strong> más bajo<br />

or<strong>de</strong>n.<br />

Suposición inductiva débil<br />

Recurrencia a resolver:<br />

T( n) = 2 T( ⎢⎣n/2 ⎥⎦) + 2 T( ⎡⎢n/2 ⎤⎥<br />

) + 1<br />

Adivinación <strong>de</strong> la fórmula <strong>de</strong> la solución:<br />

Tn ( ) = On ( )<br />

Hipótesis inductiva: existe una c>0 que haga cierto que,<br />

Tn ( ) ≤ cn ( )<br />

Sustitución en la recurrencia <strong>de</strong> la hipótesis inductiva evaluada en k f-1 = n/2<br />

T( n) ≤ cn /2 + cn /2+<br />

1<br />

Tn ( ) ≤ cn+<br />

1<br />

La hipótesis inductiva se rechaza ya que no existe una c que haga cierta la hipótesis en la<br />

recurrencia ya que para toda c>1, cn≠ cn+1<br />

Suposición inductiva fuerte<br />

El término <strong>de</strong> más bajo or<strong>de</strong>n <strong>de</strong> la recurrencia es 1, el cual se resta <strong>de</strong> la hipótesis<br />

inductiva como una constante, quedando:<br />

Tn ( ) ≤cn ( ) −b, con b≥<br />

0<br />

Sustituyendo en la recurrencia la hipótesis inductiva evaluada en k f-1 = n/2 se tiene:<br />

Tn ( ) ≤cn/2 − b+ cn/2− b+<br />

1<br />

Tn ( ) ≤cn− 2b+<br />

1<br />

Para b=1 la recurrencia y la hipótesis coinci<strong>de</strong>n<br />

Recurrencia


Instituto Tecnológico <strong>de</strong> Ciudad Ma<strong>de</strong>ro<br />

Unidad I COMPLEJIDAD DE ALGORITMOS<br />

Tn ( ) ≤cn− 2(1) + 1<br />

Tn ( ) ≤cn−1<br />

Hipótesis<br />

Dra. Laura Cruz Reyes<br />

Capítulo 3 <strong>Complejidad</strong> <strong>de</strong> <strong>algoritmos</strong> <strong>recursivos</strong><br />

Tn ( ) ≤cn−b<br />

Tn ( ) ≤cn−1<br />

d) Cambio <strong>de</strong> variables.<br />

Mediante una manipulación algebraica hacer que una recurrencia <strong>de</strong>sconocida sea similar a<br />

una conocida<br />

Por ejemplo:<br />

Tn ( ) = 2 T( n) + lgn.<br />

Para eliminar el logaritmo se introduciendo una nueva variable m=lgn.<br />

m<br />

n = 2<br />

m<br />

m<br />

T(2 ) = 2 T( 2 ) + m<br />

m<br />

m/2<br />

T(2 ) = 2 T(2 ) + m<br />

La recurrencia original T se renombra con S, cuyo tamaño <strong>de</strong> problema es m.<br />

m<br />

Sm ( ) = T(2 )<br />

Sm ( ) = 2 Sm ( /2) + m<br />

La nueva recurrencia S es similar a otra recurrencia <strong>de</strong> solución conocida.<br />

Tn ( ) = 2 Tn ( /2) + n<br />

Tn ( ) = On ( log n)<br />

Por lo tanto, S tiene la misma solución que la recurrencia conocida.<br />

Sm ( ) = Om ( log m)<br />

Se restablecen los valores originales para obtener la solución <strong>de</strong> la recurrencia original.<br />

m<br />

Tn ( ) = T(2 ) = Sm ( )<br />

Tn ( ) = Om ( lg m) = O(lg n(lg(lg n)))<br />

,<br />

2<br />

Tn ( ) = O(lognlg n)


Instituto Tecnológico <strong>de</strong> Ciudad Ma<strong>de</strong>ro<br />

Unidad I COMPLEJIDAD DE ALGORITMOS<br />

3.8 Ejercicios resueltos<br />

Dra. Laura Cruz Reyes<br />

Capítulo 3 <strong>Complejidad</strong> <strong>de</strong> <strong>algoritmos</strong> <strong>recursivos</strong><br />

En los siguientes ejercicios, para la función <strong>de</strong> recurrencia dada, se aplican los métodos <strong>de</strong><br />

solución indicados. Posteriormente se <strong>de</strong>termine el or<strong>de</strong>n asintótico <strong>de</strong> la función. Finalmente la<br />

solución la solución se comprueba utilizando la herramienta Derive.<br />

3.8.1. Utilice el método maestro y al árbol <strong>de</strong> recurrencia para resolver la función T(n)<br />

<strong>de</strong>finida para todas las potencias <strong>de</strong> 2.<br />

( )<br />

Tn ( ) = n-1+<br />

2 T n/2<br />

T (1) = 0<br />

a) Aplicación <strong>de</strong> métodos <strong>de</strong> solución <strong>de</strong> recurrencias<br />

Mediante un análisis <strong>de</strong>l árbol <strong>de</strong> recurrencia se observa que la complejidad en los<br />

diferentes niveles <strong>de</strong>l árbol no es constante y tampoco es una serie geométrica. Por lo<br />

anterior el teorema maestro no se pue<strong>de</strong> utilizar para resolver la recurrencia.<br />

n-1<br />

<strong>Complejidad</strong><br />

T(n)<br />

n-1<br />

Patrón <strong>de</strong> <strong>Complejidad</strong>: n-2 i<br />

T(n/2) (n/2)-1<br />

T(n/2) (n/2)-1<br />

n-2<br />

T(n/4) (n/4)-1 T(n/4) (n/4)-1 T(n/4) (n/4)-1 T(n/4) (n/4)-1 n-4<br />

.<br />

.<br />

n-2 i<br />

Para facilitar la i<strong>de</strong>ntificación <strong>de</strong> patrones, se elabora una tabla que resume la evolución<br />

<strong>de</strong>l tamaño <strong>de</strong>l problema, la complejidad <strong>de</strong> un nodo y la complejidad <strong>de</strong> un nivel.<br />

Nivel<br />

i<br />

Tamaño<br />

<strong>de</strong>l<br />

<strong>Complejidad</strong><br />

(<strong>de</strong> un<br />

No. <strong>de</strong><br />

suproblemas<br />

<strong>Complejidad</strong><br />

(<strong>de</strong> todo el nivel)<br />

problema subproblema)<br />

0 n n-1 1 1(n-1) = n-1<br />

1 n/2 n/2 -1 2 2(n/2 -1) = n-2<br />

2 n/4 n/4 -1 4 4(n/4 -1) = n-4<br />

<br />

9i n 1<br />

n − 2 i<br />

2 i 2 i<br />

<br />

m n n<br />

=1<br />

⎛ ⎞ 2 m<br />

T = T(1) =<br />

m ⎛ n ⎞ m m<br />

0<br />

2 m ⎜<br />

2 m ⎟<br />

2 T⎜<br />

2 T(1) 2 (0)<br />

m ⎟ = =<br />

⎝ ⎠<br />

⎝2<br />


Instituto Tecnológico <strong>de</strong> Ciudad Ma<strong>de</strong>ro<br />

Unidad I COMPLEJIDAD DE ALGORITMOS<br />

Dra. Laura Cruz Reyes<br />

Capítulo 3 <strong>Complejidad</strong> <strong>de</strong> <strong>algoritmos</strong> <strong>recursivos</strong><br />

m−1 m−1 m−1<br />

i m i m i<br />

∑ ∑ ∑<br />

Tn ( ) = ( n− 2 ) + 2 T(1) = ( n− 2 ) + 2 (0) = ( n−2 )<br />

i= 0 i= 0 i=<br />

0<br />

L<br />

Para i = m, que es el tamaño <strong>de</strong> problema más pequeño, y aplicando: b = x ; log x = L<br />

⎛ n ⎞<br />

T⎜<br />

(1)<br />

m ⎟ = T<br />

⎝2<br />

⎠<br />

n<br />

= 1<br />

m<br />

2<br />

m<br />

2 = n<br />

m=<br />

lg n<br />

Logrando con ello establecer el límite al cual llegará i, es <strong>de</strong>cir, la profundidad <strong>de</strong>l árbol<br />

∑<br />

i k + 1<br />

Utilizando la serie geométrica 2 = 2 −1<br />

k<br />

i=<br />

0<br />

b<br />

lg n-1 lg n-1 lg n-1<br />

i<br />

∑ ∑ ∑<br />

T( n) = ( n-2 ) = n- 2<br />

i= 0 i= 0 i=<br />

0<br />

lg n-1 lg n-1<br />

i (lg n-1) + 1<br />

lg n<br />

( ) = 1- 2 = (lg ) - (2 -1) = (lg ) - 2 + 1<br />

∑ ∑<br />

T n n n n n n<br />

i= 0 i=<br />

0<br />

T( n) = nlgn-n+<br />

1<br />

i<br />

b) Determinación <strong>de</strong>l or<strong>de</strong>n asintótico<br />

T( n) =Θ ( nlg n)<br />

c) Comprobación con Derive<br />

GEOMETRIC1 es una función que resuelve ecuaciones <strong>de</strong> recurrencia linear-geométrica obtenidas<br />

<strong>de</strong> <strong>algoritmos</strong> <strong>de</strong> los tipos divi<strong>de</strong>-y-vencerás. La Función T(n) se <strong>de</strong>be transformar para adquirir la<br />

forma esperada por GEOMETRIC1.<br />

( )<br />

( )<br />

Tn ( ) = n− 1+ 2 T n/2 , T(1) = 0<br />

T(2 n) = 2T n + 2n−1<br />

ykx ( ) = pxyx ( ) ( ) + qx ( )<br />

k = 2, x= n, px ( ) = 2, q( x) = 2n− 1, x = 1, y = 0<br />

GEOMETRIC1( k, p( x), q( x), x, x , y )<br />

0 0<br />

0 0


Instituto Tecnológico <strong>de</strong> Ciudad Ma<strong>de</strong>ro<br />

Unidad I COMPLEJIDAD DE ALGORITMOS<br />

Dra. Laura Cruz Reyes<br />

Capítulo 3 <strong>Complejidad</strong> <strong>de</strong> <strong>algoritmos</strong> <strong>recursivos</strong><br />

#1: GEOMETRIC1(2, 2, 2n - 1, n, 1, 0)<br />

n·LN(n)<br />

#2: ⎯⎯⎯⎯⎯⎯⎯⎯⎯ - n + 1<br />

LN(2)<br />

3.8.2. Utilice el método maestro para resolver la función W <strong>de</strong>finida por la ecuación <strong>de</strong> recurrencia<br />

y caso base siguientes:<br />

( ⎢ ⎥)<br />

W( n) = 2 W ⎣n/2⎦<br />

+ n<br />

W (1) = 0<br />

a) Aplicación <strong>de</strong> métodos <strong>de</strong> solución <strong>de</strong> recurrencias<br />

W(n)<br />

n<br />

<strong>Complejidad</strong><br />

n<br />

W(n/2)<br />

(1/2)n<br />

W(n/2)<br />

(1/2)n<br />

n<br />

W(n/4)<br />

(1/4)n<br />

W(n/4)<br />

(1/4)n<br />

W(n/4)<br />

(1/4)n<br />

W(n/4)<br />

(1/4) n<br />

n<br />

Observando el árbol <strong>de</strong> recurrencia se pue<strong>de</strong> notar que el patrón <strong>de</strong> complejidad se mantiene<br />

constante, correspondiendo al caso 2 <strong>de</strong>l método maestro.<br />

De la formula general <strong>de</strong> divi<strong>de</strong>-y-vencerás se tiene:<br />

T( n) = bT( n/ c) + f ( n)<br />

b = 2, c = 2, f ( n)<br />

= n<br />

logc Demostrar que f ( n) =Θ ( n<br />

b<br />

), requiere i<strong>de</strong>ntificar las funciones f(n) y g(n)<br />

f( n)<br />

= n<br />

lg 2<br />

gn ( ) = n 2 = n<br />

Como f ( n) = g( n)<br />

, se <strong>de</strong>muestra que<br />

f n<br />

logc ( ) =Θ ( n<br />

b<br />

)<br />

Del teorema maestro se obtiene la forma asintótica <strong>de</strong> la solución<br />

W n n n n n n n<br />

log log2<br />

2<br />

( ) =Θ ( c b lg ) =Θ ( lg ) =Θ ( lg )


Instituto Tecnológico <strong>de</strong> Ciudad Ma<strong>de</strong>ro<br />

Unidad I COMPLEJIDAD DE ALGORITMOS<br />

b) Comprobación con Derive<br />

Dra. Laura Cruz Reyes<br />

Capítulo 3 <strong>Complejidad</strong> <strong>de</strong> <strong>algoritmos</strong> <strong>recursivos</strong><br />

( ⎢⎣<br />

⎥⎦)<br />

( )<br />

W( n) = 2 W n/ 2 + n, W(1) = 0<br />

W(2 n) = 2W n + 2n<br />

ykx ( ) = pxyx ( ) ( ) + qx ( )<br />

k = 2, x = n, p( x) = 2, q( x) = 2n<br />

GEOMETRIC1( k, p( x), q( x), x, x0, y0)<br />

#1: GEOMETRIC1(2, 2, 2n, n, 1, 0)<br />

n·LN(n)<br />

#2: ⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯<br />

LN(2)<br />

3.8.3. Utilice el método maestro y el árbol <strong>de</strong> recurrencia para resolver la función T <strong>de</strong>finida por la<br />

ecuación <strong>de</strong> recurrencia y caso base siguientes:<br />

T( n) = T( n/2) + lg n, T(1) = 1<br />

a) Aplicación <strong>de</strong> métodos <strong>de</strong> solución <strong>de</strong> recurrencias<br />

Del análisis <strong>de</strong>l árbol <strong>de</strong> recurrencia se observa que la complejidad no es constante y no es una serie<br />

geométrica <strong>de</strong>creciente, por lo que no posible aplicar el Teorema maestro para resolver la<br />

recurrencia.<br />

T(n)<br />

T(n/2)<br />

T(n/4)<br />

lgn<br />

lg(n/2)<br />

lg(n/4)<br />

<strong>Complejidad</strong><br />

lgn<br />

lg(n/2)<br />

lg(n/4)<br />

.<br />

.<br />

.<br />

lg(n/2 i )<br />

Nivel<br />

i<br />

Tamaño <strong>de</strong>l<br />

problema<br />

<strong>Complejidad</strong><br />

(<strong>de</strong> un subproblema)<br />

No. <strong>de</strong><br />

subproblemas<br />

<strong>Complejidad</strong><br />

(<strong>de</strong> todo el nivel)<br />

0 n lg n 1 lg n<br />

1 n/2 lg(n/2) 1 (lg(n/2))<br />

2 n/4 lg(n/4) 1 (lg(n/4))<br />

1 <br />

i n/2 i lg(n/2 i ) 1 lg(n/2 i )<br />

1 <br />

m n/2 m =1 T(n/2 m )=T(1)=1 1 T(n/2 m )= T(1)=1


Instituto Tecnológico <strong>de</strong> Ciudad Ma<strong>de</strong>ro<br />

Unidad I COMPLEJIDAD DE ALGORITMOS<br />

⎛ n ⎞<br />

Patrón <strong>de</strong> complejidad: lg ⎜ 2<br />

i ⎟<br />

⎝ ⎠<br />

Dra. Laura Cruz Reyes<br />

Capítulo 3 <strong>Complejidad</strong> <strong>de</strong> <strong>algoritmos</strong> <strong>recursivos</strong><br />

L<br />

Para i=m, que es el tamaño <strong>de</strong> problema más pequeño, y aplicando: b = x ; log x = L<br />

m<br />

Tn ( /2 ) = T(1)<br />

n<br />

= 1<br />

m<br />

2<br />

m<br />

2 = n<br />

m=<br />

lg n<br />

Logrando con ello establecer el límite al cual llegará i, es <strong>de</strong>cir la profundidad <strong>de</strong>l árbol<br />

( )<br />

lg n−1<br />

∑<br />

i=<br />

0<br />

i<br />

( )<br />

Tn ( ) = lg n2 + T(1)<br />

lg n−1 lg n−1 lg n−1 lg n−1<br />

i<br />

∑ ∑ ∑ ∑<br />

Tn ( ) = lg n− lg 2 + 1 = lg n 1− i+<br />

1<br />

i= 0 i= 0 i= 0 i=<br />

0<br />

2<br />

lg n(lg n−1) 2 (lg n) −lg<br />

n<br />

Tn ( ) = lg n(lg n) − + 1 = (lg n) − + 1<br />

2 2<br />

2 2 2<br />

2(lg n) − (lg n) + lg n (lg n) + lg n<br />

Tn ( ) = + 1= + 1<br />

2 2<br />

b) Determinación <strong>de</strong>l or<strong>de</strong>n asintótico<br />

2<br />

Tn ( ) =Θ ((lg n) )<br />

c) Comprobación con Derive<br />

Tn ( ) = Tn ( /2) + lg n, T(1) = 1<br />

T(2 n) = T n + lg 2n<br />

b<br />

ykx ( ) = pxyx ( ) ( ) + qx ( )<br />

k = 2, x= n, p( x) = 1, q( x) = lg 2n<br />

GEOMETRIC1( k, p( x), q( x), x, x0, y0)<br />

#1: GEOMETRIC1(2, 1, LOG(2n, 2), n, 1, 1)<br />

2<br />

LN(n)<br />

LN(n)<br />

#2: ⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯ + ⎯⎯⎯⎯⎯⎯⎯⎯⎯ + 1<br />

2 2·LN(2)<br />

2·LN(2)


Instituto Tecnológico <strong>de</strong> Ciudad Ma<strong>de</strong>ro<br />

Dra. Laura Cruz Reyes<br />

Unidad I COMPLEJIDAD DE ALGORITMOS<br />

Capítulo 3 <strong>Complejidad</strong> <strong>de</strong> <strong>algoritmos</strong> <strong>recursivos</strong><br />

3.8.4. Utilice el método maestro para resolver la función T <strong>de</strong>finida por la ecuación <strong>de</strong> recurrencia<br />

y caso base siguientes: Tn ( ) = Tn ( /2) + n, T(1) = 1<br />

a) Aplicación <strong>de</strong> métodos <strong>de</strong> solución <strong>de</strong> recurrencias<br />

Del análisis <strong>de</strong>l árbol <strong>de</strong> recurrencia se observa que la complejidad es una serie geométrica<br />

<strong>de</strong>creciente, por lo que es recomendable aplicar el caso 3 <strong>de</strong>l Teorema maestro.<br />

T(n)<br />

T(n/2)<br />

T(n/4)<br />

n<br />

(1/2)n<br />

(1/4)n<br />

<strong>Complejidad</strong><br />

n<br />

(1/2)n<br />

(1/4)n<br />

<br />

(1/2 i )n<br />

Nivel<br />

i<br />

Tamaño <strong>de</strong>l<br />

problema<br />

<strong>Complejidad</strong><br />

(<strong>de</strong> un subproblema)<br />

<strong>Complejidad</strong><br />

(<strong>de</strong> todo el nivel)<br />

0 n n n<br />

1 n/2 n/2 n/2<br />

2 n/4 n/4 n/4<br />

<br />

De la formula general T( n) = bT( n/ c) + f ( n)<br />

se tiene se tiene b = 1, c = 2, f ( n)<br />

= n.<br />

logc Demostrar que ( ) ( b + ε<br />

f n =Ω n ) para ε > 0, requiere i<strong>de</strong>ntificar las funciones f ( n ) y gn ( )<br />

f( n)<br />

= n<br />

log c log 2<br />

( ) b +<br />

gn n ε 1 +<br />

n ε ( n 0 +<br />

= = = ε ) = ( n<br />

ε )<br />

Como f ( n/ c) ≤ c' g ( n)<br />

se <strong>de</strong>muestra que f ( n) = Ω ( n ε ) para ε = 1 y c´ = 1<br />

El Teorema Maestro también pi<strong>de</strong> <strong>de</strong>mostrar que bf ( n / c) ≤ c ' f ( n)<br />

para c ' < 1.<br />

bf ( n / c) ≤ n /2<br />

bf ( n)<br />

= 2 n<br />

3<br />

para c ' = 2<br />

3<br />

Como existe una c ' < 1, se <strong>de</strong>muestra que bf ( n / c) ≤ c ' f ( n)<br />

( )<br />

Cuando las <strong>de</strong>mostraciones son exitosas, el teorema maestro señala que Tn ( ) f( n)<br />

Por tanto, la forma asintótica <strong>de</strong> la solución queda:<br />

Tn ( ) =Θ ( n)<br />

=Θ .


Instituto Tecnológico <strong>de</strong> Ciudad Ma<strong>de</strong>ro<br />

Unidad I COMPLEJIDAD DE ALGORITMOS<br />

b) Comprobación con Derive<br />

Tn ( ) = Tn ( /2) + n, T(1) = 1<br />

( )<br />

T(2 n) = T n + 2n<br />

Dra. Laura Cruz Reyes<br />

Capítulo 3 <strong>Complejidad</strong> <strong>de</strong> <strong>algoritmos</strong> <strong>recursivos</strong><br />

ykx ( ) = pxyx ( ) ( ) + qx ( )<br />

k = 2, x= n, p( x) = 1, q( x) = 2n<br />

GEOMETRIC1( k, p( x), q( x), x, x0, y0)<br />

#1: GEOMETRIC1(2, 1, 2n, n, 1, 1)<br />

#2: 2·n - 1<br />

3.8.5. Utilice el método maestro para resolver la función T <strong>de</strong>finida por la ecuación <strong>de</strong> recurrencia<br />

y caso base siguientes: T( n) = 2 T( n/2) + n, T(1) = 1<br />

a) Aplicación <strong>de</strong> métodos <strong>de</strong> solución <strong>de</strong> recurrencias<br />

T(n)<br />

n<br />

<strong>Complejidad</strong><br />

n<br />

T(n/2)<br />

(1/2) n<br />

T (n/2)<br />

(1/2) n<br />

n<br />

T(n/4)<br />

(1/4)n<br />

T(n/4)<br />

(1/4) n<br />

T(n/4)<br />

(1/4) n<br />

T(n/4)<br />

(1/4) n<br />

n<br />

.<br />

.<br />

n<br />

Nivel<br />

i<br />

Tamaño <strong>de</strong>l<br />

problema<br />

<strong>Complejidad</strong><br />

(<strong>de</strong> un subproblema)<br />

<strong>Complejidad</strong><br />

(<strong>de</strong> todo el nivel)<br />

0 n n n = n<br />

1 n/2 n/2 2(n/2) = n<br />

2 n/4 n/4 4(n/4) = n<br />

<br />

Observando el árbol <strong>de</strong> recurrencia se pue<strong>de</strong> notar que el patrón <strong>de</strong> complejidad se mantiene<br />

constante, correspondiendo al caso 2 <strong>de</strong>l método maestro.<br />

De la formula general <strong>de</strong> divi<strong>de</strong>-y-vencerás T( n) = bT( n/ c) + f ( n)<br />

se tiene<br />

b = 2, c = 2, f ( n)<br />

= n<br />

Demostrar que<br />

f n<br />

logc ( ) ( n<br />

b<br />

)<br />

=Θ , requiere i<strong>de</strong>ntificar las funciones f(n) y g(n)<br />

lg 2<br />

f ( n) = n, g( n)<br />

= n 2 = n


Instituto Tecnológico <strong>de</strong> Ciudad Ma<strong>de</strong>ro<br />

Unidad I COMPLEJIDAD DE ALGORITMOS<br />

Como f( n) = g( n)<br />

,se <strong>de</strong>muestra que<br />

f n<br />

logc ( ) =Θ ( n<br />

b<br />

)<br />

Dra. Laura Cruz Reyes<br />

Capítulo 3 <strong>Complejidad</strong> <strong>de</strong> <strong>algoritmos</strong> <strong>recursivos</strong><br />

Del teorema maestro se obtiene la forma asintótica <strong>de</strong> la solución<br />

log log2<br />

2<br />

W( n) =Θ ( n c b lg n) =Θ ( n lg n) =Θ ( nlg n)<br />

b) Comprobación con Derive<br />

T( n) = 2 T( n/2) + n, T(1) = 1<br />

( )<br />

T(2 n) = 2T n + 2n<br />

ykx ( ) = pxyx ( ) ( ) + qx ( )<br />

k = 2, x = n, p( x) = 2, q( x) = 2n<br />

GEOMETRIC1( k, p, q, x, x0, y0)<br />

#1: GEOMETRIC1(2, 2, 2n, n, 1, 1)<br />

n·LN(n)<br />

#2: ⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯ + n<br />

LN(2)<br />

3.8.6. Utilice el método maestro y el árbol <strong>de</strong> recurrencia para resolver la función T <strong>de</strong>finida por la<br />

ecuación <strong>de</strong> recurrencia y caso base siguientes:<br />

T( n) = 2 T( n/2) + nlg n, T(1) = 1<br />

a) Aplicación <strong>de</strong> métodos <strong>de</strong> solución <strong>de</strong> recurrencias<br />

Del análisis <strong>de</strong>l árbol <strong>de</strong> recurrencia se observa que la complejidad no se mantiene constante y no es<br />

una serie geométrica <strong>de</strong>creciente, por lo que no es posible utilizar el Teorema maestro para la<br />

solución <strong>de</strong> la recurrencia<br />

T(n)<br />

n lg n<br />

<strong>Complejidad</strong><br />

n lg n<br />

T(n/2)<br />

(1/2) n lg n/2<br />

T(n/2)<br />

(n/2) lg (n/2)<br />

n lg (n/2)<br />

T(n/4)<br />

(n/4) n lg (n/4)<br />

T(n/4)<br />

(n/4) lg (n /4)<br />

T(n/4)<br />

(n/4) lg (n/4)<br />

T(n /4)<br />

(n /4) lg (n/4)<br />

n lg (n/4)<br />

.<br />

.<br />

.<br />

.<br />

n lg (n/2 i )


Instituto Tecnológico <strong>de</strong> Ciudad Ma<strong>de</strong>ro<br />

Unidad I COMPLEJIDAD DE ALGORITMOS<br />

Dra. Laura Cruz Reyes<br />

Capítulo 3 <strong>Complejidad</strong> <strong>de</strong> <strong>algoritmos</strong> <strong>recursivos</strong><br />

Nivel<br />

i<br />

Tamaño <strong>de</strong>l<br />

problema<br />

<strong>Complejidad</strong><br />

(<strong>de</strong> un<br />

subproblema)<br />

No. <strong>de</strong><br />

subproblemas<br />

<strong>Complejidad</strong><br />

(<strong>de</strong> todo el nivel)<br />

0 n n lg n 2 1(n lg n) = n lg(n)<br />

1 n/2 (n/2)lg(n/2) 4 2((n/2) lg(n/2)) = n lg(n/2)<br />

2 n/4 (n/4)lg(n/4) 8 4((n/4) lg(n/4)) = n lg(n/4)<br />

<br />

i n/2 i (n/2 i )lg(n/2 i ) 2 i n lg(n/2 i )<br />

<br />

m n/2 m T(n/2 m )=T(1)=1 2 m 2 m T(n/2 m )= 2 m T(1)<br />

Patrón <strong>de</strong> complejidad:<br />

⎛ n ⎞<br />

n lg ⎜ 2<br />

i ⎟<br />

⎝ ⎠<br />

L<br />

Para i = m, que es el tamaño <strong>de</strong> problema más pequeño, y aplicando: b = x ; log x = L<br />

m<br />

Tn ( /2 ) = T(1)<br />

n<br />

= 1<br />

m<br />

2<br />

m<br />

2 = n<br />

m=<br />

lg n<br />

Logrando con ello establecer el límite al cual llegará i, es <strong>de</strong>cir, la profundidad <strong>de</strong>l árbol<br />

b<br />

n<br />

n<br />

T n n T n T<br />

⎝ ⎠ ⎝ ⎠<br />

m−1<br />

lg n−1<br />

⎛ ⎞ m<br />

⎛ ⎞ log n<br />

( ) = ∑ lg ⎜ 2 (1) lg 2 (1)<br />

i ⎟+ = ∑ ⎜ i ⎟+<br />

i= 0 2 i=<br />

0 2<br />

lg n−1 lg n−1 lg n−1 lg n−1 lg n−1 lg n−1<br />

i<br />

∑ ∑ ∑ ∑ ∑ ∑<br />

T( n) = n lg n− n lg 2 + n= nlg n 1− n i+ n= nlg n 1− n i+<br />

n<br />

i= 0 i= 0 i= 0 i= 0 i= 0 i=<br />

1<br />

lg n(lg n−1)<br />

T( n) = nlg n(lg n)<br />

− n + n<br />

2<br />

2 1 2 1<br />

T( n) = nlg n−<br />

nlg<br />

n+ nlgn+<br />

n<br />

2 2<br />

1 2 1<br />

T( n) = nlg n+ nlg<br />

n+<br />

n<br />

2 2<br />

b) Determinación <strong>de</strong>l or<strong>de</strong>n asintótico<br />

2<br />

( ) =Θ(<br />

log )<br />

T n n n


Instituto Tecnológico <strong>de</strong> Ciudad Ma<strong>de</strong>ro<br />

Unidad I COMPLEJIDAD DE ALGORITMOS<br />

c) Comprobación con Derive<br />

Dra. Laura Cruz Reyes<br />

Capítulo 3 <strong>Complejidad</strong> <strong>de</strong> <strong>algoritmos</strong> <strong>recursivos</strong><br />

Tn ( ) = 2 Tn ( /2) + nlg n, T(1) = 1<br />

( )<br />

T(2 n) = 2T n + 2 n(lg2 n)<br />

ykx ( ) = pxyx ( ) ( ) + qx ( )<br />

k = 2, x= n, p( x) = 2, q( x) = 2nlg2n<br />

GEOMETRIC1( k, p( x), q( x), x, x0, y0)<br />

#1: GEOMETRIC1(2, 2, 2nLOG(2n, 2), n, 1, 1)<br />

2<br />

n·LN(n)<br />

n·LN(n)<br />

#2: ⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯ + ⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯ + n<br />

2 2·LN(2)<br />

2·LN(2)<br />

3.8.7. Utilice el método maestro y el árbol <strong>de</strong> recurrencia para resolver la función T <strong>de</strong>finida por la<br />

ecuación <strong>de</strong> recurrencia y caso base siguientes:<br />

Tn Tn n T<br />

2<br />

( ) = 2 ( /2) + , (1) = 1<br />

a) Aplicación <strong>de</strong> métodos <strong>de</strong> solución <strong>de</strong> recurrencias<br />

Del análisis <strong>de</strong>l árbol <strong>de</strong> recurrencia se observa que la complejidad es una serie geométrica<br />

<strong>de</strong>creciente, por lo que para la solución <strong>de</strong> la recurrencia se utilizará el caso 3 <strong>de</strong>l Teorema<br />

Maestro.<br />

1/4<br />

T(n)<br />

n 2<br />

<strong>Complejidad</strong><br />

n 2<br />

T (n/2)<br />

(1/4) n 2<br />

T(n/2)<br />

(1/4) n 2<br />

(1/2) n 2<br />

T(n/4) (1/16)n 2<br />

T(n/4) (1/16)n 2<br />

T(n/4) (1/16)n 2<br />

T(n/4)<br />

(1/16)n 2<br />

(1/4) n 2<br />

.<br />

.<br />

(1/2 i ) n 2


Instituto Tecnológico <strong>de</strong> Ciudad Ma<strong>de</strong>ro<br />

Dra. Laura Cruz Reyes<br />

Unidad I COMPLEJIDAD DE ALGORITMOS<br />

Nivel<br />

i<br />

Tamaño <strong>de</strong>l<br />

problema<br />

<strong>Complejidad</strong><br />

(<strong>de</strong> un<br />

subproblema)<br />

Capítulo 3 <strong>Complejidad</strong> <strong>de</strong> <strong>algoritmos</strong> <strong>recursivos</strong><br />

<strong>Complejidad</strong><br />

(<strong>de</strong> todo el nivel)<br />

0 n n 2 1 n 2 = (1/1) n 2<br />

1 n/2 (n/2) 2 2 (n/2) 2 = (1/2) n 2<br />

2 n/4 (n/4) 2 4 (n/4) 2 = (1/4) n 2<br />

3 n/8 (n/8) 2 8 (n/8) 2 = (1/8) n 2<br />

<br />

De la formula general Tn ( ) = bTnc ( / ) + fn ( ) se tiene<br />

b = 2, c = 2, f( n)<br />

= n<br />

2<br />

Demostrar que<br />

f n<br />

f ( n)<br />

= n<br />

=Ω ε > , requiere i<strong>de</strong>ntificar las funciones f ( n ) y gn ( )<br />

logc ( ) ( b + ε<br />

n ) para 0<br />

2<br />

gn n n<br />

logc 1<br />

( ) ( b + ε + ε<br />

= ) = ( )<br />

Como f ( n) ≤ c´ g( n)<br />

, se <strong>de</strong>muestra que<br />

f n n c<br />

1+<br />

ε<br />

( ) = Ω ( ) para ε = 1 y ´ = 1<br />

El Teorema Maestro también pi<strong>de</strong> <strong>de</strong>mostrar que bf ( n) ≤ c´ f ( n)<br />

para c ' < 1.<br />

( n ) ( ) 2 2<br />

2 n n<br />

bf<br />

c = 2 = 2<br />

2<br />

c'<br />

f ( n) = (<br />

2<br />

3 ) n para c ' = 2<br />

3<br />

Como existe una c ' < 1, se <strong>de</strong>muestra que bf ( n) ≤ c´ f ( n)<br />

( )<br />

Cuando las <strong>de</strong>mostraciones son exitosas, el teorema maestro señala que T( n) f ( n)<br />

tanto, la forma asintótica <strong>de</strong> la solución queda:<br />

2<br />

( ) =Θ ( n )<br />

T n<br />

b) Comprobación con Derive<br />

Tn= Tn + n T =<br />

2<br />

( ) 2 ( /2) , (1) 1<br />

( )<br />

T(2 n) = 2T n + 4n<br />

2<br />

=Θ . Por<br />

ykx ( ) = pxyx ( ) ( ) + qx ( )<br />

k = 2, x= n, p( x) = 2, q( x) = 4n<br />

GEOMETRIC1( k, p( x), q( x), x, x0, y0)<br />

2


Instituto Tecnológico <strong>de</strong> Ciudad Ma<strong>de</strong>ro<br />

Unidad I COMPLEJIDAD DE ALGORITMOS<br />

Dra. Laura Cruz Reyes<br />

Capítulo 3 <strong>Complejidad</strong> <strong>de</strong> <strong>algoritmos</strong> <strong>recursivos</strong><br />

#1: GEOMETRIC1(2, 2, 4n ^2 , n, 1, 1)<br />

2<br />

#2: 2·n - n<br />

3.8.8. Utilice el método <strong>de</strong> árbol <strong>de</strong> recurrencia para resolver la función:<br />

T( 1 ) = 1, T( n ) = 3T( n - 1 ) + 2<br />

a) Aplicación <strong>de</strong> métodos <strong>de</strong> solución <strong>de</strong> recurrencias<br />

T(n)<br />

2<br />

<strong>Complejidad</strong><br />

2<br />

T(n-1)<br />

2<br />

T(n-1)<br />

2<br />

T(n-1)<br />

2<br />

2(3)<br />

T(n-2) 2 T(n-2) 2<br />

T(n-2) 2<br />

T(n-2)<br />

2<br />

T(n-2) 2<br />

T(n-2) 2<br />

T(n-2) 2 T(n-2) 2 T(n-2) 2<br />

2(9)<br />

.<br />

.<br />

.<br />

2(3 i )<br />

Nivel<br />

i<br />

Tamaño <strong>de</strong>l<br />

problema<br />

<strong>Complejidad</strong><br />

(<strong>de</strong> un subproblema)<br />

No. <strong>de</strong><br />

subproblemas<br />

<strong>Complejidad</strong><br />

(<strong>de</strong> todo el nivel)<br />

0 n-1 2 3 3(2)<br />

1 n-2 2 9 9(2)<br />

2 n-3 2 27 27(2)<br />

<br />

i n-i 2 3 i 3 i (2)<br />

<br />

m n-m T(n-m)=T(1)=1 3 m 3 m T(n-m)=3 m T(1) =3 m (1)<br />

Patrón <strong>de</strong> <strong>Complejidad</strong>: 2(3 )<br />

m−1<br />

∑<br />

i=<br />

0<br />

i m()<br />

i<br />

Tn ( ) = 2 3 + 3 1<br />

L<br />

Para i=m, que es el tamaño <strong>de</strong> problema más pequeño, y aplicando: b = x ; logb<br />

x = L<br />

T(n-m)=T(1)<br />

n-m=1<br />

m = n – 1


Instituto Tecnológico <strong>de</strong> Ciudad Ma<strong>de</strong>ro<br />

Dra. Laura Cruz Reyes<br />

Unidad I COMPLEJIDAD DE ALGORITMOS<br />

Capítulo 3 <strong>Complejidad</strong> <strong>de</strong> <strong>algoritmos</strong> <strong>recursivos</strong><br />

Logrando con ello establecer el límite al cual llegará i, es <strong>de</strong>cir, la profundidad <strong>de</strong>l árbol<br />

n−2<br />

⎛3 −1⎞ ⎛3 −1⎞<br />

Tn ( ) = 2∑3 + 3 T(1) = 2⎜ ⎟+ 3 = 2⎜ ⎟+<br />

3<br />

i=<br />

0<br />

⎝ 3−1 ⎠ ⎝ 2 ⎠<br />

n−1 n−1 n−1<br />

n<br />

Tn ( ) = 3 − 1+ 3 = 2 3 − 1 =Θ(3 )<br />

b) Comprobación con Derive<br />

n− 2+<br />

1 n−1<br />

i n−1 n−1 n−1<br />

( )<br />

LIN1_DIFFERENCE es una función que resuelve ecuaciones <strong>de</strong> recurrencia <strong>de</strong> primer or<strong>de</strong>n<br />

obtenidas <strong>de</strong> <strong>algoritmos</strong> <strong>de</strong> los tipos recorta-y-vencerás. La Función T(n) se <strong>de</strong>be transformar para<br />

adquirir la forma esperada por LIN1_DIFFERENCE.<br />

Tn ( ) = 3 Tn ( -1 ) + 2, T(1) = 1<br />

Tn ( + 1) = 3T n+<br />

2<br />

( )<br />

yx ( + 1) = pxyx ( ) ( ) + qx ( )<br />

x= n, px ( ) = 3, qx ( ) = 2<br />

LIN1_DIFFERENCE( p( x), q( x), x, x0, y0)<br />

#1: LIN1_DIFFERENCE(3, 2, n, 1, 1)<br />

n - 1<br />

#2: 2·3 - 1<br />

3.8.9. Utilice el método <strong>de</strong> expansión para resolver la siguiente recurrencia:<br />

T(1)=8, T(n)=3T(n-1)-15<br />

a) Aplicación <strong>de</strong> métodos <strong>de</strong> solución <strong>de</strong> recurrencias<br />

La ecuación inductiva se expresa con diferentes tamaños <strong>de</strong> problema<br />

T( n) = 3 T( n−1) −15<br />

T( n− 1) = 3 T( n−2) −15<br />

T( n− 2) = 3 T( n−3) −15<br />

La ecuación inductiva se expan<strong>de</strong><br />

Expansión con T( n )<br />

T( n) = 3 T( n−1) − 15<br />

Expansión con Tn− ( 1)<br />

Tn ( ) = 3 3 Tn ( −2) −15 − 15 = (3)(3) Tn ( −2) −3(15) − 15 =−15 − 3(15) + 3 Tn ( − 2)<br />

( )<br />

2


Instituto Tecnológico <strong>de</strong> Ciudad Ma<strong>de</strong>ro<br />

Dra. Laura Cruz Reyes<br />

Unidad I COMPLEJIDAD DE ALGORITMOS<br />

Capítulo 3 <strong>Complejidad</strong> <strong>de</strong> <strong>algoritmos</strong> <strong>recursivos</strong><br />

Expansión con T( n− 2)<br />

Tn ( ) = (3)(3) 3 Tn ( −2) −15 −(3)15 − 15 =−15 −3(15) − 3 (15) + 3 Tn ( − 3)<br />

2 3<br />

(( )) La ecuación inductiva se expresa con sumatorias<br />

m−1<br />

∑<br />

i m<br />

Tn ( ) =− 15 3 + 3 Tn ( −m)<br />

i=<br />

0<br />

En el caso base, T (1) = 8 , por lo tanto n− m = 1 y m = n−<br />

1<br />

( n−1) −1<br />

i n−1<br />

( ) =− 15 3 + 3 T(1)<br />

T n<br />

∑<br />

i=<br />

0<br />

n−2<br />

i n−1<br />

( ) =− 15 3 + 3 T(1)<br />

Tn<br />

∑<br />

i=<br />

0<br />

⎛ − ⎞<br />

Tn ⎜ ⎟<br />

⎝ 2 ⎠<br />

n−1 Tn ( ) = 3 8− 15<br />

+<br />

15<br />

n−1<br />

3 1 n−1<br />

( ) =− (15) + (3 )(8)<br />

Tn ( ) =<br />

( )<br />

n 1<br />

3 − + 15<br />

2<br />

2 2<br />

b) Comprobación con Derive<br />

Tn ( ) = 3 Tn ( -1)-15, T(1) = 8<br />

( )<br />

Tn ( + 1) = 3T n−15<br />

yx ( + 1) = pxyx ( ) ( ) + qx ( )<br />

x= n, px ( ) = 3, qx ( ) =−15<br />

LIN1_DIFFERENCE( p( x), q( x), x, x0, y0)<br />

#1: LIN1_DIFFERENCE(3, -15, n, 1, 8)<br />

n - 1<br />

3 15<br />

#2: ⎯⎯⎯⎯⎯⎯⎯⎯ + ⎯⎯⎯⎯<br />

2 2<br />

3.8.10. Utilice el método <strong>de</strong> expansión para resolver la siguiente recurrencia:<br />

T (1) = 2 , T( n) = T( n− 1) + n−<br />

1


Instituto Tecnológico <strong>de</strong> Ciudad Ma<strong>de</strong>ro<br />

Unidad I COMPLEJIDAD DE ALGORITMOS<br />

a) Aplicación <strong>de</strong> métodos <strong>de</strong> solución <strong>de</strong> recurrencias<br />

Dra. Laura Cruz Reyes<br />

Capítulo 3 <strong>Complejidad</strong> <strong>de</strong> <strong>algoritmos</strong> <strong>recursivos</strong><br />

La ecuación inductiva se expresa con diferentes tamaños <strong>de</strong> problema<br />

T( n) = T( n− 1) + n−1<br />

T( n− 1) = T( n− 2) + n−2<br />

T( n− 2) = T( n− 3) + n−3<br />

La ecuación inductiva se expan<strong>de</strong><br />

Expansión con T( n )<br />

Tn ( ) = n− 1 + Tn ( − 1)<br />

Expansión con Tn− ( 1)<br />

T( n) = n− 1 + ( T( n− 2) + n− 2) = ( n− 1) + ( n− 2) + T( n−<br />

2)<br />

Expansión con T( n− 2)<br />

T( n) = ( n− 1) + ( n− 2) + ( T( n− 3) + n− 3) = ( n− 1) + ( n− 2) + ( n− 3) + T( n−<br />

3)<br />

La ecuación inductiva se expresa con sumatorias<br />

m<br />

∑<br />

Tn ( ) = ( n− i) + Tn ( −m)<br />

i=<br />

1<br />

En el caso base, T (1) = 2 , por lo tanto n− m= 1 y m= n−<br />

1<br />

n−1 n−1<br />

∑<br />

T( n) = ( n− i) + T(1) = ( n− i) + 2<br />

i= 1 i=<br />

1<br />

n−1 n−1<br />

( n−1)( n)<br />

T( n) = ∑( n) − ∑ ( i) + 2 = n( n−1) − + 2<br />

2<br />

i= 1 i=<br />

1<br />

2 2<br />

2 n n n n<br />

( ) = − − + + 2= − + 2<br />

T n n n<br />

( )<br />

∑<br />

2 2 2 2<br />

b) Comprobación con Derive<br />

Tn ( ) = Tn ( − 1) + n− 1, T(1) = 2<br />

Tn ( + 1) = T n+<br />

n<br />

yx ( + 1) = pxyx ( ) ( ) + qx ( )<br />

x= n, p( x) = 1, q( x)<br />

= n<br />

LIN1_DIFFERENCE( p( x), q( x), x, x0, y0)


Instituto Tecnológico <strong>de</strong> Ciudad Ma<strong>de</strong>ro<br />

Unidad I COMPLEJIDAD DE ALGORITMOS<br />

Dra. Laura Cruz Reyes<br />

Capítulo 3 <strong>Complejidad</strong> <strong>de</strong> <strong>algoritmos</strong> <strong>recursivos</strong><br />

#1: LIN1_DIFFERENCE(1, n, n, 1, 2)<br />

2<br />

n n<br />

#2: ⎯⎯⎯⎯ - ⎯⎯⎯ + 2<br />

2 2<br />

3.9 Ejercicios propuestos<br />

3.9.1 Usando la notación vista en el curso <strong>de</strong> Análisis y Diseño <strong>de</strong> Algoritmos II, escriba la<br />

<strong>de</strong>finición <strong>de</strong> cada tipo <strong>de</strong> función <strong>de</strong> recurrencia <strong>de</strong> la lista <strong>de</strong> abajo. Para cada tipo <strong>de</strong><br />

función, también presente un ejemplo y su solución con alguno <strong>de</strong> los métodos vistos en el<br />

curso <strong>de</strong> análisis y diseño <strong>de</strong> Algoritmos I.<br />

a) Recurrencia homogénea lineal <strong>de</strong> primer-or<strong>de</strong>n con coeficientes constantes<br />

b) Recurrencia homogénea lineal <strong>de</strong> segundo-or<strong>de</strong>n con coeficientes constantes<br />

c) Recurrencia no-homogénea <strong>de</strong> primer-or<strong>de</strong>n<br />

d) Recurrencia no-homogénea <strong>de</strong> segundo-or<strong>de</strong>n<br />

e) Recurrencia no-lineal<br />

3.9.2 Use el árbol <strong>de</strong> recurrencia para resolver las recurrencias <strong>de</strong> los ejercicios 3.8.2 y 3.8.4,<br />

3.8.5, 3.8.7<br />

3.9.3 Resuelva las siguientes recurrencias usando el método maestro, árbol <strong>de</strong> recurrencia y<br />

expansión. Verifique la solución con la herramienta Derive.<br />

⎧ + + ≥<br />

Tn ( ) = ⎨<br />

⎩1.....................<br />

............. n = 1<br />

2<br />

3 Tn ( /2) n n..........<br />

n 2<br />

3.9.4 Resuelva las siguientes recurrencias usando el método maestro, árbol <strong>de</strong> recurrencia y<br />

expansión. Verifique la solución con la herramienta Derive.<br />

⎧Tn ( − 2) + 3n+ 4..........<br />

n≥3<br />

⎪<br />

Tn ( ) = ⎨1..................................<br />

n=<br />

1<br />

⎪<br />

⎩6...................<br />

...............<br />

n = 2<br />

3.9.5 Encuentre un ejemplo <strong>de</strong> recurrencia <strong>de</strong> solución conocida en el que las siguientes reglas<br />

maestras obtienen la misma solución que las reglas utilizadas en los ejercicios resueltos.<br />

k<br />

Para recurrencias con la forma general T ( n) = bT ( n c)<br />

+ an , la solución <strong>de</strong> la recurrencia<br />

se obtiene con las siguientes reglas:


Instituto Tecnológico <strong>de</strong> Ciudad Ma<strong>de</strong>ro<br />

Unidad I COMPLEJIDAD DE ALGORITMOS<br />

Dra. Laura Cruz Reyes<br />

Capítulo 3 <strong>Complejidad</strong> <strong>de</strong> <strong>algoritmos</strong> <strong>recursivos</strong><br />

k<br />

⎧Θ ( n ) si b<<br />

c<br />

⎪<br />

k<br />

Tn ( ) = ⎨Θ ( nlog n) si b=<br />

c<br />

⎪ Θ<br />

logc<br />

b<br />

( ) si ><br />

⎩<br />

n b c<br />

k<br />

k<br />

k<br />

Bibliografía<br />

1. CormenT.H., LeisersonC.E., RivestR.L: Introduction to Algorithms, MIT Press 1990.<br />

2. Sara Basse, Allen Van Gel<strong>de</strong>r. Algoritmos Computacionales: Introducción al análisis y<br />

diseño. Tercera Edición. AddisonWesley. 2002.<br />

3. Ian Parberry, William Gasarch. Problems on Algorithms. Prentice Hall, 1994

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!