You are on page 1of 10

Estudio del tiempo de ejecucin de

algoritmos recursivos a travs de


relaciones de recurrencia lineal






Apellidos, nombre Sanabria Codesal, Esther
1
(esanabri@mat.upv.es)
Casanova Faus, Assumpci
2
(casanova@dsic.upv.es)
Marqus Hernndez, Francisco
2
(pmarques@dsic.upv.es)
Centro Universitat Politcnica de Valncia



Resumen
En este artculo vamos a presentar un ejemplo de colaboracin entre dos materias
bsicas: las Matemticas y la Informtica. La idea es mejorar el aprendizaje de los
alumnos, reforzando los conceptos impartidos en ambas, poniendo de manifiesto
que las materias bsicas, que en ocasiones resultan poco interesantes, son
importantes para su formacin como profesionales. En este caso abordaremos los
costes de los algoritmos recursivos, punto de inters para asignaturas de
Informtica, a travs de la resolucin de relaciones de recurrencia, herramienta
proporcionada por las asignaturas de Matemticas.
1 Introduccin
Aprender a programar es un proceso que necesita que el alumno desarrolle
recursos de diversa ndole:
Debe llegar a dominar herramientas especficas, como el lenguaje o
lenguajes de programacin y sus entornos de desarrollo, adems de las
tcnicas algortmicas, bsicas y avanzadas, de aplicacin en el mbito
informtico.
Debe llegar a ser capaz de enfrentarse a la resolucin de problemas, en el
sentido ms amplio, de modo que pueda analizarlos y hacerlos abordables
mediante las tcnicas anteriores.
En ambos aspectos interviene de forma significativa su formacin matemtica.
Al mismo tiempo, que el alumno perciba qu conceptos y tcnicas matemticas
le respaldan en su tarea de programador, puede ayudarle a:
Sentirse ms interesado en el estudio de las matemticas.
Reforzar la asimilacin de los conceptos matemticos, que se revisan con
ejemplos procedentes un mbito diferente.
Consideramos que una buena manera de fomentar esta interrelacin es
desarrollando uno a uno, y detalladamente, ejemplos concretos como los que se
presentan en este artculo, donde se analiza el tiempo de ejecucin de los
algoritmos recursivos.
2 Objetivos
El trabajo tiene como objetivo poner de manifiesto la estrecha relacin entre los
conceptos impartidos en asignaturas bsicas en los grados y para ello
resolveremos problemas propios de asignaturas de informtica, utilizando las
herramientas proporcionadas por las asignaturas de matemticas.
3 Anlisis del coste de los algoritmos recursivos
Una caracterstica importante de un buen programa informtico es el tiempo que
toma su ejecucin, especialmente cuando se trata con grandes volmenes de
datos y con problemas complejos. El anlisis del coste de los algoritmos es la parte
de la Programacin que se ocupa de estudiarlo, y nos ayuda a fijarnos en los



aspectos de un programa que influyen decisivamente en el tiempo consumido,
sobre todo a medida que crece el volumen de los datos de entrada, e
independientemente de la mquina concreta en que se ejecuta.
Dicho problema se resuelve contando los pasos que se ejecutan para un volumen
de datos o talla del programa. Como se discute en el captulo 12 de [1],
entendemos por paso de programa toda aquella operacin que se hace
independientemente de lo grande que sea el dato, obteniendo el nmero de
pasos de programas como una funcin de coste I(n), en donde n es la talla.
Cuando un algoritmo est expresado recursivamente y queremos contar los pasos
de programa que toma su ejecucin, podemos suponer que las subllamadas
recursivas generadas tienen el mismo comportamiento temporal que la llamada
inicial, dado que siguen la misma estrategia, pero trabajando con datos de menor
talla. Por ello, lo ms natural parece ser expresar tambin I(n) de forma recurrente.
Por ejemplo, dado un entero n u, el algoritmo de la figura 1 calcula
recursivamente su representacin en binario. El algoritmo viene dado como un
mtodo J ava que recibe a n como parmetro, y que escribe en la salida una
secuencia de u y 1 correspondiente a su representacin en base 2.
Figura 1. Clculo de la representacin en binario de n.
Se trata de un ejemplo de recursividad lineal no final (segn la clasificacin dada
en el captulo 11 de [1]), donde en primer lugar obtenemos la representacin en
binario de n2, y a su d e re c ha se escribe el bit menos significativo (el resto de
n2, calculado en J ava como n%2). Por ejemplo, para calcular la representacin
en binario de 18, en primer lugar escribimos la representacin de 9, es decir, 1uu1,
escribiendo a continuacin u para obtener como resultado 1uu1u.
De esta manera, en cada llamada recursiva se va aadiendo un bit ms al
resultado. Notamos que el bit ms significativo del argumento (que vale 1 para
cualquier n, salvo en el caso particular n = u) se obtiene en la llamada
correspondiente al caso base.
Una vez analizado el problema llegamos a la relacin de recurrencia para el coste
I(n) = _
1 n = 1
1 +I [
n
2
n > 1

Ecuacin 1. Coste del algoritmo de la figura1.



3.1 Solucin a travs de sustitucin
La recurrencia de la ecuacin 1 podemos resolverla por sustitucin
I(n) = 1 + I [
n
2
= 2 +I [
n
4
= S + I [
n
8
= = k +I [
n
2
k

Si hacemos el cambio de variable n = 2
k
, obtenemos que
I(n) = k + I [
n
2
k
= log
2
n +I(1) = log
2
n + 1
Este resultado nos indica que el coste es proporcional a la parte entera de log
2
n, es
decir, al nmero de veces que debemos dividir n por 2 para llegar a 1, o dicho de
otro modo, el coste es proporcional al nmero de cifras de n en base 2.

Precisamente, otro posible anlisis del problema consiste en considerar como talla
el nmero de bits de n, al que podemos llamar k. As, en cada llamada recursiva
reducimos en uno el nmero de bits, y entonces
I(k) = _
1 k = 1
1 +I(k - 1 ) k > 1

Ecuacin 2. Relacin de recurrencia lineal
La resolucin por sustitucin en este caso es la siguiente
I(k) = 1 +I( k -1 ) = 2 +I(k - 2) = S +I( k - S) = = k +I(1) = k +1.
3.2 Solucin por el mtodo de la ecuacin caracterstica
Las recurrencias de las ecuaciones 1 y 2 son relativamente sencillas y se han podido
resolver de forma directa por sustitucin reiterada de trminos.
Encontramos otro ejemplo un poco ms complejo en el problema de buscar el
mnimo de un array de enteros, entre unas posiciones inicial ini y final in. En la
figura 2 vemos, escrita en J ava, una resolucin del problema mediante recursin no
lineal.
En este mtodo, si o|ini . . in] tiene un nmero de componentes n mayor que 1, se
reduce a dos subarrays no vacos de talla las partes enteras por defecto o por
exceso de n2, es decir | n 2 j, o bien |n 2 ]. Una vez calculados los mnimos de
ambas partes, es suficiente comparar ambos mnimos para obtener el mnimo
buscado. Si el array tiene a lo sumo un elemento, dicho elemento es trivialmente el
mnimo.
Por ejemplo, si o es el array {S,4,2,6,u, -2,S], y el rango de ndices ini . . in abarca
todo el array, es decir, va desde u a 6 inclusive, el problema se reduce a calcular
recursivamente el mnimo en el rango u . . S (las cuatro primeras componentes), y el
mnimo en el rango 4 . . 6 (las tres ltimas); estos mnimos son respectivamente 2 y -2,
y de la comparacin de ambos se obtiene que el mnimo de o es -2.
As pues, todo problema se va reduciendo recursivamente a dos subproblemas de
talla aproximadamente mitad y que en el caso base sern de talla 1.



Figura 2. Clculo del mnimo de un array en el rango ini. . in.
Una vez analizado el problema llegamos a la relacin de recurrencia para el coste
I(n) = _
1 n = 1
1 ++ I(|
n
2
, j) +I(|
n
2
, ]) n > 1

Ecuacin 3. Coste el algoritmo de la figura 2.
que aproximaremos por
I(n) = _
1 n = 1
1 +2 I [
n
2
n > 1

Ecuacin 4. Coste el algoritmo de la figura 2.
En este caso podemos resolverla por sustitucin
I(n) = 1 +2 I [
n
2
= 1 + 2 _1 + 2 I [
n
4
_ = = 2
-1
k
=1
+2
k
I [
n
2
k

Utilizando el hecho de que _ 2
-1
k
=1
= 2
k
-1 y haciendo el cambio de variable
n = 2
k
obtenemos
I(n) = 2
k
- 1 + 2
k
I [
n
2
k
= n - 1 + n I(1) = 2n - 1
Con el objetivo de utilizar las herramientas matemticas para resolver la relacin de
recurrencia obtenida en la ecuacin 4, realizamos el cambio de variable n =
2
k
, donde consideramos que k es la parte entera de log
2
n y
n
2
= 2
k-1
. Por tanto, la
relacin de recurrencia lineal viene dada por la sucesin o
k
= I(2
k
) con o
0
= I(2
0
) =
I(1) = 1 y o
k
= I(2
k
) = 1 +2 I(2
k-1
) = 1 +2o
k-1
, k > u.
De esta forma hemos modificado el problema inicial transformndolo en un
ejercicio tpico de ecuaciones en diferencias de la asignatura de matemticas.
o
k
= _
1 k = u
1 +2o
k-1
k > u

Ecuacin 5. Relacin de recurrencia lineal con coeficientes constantes.



Para resolverlo es necesario encontrar una familia de sucesiones que sern la
solucin general de la relacin de recurrencia. Para ello utilizaremos el siguiente
teorema:
La solucin general de una recurrencia lineal o
n
= b(n) + c
1
o
n-1
+ c
k
o
n-k
, donde
c

R , c
k
= u y b(n) es un funcin de n N, viene dada por la expresin o
n
= o
n
h
+ o
n
p
,
donde o
n
h
representa la solucin general de la ecuacin lineal homognea
asociada, es decir o
n
= c
1
o
n-1
+c
k
o
n-k
y o
n
p
es una solucin particular (cualquiera)
de la ecuacin completa ([3]).
Siguiendo el mtodo habitual para resolver ecuaciones en diferencias ([4]),
calculamos la solucin general de la recurrencia homognea de coeficientes
constantes o
k
- 2o
k-1
= u, considerando la ecuacin caracterstica asociada, dada
en este caso por z -2 = u.
Utilizando las soluciones de esta ecuacin, en nuestro caso z = 2, construimos la
familia de sucesioneso
k
h
= C2
k
,

donde C es una constante arbitraria,

que cumplen la
igualdad o
k
-2o
k-1
= u.
Puesto que la recurrencia lineal de la ecuacin 5 tiene la funcin b(n) = 1, es decir
b(n) es un polinomio de grado cero, sabemos que sus soluciones particulares tienen
la forma o
k
p
= A, donde A es una constante que tendremos que determinar.
Para ello sustituimos en la relacin de recurrencia anterior o
k
- 2o
k-1
= 1
o
k
p
- 2o
k
p
= A - 2A = 1 A = -1
Luego o
k
p
= -1 y la familia de sucesiones que cumplen la relacin de recurrencia
o
k
= 1 +2o
k-1
, es decir, la solucin general de la recurrencia viene dada por
o
k
= o
k
h
+o
k
p
= C2
k
- 1, donde C es una constante arbitraria.
Para encontrar la solucin particular, es decir la nica sucesin que la relacin de
recurrencia sujeta a la condicin inicial o
0
= 1, ser necesario calcular la constante
C. Para ello sustituimos la condicin inicial en la solucin general
1 = o
0
= C2
0
- 1 C = 2
Luego la solucin de la ecuacin 5 viene dada por o
k
= 22
k
- 1 = 2
k+1
- 1, para
todo k u.
Deshaciendo el cambio de variable n = 2
k
y recordando que hemos denotado
o
k
= I(2
k
), obtendremos la sucesin que cumple la recurrencia dada por la
ecuacin 4
I(n) = I(2
k
) = o
k
= 2 2
k
-1 = 2 n - 1, n 1.
4 Desarrollo del coste de Fibonacci
El ltimo ejemplo que trataremos es la sucesin de Fibonacci definida por la
recurrencia:

n
= _
u n = u
1 n = 1

n-1
+
n-2
n > 1

Ecuacin 6. Sucesin de Fibonacci.



En la parte izquierda de la figura 3, vemos un mtodo recursivo que implementa el
clculo del trmino
n
siguiendo literalmente la definicin anterior. Mientras que a
la derecha, en la misma figura, tenemos una versin iterativa de Fibonacci que
calcula
n
con n pasos de programa.
Figura 3. Clculos recursivo e iterativo de la sucesin de Fibonacci.
Una diferencia que podemos observar entre las dos versiones es que el clculo
recursivo repite muchos clculos, como vemos por ejemplo en la figura 4, en la que
hemos desarrollado el rbol de llamadas recursivas para n = S.
Figura 4. rbol de llamadas del clculo recursivo de Fibonacci de 5.
Para medir cmo va a afectar esta redundancia al tiempo de ejecucin de este
algoritmo, nos vamos a plantear a continuacin el estudio del coste mediante las
relaciones de recurrencia para I(n).
4.1 Solucin a travs de sustitucin
El coste del clculo recursivo de Fibonacci se expresa mediante la siguiente
relacin
I(n) = _
1 u n 1
1 + I(n -1 ) + I(n - 2) n > 1

Ecuacin 7. Relacin de recurrencia del coste de Fibonacci recursivo.
En este caso no podemos resolverla directamente por sustitucin, pero s podemos
acotarla por dos sucesiones ms simples ya que es una sucesin creciente

1 + I(n - 2 ) + I(n - 2) 1 + I(n -1 ) + I(n - 2) 1 + I(n - 1 ) +I(n -1), n > 1




Luego 1 +2 I(n - 2) I(n) 1 + 2 I(n - 1), n > 1.
Por tanto aplicando sustitucin a la cota inferior obtenemos
1 +2 I(n -2) = 1 + 2 (1 + 2 I(n - 4 )) = = 2
-1
k
=1
+2
k
I(n - 2k )
Sustituyendo _ 2
-1
k
=1
= 2
k
- 1, el trmino general de la sucesin viene dado por
1 +2 I(n - 2) = 2
k
-1 +2
k
I(n -2k ) = o2
n 2
- 1 , n > 1
donde o = 2 si n = 2 k (par) y o = 2
1 2
si n = 2 k +1 (impar). Aplicando el mismo
razonamiento de sustitucin a la cota superior obtenemos
1 +2 I(n - 1) = 1 +2 (1 + 2 I(n - 1 )) = = 2
-1
k
=1
+ 2
k
I(n - k )
Sustituyendo _ 2
-1
k
=1
= 2
k
- 1, el trmino general de la sucesin en este caso viene
dado por una nica expresin para todo n
1 +2 I(n - 1) = 2
k
-1 +2
k
I(n -k ) = 2 2
n
- 1, n > 1
Por tanto
o2
n 2
-1 = 1 +2 I(n - 2) I(n) 1 + 2 I(n -1) = 2
n+1
-1, n > 1
donde o = 2 si n es par y o = 2
1 2
si n es impar.
Por ejemplo, para n = S la cota inferior corresponde a suponer un desarrollo de
llamadas como se muestra en la figura 5, a la izquierda; mientras que la cota
superior corresponde a suponer un desarrollo de llamadas recursivas como el de la
misma figura a la derecha.
Figura 5. Cotas inferior y superior del comportamiento de
Fibonacci recursivo para n = S.
En resumen, las dos cotas anteriores son exponenciales en n (con bases 2
1 2
y 2,
respectivamente), lo que puede resultar suficiente para compararlo con el coste
del Fibonacci iterativo.
Aun as, podemos ser todava ms precisos si aplicamos las herramientas
matemticas ya conocidas.



4.2 Solucin a travs de relaciones de recurrencia
Consideramos I(n) = o
n
para transformar el problema del coste de la ecuacin 7 en
un tpico ejercicio de ecuaciones en diferencias de la asignatura de matemticas
o
n
= _
1 u n 1
1 +o
n-1
+o
n-2
n > 1

Ecuacin 8. Relacin de recurrencia lineal con coeficientes constantes.
Para calcular la solucin general de la recurrencia homognea de coeficientes
constantes o
n
= o
n-1
+ o
n-2
, necesitamos construir la ecuacin caracterstica, dada
en este caso por z
2
-z -1 = u.
Utilizando las soluciones de la ecuacin caracterstica z =
1 _ 5
2
, construimos la
familia de sucesiones o
n
h
que cumplen la igualdad o
n
= o
n-1
+o
n-2
. stas vienen
dadas por la expresin o
n
h
= C
1
[
1+ 5
2

n
+ C
2
[
1- 5
2

n
,

donde C
1
y C
2
son constantes
arbitrarias.


Puesto que la recurrencia lineal de la ecuacin 8 tiene la funcin b(n) = 1, sabemos
que las soluciones particulares tienen la forma o
n
p
= A, donde A es una constante
que tendremos que determinar.
Para ello sustituimos o
n
p
en la relacin de recurrencia anterior o
n
-o
n-1
- o
n-2
= 1
o
n
p
-o
n-1
p
- o
n-2
p
= A - 2A = 1 A = -1
Luego o
n
p
= -1 y la solucin general de la recurrencia viene dada por o
n
= o
n
h
+ o
n
p
=
C
1
[
1+ 5
2

n
+ C
2
[
1- 5
2

n
-1, donde C
1
y C
2
son constantes arbitrarias.


Para encontrar la solucin particular de la ecuacin 8, ser necesario calcular las
constantes C
1
y C
2
. Para ello sustituimos las condiciones iniciales o
0
= o
1
= 1 en la
solucin general
1 = o
0
= o
1
C
1
=
1 + S
S
, C
2
=
1 - S
S

Y por tanto la solucin de la recurrencia de la ecuacin 7 viene dada por
I(n) = o
n
=
1 + S
S
_
1 + S
2
_
n
+
1 - S
S
_
1 - S
2
_
n
-1, n u.

5 Conclusin
Mediante algunos ejemplos de anlisis del coste de algoritmos recursivos, hemos
podido comprobar:
En primer lugar, el inters de conocer y aplicar una herramienta
matemtica concreta: la resolucin de recurrencias lineales, al estudio del
comportamiento temporal de un conjunto de algoritmos recursivos.
Por otra parte, que los problemas de anlisis de algoritmos que se ha
resuelto puede ayudar a interpretar los pasos dados cuando se aplica
dicha herramienta matemtica.



De una manera ms general, queremos resaltar la importancia de la formacin
matemtica de los estudiantes de Informtica para su profesin ([5]). Una muestra
notable de esta importancia es el premio Fronteras del conocimiento otorgado
en Espaa en 2011 al matemtico Donald E. Knuth. Como se resea en [6], el
jurado le atribuy hacer de la programacin informtica una ciencia
introduciendo tcnicas matemticas para el anlisis riguroso de los algoritmos, y
reconoci que aport elegancia al promover la escritura de un cdigo de
programacin sencillo, compacto y comprensible de forma intuitiva.
6 Bibliografa
6.1 Libros:

[1] Prieto Sez, N; Casanova Faus, A; Marqus Hernndez, F; y otros: Empezar a
programar usando J ava, Ed. UPV, 2012.
[2] Graham, R L; Knuth, D E; Patashnik, O: Concrete Mathematics: Foundation for
Computer Science, Ed. Addison Wesley, 1994.
[3] Fernndez Prez, C; Vzquez Hernndez, F J ; Vegas Montaner, J M: Ecuaciones
diferenciales y en diferencias, Ed. Thomson, 2003.
[4] Garca Merayo, F; Hernndez Pealver, G; Nevot Luna, A: Problemas resueltos
de Matemtica Discreta, Ed. Thomson, 2003.
6.2 Comunicaciones presentadas en conferencias:

[5] Martnez Hinarejos, C D; Sanabria Codesal, E: Una experiencia de coordinacin
entre las asignaturas de Anlisis Matemtico y Programacin de la ETSINF, Actas
de las VIII J ornadas de Redes de Investigacin en Docencia Universitaria, Alicante,
2010.
6.3 Referencias de fuentes electrnicas:

[6] Entrevista a Donald E. Knuth: El hombre que habla a las mquinas, El Pas, 18 de
enero de 2011. Disponible en:
http://sociedad.elpais.com/sociedad/ 2011/ 01/ 18/ actualidad/ 1295305202_850215.html

You might also like