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 ...
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