Documentos de Académico
Documentos de Profesional
Documentos de Cultura
12 de septiembre de 2005
2
Objetivos
3
4
Prefacio
5
6
I Análisis de algoritmos 11
1. Introducción 13
1.1. Conceptos Básicos . . . . . . . . . . . . . . . . . . . . . . . . 14
1.1.1. Denición de algoritmo . . . . . . . . . . . . . . . . . . 14
1.2. Complejidad de algoritmos . . . . . . . . . . . . . . . . . . . . 15
1.3. Ejercicios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25
2. Comportamiento... 29
2.1. Dominio asintótico . . . . . . . . . . . . . . . . . . . . . . . . 29
2.2. Notación de orden . . . . . . . . . . . . . . . . . . . . . . . . . 36
2.3. Interpretación de los conceptos enunciados . . . . . . . . . . . 41
2.4. Dominio asintótico con límites . . . . . . . . . . . . . . . . . . 43
2.5. Ejercicios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 46
7
8 ÍNDICE GENERAL
4.5. Ejercicios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 80
11
Capítulo 1
Introducción
13
14 CAPÍTULO 1. INTRODUCCIÓN
ecientes pero confusos, puede suceder que después no sea posible darle el
mantenimiento adecuado.
Los recursos que consume un algoritmo pueden estimarse mediante he-
rramientas teóricas y constituyen, por lo tanto, una base conable para la
elección de un algoritmo. En las Ciencias de la Computación, la actividad
dedicada a determinar la cantidad de recursos que consumen los algoritmos
se le denomina análisis de algoritmos.
La primera sección de este capítulo presenta los conceptos que nos permi-
tirán introducir después, en secciones posteriores, las técnicas utilizadas para
la medición de los recursos que consume un algoritmo y las bases teóricas
sobre las que estas se fundamentan.
x ← log(0)
o
x ← (10 o 35)/3
no pueden formar parte de un algoritmo.
Una instrucción es efectiva cuando se puede ejecutar en un intervalo nito
de tiempo, por ejemplo, las instrucciones
x ← 2 + 8, mensaje ← Une('Hola','Mundo')
son efectivas, mientras que
x ← cardinalidad(números naturales)
1.2. COMPLEJIDAD DE ALGORITMOS 15
no lo es.
Si un conjunto de instrucciones tiene todas las características de un al-
goritmo, excepto ser nito en tiempo se le denomina proceso computacional.
Los sistemas operativos son el mejor ejemplo de proceso computacional, pues
están diseñados para ejecutar tareas mientras las haya pendientes, y cuando
éstas se terminan, el sistema operativo entra en un estado de espera, hasta
que llegan más, pero nunca termina.
Se asume que un problema tiene solución algorítmica si además de que el
algoritmo existe, su tiempo de ejecución es razonablemente corto. Por ejem-
plo, es posible diseñar un algoritmo para jugar ajedrez que triunfe siempre: el
algoritmo elige la siguiente tirada examinando todas las posibles secuencias
de movimientos desde el tablero actual hasta uno donde sea claro el resultado
y elige la tirada que le asegure el triunfo; el pequeño inconveniente de este
algoritmo es que dicho espacio de búsqueda se ha estimado en 100040 tableros
por lo que puede tardarse miles de años en tomar una decisión. Por lo tanto,
para nes prácticos se considera que si un problema tiene una solución que
toma años en computar, dicha solución no existe.
Considérese ahora el problema de ordenar un conjunto de valores, si el
conjunto tiene 2 elementos es más fácil resolverlo que si tiene 20, análoga-
mente un algoritmo que resuelva el problema tardará más tiempo mientras
más grande sea el conjunto y requerirá una cantidad de memoria mayor para
almacenar los elementos del conjunto.
En general la cantidad de recursos que consume un algoritmo para re-
solver un problema se incrementa conforme crece el tamaño del problema.
Dependiendo del problema en particular, uno o varios de sus parámetros será
elegido como tamaño del problema. Haciendo una cuidadosa observación, es
relativamente fácil efectuar una elección atinada.
En la Figura 1 se presenta una serie de problemas y una sugerencia acerca
del parámetro que se puede elegir como tamaño del problema.
a) Celdas estáticas. Son las que se utilizan en todo el tiempo que dura la
ejecución del programa, por ejemplo, las variables globales.
una variable simple, sin importar el tipo al que pertenezca. Las variables que
tengan valores de un tipo simple ocuparán una celda de memoria, mientras
que a las variables de tipos compuestos se les asignan tantas celdas como
requieran los elementos que las componen.
El tiempo que emplea un algoritmo en ejecutarse reeja la cantidad de
trabajo realizado, así, la complejidad temporal da una medida de la cantidad
de tiempo que requerirá la implantación de un algoritmo para resolver el
problema, por lo que se le puede determinar en forma experimental. Por
ejemplo, para encontrar el valor de la función complejidad de un algoritmo
A que se codica un lenguaje de programación L, se compila utilizando el
compilador C y se ejecuta en la máquina M, damos algunas entradas al
programa y medimos el tiempo de procesador empleado para resolver los
casos del problema.
Proceder de esta manera presenta, entre otros, el inconveniente de que
los resultados obtenidos dependen de:
a) las entradas proporcionadas,
c) Asignación al índice i
d) Asignación a la función
f ) Incremento al índice i
a) Peor caso
ft (n) = máx({O1 , O2 , O3 , . . . , Ok })
b) Mejor caso
ft (n) = mı́n({O1 , O2 , O3 , . . . , Ok })
c) Caso medio
k
X
ft (n) = Oi P (i)
i=1
Análisis Temporal
i) Mejor caso: ocurre cuando el valor es el primer elemento del arreglo.
ft (n) = 1
Análisis Temporal
i) Mejor caso: ocurre cuando el arreglo está ordenado ascendentemente
(en cada iteración sólo hace la primera comparación)
ft (n) = 1 + (1 × (n − 2)) = n − 1
ii) Peor caso: el arreglo está ordenado de manera descendente (se hacen
dos comparaciones por iteración en el ciclo)
ft (n) = 1 + (2 × (n − 2)) = 2n − 3
µ ¶
|U |
iii) Caso medio: en este problema se tienen n! casos, donde U es
n
el conjunto del que se extraen los elementos del arreglo.
5 (5n − 7)
ft (n) = 1 + (n − 2) =
3 3
comparaciones.
1.3. Ejercicios
Ejercicio 1.1 La regla para multiplicar las matrices A y B de dimensión
2 × 2, y obtener C = AB, es:
c11 = a11 b11 + a12 b21 c12 = a11 b12 + a12 b22
c21 = a21 b11 + a22 b21 c22 = a21 b12 + a22 b22
N = 2q0 + r0
q0 = 2q1 + r1
q1 = 2q2 + r2
..
.
qk−1 = 2qk + rk
proc RepresentaciónBinaria(N,N2) ≡
comienza
y ← N;
i ← 0;
mientras (y 6= 0) haz
si par (y) entonces
r[i] ← 0
otro
r[i] ← 1;
y ←y−1
is
y ← y/2;
i ← i + 1;
zah
k ← i − 1;
N 2 ← r[0...k];
termina.
Algoritmo 3: Representación binaria.
iii) Muestre que si elige el valor del número N como el tamaño del proble-
ma, el número de operaciones que requiere el algoritmo es b 10
3
log N c+1.
Ejercicio 1.7 Dada una lista ordenada con representación ligada sencilla,
escriba un algoritmo para insertar un elemento y obtenga la complejidad tem-
poral del mismo.
29
30 CAPÍTULO 2. COMPORTAMIENTO...
En otros términos, podemos decir que si una función domina a otra, su velo-
cidad de crecimiento es mayor o igual. Si esas funciones están representando
el consumo de recursos de la computadora, obviamente la función dominada
crecerá a lo más a la misma velocidad de la otra.
5
m|f (n)|
|g(n)|
4
0
0 1 2 4 5
k
Figura 3: Representación gráca del concepto de dominio asintótico.
Puesto que las funciones complejidad son funciones con dominio N, los
números naturales, y contradominio R, los números reales; los conceptos y
las propiedades de dominio asintótico proporcionan una manera conveniente
de expresarlas y manipularlas.
Con la intención de aclarar la denición, a continuación se presentan
algunos ejemplos.
|n| ≤ m|n3 |, ∀n ≥ k,
2.1. DOMINIO ASINTÓTICO 31
simplicando
|n2 | > m
n2 > m
√
n > m para al menos una n ≥ k
√
si se toma n > máx ( m, k) ambas desigualdades se cumplen,
∴ f no domina asintóticamente a g.
|g(n)| ≤ m|c||g(n)|, ∀n ≤ k
32 CAPÍTULO 2. COMPORTAMIENTO...
|g(n)| ≤ mc|g(n)|,
tomando m = 1c ,
1
|g(n)| ≤ c|g(n)|∀, n ≤ k
c
y k = 0,
|g(n)| ≤ |g(n)|, ∀n ≤ 0
∴ f d.a. g.
|cg(n)| ≤ m|g(n)|, ∀n ≥ k
esto es,
c|g(n)| ≤ m|g(n)|, ∀n ≥ k
tomando m = c y k = 0,
c|g(n)| ≤ c|g(n)|, ∀n ≥ 0
∴ g d.a. f.
Ejemplo 8 Sean
½
1 si n es par
f (n) = n y g(n) =
n3 si n es impar
1
Entonces para toda n impar > máx (m 2 , k) las desigualdades se cum-
plen,
∴ f no-d.a. g.
ii) También se debe demostrar que g no-d.a. f. Esto es
∀m ≥ 0, k ≥ 0; ∃n ≥ k tal que |f (n)| > m|g(n)|
Tomando el caso para el cual n es par, se obtiene
|n| > m|1| para alguna n ≥ k
|n| > m
y es reexiva y transitiva.
f ∈ M ⇒ f d.a.f.
|g(n)| ≤ m1 |f (n)|, ∀n ≥ k1
|h(n)| ≤ m2 |g(n)|, ∀n ≥ k2
por lo que
|h(n)| ≤ |g(n)|, ∀n ≥ k
|c + n| ≤ m|n|, ∀n ≥ k
Si m = 2 y k = c, se cumple que
|c + n| ≤ 2|n|, ∀n ≥ c
Demostración 3 Tenemos
a) f es O(f ); dado que f d.a. f ⇒ f es O(f ).
|f (n)| ≤ m1 |g(n)|, ∀n ≥ k1 .
con c ∈ R.
38 CAPÍTULO 2. COMPORTAMIENTO...
Si tomamos m = |c|m1
|f (n)| ≤ m1 |g(n)|, ∀n ≥ k1
|h(n)| ≤ m2 |g(n)|, ∀n ≥ k2
Sustituyendo en la suma
Demostración 5 Tenemos,
f esO(h1 ), i.e. ∃m1 ≥ 0 y k1 ≥ 0 tales
∴ (f + g) es O(máx(h1 , h2 ))
1
f1 (n) = + 63 es O(1).
n2
1
f2 (n) = rn + + kn log n es O(n log n).
n
f3 (n) = .6n3 + 31n + 468 es O(n3 ).
n
O(c )
O(n log n)
O(log n)
O(1)
O(n)
c
O(n )
O(n!)
entonces
f (n) f 0 (n)
lı́m = lı́m 0
n→∞ g(n) n→∞ g (n)
2.5. Ejercicios
Ejercicio 2.1 Determine cuales de las siguientes funciones dominan asin-
tóticamente a las otras.
½
n, si n es par
i) f1 (n) =
−n, si n es impar
n+1
ii) f2 (n) =
n+1
1
iii) f3 (n) = 3n2 log n + n2
v) f5 (n) = log n2
Ejercicio 2.2 ¾Para que valores de n se satisface la expresión 10n log n >
2n2 ?
Ejercicio 2.3
1. Agrupe las siguientes funciones; dos funciones f y g pertenecen al mis-
mo grupo si y sólo si se dominan asintóticamente.
f1 (n) = n f7 (n) = 2n
f2 (n) = n3 f8 (n) = log n
f3 (n) = n log n f9 (n) = n − n3 + 9n5
f4 (n) = n2 + log n f10 (n) = n2
1
f5 (n) = n 2 + log n f11 (n) = ln n
f6 (n) = 3n! f12 (n) = (log n)2
Ejercicio 2.4 Encuentre una función g(n) (de la forma AB ), tal que f (n)
sea O(g(n)), para cada uno de los siguientes casos:
i) f (n) = C(n, 2)
5n3 + 6
ii) f (n) =
n+2
(n2 + 7)3n
iii) f (n) =
2n
iv) f (n) = n!
Ejercicio 2.5 Muestre que para cualesquiera constantes positivas c0 , c1 , c2 , . . . , ck
la expresión c0 + c1 n + c2 n2 + · · · + ck nk es O(nk ). Pruebe que la expresión
no es O(nk−1 ).
Ejercicio 2.6 Cuando decimos que una expresión f (n) es O(log n), ¾porqué
no es necesario especicar la base del logaritmo?
Ejercicio 2.7 Probar las siguientes aseveraciones, y vericar que cada una
de las contenciones es propia.
i) O(n) ⊂ O(n log n)
ii) O(n log n) ⊂ O(nd ), ∀d > 1
iii) O(cn ) ⊂ O(n!), ∀c > 1
Ejercicio 2.8 Demostrar los siguientes resultados.
i) Sean f, g funciones con dominio N. Entonces
a) f es O(g) y g es O(f ) ⇔ O(f ) = O(g).
b) Si f es O(g) y g es O(h) ⇒ f es O(h).
ii) Sean c, d ∈ R, donde 0 < c < d, entonces O(cn ) ⊂ O(dn ) y la conten-
ción es propia.
Ejercicio 2.9 Pruebe que O(log n) = O(log(n + k)), ∀n, k > 0.
Ejercicio 2.10 Pruebe que R, 0 ≤ i ≤ n, ik es O(nk+1 ), si k ∈ N; si no es
el caso, demuestre lo contrario.
Ejercicio 2.11 Mostrar que para todas constantes a, b > 0 (log2 n)a es O(nb ).
48 CAPÍTULO 2. COMPORTAMIENTO...
Capítulo 3
Análisis de Algoritmos Iterativos
3.1. Introducción
De acuerdo a los conceptos enunciados, debe resultar claro que el análisis
de un algoritmo precisa de un conteo de los recursos consumidos. En un algo-
ritmo sin llamadas recursivas, una vez seleccionados el tamaño del problema
y la operación básica, el análisis se realiza utilizando técnicas tradicionales
de conteo (sucesiones, progresiones aritméticas, sumas, etc.) y el concepto de
orden de una función.
En el ejemplo siguiente se ilustra el análisis temporal de un algoritmo
iterativo de ordenación.
Análisis Temporal
a) Mejor Caso: Ocurre cuando el arreglo está ordenado,
49
50 CAPÍTULO 3. ANÁLISIS DE ALGORITMOS ITERATIVOS
te,
n
X
ft (n) = n (i + 1)
i=2
Xn
=n i + (n − 1)
i=2
n+1
=n − 1 + (n − 1)
2
n2 + 3n − 4
ft (n) = , es O(n2 ).
2
i+1
1 1X
(2 + 3 + 4 + · · · + (i + 1)) = j
i i j=2
µ ¶
1 (i + 1)(i + 2)
= −1
i 2
(i + 1)(i + 2) − 2
=
2i
i2 + 3i
=
2i
i+3
= asignaciones.
2
3.1. INTRODUCCIÓN 51
n
X i+3
ft (n) =
i=2
2
1X
= n(i + 3)
2 ·µ ¶ ¸
1 n(n + 1)
= − 1 + 3(n − 1)
2 2
1
= [n(n + 1) − 2 + 6(n − 1)]
4
1 2
= (n + n − 2 + 6n − 6)
4
n2 7n
= + − 2 es O(n2 ).
4 4
proc InserciónDirecta(ini, n, A) ≡
comienza
para i = ini + 1 a n haz
comienza
x ← A[i];
j ← i − 1;
mientras (j ≥ ini) ∧ (A[j] > x) haz
A[j + 1] ← A[j];
j ← j − 1;
zah
A[j + 1] ← x;
termina
zah
termina.
Algoritmo 5: Ordenación por Inserción Directa
52 CAPÍTULO 3. ANÁLISIS DE ALGORITMOS ITERATIVOS
3.2.1. Secuencia
Sea {I1 , I2 } una secuencia de instrucciones, con complejidades O(f ) y
O(g) respectivamente, entonces el orden de la secuencia es, por el Teorema
6, O(máx(f, g)). Ver Figura 5.
?
I1
O(f )
?
I2
O(g)
?
¡@
¡ @
V ¡ C @ F
@ ¡
? @ ¡ ?
@¡
I1 I2
O(f ) O(g)
3.2.3. Iteración
Si el bloque de complejidad O(f ) se realiza n veces, deducimos que la ite-
ración es O(nf (n)). En muchas ocasiones la complejidad del bloque depende
de algún índice. Si la complejidad es O(f (i)) para 1 ≤ i ≤ n la complejidad
Xn
de la iteración es f (i). Ver gura 7.
i=1
Se hizo ya el análisis de tres algoritmos iterativos, ahora utilizando las
técnicas que hemos descrito analizaremos paso a paso un algoritmo sencillo
que requiere el conocimiento de conceptos elementales de algebra lineal.
Ejemplo 14 Sean A y B dos matrices de n×n con entradas reales. Calcular
la matriz producto C = AB. El algoritmo que se utilizará, es implicado por
la denición del producto de matrices, donde la matriz C tiene la forma :
n
X
cij = aik bkj , i, j ∈ [1, n].
k=1
54 CAPÍTULO 3. ANÁLISIS DE ALGORITMOS ITERATIVOS
-
¡@
¡ @
I1 ¾V ¡ @
O(f ) @
C ¡
@ ¡
@¡
F
?
Análisis Temporal
De manera informal podemos decir que para obtener una entrada de cij
se hacen n multiplicaciones, como la matriz C tiene n × n entradas se tiene
que:
ft (n) = n(n2 ) = n3 es O(n3 ).
Nosotros podemos obtener el resultado anterior, si asignamos un orden
(según su comportamiento asintótico) a cada bloque de instrucciones según
las estructuras de control:
Análisis Espacial
n
X
Ejemplo 15 Sea A un vector de coecientes y sea Pn (z) = A[i]z i un po-
i=0
linomio de grado n, evaluado para un argumento real z. Encontrar la función
complejidad, temporal y espacial, para el algoritmo que evalúa Pn (z).
Análisis Temporal
a) I3 es de orden O(1),
ft (n) es O(n).
3.3. EJERCICIOS 57
Análisis Espacial
3.3. Ejercicios
Ejercicio 3.1 Escriba un algoritmo que dado un conjunto de números en-
teros diferentes y ordenados, devuelva el primer valor x tal que A[x] = x.
Calcule la complejidad espacial y temporal del algoritmo.
1. k divide a m y n,
4.1. Introducción
La recursividad es un fenómeno que se presenta en muchos problemas de
forma natural, delegando la solución de un problema en la solución de otro
más pequeño. Los siguientes son dos ejemplos clásicos:
Como se observa existen situaciones en las cuales las cantidades que que-
remos estudiar pueden ser modeladas matemáticamente por funciones de-
nidas en forma recursiva. Una ecuación que expresa una función de este tipo
recibe el nombre de ecuación recurrente, si además están dados uno o más
valores de n especícos, lo que se tiene es un sistema recurrente.
Los algoritmos, al igual que las funciones, también pueden ser denidos
recursivamente, de hecho tienen mucho en común pues ambos aceptan un
conjunto de entradas, generan salidas correspondientes a las entradas y tie-
nen una regla o conjunto de reglas para obtener las salidas a partir de las
entradas. Así que muchos conceptos que se aplican a funciones se aplicarán,
frecuentemente, también a los algoritmos.
59
60 CAPÍTULO 4. ANÁLISIS DE ALGORITMOS RECURSIVOS
f (0) = 0.
f (1) = f (0) + 1 = 1
f (2) = f (1) + 1 = 2
f (3) = f (2) + 1 = 3
f (4) = f (3) + 1 = 4
f (n) = f (n − 1) + 1
f (n) − f (n − 1) = 1
4.2. SISTEMAS RECURRENTES 63
expandemos la recurrencia
f (n) − f (n − 1) = 1
f (n − 1) − f (n − 2) = 1
f (n − 2) − f (n − 3) = 1
..
.
f (2) − f (1) = 1
f (1) − f (0) = 1
f (0) = 0
f (n) = 1| + 1 +{z· · · + 1}
n veces
∴ f (n) = n
P (n) − nP (n − 1) = 0
nP (n − 1) − n(n − 1)P (n − 2) = 0
..
.
n(n − 1)(n − 2) . . . 2 × P (1) − n(n − 1)(n − 2) · · · × 1 × P (0) = 0
P (0) = 1
64 CAPÍTULO 4. ANÁLISIS DE ALGORITMOS RECURSIVOS
f (1) = a,
f (n) = cf (n − 1) + b
f (n) − cf (n − 1) = b
cf (n − 1) − c2 f (n − 2) = cb
c2 f (n − 2) − c3 f (n − 3) = c2 b
..
.
c f (2) − c f (1) = cn−2 b
n−2 n−1
sabemos que
n
X
ci = n + 1, si c = 1
i=0
n
X cn+1 − 1
ci = , si c 6= 1
i=0
c−1
entonces si c = 1
f (n) = a + b(n − 1)
y si c 6= 1
b(cn−1 − 1)
f (n) = cn−1 +
c−1
A continuación presentamos un teorema basado en lo anterior.
entonces
i) Si c = 1 entonces f (n) = a + b(n − 1)
b(cn−1 − 1)
ii) Si c > 1 entonces f (n) = cn−1 a + .
c−1
A continuación ilustramos el uso del teorema anterior para resolver proble-
mas donde el sistema recurrente resultante se ajusta a la forma especicada
por el teorema.
Análisis Temporal
La relación de recurrencia esta dada por
ft (1) = 1
ft (n) = 2f (n − 1) + 1
4.2. SISTEMAS RECURRENTES 67
n−1 2n−1 − 1
ft (n) = 2 + = 2n−1 + (2n−1 − 1) = 2n − 1 es O(2n ).
1
Hasta ahora sólo hemos analizado algoritmos que utilizaban memoria es-
tática, los Algoritmos 10 y 11, por ser recursivos, requieren espacio para al-
macenar los registros de activación de las diferentes llamadas, de tal manera
que mientras más anidación de ambientes exista, mayor cantidad de memo-
ria consumirán. Los siguientes ejemplos ilustran el cálculo de la complejidad
espacial dinámica para algoritmos recursivos.
Análisis Espacial
El algoritmo recibe 4 parámetros y necesita una localidad de memoria
adicional para almacenar la dirección de retorno. Para resolver un problema
de tamaño n > 1, el algoritmo debe almacenar los valores de las variables y su
dirección de retorno, por lo tanto necesitará 5 celdas de memoria dinámica,
más las que consuma para resolver un problema de tamaño n−1. Observamos
que hace 2 llamadas recursivas con argumento n−1, pero cuando el primero de
ellos termina, la memoria consumida se libera y es reutilizada por la segunda
llamada, entonces podemos expresar la función complejidad espacial por el
siguiente sistema:
fe (1) = 5, pues para n = 1 no se hacen llamadas recursivas
fe (n) = fe (n − 1) + 5
Para aplicar el Teorema 9, hacemos a = 5, b = 5, c = 1 y obtenemos
Análisis Espacial
f (1) = c
n
f (n) = af ( ) + c
b
para argumentos de la forma n = bk , donde k ∈ N y k > 0, se tienen las
siguientes soluciones al sistema
i) Si a = 1 entonces f (n) = c(logb n + 1)
4.2. SISTEMAS RECURRENTES 69
c(anlogb a − 1)
ii) Si a 6= 1 entonces f (n) =
a−1
Demostración 6 Sea el sistema
f (1) = c
n
f (n) = af ( ) + c
b
con n = bk y k ≥ 1 se tiene
f (bk ) − af (bk−1 ) = c
af (bk−1 ) − a2 f (bk−2 ) = ac
..
.
ak−1 f (b1 ) − ak f (b0 ) = ak−1 c
f (bk ) = c + ac + · · · + ak−1 c + ak c
k
X
=c ai
i=0
i) Si a = 1, con n = bk
f (bk ) = c(k + 1)
y notamos que logb n = logb bk = k, luego entonces
c(ak+1 − 1)
f (bk ) =
a−1
c
= (aak − 1)
a−1
70 CAPÍTULO 4. ANÁLISIS DE ALGORITMOS RECURSIVOS
pero
logb n
alogb n = blogb a
= blogb n logb a
= blogb a logb n
logb a
= blogb n
= nlogb a
entonces
c
f (n) = (aalogb n − 1)
a−1
c
f (n) = (anlogb a − 1)
a−1
La forma cerrada para el sistema recurrente que enuncia el teorema sólo
es válida para argumentos de la forma bk , con b > 1 y k > 0. ¾Qué orden
podemos asociarle a la función en su forma cerrada?, dado que una función es
de orden g si g la domina asintóticamente y la denición de d.a. implica que
el dominio se dé en todos los naturales a partir de algún valor k especíco, y
el teorema no asegura el dominio en un rango continuo de los naturales, no
es posible asociarle un orden a la función. Sin embargo, podemos enunciar
la siguiente denición que nos caracteriza el comportamiento de una función
en un subconjunto de los naturales.
Denición 4 Sean f y g funciones de N a R y S un subconjunto innito de
N. Se dice que f es O(g) en S si existen m ≥ 0, k ≥ 0 tales que
|f (n)| ≤ m|g(n)|, ∀n ∈ S y n ≥ k.
En el marco de la denición anterior diremos que si f cumple con las
restricciones planteadas en el Teorema 10, entonces:
i) Si a = 1, f es O(log n) en S
ii) Si a 6= 1, f es O(nlogb a ) en S, donde S = {bk |b, k ∈ N ∧ b > 1, k > 0.}
Ahora bien, cuando el sistema recurrente que resulte de un algoritmo no
tenga exactamente la forma del teorema, pero se puede escribir en esa forma
cambiando la igualdad por una desigualdad, se puede asegurar un orden
para la función, pero no una expresión exacta para el sistema recurrente,
esta aseveración está respaldada por el siguiente teorema.
4.2. SISTEMAS RECURRENTES 71
f (1) ≤ c
n
f (n) ≤ af ( ) + c, para n = bk donde k > 0,
b
1. si a = 1 entonces f es O(log n) en S
2. si a 6= 1 entonces f es O(nlogb a ) en S
g(1) = c
n
g(n) = ag( ) + c, para n = bk y k > 0
b
Por el Teorema 10 es fácil ver que la función g es O(log n) en S si a = 1, y
O(nlogb a ) en S si a 6= 1.
Así tenemos que la función g es una cota para la función f en S, es decir
f (n) ≤ g(n), si n ∈ S.
func Cuenta(raiz) ≡
comienza
si (tipo (raiz) = hoja)) entonces
Cuenta ← 1
otro
Cuenta ← 1 + Cuenta(hijoizq(raiz))
+Cuenta(hijoder (raiz));
is
termina.
Algoritmo 12: Cuenta el número de nodos en un árbol binario
Análisis Temporal
n n−1
Como ft (n) es monótona creciente y 2
> 2
entonces ft ( n2 ) > ft ( n−1
2
),
de esta forma se tiene el sistema
ft (1) ≤ 1
n
ft (n) ≤ 2f ( ) + 1
2
Análisis Temporal
ft (1) = 0
n
ft (n) = 2ft ( ) + 1
2
ft (1) ≤ 1
n
ft (n) ≤ 2ft ( ) + 1
2
74 CAPÍTULO 4. ANÁLISIS DE ALGORITMOS RECURSIVOS
ft (n) es O(nlogb a ) en S
Análisis Espacial
Como es claro la complejidad espacial es de dos tipos:
1. Estática
fee (n) = espacio(A)
entonces:
fee (n) = n
2. Dinámica
Se tiene el sistema recurrente:
fed (1) = espacio(ini) + espacio(f in) + espacio(mitad) + espacio(max)
+ espacio(max_aux) + espacio(dirección de retorno)
fed (1) = 6
n
fed (n) = fed ( ) + 6
2
f (bi+1 ) ≤ m1 log bi (1 + 1)
f (bi+1 ) ≤ 2m − 1 log bi
⇒ f (j) < f (bi+1 ) ≤ 2m1 log bi ≤ 2m1 log j
⇒ f (j) ≤ 2m1 log j
76 CAPÍTULO 4. ANÁLISIS DE ALGORITMOS RECURSIVOS
n
X Z n
1 1
= ≤1+ dx = 1 + (ln x|x=n − ln x|x=2 )
i=1
i 2 x
≤ 1 + ln n − ln 2
por lo que podemos utilizar este valor para acotar la sumatoria sin perder de
vista que la igualdad es ahora una desigualdad.
4.4. ELECCIÓN DE LA OPERACIÓN BÁSICA 77
n n
2 2
n n n n
4 4 4 4
. . . . . . . .
4.5. Ejercicios
Ejercicio 4.1 Resuelva los siguientes sistemas recurrentes donde f (1) = 1
y para n ≥ 2
n
f (n) = 8f ( ) + n2 (4.1)
2
n
f (n) = 2f ( ) + log n (4.2)
2
Ejercicio 4.2 Muestre que el número de funciones booleanas de n variables
está dado por la recurrencia:
f (1) = 4
f (n) = (f (n − 1))2
4.5. EJERCICIOS 81
Ejercicio 4.5 Elabore algoritmos recursivos para resolver los siguientes pro-
blemas y calcule su complejidad temporal y espacial.
1. Encontrar una moneda falsa en un arreglo de n monedas con n = 2k
(el arreglo contiene los pesos de las monedas y la falsa pesa menos que
las otras).
2. Evaluar una expresión aritmética en notación inja que se encuentra
en un arreglo que contiene prioridades de aplicación para los elementos
de la expresión (la prioridad de un operando es innita).
Ejercicio 4.9 Escriba una versión recursiva del Algoritmo 8 (vease el ejer-
cicio 3.2).