Complejidad Algoritmos Recursivos 02
Complejidad Algoritmos Recursivos 02
Complejidad Algoritmos Recursivos 02
a 0 T(n) + a1 T (n − 1) + a2 T (n − 2) + ... + a k T (n − k) = 0
donde los coeficientes ai son números reales, y k es un número natural entre 1 y n.
Para resolverlas vamos a buscar soluciones que sean combinaciones de funciones
exponenciales de la forma:
k
T (n) = c1 p1 (n)r1 + c 2 p2 (n)r2 + ...+ c k pk (n)rk = ∑ c i pi (n)ri ,
n n n n
i =1
donde los valores c1, c2,...,cn y r1, r2, ...,rn son números reales, y p1(n),...,pk(n) son
polinomios en n con coeficientes reales. Si bien es cierto que estas ecuaciones
podrían tener soluciones más complejas que éstas, se conjetura que serían del
mismo orden y por tanto no nos ocuparemos de ellas.
Para resolverlas haremos el cambio xn = T(n), con lo cual obtenemos la
ecuación característica asociada:
k k −1 k− 2
a0 x + a1 x + a2 x + ... + ak = 0 .
Llamemos r1, r2,...,rk a sus raíces, ya sean reales o complejas. Dependiendo del
orden de multiplicidad de tales raíces, pueden darse los dos siguientes casos.
i=1
1+ 5 1− 5
r1 = , r2 =
2 2
y por tanto
n n
1+ 5 1− 5
T ( n ) = c1 + c2
2 .
2
12 TÉCNICAS DE DISEÑO DE ALGORITMOS
1+ 5
0
1− 5
0
T (0) = c1 + c2
2
= c1 + c2 = 0
2 1
1 1 ⇒ c1 = − c2 = .
1+ 5 1− 5 5
T (1) = c1 + c2
=1
2 2
Sustituyendo entonces en la ecuación anterior, obtenemos
n n
1 1+ 5 1 1− 5
T (n) = − ∈ Ο(ϕ n ).
5 2
5 2
Supongamos que alguna de las raíces (p.e. r1) tiene multiplicidad m>1. Entonces la
ecuación característica puede ser escrita en la forma
(x – r1)m(x – r2)...(x – rk–m+1)
en cuyo caso la solución de la ecuación en recurrencia viene dada por la expresión:
m k
T ( n ) = ∑ ci n i −1r1n + ∑c r n
i i −m +1
i =1 i =m +1
m1 m2 mk
T (n) = ∑c
i =1
1i n r + ∑ c 2 i n r + ... + ∑ c ki n i −1 rkn .
i−1 n
1
i=1
i −1
2
n
i =1
n n n
a 0 T(n) + a1 T(n −1) + ... + ak T(n − k) = b1 p1 (n) + b 2 p2 (n) + ... + bs ps (n)
donde como en el caso anterior, los coeficientes ai y bi son números reales y pj(n)
son polinomios en n de grado dj. En este caso también existe una forma general de
la solución, en donde se demuestra que la ecuación característica es:
k k −1 k −2 d 1 +1 d 2 +1 d s +1
(a 0 x + a1 x + a2 x + ... + ak )(x − b1 ) (x − b2 ) ...(x − bs ) = 0.
Como ejemplo, supongamos la ecuación
T(n) = 2T(n–1) + n + 2n, n≥1,
con la condición inicial T(0) = 1. En este caso tenemos que b1 = 1, p1(n) = n,
b2 = 2 y p2(n) = 1, por lo que su ecuación característica es (x–2)2(x–1)2 = 0, lo que
da lugar a la expresión final de T(n):
T(n) = –2 – n + 2n+1 + n2n ∈Θ(n2n).
k k 2 k −1 k 2
t k = T(2 ) = 2 T (2 ) = 2 t k −1 ,
que no corresponde a ninguno de los tipos estudiados. Necesitamos hacer un
cambio más para transformar la ecuación. Tomando logaritmos a ambos lados y
haciendo el cambio uk = log tk obtenemos
uk – 2uk–1 = k,
ecuación en recurrencia no homogénea cuya ecuación característica asociada es
(x–2)(x–1)2 = 0. Por tanto,
uk = c12k + c2 + c3k.
Necesitamos ahora deshacer los cambios hechos. Primero uk = log tk
k
+ c2 +c 3 k
t k = 2c1 2
y después tk = T(2k). En consecuencia
c1n +c 2 +c 3 log n
T(n) = 2 .
Para calcular las constantes necesitamos las condiciones iniciales. Como sólo
disponemos de una y tenemos tres incógnitas, usamos la ecuación en recurrencia
original para obtener las restantes:
T(2) = 2T 2(1) = 2/9.
T(4) = 4T 2(2) = 16/81.
Con esto llegamos a que c1 = log(4/3) = 2 – log3, c2 = –2, c3 = –1 y por
consiguiente:
22n
T (n) = .
4n3n
16 TÉCNICAS DE DISEÑO DE ALGORITMOS
1.1. De las siguientes afirmaciones, indicar cuales son ciertas y cuales no:
(i) n2∈O(n3) (ix) n2∈Ω(n3)
(ii) n3∈O(n2) (x) n3∈Ω(n2)
n+1 n
(iii) 2 ∈O(2 ) (xi) 2n+1∈Ω(2n)
(iv) (n+1)!∈O(n!) (xii) (n+1)!∈Ω(n!)
(v) f(n)∈O(n) ⇒ 2f(n)∈O(2n) (xiii) f(n)∈Ω(n) ⇒ 2f(n)∈Ω(2n)
n n
(vi) 3 ∈O(2 ) (xiv) 3n∈Ω(2n)
(vii) logn ∈O(n1/2) (xv) logn ∈Ω(n1/2)
1/2
(viii) n ∈O(logn) (xvi) n1/2∈Ω(logn)
1.2. Sea a una constante real, 0<a<1. Usar las relaciones ⊂ y = para ordenar los
órdenes de complejidad de las siguientes funciones: nlogn, n2logn, n8, n1+a,
(1+a)n, (n2+8n+log3n)4, n2/logn, 2n.
cn k si 1 ≤ n ≤ b
T (n) =
aT ( n − b) + cn si n > b
k
donde a,c,k son números reales, n,b son números naturales, y a>0, c>0,
k≥0. En general, la constante a representa el número de llamadas recursivas
que se realizan para un problema de tamaño n en cada ejecución del
algoritmo; n–b es el tamaño de los subproblemas generados; y cnk
representa el coste de las instrucciones del algoritmo que no son llamadas
recursivas.
Θ( n k ) si a < 1
k +1
Demostrar que T ( n ) ∈ Θ( n ) si a = 1
Θ( a n div b ) si a > 1
cn k si 1 ≤ n < b
T (n ) =
aT ( n / b) + cn si n ≥ b
k
donde a,c,k son números reales, n,b son números naturales, y a>0, c>0,
k≥0, b>1. La expresión cnk representa en general el coste de descomponer
el problema inicial en a subproblemas y el de componer las soluciones para
producir la solución del problema original.
LA COMPLEJIDAD DE LOS ALGORITMOS 17
Θ( n k ) si a < b k
Demostrar que T ( n ) ∈ Θ( n k log n ) si a = b k
Θ( n logb a ) si a > b k
CONST n = ...;
TYPE vector = ARRAY [1..n] OF INTEGER;
PROCEDURE Euclides(m,n:CARDINAL):CARDINAL;
VAR temp:CARDINAL;
BEGIN
WHILE m>0 DO (* 1 *)
temp:=m; (* 2 *)
m:=n MOD m; (* 3 *)
n:=temp (* 4 *)
END; (* 5 *)
RETURN n (* 6 *)
END Euclides;
PROCEDURE Misterio(n:CARDINAL);
VAR i,j,k,s:INTEGER;
BEGIN
s:=0; (* 1 *)
FOR i:=1 TO n-1 DO (* 2 *)
FOR j:=i+1 TO n DO (* 3 *)
FOR k:=1 TO j DO (* 4 *)
s:=s+2 (* 5 *)
END (* 6 *)
END (* 7 *)
END (* 8 *)
END Misterio;
1.10. Suponiendo que T1∈O(f) y que T2∈O(f), indicar cuáles de las siguientes
afirmaciones son ciertas:
a) T1 + T2 ∈O(f).
b) T1 – T2 ∈O(f).
c) T1 / T2 ∈O(1).
d) T1 ∈O(T2).
1.11. Encontrar dos funciones f(n) y g(n) tales que f ∉O(g) y g ∉Ο(f).
1.12. Demostrar que para cualquier constante k se verifica que logkn ∈O(n).
PROCEDURE Mezcla(t1,t2:arbol):arbol;
(* devuelve un arbol binario de busqueda con los elementos de
los dos arboles binarios de busqueda t1 y t2. La funcion Ins
inserta un elemento en un arbol binario de busqueda *)
BEGIN
IF Esvacio(t1) THEN (* 1 *)
RETURN t2 (* 2 *)
ELSIF Esvacio(t2) THEN (* 3 *)
RETURN t1 (* 4 *)
ELSE (* 5 *)
RETURN Mezcla(Mezcla(Ins(t1,Raiz(t2)),Izq(t2)),
Der(t2)) (* 6 *)
END (* 7 *)
END Mezcla;
Supondremos que las operaciones básicas del tipo abstracto de datos arbol
(Raiz, Izq, Der, Esvacio) son O(1), así como las operaciones Opera
(que no es relevante lo que hace) y Max2 (que calcula el máximo de dos
números). Por otro lado, supondremos que la complejidad de la función Ins
es O(logn).
1 n −1
1.15. Resolver la ecuación T ( n ) = ∑ T (i ) + cn, siendo T (0) = 0.
n i =0
CONST n = ...;
TYPE vector = ARRAY[1..n] OF INTEGER;
LA COMPLEJIDAD DE LOS ALGORITMOS 21
PROCEDURE Sumadigitos(num:CARDINAL):CARDINAL;
BEGIN
IF num<10 THEN RETURN num (* 1 *)
ELSE RETURN (num MOD 10)+Sumadigitos(num DIV 10) (* 2 *)
END (* 3 *)
END Sumadigitos;