Sie sind auf Seite 1von 5

Complejidad de algoritmos recursivos

Ejercicio01

Funcion factorial(entero n){


Si(n<=1) entonces
<-- 1;
sino
<-- n * factorial(n-1);
fsi
Ffuncion

¿Cómo resolverlos?
1- Suponer una solución f(n) y usar la recurrencia para demostrar que T(n)=f(n).
La fórmula se hace generalmente por inducción sobre n.

Paso1: Sea
T(n)= C1 si n<=1 //este es el caso base
T(n-1)+C2 si n>1 //este es el caso cuando el algoritmo ejecuta la llamada recursiva

En este caso

C1 SI n<=1:Se define como el caso base de la función. Y se denomina C1 porque cuando n<=1 retorna un número <=1
T(n-1)+C2: Representa la llamada recursiva a la función con factorial(n-1)

Si n=0: => T(n)=T(n-1)+C2 = T(n-1)+C2


Si n=1: => T(n-1)=(T(n-2)+C2)+C2 =T(n-2)+2C2
Si n=2: => T(n-2)=((T(n-3)+C2)+C2)+C2 = T(n-3)+3C2

Haciendo esto por inducción suponemos para n=k


=>

Si n=k : => T(n-k)+KC2

2) Sustituimos las recurrencias por su igualdad hasta llegar a cierto 𝑻𝒏𝒐

Sea T(n-k)+KC2 =>T(n)= T(n-k)+kC2 =


Sabemos que n-k=1 ( valor del caso base) =T(n-(n-1))+(n-1)C2
=> -k=1-n = T(n-n+1)+nC2-C2
=> k=n-1 = T(1)+nC2-C2
= C1+nC2-C2
(T(1) es C1 , porque es equivalente a preguntar cuál es el
valor cuando n es igual a 1, que en este caso es el valor del
caso base

=>T(n)= O(Max(C1,nC2,-C2)
=>T(n)= O(Max(C2,n,-C2) por regla del producto
=>T(n)= O(n) // por concepto de dominancia de funciones
En este caso se toma cual es la función que crece más
rápido para n. Entre la función C2, la función n, y la función
-C2, la que crece más rápido es n
Ejercicio02

Funcion Rec3 (entero n){


Si(n<=1) entonces
<-- 1;
sino
<-- 2 * Rec(n/2);
fsi
Ffuncion

Solución
- Suponer una solución f(n) y usar la recurrencia para demostrar que T(n)=f(n).
La fórmula se hace generalmente por inducción sobre n.

Paso1: Sea
T(n)= C1 SI n<=1 //este es el caso base
T(n/2)+C2 si n>1 //este es el caso cuando el algoritmo ejecuta la llamada recursiva

En este caso

C1 SI n<=1:Se define como el caso base de la función. Y se denomina C1 porque cuando n<=1 retorna un número <=1

T(n/2)+C2: Representa la llamada recursiva a la función con Rec3 (n/2). Esto se traduce como que es una función que
llama de forma genérica a una función que recibe por parámetro n/2 ( T(n/2)), y el C2 representa el tiempo que
adicionalmente se tarda el algoritmo en multiplicar *2. Por esto se escribe el caso como:
T(n/2)+C2

Si n=0: => T(n) =T(n/2)+C2 = T(n/2)+C2


Si n=1: => T(n-1) =(T(n/2/2)+C2)+C2 =T(n/4)+2C2
Si n=2: => T(n-2) =((T(n/2/2/2)+C2)+C2)+c2 = T(n/8)+3C2

Haciendo esto por inducción suponemos para n=k


=>

Si n=k : => T( 𝑘 )+KC2 Escriba aquí la ecuación.


𝑛
2

Igualamos el valor que recibe el T(n) al valor del caso base( igual a 1)
𝒏
=1 => n=2𝑘 => k= 𝒍𝒐𝒈𝟐 (𝒏)
𝟐𝒌

𝒏
=>T(n)= T( )+ 𝒍𝒐𝒈𝟐 (𝒏)
𝟐𝒍𝒐𝒈𝟐 (𝒏)

𝒏
=>T(n)= O(Max(𝟐𝒍𝒐𝒈𝟐(𝒏)), 𝒍𝒐𝒈𝟐 (𝒏) ) por regla de la suma

=>T(n)= O(𝒍𝒐𝒈𝟐 (𝒏))


Ejercicio03

Funcion Rec33 (entero n){


Si(n<=1) entonces
<-- 1;
sino
<-- Rec33(n-1)+ Rec33(n-1);
fsi
Ffuncion

Solución

Sea
T(n)= C1 SI n<=1 //este es el caso base
2*T(n-1)+C2 si n>1 //este es el caso cuando el algoritmo ejecuta la llamada recursiva

T(n)=2*T(n-1)+C2

Si T(n) = 2*T(n-1)+C2 = 2*T(n-1)+C2 = 2*T(n-1)+C2


Pero T(n-1)= 2(T(n-2)+C2 = 2*(2(T(n-2)+C2)+C2 = 22 𝑇(𝑛 − 2)+3C2
T(n-2)= 2*T(n-3)+C2 =2*(2*(2*T(n-3)+C2)+C2)+C2=23 𝑇(𝑛 − 3)+7C2

Para n=k
=> T(n)= 2𝑘 ∗ 𝑇(𝑛 − 𝑘)+ (2𝑘 − 1)*C2

Cuando n-k=1 => k=n-1

=> T(n) = 2𝑛 −1 𝑇(𝑛 − (𝑛 − 1))+ (2𝑛−1 − 1)*C2


=> T(n) = 2𝑛 −1 𝑇(𝑛 − 𝑛 + 1)+ (2𝑛 −1 − 1)*C2
=> T(n) = 2𝑛 −1 𝑇(1)+ (2𝑛 −1 − 1)*C2
=> T(n) =2𝑛 −1 𝐶1 + 2𝑛 −1 ∗ 𝐶2 − 𝐶2 //T1 es C2 porque es equivalente a preguntar cuando n es igual a 1 cuál es el valor( ver
ecuación de recurrencia)

=>T(n)= O(Max(2𝑛 −1 𝐶1, 2𝑛 −1 ∗ 𝐶2, −𝐶2)) // Por regla de la suma


=>T(n)=O(2𝑛−1 ) por concepto de dominancia de funciones

Ejercicio04

Funcion Recursivo (entero n){


Si(n<=1) entonces
<-- 1;
sino
<-- Recursivo(n-1)+ Recursivo (n-1)+ Recursivo(n-1);
fsi
Ffuncion

Sea
T(n)= C1 SI n<=1 //este es el caso base
3*T(n-1)+C2 si n>1 //este es el caso cuando el algoritmo ejecuta la llamada recursiva

T(n)=3*T(n-1)+C2

Si T(n) = 3*T(n-1)+C2 = 3*T(n-1)+C2 = 3*T(n-1)+C2


Pero T(n-1)= 3(T(n-2)+C2 = 3*(3(T(n-2)+C2)+C2 = 32 𝑇(𝑛 − 2)+3C2+C2
T(n-2)= 3*T(n-3)+C2 =3*(3*(3*T(n-3)+C2)+C2)+C2=33 𝑇(𝑛 − 3)+9C2+3C2+C2
T(n-3)= 3*T(n-4)+C2 =3*(3*(3*(3*T(n-4)+C2)+C2)+C2)+C2=34 𝑇(𝑛 − 4)+27C2+9C2+3C2+C2

Observe el comportamiento de lo que esta subrayado:


De ese comportamiento se desprende se comporta como:
k

3i ∗ C2
𝑖 =0
Para n=k
k
=> T(n)= 3𝑘 ∗ 𝑇(𝑛 − 𝑘)+ 𝑖 =1
3i ∗ C2

Pero necesitamos expresar toda la ecuación T(n) en función de n, por lo que necesitamos saber la fórmula general para la
sumatoria expresada a continuación:
k

3i
𝑖=0

Para determinar la fórmula determinamos el comportamiento de la sumatoria:


k
𝑖=0
3i = 3o +31 + 32 + 33 + ⋯ + 3k

Multiplicamos por -3 la ecuación dada:


k
−3 ∗ 𝑖=0
3i = 31 +32 + 33 + 34 + ⋯ + 3k+1

Restamos las 2 ecuaciones:


k k
𝑖=0
3i - −3 ∗ 𝑖=0
3i = 30 − 3k+1

Quedando esto:
k
−2 ∗ 𝑖=0
3i = 1 − 3k+1

k = 1−3 k +1
=> 𝑖=0
3i = 2

k
De la ecuación anterior de T(n)= 3𝑘 ∗ 𝑇(𝑛 − 𝑘)+ 𝑖 =1
3i ∗ C2, se tiene que:

1−3 k +1
T(n)= 3𝑘 ∗ 𝑇(𝑛 − 𝑘)+ 2 ∗ 𝐶2
La ecuación esta expresada en función de 2 variables( n y k) y necesitamos colocarla en función
de n por definición de complejidad en tiempo
por eso calcularemos en valor de k:
n-k=1 => k=n-1
1−3 k +1
=> T(n)= 3𝑘 ∗ 𝑇(𝑛 − 𝑘)+( ) ∗ 𝐶2
2

1−3 n −1+1
=> T(n)= 3𝑛 −1 ∗ 𝑇(𝑛 − (𝑛 − 1))+( ) ∗ 𝐶2
2

1−3 n
=> T(n)= 3𝑛 −1 ∗ 𝑇(𝑛 − 𝑛 + 1)+ ( ) ∗ 𝐶2
2

1−3 n
=> T(n)= 3𝑛 −1 ∗ 𝑇 1 + ∗ 𝐶2
2

1−3 n
=> T(n)= 3𝑛 −1 . 1+ 2
∗ 𝐶2 // T(1) es 1 por que cuando n<=1 retorna 1

1−3 n
=> T(n)= 3𝑛 −1 + 2
∗ 𝐶2

1−3 n
=> T(n)= O(Max(3𝑛 −1 , 2
𝐶2)) por regla de la suma

1 3𝑛
=> T(n)=O(Max(3𝑛−1 , 2
𝐶2, 2
𝐶2))

=> T(n)=O(3𝑛 ) por regla del producto

RECOMENDACIONES:

Practicar recurrencia
Aprenderse o deducir las fórmulas más comunes por inducción sobre n( ver apuntes de matemáticas discretas I)

Das könnte Ihnen auch gefallen