Vous êtes sur la page 1sur 99

TEMA 3.

ANLISIS DE EFICIENCIA
Anlisis de Eficiencia. Introduccin
2
Introduccin Introduccin
D d d l it l l i bl d f dif t
3
Dados dos algoritmos que resuelven el mismo problema de forma diferente
Cul es el mejor?. Cmo se decide que un algoritmo es mejor que otro?
Posibles respuestas:
El i ( d i bl d El que consuma menos memoria (nmero de variables, nmero y tamao de
estructuras de datos usadas).
El que vaya ms rpido (midiendo el tiempo que tarda en ejecutarse o el
nmero de operaciones elementales que realiza). nmero de operaciones elementales que realiza).
El que funcione adecuadamente.
El ms fcil para el humano de leer, escribir o entender.
Por qu deberamos preocuparnos por la calidad de un algoritmo si lo Por qu deberamos preocuparnos por la calidad de un algoritmo, si lo
nico que tenemos que hacer para que un programa vaya ms rpido es
utilizar un ordenador con ms potencia, o si ste consume mucha memoria,
aadirle algunos mdulos de memoria ms?
En todo caso, por qu queremos medir la calidad de un algoritmo si ya
hace lo que se le pide?
Introduccin Introduccin
C j l fi i i d l h d
4
Cmo mejorar la eficiencia cuando el hardware no es
suficiente
Para conseguir que un algoritmo resuelva problemas Para conseguir que un algoritmo resuelva problemas
de mayor tamao no bastar con ejecutarlo en un
hardware ms potente?
Qu ganancia se obtiene al duplicar la velocidad de
procesamiento?
Qu ganancia se obtiene al duplicar el nmero de Qu ganancia se obtiene al duplicar el nmero de
ncleos de procesamiento?
Cunto tiempo lleva a la industria ofrecer procesadores
l d bl d l id d l d bl d l l d bl con el doble de velocidad, el doble de ncleos o el doble
de memoria?
Introduccin Introduccin
P bl
5
Problema:
El aumento de las prestaciones no implica una clara mejora en el
tiempo de ejecucin.
Ejemplo:
Ejecucin de un programa con n datos en 10-42n segundos:
Si n=10 el programa terminar en 0'1 segundos Si n=10, el programa terminar en 0 1 segundos.
Si fuera 20, aproximadamente 10 minutos;
30, un da y
40 40, un ao.
Si cambiamos el ordenador que estamos usando por uno 100 veces
ms rpido:
Si n=45 datos, en un ao.
Slo se mejorara de manera importante si se modificara el diseo del
programa, sustituyendo este algoritmo anterior por uno ms eficiente
Introduccin Introduccin
A
6
Analicemos el algoritmo de las Torres de Hanoi:
Para 3 discos realiza 8 operaciones: 2
3
En general, para n discos: 2
n
operaciones
Tomemos una mquina capaz de realizar mil
millones de operaciones elementales por segundo millones de operaciones elementales por segundo
y veamos qu podramos hacer
Introduccin Introduccin
7
2773 l d d d l i ! 2773 veces la edad del universo!
Introduccin Introduccin
8
Tericamente la potencia de los ordenadores se
duplica cada 18 meses duplica cada 18 meses
Nos sirve un ordenador el doble de potente? 10 veces
ms potente? ms potente?
1.000.000 de veces ms potente?
Introduccin Introduccin
C d li l t di d l fi i i d
9
Cmo podemos realizar el estudio de la eficiencia de un
algoritmo?
Empricamente: programar los algoritmos y ejecutarlos varias veces con
di ti t d t d t d distintos datos de entrada.
Tericamente: determinar matemticamente la cantidad de recursos
(tiempo de ejecucin y memoria) requeridos por la implementacin en
funcin del tamao de la entrada funcin del tamao de la entrada.
Problemas del estudio emprico:
Dependencia de los resultados obtenidos del tipo de ordenador,
del lenguaje de programacin usado
del traductor con el que se obtenga el cdigo ejecutable,
de la pericia del programador. (si cambiamos alguno de estos p p g ( g
elementos probablemente se obtengan resultados diferentes, con lo cual
no podemos establecer una eficiencia emprica absoluta).
Introduccin Introduccin
E di E i
10
Estudio Emprico:
Existen algoritmos que pueden ser comparados con esta
tcnica slo cuando el nmero de datos con los que se tcnica slo cuando el nmero de datos con los que se
ejecutan es relativamente pequeo.
Ejemplo: el problema del viajante de comercio Ejemplo: el problema del viajante de comercio
(encontrar una ruta que una un nmero de ciudades
pero con coste mnimo, por ejemplo en kilmetros a
recorrer.)
10 20 poblaciones: solucin en pocos segundo.
100 poblaciones: no existe ordenador para encontrar la
solucin en un tiempo razonable.
Introduccin Introduccin
M di d i
11
Mediante mtodos empricos
Ejecucin del algoritmo con distintos tamaos del
problema y medida del tiempo empleado: problema y medida del tiempo empleado:
Al cambiar de mquina los resultados diferirn
El lenguaje escogido influir en la implementacin y el g j g p y
compilador usado optimizar ms o menos el cdigo
ejecutable
La ocupacin del sistema en el momento de la ejecucin La ocupacin del sistema en el momento de la ejecucin
tambin cambiar los resultados
Hay algoritmos que no pueden ser probados as para
d l i d j tamaos grandes por el tiempo que tardaran en ejecutarse
(ACO, genticos, etc.)
Introduccin Introduccin
M d d T i
12
Mediante mtodos Tericos
Ventajas del estudio terico:
Independencia con todos los factores anteriores.
Genrico para cualquier entrada
d l d l i i Depende slo de las instrucciones que componen el
algoritmo y del tamao del problema.
No es necesario ejecutar el algoritmo para conocer su No es necesario ejecutar el algoritmo para conocer su
eficiencia
Ofrece como salida una expresin matemtica que indica p q
cmo se produce el crecimiento del tiempo de ejecucin
conforme aumenta el tamao de entrada.
Introduccin Introduccin
13
De manera hbrida:
realizar un estudio terico y posteriormente estimar
ciertos parmetros de forma emprica.
Introduccin Introduccin
L t d d bl t
14
La entrada de un problema y su tamao.
Algoritmo de ordenacin de un vector de n enteros: n es el tamao de
los datos de entrada.
Algoritmo para el clculo del factorial de un entero: el valor de ese
nmero entero es el que nos determinara el tamao de nuestro
problema.
Algoritmo que resuelve el problema del viajante de comercio: el nmero
de ciudades y el de carreteras que unen a estas.
De manera general, el tamao de la entrada de un problema
vendr dado en funcin de un nmero entero que nos mide el
nmero de componentes de dicho ejemplo.
No existe una regla exacta para determinar el tamao de un
problema, sino que tendr que obtenerse segn las caractersticas
de cada uno.
Introduccin Introduccin
D t i l t d l bl
15
Determinar el tamao del problema
El primer paso es conocer el tamao del problema, un dato que
vendr expresado normalmente como un nmero entero n: p
Algoritmo de ordenacin de un vector de n enteros: n es el tamao de
los datos de entrada.
Algoritmo para el clculo del factorial de un entero: el valor de ese Algoritmo para el clculo del factorial de un entero: el valor de ese
nmero entero es el que nos determinara el tamao de nuestro
problema.
Para calcular un valor de la sucesin de Fibonacci n indica la posicin del p
trmino
La ordenacin de una lista de datos tiene como n al nmero de
elementos a ordenar
En el problema del TSP n es el nmero de ciudades, en las Torres de Hanoi
n es el nmero de discos, etc.
Introduccin Introduccin
16
Determinar el tamao del problema
No siempre es fcil determinar el valor de n. Ejemplo
la funcin:
ncsr(n, k) = ncsr(n- 1, k-1) + ncsr(n-1, k). ( , ) ( , ) ( , )
De manera general, el tamao de la entrada de un
problema vendr dado en funcin de un nmero entero que
nos mide el nmero de componentes de dicho ejemplo.
No existe una regla exacta para determinar el tamao de
un problema, sino que tendr que obtenerse segn las
caractersticas de cada uno.
Tiempo de ejecucin
17
Tiempo de ejecucin Tiempo de ejecucin
T( )
18
T(n)
Unidades de tiempo (segundos, milisegundos,...) que un algoritmo tardara
en ejecutarse con unos datos de entrada de tamao n.
Pero el tiempo de ejecucin depende
del ordenador utilizado
traductor con el que se genere el cdigo objeto traductor con el que se genere el cdigo objeto
Entonces T(n) representar: nmero de instrucciones simples (asignaciones,
comparaciones, operaciones aritmticas,...) ejecutadas.
O de manera equivalente: el tiempo de ejecucin del algoritmo en un O de manera equivalente: el tiempo de ejecucin del algoritmo en un
ordenador idealizado, donde cada una de las instrucciones simples
consume una unidad de tiempo.
T(n) no se expresa con unidades y para n0 T(n) es positivo
Tiempo de ejecucin Tiempo de ejecucin
C id l t d l bl h l l l l
19
Conocido el tamao del problema hay que calcular cul ser el
tiempo de ejecucin para n: T(n)
La medida se efecta en unidades de tiempo imaginarias, supuesto un
d d id l j t i t i i l id d d ordenador ideal que ejecutase una instruccin simple por unidad de
tiempo
En un ordenador real cualquiera, la ejecucin del mismo algoritmo para
el mismo tamao tardar un tiempo T1(n) el mismo tamao tardar un tiempo T1(n)
Ambas medidas no diferirn en eficiencia ms all de un factor
multiplicativo c, de forma que dadas dos medidas para el mismo
algoritmo (de dos ejecuciones en dos mquinas distintas) T1(n) y T2(n) algoritmo (de dos ejecuciones en dos mquinas distintas) T1(n) y T2(n)
se cumplir que:
T1(n) cT2(n) T1(n) y T2(n) (n) T1(n) cT2(n) T1(n) y T2(n) (n)
ste es el denominado principio de invarianza. p p
Tiempo de ejecucin Tiempo de ejecucin
P i i i d i i
20
Principio de invarianza:
Dos implementaciones distintas de un mismo algoritmo, que toman
t1(n) y t2(n) unidades de tiempo, respectivamente, para resolver
un problema de tamao n, no diferirn en eficiencia en ms de
una constante multiplicativa.
Existe un c>0 tal que t1(n) ct2(n). q ( ) ( )
Lo que implica que:
Un programa vaya 10 1000 veces ms rpido cambiando de
i mquina,
pero slo un cambio de algoritmo
permitir obtener una mejora mayor cuanto ms crezca el permitir obtener una mejora mayor cuanto ms crezca el
tamao de los ejemplos, lo que nos llevar a ignorar las
constantes multiplicativas a todos los efectos.
Tiempo de ejecucin Tiempo de ejecucin
U l it d j t d t d t d
21
Un algoritmo se puede ejecutar con datos de entrada
diferentes.
Hay datos con los que tarde ms, y y q , y
Datos con los que acabe antes.
Hay que indicar a qu situacin pertenece la expresin T(n)
l l d calculada:
Peor caso: lmite superior en el tiempo (mximo valor).
Generalmente es pesimista.
Mejor caso: lmite inferior en el tiempo (siempre se ejecutar por
encima de dicho tiempo).
Caso promedio: media ponderada de ambos casos. Caso promedio: media ponderada de ambos casos.
Salvo que se diga lo contrario, siempre trabajaremos con el
peor caso.
Tiempo de ejecucin Tiempo de ejecucin
Ej l 1 Al it d d i l i
22
Ejemplo 1: Algoritmo de ordenacin por seleccin:
Vector ordenado de forma creciente (mejor caso)
Vector ordenado de manera decreciente (peor caso) Vector ordenado de manera decreciente (peor caso)

Ambos tiempos coinciden ms o menos Ambos tiempos coinciden ms o menos


Ejemplo 2: Algoritmo de ordenacin por insercin. j p g p
Vector ordenado de forma creciente proporcional a n.
Vector ordenado de forma decreciente proporcional a n
2

Los tiempo de ambos son diferentes


Tiempo de ejecucin Tiempo de ejecucin
C l l l i d j i d
23
Cmo se calcula el tiempo de ejecucin de un
algoritmo? sobre la base de las instrucciones lo
componen : componen :
1. Tiempo de ejecucin (Evaluacin de una expresin) = lo
que se tarde en realizar las operaciones que contenga q p q g
2. Tiempo de ejecucin (asignacin a una variable simple
de una expresin) = tiempo de evaluacin de la expresin +
d tiempo de asignacin
3. Tiempo de ejecucin (escritura de una expresin) =
tiempo de evaluacin de la expresin + tiempo del proceso de tiempo de evaluacin de la expresin + tiempo del proceso de
escritura.
4. Tiempo de ejecucin (lectura de una variable) = constante p j
Tiempo de ejecucin Tiempo de ejecucin
Ti d j i ( i d i t i ) = l
24
5.Tiempo de ejecucin (secuencia de instrucciones) = la
suma de los tiempos de cada una de las instrucciones.
6.Tiempo de ejecucin (una sentencia condicional)= Tiempo p j ( ) p
de evaluar la condicin + mximo de los costes del bloque
entonces y del bloque sino.
7 Tiempo de ejecucin (bucle)= tiempo del cuerpo del bucle*( 7.Tiempo de ejecucin (bucle)= tiempo del cuerpo del bucle (
nmero de iteraciones + tiempo de evaluar la condicin del
bucle)
O i l t l d ll i Operaciones elementales: todas aquellas cuyo tiempo
de ejecucin est limitado superiormente por una
constante (slo depende de la implementacin) ( p p )
Ejemplo: operaciones de suma, multiplicacin, resta,
divisin, mdulo y similares.
Tiempo de ejecucin Tiempo de ejecucin
Ej l f i l l l l i d t
25
Ejemplo: fucin para calcular el valor mnimo de un vector.
/* 1 */ int BuscarMinimo(int []Vector, int n){
/* 2 */ int j, min; / / j, ;
/* 3 */ min= 0;
/* 4 */ for (j=1; j<n;j++)
/* 5 */ if (Vector[j] < Vector[min])
/* 6 */ min= j;
/* 7 */ return min; / 7 / return min;
/* 8 */ }
T(n)= ca + ci +(ce+ce+ca+cinc)(n-1) + cr.

T(n)= 4(n-1) + 3= 4n.?????


Tiempo de ejecucin Tiempo de ejecucin
26
Tiempo de ejecucin Tiempo de ejecucin
27
Orden
28
Orden Orden
Efi i i
29
Eficiencia
La forma en que el tiempo de ejecucin (y en general cualquier recurso)
necesario para procesar una entrada de tamao n crece cuando se
incrementa el valor de n.
Se especifica mediante una funcin de crecimiento
Orden de una funcin Orden de una funcin
Se dice que un algoritmo necesita un tiempo de ejecucin del orden de una
funcin cualquiera f(n), cuando existe una constante positiva c y una
implementacin del algoritmo que resuelve cada instancia del problema en implementacin del algoritmo que resuelve cada instancia del problema en
un tiempo acotado superiormente por cf(n), siendo la funcin f(n) la que
marca cmo crecer dicho tiempo de ejecucin cuando aumente n.
Un algoritmo ser por tanto ms eficiente que otro si el tiempo de Un algoritmo ser, por tanto, ms eficiente que otro si el tiempo de
ejecucin del peor caso tiene un orden de crecimiento menor que el
segundo.
Orden Orden
30
Dos algoritmos ,A y B, resuelven un problema mediante las funciones
TA(n)=100n y TB(n)=2n
2
, respectivamente. Cul deberamos usar?
Si n<50, B es mejor que A. j q
Si n50, A es mejor que B,
si n= 100, A es el doble de rpido que B
i 1 000 A 20 id B si n=1.000, A es 20 veces ms rpido que B
Es ms importante la forma de las funciones (n y n
2
), que las
constantes (2 y 100).
En vez de decir que el tiempo de ejecucin del algoritmo es T(n)=4n+3,
por ejemplo, diremos que T(n) es del orden de n, lo que implica que el
tiempo de ejecucin es alguna constante multiplicada por n para tamaos tiempo de ejecucin es alguna constante multiplicada por n, para tamaos
de problemas de dimensin n.
Orden Orden
31
Las funciones que nos marcan ms comnmente el orden de crecimiento de
los algoritmos y los nombres por las que se les conocen son las siguientes:
f(n)= 1 Constante. f(n) 1 Constante.
f(n)= log n Logartmica.
f(n)= n Lineal.
f(n)= nlog n Quasilineal.
f(n)= n
2
Cuadrtica.
f(n)= n
3
Cbica, y en general,
f(n)= n
k
polinmica.
f(n)= k
n
Exponencial.
Orden Orden

32
Algoritmo eficiente como mucho un coste quasilineal.
Mejor orden es el logartmico: doblar el tamao del problema, no afecta
al tiempo y doblar el tiempo permite tratar problemas enormes. al tiempo y doblar el tiempo permite tratar problemas enormes.
rdenes quasilienal y lineal: duplicar el tamao del problema se duplica
aproximadamente el tiempo empleado, y anlogamente, al duplicar el
d bl d d l d bl d tiempo se pueden tratar problemas aproximadamente del doble de
tamao.
rdenes polinmicos: se necesita mucho tiempo para resolver un problema de es po cos: se eces a uc o e po pa a eso ve u p ob e a
que ha crecido relativamente poco en tamao.
Problemas de orden polinomial se consideran tratables.
Orden Orden
33
Crecimiento de algunas funciones conforme crece el tamao g
n del problema:
Orden Orden
34
Los rdenes de eficiencia son clases de equivalencia (basadas en el
principio de invarianza):
T1(n)= 2n
3
+ 4n
2
+ 5 T1(n) 2n 4n 5
T2(n)= n
3
- 4n,

Pertenecen a la misma clase cuya representante es la funcin f(n)= n


3
.
Otros criterios para elegir o disear un algoritmo:
Si un programa se va a ejecutar pocas veces, el costo de escritura es el principal, no
influyendo en dicho costo el tiempo de ejecucin, debindose elegir un algoritmo
cuya aplicacin sea la ms fcil.
Tamao de las entradas: la velocidad de crecimiento del tiempo de ejecucin puede
ser menos importante que las constantes multiplicativas
Orden Orden
35
Ejemplo:
Dos algoritmos con T(n)= 100n
2
y 5n
3
, Dos algoritmos con T(n) 100n y 5n ,
respectivamente.
Para n < 20, el segundo programa ser ms , g p g
rpido que el primero si el programa se
va a ejecutar normalmente con entradas va a ejecutar normalmente con entradas
menores que 20, conviene ejecutar el
d segundo.
Notacin Asinttica
36
Notacin Asinttica Notacin Asinttica
C l l d l i d j i d l i f i
37
Calculado el tiempo de ejecucin de un algoritmo en funcin
del tamao del problema tenemos T(n) y sabemos que:
El valor de n siempre ser un entero no negativo, es decir, el tamao del El valor de n siempre ser un entero no negativo, es decir, el tamao del
problema ser 0 o mayor y sin parte fraccionaria
El resultado de evaluar T(n) para cualquier valor de n siempre es no
negativo negativo
Bajo estas premisas, si encontramos una funcin f(n) definida
sobre enteros no negativos que acote superiormente a T(n)
entonces se dice que T(n) es O(f(n)): T(n) pertenece al orden de
f(n)
L t i i tti O(f( )) t bi id O La notacin asinttica O(f(n)) tambin es conocida como O-
grande
Notacin Asinttica Notacin Asinttica
L t i 0 l
38
Las notaciones 0 mayscula.
O(f(n)), representa el conjunto de funciones g que
crecen como mucho tan rpido como f o lo que es lo crecen como mucho tan rpido como f, o lo que es lo
mismo, las funciones g tales que f llega a ser en algn
momento una cota superior para g.
g(n) O(f(n)) (g es del orden de f).
Sea f:NR
+
{0} una funcin cualquiera, el conjunto de
l f i d l d d f( ) t d O(f( )) las funciones del orden de f(n), notado como O(f(n)), se
define:
O(f(n)) = { g | c R+ y n N, n n g(n) O(f(n)) = { g | c
0
R+ y n
0
N, n n
0
g(n)
c
0
f(n) }
Notacin Asinttica Notacin Asinttica
39
T(n)= 3n + 2 O(n), n
0
= 2, y c
0
=4 | 3n+2 4n.
T(n)= 1.000n
2
+ 100n - 6 O(n
2
), n
0
= 100, y
0
c
0
=1.001 | 1.000n
2
+ 100n - 6 1.001n
2
.
T(n) = 62
n
+ n
2
O(2
n
), n
0
= 4, y c
0
=7 | 62
n
+ n
2
T(n) 6 2 n O(2 ), n
0
4, y c
0
7 | 6 2 n
72
n
.
T(n) = 3n O(2n) Supongamos n y c | nn T(n) = 3n O(2n). Supongamos n
0
y c
0
| nn
0
,
3n c
0
2n. Entonces c
0
(3/2)n nn
0
, pero no
constante suficientemente grande que (3/2)n para constante suficientemente grande que (3/2)n para
todo n.
Notacin Asinttica Notacin Asinttica
L t i i tti d l d li d d t l
40
La notacin asinttica del orden generalizada a dos parmetros es la
siguiente:
Sea f:N x NR
+
{0} una funcin cualquiera, el conjunto de las funciones del
orden de f(n, m), notado como O(f(n, m)), se define como sigue: orden de f(n, m), notado como O(f(n, m)), se define como sigue:
O(f(n,m)) = { g |c
0
R
+
y n
0
,m
0
N, n n
0
y m m
0
, g(n,m) c
0
f(n,m)
}
Propiedades de O(f) funciones f f' g h: Propiedades de O(f), funciones f, f , g, h:
Invarianza multiplicativa.
c R+, g O(f) si y slo si cg O(f)
I i diti Invarizanza aditiva
c R+, g O(f) si y slo si c+g O(f)
Reflexividad:
f O(f) f O(f)
Transitividad:
Si h O(g) y g O(f) entonces h O(f)
Notacin Asinttica Notacin Asinttica
d
41
Criterio de Caracterizacin:
g O(f) si y slo si O(g) O(f)
Regla de la suma: Regla de la suma:
Si g O(f) y h O(f'), entonces g + h O(max(f, f'))
Dos trozos de cdigo independientes, con eficiencias O(f(n)) y O(f'(n)) la
' eficiencia del trozo completo ser O(max(f(n), f'(n)).
Ejemplo:
O(n
2
) O(n )
O(n
3
)
O(nlgn)
Orden del tiempo de ejecucin de los tres:
O(max(n
2
, n
3
, nlgn))= O(n
3
).
Notacin Asinttica Notacin Asinttica
l d l d
42
Regla del producto:
Si g O(f) y h O(f'), entonces gh O(ff')
Dos trozos de cdigo anidados (no independientes), con eficiencias O(f(n)) y Dos trozos de cdigo anidados (no independientes), con eficiencias O(f(n)) y
O(f'(n)), la eficiencia del trozo completo es O(f(n)*g(n)).
Ejemplo:
O(n)
O(lg n)
Orden del cdigo completo pertenecer a Orden del cdigo completo pertenecer a
O(nlgn).
Se cumple la siguiente cadena de inclusiones:
O(1) O(log n) O(n) O(n
2
) ... O(n
a
) ...... O(2
n
) O(n!)
Notacin Asinttica Notacin Asinttica
P i d d d l t i i tti O
43
Propiedades de la notacin asinttica O
1.Los factores constantes pueden ser ignorados:
k>0,hI O(f). Ejemplo: an
2
y bn
2
son O(n
2
)
2.Los exponentes mayores crecen con ms rapidez que los menores:
n
r
es O(n
s
) si r s
3 El orden de una suma de trminos es el del trmino de mayor crecimiento 3.El orden de una suma de trminos es el del trmino de mayor crecimiento:
an
3
+ bn
2
es O(n
3
)
4.El orden de un polinomio es el de su trmino ms alto:
Si f es un polinomio de grado d, entonces f ser O(n
d
)
5.El producto del peor caso de dos funciones es lmite superior para su producto:
Si f es O(n
2
) y g es O(log n) entonces fg ser O(n
2
log n) Si f es O(n ) y g es O(log n) entonces fg ser O(n log n)
6.Las funciones exponenciales crecen ms rpidamente que las potencias:
n
k
es O(b
n
), b > 1 y k 0. Ejemplo: n
4
es O(2
n
)
7.Las funciones logartmicas crecen ms despacio que las potencias:
log
b
n es O(n
k
), b > 1 y k > 0. Ejemplo: log
b
n es O(n
0.5
)
Notacin Asinttica Notacin Asinttica
44
rdenes de eficiencia
Notacin Asinttica Notacin Asinttica
L i
45
Las notaciones :

k
y

, dan cotas inferiores en el orden de eficiencia:

k
(f(n)) = { g |c
0
R+ y n
0
N, n n
0
g(n) c
0
f(n) }

(f(n)) = { g |c
0
R+ y n
0
N, n n
0
g(n) c
0
f(n) }
Si g(n)
k
(f(n)) entonces f es una cota inferior de g desde un punto en adelante, o lo que
es lo mismo, ofrece un mnimo del cual nunca baja (g crece ms deprisa que f). Por otro
l d i ( ) (f( )) id d i fi i d i l fi i lado, si g(n)

(f(n)), entonces en una cantidad infinita de ocasiones g crece lo suficiente


como para alcanzar a f.
Las notaciones :
Esta notacin define las funciones con la misma tasa de crecimiento (crecen al mismo ritmo)
que f, es decir, (f) = O(f)
k
(f). Formalmente:
(f(n)) = { g |c
0
, c
1
R+ y n
0
N, n n
0
, 0 c
0
f(n) g(n) c
1
f(n) }
Notacin Asinttica Notacin Asinttica
46
Relacin entre notaciones
Clculo
47
Clculo Clculo
48
Objetivo: calcular el orden de eficiencia de un algoritmo.
Dos formas diferentes:
Obtener el tiempo de ejecucin del programa y posteriormente calcular su orden de Obtener el tiempo de ejecucin del programa, y posteriormente calcular su orden de
eficiencia.
Ir calculando el orden de eficiencia de las diferentes sentencias y bloques existentes en el
programa. p g
Sentencias simples.
Cualquier sentencia simple (lectura, escritura, asignacin, ...) tardar un q p ( g )
tiempo O(1), ya que el tiempo constante que tarda realmente la ejecucin
de esa sentencia se puede acotar por una constante que multiplica a la
funcin f(n)=1. funcin f(n) 1.
Esto podremos hacerlo siempre y cuando no intervengan en dicha sentencia
ni variables estructuradas, ni operandos aritmticos que dependan del
d l bl tamao del problema.
Clculo Clculo
id i (){
49
void main(){
int a, b, c;
printf("Introduzca los dos nmeros a sumar: "); (1)
scanf("%i %i", &a, &b); (1)
c= a+b; (1)
printf("\n La suma de %i y %i es %i.\n", a, b,c); (1) p ( \ % y % % \ , , , ); ( )
}
O(1+1+1+1) = O(max(1,1,1,1))= O(1) (regla de la suma)
T(n)= te+tl+toa+te= c T(n)= te+tl+toa+te= c
te = el tiempo que se tarda en ejecutar una escritura;
tl= el de la lectura y
toa = el que se tarda en hacer una operacin aritmtica ms una asignacin.
T(n)=c O(1).
Clculo Clculo
50
Sentencias de repeticin:
En bucles controlados por contador: p
for(i=0; i<n;i++)
printf(" %i " i); printf( %i , i);
La sentencia printf tiene un tiempo de
ejecucin te.
El ciclo se repite n veces T(n) = n(tc + te)
O(n) (tc el tiempo de evaluacin de la
condicin ms el incremento))
Clculo Clculo
S t i d ti i
51
Sentencias de repeticin.
En bucles controlados por contador (ejemplo):
1. for(i=0; i<n;i++)
2. for(j=0; j<n;j++)
3. Matriz[i][j]= 0;
La lnea 3 tiene un orden de ejecucin constante; La lnea 3 tiene un orden de ejecucin constante;
El bucle de la lnea 2 se repite n veces O(n),
El ciclo de la primera lnea O(n).
Aplicando en este caso la regla del producto: O(n
2
). p g p ( )
Obteniendo el tiempo de ejecucin del bloque completo :
T
2-3
(n) = n(t
a
+ t
c
), para las sentencias 2 y 3, y
T
1 3
(n)= n((nt
a
+nt
c
) +t
c
)= t
a
n
2
+t
c
n
2
+nt
c
O(n
2
)
1-3
( ) ((
a c
)
c
)
a c c
( )
Si la dimensin fuera n x m, en este caso, el orden de eficiencia sera
O(nm).
Clculo Clculo
S i d i i
52
Sentencias de repeticin.
Bucles controlados por centinela.
i=0;
while(i<n && Vector[i] != valor)
i++;
Se supone el peor caso: recorrer todo el vector
As, el bucle while repetir n veces una sentencia de O(1),
por lo que su orden de eficiencia ser n.
Despreciamos el tiempo constante de la evaluacin de la expresin del
bucle.
Para bucles do...while la forma de proceder sera la misma.
Clculo Clculo
S d l
53
Sentencias condicionales.
El tiempo de ejecucin ser el tiempo de evaluacin de la
condicin ms el mximo del bloque a ejecutar cuando condicin, ms el mximo del bloque a ejecutar cuando
la condicin se evale como verdadera y del bloque a
ejecutar cuando se evale como falsa.
Cuando estamos tratando con rdenes, el de la
evaluacin de la expresin booleana, que es
constante, se desprecia.
Bloque then tiene una eficiencia O(f(n))
Bloque else posee una eficiencia O(g(n))
El orden de eficiencia del if ser O(max(f(n), g(n)).
Clculo Clculo
S t i di i l
54
Sentencias condicionales.
if(n> m)
n= n *m; n= n m;
else
for(i=0; i<n;i++) ( ; ; )
m= m * n;
Orden del else el del bucle for: O(n),
O d d l h O(1) Orden del then O(1),
Orden del if = O(max(n,1))= O(n)
T(n) = t
e
+ max(t
ea
, nt
ea
)= t
e
+ nt
ea
O(n), ( )
e
(
ea
,
ea
)
e ea
( ),
t
e
corresponde con el tiempo de evaluar la condicin
t
ea
, el correspondiente a la asignacin ms la suma.
Clculo Clculo
Ll d f i i
55
Llamadas a funciones no recursivas
Calcular el tiempo de ejecucin de aquellas que no llaman a otras.
Calcular el tiempo de ejecucin de las que llaman a otras a partir de sus
tiempos correspondientes tiempos correspondientes.
Dependiendo de dnde estn situadas las llamadas a funciones, se deber
incluir su tiempo de ejecucin de una u otra manera:
En una asignacin T(n) asignacin = T(n) de la funcin Si hay ms de una En una asignacin: T(n) asignacin = T(n) de la funcin. Si hay ms de una
funcin invocada en la sentencia: T(n) asignacin = T(n) funcin1+ ...+T(n)
funcinN. (o el mximo de los rdenes)
En una condicin de un bucle (cualquier tipo): ( q p )
T(n) bucle = (T(n) funcin + T(n) cuerpo) * n
iteraciones
En la condicin de una sentencia condicional:
T(n) if = T(n) funcin + T(n) if ( ) ( ) ( )
En una secuencia de sentencias: simplemente aplicar la regla de la suma, si
tratamos con rdenes, o sumar tiempos si son tiempos de ejecucin.
Clculo Clculo
56
Clculo Clculo
Ejemplo 1 Las lneas 4 5 6 O(n) = 1
57
Ejemplo 1
void Burbuja (int *Vector, int n) {
int i, j;
Las lneas 4,5,6 O(n) = 1
El if de la lnea 3:
O(1) + O(1) O(1)
El f l 2
int aux;
1. for (i = 0; i < n - 1; i++){
2. for (j = n-1; j< i; j--){
El for lnea 2:
O(1) * (n-i) O(n-i)
El for lnea 1:
O( i) * ( 1)
3. if (Vector[j-1] > Vector[j]){
4. Aux= Vector[j-1];
5. Vector[j-1]= Vector[j];
O(n-i) * (n-1)
[j ] [j];
6. Vector[j]= Aux;
7. }
8 }
O(n
2
)
8. }
9. }
}
Clculo Clculo
long S maS bsecMa ima(int *Vector int n){
l l
58
long SumaSubsecMaxima(int *Vector,int n){
1. int i, j, k; int SMax=0, PosIniSec=0,
2. PosFinSec=0, SActual;
3 for (i=0;i<n; i++){
Entre las lneas 5 y 11:
Asignacin lnea 5: O(1);
Condicional lnea 8,9: O(1).
3. for (i 0;i<n; i++){
4. for (j=i;j<n; j++){
5. SActual=0;
6. for (k=i;k<j; i++){
Bucle lnea 6: repetir j-i+1 veces
una asignacin, lo que implica que
pertenecer a O(j-i+1). (Peor de los
( j ){
7. SActual+= Vector[k];
8. if (SAcutal > SMax){
9. SMax= SActual;
caso, se repite n veces O(n)).
O(n), aplicando la regla de la
suma.
10. PosIniSec=i;
11. PosFinSec= j;
12. }
El bucle de la lnea 4, en el peor
de los casos ejecutar n
i d O( ) O(
2
)
13. }
14. }
15. }
operaciones de O(n) O(n
2
).
Y el de la lnea 3, n veces O(n
2
)
O(n
3
) .
16. return SMax;
}
( )
Clculo Clculo
59
El tiempo de ejecucin de la funcin vendr dada por:
Segunda sumatoria:
Tercera sumatoria (primer bucle): (p )
O(n
3
)
Clculo
S t i d di t d l t d l bl
Clculo
60
Sentencias no dependientes del tamao del problema
Una sentencia o secuencia de sentencias que sea ejecutada solamente una
vez con independencia del tamao del problema siempre es O(1)
int fibPataNegra(int n) {
double phi = (1 + sqrt(5)) / 2; p ( q ( )) / ;
double F = pow(phi, n) / sqrt(5);
return (int)(F + 0.5);
} }
Afecta el valor de n al tiempo que tardar en ejecutarse este algoritmo?
Si calculamos T(n) tendramos que T(n)=9 4 unidades en la primera lnea,
4 en la segunda y 1 en la tercera. Cambia el resultado de T(n) para distintos
valores de n?
Clculo
Sentencias no dependientes del tamao del problema
Clculo
61
Sentencias no dependientes del tamao del problema
Incluso si tenemos bucles, siempre que stos iteren una cantidad constante de veces independiente
del tamao del problema, la secuencia de sentencias seguir siendo O(1):
int fibPataNegra(int n) {
double min = 1, max = 5, raiz5;
for(int ciclo=0; ciclo < 10; ciclo++) {
raiz5 = (max + min) / 2;
if(raiz5*raiz5 < 5)
min = raiz5;
else
max = raiz5;
}
double phi = (1 + raiz5) / 2;
d bl F = ( hi ) / i 5 double F = pow(phi, n) / raiz5;
return (int)(F + 0.5);
}
Clculo
f
Clculo
62
Bucles simples en funcin del tamao del problema
Desde el momento en que el tamao del problema sirve para acotar el nmero de
iteraciones de un bucle, el orden de las sentencias que hay en su interior se ve
multiplicado:
int fibIterativo(int n) {
...
for (int i = 1; i <= n; i++) {
resultado = ultimo + penultimo;
penultimo = ultimo;
ultimo = resultado;
}
La secuencia de sentencias que hay dentro del bucle es O(1)
Puesto que el bucle se ejecuta n-1 veces tendramos nO(1) = O(n) Puesto que el bucle se ejecuta n-1 veces, tendramos nO(1) = O(n)
Clculo Clculo
63
Bucles simples en funcin del tamao del problema
El factor de incremento/salto que rige el bucle afecta al nmero de ciclos
que realmente se ejecutarn, por lo que influir en el orden de eficiencia que realmente se ejecutarn, por lo que influir en el orden de eficiencia
(mejorndolo o empeorndolo):
void pot2(int n) {
for(int p = 1; p<=n; p*=2)
cout << p << endl;
}}
Cuntas veces se ejecuta la sentencia que hay en el interior del bucle y
que es O(1) dependiendo del tamao de n? que es O(1) dependiendo del tamao de n?
Tenemos un bucle cuyo orden de eficiencia es O(log n) en lugar de O(n),
como es fcil comprobar
Clculo Clculo
64
Bucles anidados en funcin del tamao del problema
Cuando cada uno de los bucles tiene un nmero de iteraciones
dependiente del tamao del problema, la eficiencia total se obtiene dependiente del tamao del problema, la eficiencia total se obtiene
aplicando la regla del producto:
void pot2(int n) {
for(int b = 2; b<=n; b++) {
for(int p = 1; p<=n; p*=b)
" " cout << p << " ";
cout << endl;
} }
}
El bucle interior sigue siendo O(log
b
n) El bucle interior sigue siendo O(log
b
n)
para algn b y, puesto que el exterior es O(n),
en total tenemos O(n log n)
Clculo
Bucles mixtos
Clculo
65
Bucles mixtos
Si no todos los bucles iteran en funcin del tamao del problema, a la regla del
producto hay que agregar la aplicacin del principio de invarianza:
void pot(int n) { void pot(int n) {
for(int b = 1; b<=n; b++) {
for(int p = 1; p<=10; p++)
cout << pow(b p) << " "; cout << pow(b,p) << ;
cout << endl;
}
} }
El bucle interior se ejecuta siempre 10 veces, por lo que sera 10O(1) = O(1)
El bucle exterior es O(n), por lo que el total sera O(1)*O(n) = O(n)
A d l b l id d l d d fi i i d ti i li l A pesar del bucle anidado, el orden de eficiencia no es cuadrtico sino lineal: para
valores muy grandes de n el hecho de multiplicar por 10 no tiene una gran influencia en el
comportamiento del algoritmo
Recurrencias
66
Recurrencias Recurrencias
67
Cuando se analiza la eficiencia de un programa recursivo, suele ocurrir
habitualmente que las funciones del tiempo de ejecucin que se obtengan
sean tambin recursivas
relaciones recurrentes o recurrencias.
Objetivo: buscar una expresin de T(n) no recursiva.
long factorial (long n) {
if (n <= 0) return 1;
else return n * factorial(n-1);
}
Si n 1 T(n)= c Si n 1, T(n)= c
y si n > 1, T(n) = d +T(n-1).
Recurrencias Recurrencias
{
68
long factorial (long n) {
if (n <= 0) return 1;
else return n * factorial(n 1); else return n * factorial(n-1);
}
Si n 1, T(n)= c Si n 1, T(n) c
y si n > 1, T(n) = d +T(n-1).
Existen fundamentalmente dos mtodos para llevar a cabo dicha p
resolucin:
Mtodo de expansin: Se desarrolla la funcin de tiempo hasta obtener una
sucesin que pueda ser evaluada sucesin que pueda ser evaluada
Mtodo de la ecuacin caracterstica: Consiste en obtener a partir de la recurrencia
una ecuacin y hallar sus races, a las que se denomina races caractersticas
Recurrencias Recurrencias
R i P i
69
Recurrencias Pasos previos
Para obtener la funcin de tiempo T(n) de un algoritmo recursivo hay que
tomar en consideracin:
Cul es el parmetro que conduce al algoritmo hasta el caso base
Qu valor es el que toma dicho parmetro al alcanzar el caso base (igual para
todos los casos base que pudieran existir)
Calcular el tiempo del algoritmo en los casos base
Evaluar el nmero de llamadas recursivas que se efectan en el cuerpo del
algoritmo (en el caso general)
Analizar cmo durante el proceso recursivo se modifica el valor del parmetro que
conduce al caso base
Calcular el tiempo del resto de operaciones para el caso general
Con todos estos datos estamos en disposicin de construir la funcin de
tiempos T(n) para el algoritmo recursivo
Recurrencias Recurrencias
70
Funcin de tiempos recursiva
Es una funcin definida a trozos: una parte por cada caso base y una
adicional para el caso general adicional para el caso general
Por cada caso base se especifica: tiempo de ejecucin del algoritmo y
valor del parmetro que lleva hasta dicho caso base
Para el caso general se especifica: con la misma funcin T(n) pero indican
cmo cambia el parmetro, incluyendo adems el tiempo del resto de
operaciones ejecutadas para el caso general del algoritmo ope ac o es ejecu adas pa a e caso ge e a de a go o
La obtencin de la funcin de tiempos recursiva es el primer paso hacia la
resolucin de la relacin de recurrencia. Dicha funcin puede ser lineal o
d di d d l l h b l d no, dependiendo de lo cual habr que emplear un mtodo u otro para su
tratamiento
Recurrencias Recurrencias
71
Funcin de tiempos recursiva Ejemplo
Usamos las respuestas a las cuestiones para construir la funcin
de tiempos:
Qu parmetro nos lleva hasta el caso base? n
C l l l d di h t l b ? <= 1 Cul es el valor de dicho parmetro en el caso base? - <= 1
Cul es el tiempo del algoritmo para el caso base? constante (c)
Cuntas llamadas recursivas se hacen en el cuerpo del algoritmo para el caso
general? 1
Cmo cambia el parmetro que lleva al caso base? reduce 1 unidad
Cul es el tiempo del resto del algoritmo para el caso general? constante Cul es el tiempo del resto del algoritmo para el caso general? constante
(d)
Recurrencias Recurrencias
F i d ti i Ej l
72
Funcin de tiempos recursiva Ejemplo
Tenemos el siguiente algoritmo:
int ejemplo(int n, int p) {
if(p == 0)
return n;
else
return 5*ejemplo(n-1, p/2) + ejemplo(n-2, p/2) +7;
}
Nos planteamos las cuestiones:
Qu parmetro nos lleva hasta el caso base? p
Cul es el valor de dicho parmetro en el caso base? - 0
Cul es el tiempo del algoritmo para el caso base? constante (c)
C ll d i h l l l? 2 Cuntas llamadas recursivas se hacen en el cuerpo para el caso general? 2
Cmo cambia el parmetro que lleva al caso base? divide entre 2 en ambos casos
Cul es el tiempo del resto del algoritmo para el caso general? constante (d)
Recurrencias Recurrencias
73
Funcin de tiempos recursiva Ejemplo
A partir de las respuestas a las cuestiones:
Qu parmetro nos lleva hasta el caso base? p
Cul es el valor de dicho parmetro en el caso base? - 0
Cul es el tiempo del algoritmo para el caso base? constante (c)
Cuntas llamadas recursivas se hacen en el cuerpo para el caso general? 2
Cmo cambia el parmetro que lleva al caso base? divide entre 2 en ambos casos
Cul es el tiempo del resto del algoritmo para el caso general? constante (d) Cul es el tiempo del resto del algoritmo para el caso general? constante (d)
Construimos la funcin de tiempos recursiva:
Haciendo una sustitucin de variable, de p por n, quedara la funcin final
Recurrencias Recurrencias
74
Mtodo de expansin
Se basa en la aplicacin de la recursividad sobre la propia
f i d i b i d funcin de tiempos recurrente y se compone bsicamente de
cuatro pasos:
1 Obtener los primeros trminos de la recurrencia dando valores a n 1. Obtener los primeros trminos de la recurrencia dando valores a n
2. Analizar los trminos en busca de un patrn regular
3. Componer una expresin generalizada adecuada
4. Demostrar la validez de dicha expresin mediante el mtodo induccin
matemtica
En este proceso es necesario tomar en consideracin las En este proceso es necesario tomar en consideracin las
condiciones iniciales impuestas por el propio problema para
determinar los valores frontera
Recurrencias Recurrencias
l f t i l (l ) {
75
long factorial (long n) {
if (n <= 0) return 1;
else return n * factorial(n-1); else return n factorial(n 1);
}
Si n 1, T(n)= c
y si n > 1, T(n) = d +T(n-1).
Resolucin: Mediante la expansin de la misma sustituyendo T(n-1) por su
valor correspondiente, y as sucesivamente hasta que se elimine la valor correspondiente, y as sucesivamente hasta que se elimine la
recursividad
T(n) = d + T(n-1)= d + d+ T(n-2)= d + d + d + T(n-3).
i pasos: T(n)=i d+T(n-i), n>i.
Para i=n-1, T(n) = (n-1)d + T(n-(n-1)) = (n-1)d + T(1)= (n-1) d+c O(n).
Recurrencias Recurrencias
Mt d d i Ej l
76
Mtodo de expansin - Ejemplo
Partimos de la ecuacin de tiempos para el factorial:
Calculamos los primeros trminos:
T(1) = c T(1) c
T(2) = T(1) + d = c + d
T(3) = T(2) + d = (c + d) + d = c + 2d
T(4) = T(3) + d = (c + 2d) + d = c + 3d T(4) = T(3) + d = (c + 2d) + d = c + 3d
En general se observa que:
T(n) = T(n-1) + d = (c + (n-2)d) + d = c + (n-1)d
d d d l l l ( ) Dado que c y d son constantes aditivas y multiplicativas, se concluye que T(n)
es O(n), es decir, se trata de un algoritmo de complejidad lineal (crece al
mismo ritmo que el problema)
Recurrencias Recurrencias
id O d V t (i t []V t i t ){
d
77
void OrdenarVector(int []Vector, int n){
int i, MaxPos;
if (n>1){
Ecuacin de recurrencia:
Si n 1, T(1)=1, si no, T(n) = T(n-
1) + n.
MaxPos=0;
for (i=1; i<n;i++)
if (Vector[i] > Vector[MaxPos])
1) n.
T(n)= T(n-1) +n =T(n-2)+(n-1)
+n= T(n-3) + (n-2) + (n-1) + n,
MaxPos= i;
if (MaxPos != 0){
i= Vector[0];
y en general:
Vector[0]= Vector[MaxPos];
Vector[MaxPos]= i;
}
Para i=n-1,
}
OrdenarVector(Vector+1, n-1);
}
}
Operando tenemos:
}
Recurrencias Recurrencias
P i d d d l l it
78
Propiedades de los logaritmos
Dado un nmero real (argumento x), la funcin logaritmo le
asigna el exponente n (o potencia) a la que un nmero fijo se g p ( p ) q j
ha de elevar para obtener dicho argumento. Es la funcin
inversa de b a la potencia n. Esta funcin se escribe como: n =
log
b
x, lo que permite obtener n. g
b
, q p
(esto se lee como: logaritmo en base "b" de "x" es igual a "n"; s y slo
si "b" elevado a la "n" da por resultado a "x") si b elevado a la n da por resultado a x )
La base b tiene que ser positiva y distinta de 1 .
x tiene que ser un nmero positivo .
d l i l n puede ser cualquier nmero real .
As, en la expresin 10
2
= 100, el logaritmo de 100 en base 10 es
2, y se escribe como log
10
100 = 2.
Recurrencias Recurrencias
Id tid d l t i
79
Identidades logartmicas
Los logaritmos mantienen ciertas identidades aritmticas muy tiles a la
hora de realizar clculos:
El l i d d i l l d l l i d l f El logaritmo de un producto es igual a la suma de los logaritmos de los factores.
El logaritmo de un cociente es igual al logaritmo del numerador menos el
logaritmo del denominador logaritmo del denominador.
El logaritmo de una potencia es igual al producto entre el exponente y el
logaritmo de la base de la potencia logaritmo de la base de la potencia.
El logaritmo de una raz es igual al producto entre la inversa del ndice y el
logaritmo del radicando. g
En realidad la tercera y cuarta identidad son equivalentes, sin ms que hacer:
Recurrencias Recurrencias
C bi d b
80
Cambio de base
Son comunes los logaritmos en base e (logaritmo neperiano),
base 10 (logaritmo comn), base 2 (logaritmo binario), o en ( g ), ( g ),
base indefinida (logaritmo indefinido). La eleccin de un
determinado nmero como base de los logaritmos no es
crucial, ya que todos son proporcionales entre s. Es til la , y q p p
siguiente frmula que define al logaritmo de x en base
b (suponiendo que b, x, y k son nmeros reales positivos y que
tanto "b" como "k" son diferentes de 1): tanto b como k son diferentes de 1):
en la que "k" es cualquier base vlida. Si hacemos k=x,
obtendremos:
Identidades de Exponentes Identidades de Exponentes
81
Recurrencias Recurrencias
82
Recurrencias Recurrencias
83
Mtodo de expansin No siempre es sencillo
Tenemos que T(2
k
) = 3
k+1
-2
k+1
y puesto que habamos
d 2
k
h l bi expresado n como n=2
k
, hacemos el cambio:
n=2
k
k=log
2
n
Sustituimos en la ecuacin original el valor de k por la nueva
expresin:
I I
l 1 l 1 l
I(n)=I(2
logn
)=3
1-logn
2
1-logn
Aplicando las identidades de potencias y logaritmos:
I(n)=I(2
logn
)=3
1+logn
2
1+logn
=3n
log3
+2n
Finalmente tenemos que:
I(n)=3n
log3
+2n 0(n
log3
)0(n
1.58496
)
Recurrencias Homogneas
84
Mtodo de la ecuacin caracterstica
Recurrencias Homogneas Recurrencias Homogneas
85
Las recurrencias lineales homogneas tienen la forma:
a
0
t
n
+ a
1
t
n-1
+ ... + a
k
t
n-k
= 0 [1]
donde los t son los valores buscados (aplicamos el adjetivo de lineal por que no hay donde los t
i
son los valores buscados (aplicamos el adjetivo de lineal por que no hay
trminos de la forma t
i
t
i+j
t
i
2
, por ejemplo), los coeficientes a
i
son constantes y la
recurrencia es homognea por que la combinacin lineal de los t
i
es igual a 0.
Soluciones buscadas de la forma t =x
n
donde x es una constante Si Soluciones buscadas de la forma t
n
=x
n
, donde x es una constante. Si
sustituimos esta solucin en [1] obtenemos:
a
0
x
n
+ a
1
x
n-1
+ ... + a
k
x
n-k
= 0 [2]
0 1 k
Esta ecuacin tiene dos soluciones:
x=0, que no nos sirve, y
a
0
x
k
+ a
1
x
k-1
+ ... + a
k
= 0,
ecuacin caracterstica asociada a la ecuacin recurrente inicial.
Recurrencias Homogneas Recurrencias Homogneas
86
Supongamos que las k races de esta ecuacin caracterstica son r
1
, r
2
, ...,
r
k
, entonces cualquier combinacin lineal de trminos r
i
n
es solucin para la
ecuacin recurrente lineal homognea. Ejemplo:
Cambio de notacin [1]: t
n
= 3t
n-1
- 4t
n-2
=> t
n
- 3t
n-1
- 4t
n-2
= 0
1 2
Hacer la sustitucin t
n
=x
n
: x
n
- 3x
n-1
- 4x
n-2
=0
Dividimos cada trmino por x
n-k
= x
n-2
, con objeto de eliminar la solucin
trivial y conseguimos la ecuacin caracterstica: trivial y conseguimos la ecuacin caracterstica:
x
2
-3x-4=0
Resolver la ecuacin: races -1 y 4.
Recurrencias Homogneas Recurrencias Homogneas
87
La solucin general a la expresin recursiva tendr la forma
de la expresin [2], donde los r
i
son las soluciones de la
recurrencia recurrencia.
t
n
= c
1
(-1)
n
+ c
2
4
n
S tit d 0 1 l i t i ll l Sustituyendo n=0 y n=1 en la ecuacin anterior, llegaremos al
siguiente sistema de dos ecuaciones con dos incgnitas (en este
caso c1 y c2): caso c1 y c2):
c
1
+ c
2
= 0 y -c
1
+ 4c
2
=1
Solucin: c = -1/5 y c = 1/5 Solucin: c
1
= -1/5 y c
2
= 1/5,
Sustituyendo: t
n
= (1/5)(4
n
- (-1)
n
) O(4
n
).
Recurrencias Homogneas Recurrencias Homogneas
D d l i t t + t 2 t 0 t 1
88
Dada la recurrencia: t
n
= t
n-1
+ t
n-2
, n2, y t
0
= 0, t
1
= 1
Cambiando de notacin, sustituyendo t
n
=x
n
y dividiendo por x
n-k
=
x
n-2
se obtiene la ecuacin caracterstica:
t
n
-t
n-1
-t
n-2
=0 => x
2
-x-1=0
Soluciones a la ecuacin: r
1
= (1+5
1/2
)/2 y r
2
=(1-5
1/2
)/2.
S stit endo las condiciones iniciales n=0 n=1 en la e presin Sustituyendo las condiciones iniciales n=0 y n=1, en la expresin
que nos da la solucin, t
n
=c
1
r
1
n
+c
2
r
2
n
, obtenemos el sistema de dos
ecuaciones con dos incgnitas:
+ 0 + 1 c
1
+ c
2
= 0 y c
1
r
1
+ c
2
r
2
= 1.
Al solucionarlo,
c
1
=1/(5
1/2
) y c
2
=-1/(5
1/2
). c
1
1/(5 ) y c
2
1/(5 ).
Sustituir c
1
y c
2
en la expresin de la solucin de la recurrencia.
Recurrencias Homogneas Recurrencias Homogneas
89
Dada la recurrencia: t
n
= 5t
n-1
- 8t
n-2
+ 4t
n-3
, n3, t
0
=0, t
1
=1, t
2
=2
La ecuacin caracterstica es:
x
3
5x
2
+ 8x 4= 0 x
3
- 5x
2
+ 8x - 4= 0
Soluciones a la ecuacin anterior:
1, con multiplicidad 1, y , p , y
2, con multiplicidad 2,
es decir, (x-1)(x-2)
2
=0.
La solucin general ser, por tanto:
t
n
= c
1
1
n
+ c
2
2
n
+ c
3
n2
n
(T t d lti li id d t l lti l i l (Tantos sumandos como multiplicidades tengan las races mltiples: si m es la
multiplicidad de una raz r, entonces se aadirn los sumandos r
n
, nr
n
,
n
2
r
n
,..., n
m-1
r
n
, multiplicados por sus correspondientes constantes)
Recurrencias Homogneas Recurrencias Homogneas
90
Dadas las condiciones iniciales, se plantean las ecuaciones
de un sistema lineal:
+ = 0 c
1
+ c
2
= 0
c
1
+ 2c
2
+ 2c
3
= 0
c
1
+ 4c
2
+ 8c
3
= 0 c
1
+ 4c
2
+ 8c
3
0
Soluciones: c
1
=-2, c
2
=2 y c
3
=-1/2
1
,
2
y
3
/
t =2
n+1
n2
n-1
2 O(2
n
) t
n
=2
n+1
-n2
n 1
-2 O(2
n
)
Recurrencias No Homogneas
91
Recurrencias No Homogneas Recurrencias No Homogneas
L i
92
Las recurrencias:
a
0
t
n
+ a
1
t
n-1
+...+ a
k
t
n-k
= b
n
p(n) [3]
Donde p(n) es un polinomio de grado d y b es una Donde p(n) es un polinomio de grado d, y b es una
constante (el resto es igual que [1]).
Resolver la ecuacin caracterstica:
(a
0
x
k
+a
1
x
k-1
+...+ a
k
)(x-b)
d+1
=0 [4]
Donde (a
0
x
k
+ a
1
x
k-1
+...+ a
k
) es la aportacin de la parte
homognea y (x-b)
d+1
de la parte no homognea.
U l l d d l Una vez en este punto, se concluye el proceso dando los
mismos pasos que en la solucin de recurrencias
homogneas. g
Recurrencias No Homogneas Recurrencias No Homogneas
L i T( ) = 2T( 1) + 1 T(0) = 0
93
La recurrencia T(n) = 2T(n-1) + n, n 1 y T(0) = 0.
Cambiando de notacin, tendremos la siguiente ecuacin lineal no homognea:
t
n
- 2t
n-1
= n
Identificamos b=1 y p(n)=n, siendo d=1, con lo que se obtiene la ecuacin
caracterstica siguiente:
(x-2)(x-1)
2
= 0
Por tanto, la solucin es: t
n
= c
1
2
n
+ c
2
1
n
+ c
3
n1
n
= c
1
2
n
+ c
2
+c
3
n
Con t
0
, se obtienen t
1
y t
2
, y se sustituyen en la ecuacin anterior, obteniendo el
siguiente sistema de tres ecuaciones con tres incgnitas:
c
1
+ c
2
= 0,
2c
1
+ c
2
+ c
3
= 1,
4c
1
+ c
2
+ 2c
3
= 4 4c
1
+ c
2
+ 2c
3
4
Las soluciones son c
1
= 2, c
2
= -2 y c
3
= -1, con lo que finalmente:
t
n
=22
n
- n -2 = 2
n+1
- n - 2 O(2
n+1
)
Recurrencias No Homogneas Recurrencias No Homogneas
94
De esta misma manera, se pueden resolver recurrencias de la
forma:
a
0
t
n
+ a
1
t
n-1
+...+ a
k
t
n-k
= b
1
n
p
1
(n) + b
2
n
p
2
(n) + b
3
n
p
3
(n) +... [5]
Siendo d
1
el grado de p
1
(n), d
2
el de p
2
(n) y as
sucesivamente.
Las ecuaciones caractersticas tendrn el siguiente patrn:
(a
0
x
k
+ a
1
x
k-1
+ ...+ a
k
)(x - b
1
)
d1+1
(x - b
2
)
d1+2
...= 0 [6]
Recurrencias No Homogneas Recurrencias No Homogneas
D d l i T( ) 2T( 1) + + 2
n
1 T(0) 0
95
Dada la recurrencia: T(n)= 2T(n-1) + n + 2
n
, n1 y T(0)= 0.
En primer lugar cambiemos la notacin y reorganicemos la expresin:
t = 2t
1
+ n + 2
n
=> t - 2t
1
= n + 2
n
t
n
2t
n-1
n 2 t
n
2t
n-1
n 2
La parte derecha de la igualdad debemos expresarla de la forma:
n + 2
n
= b
1
n
p
1
(n) + b
2
n
p
2
(n)
Cosa que conseguiremos si identificamos b
1
= 1, p
1
(n)= n (grado d=1) y
b
2
= 2 , p
2
(n)= 1 (d=0). De esta manera, podemos obtener la ecuacin
caracterstica:
(x-2)(x-1)
2
(x-2) = 0
Su solucin tiene la forma:
t
n
=c
1
1
n
+ c
2
n1
n
+ c
3
2
n
+ c
4
n2
n
= c
1
+ c
2
n + c
3
2
n
+ c
4
n2
n
Sustituyendo las condiciones iniciales y resolviendo el sistema de cuatro
ecuaciones con cuatro incgnitas, concluiremos que T(n) O(n2
n
).
Cambio de variable
96
Cambios de Variable Cambios de Variable
D bid l d l bl di id d
97
Debido a que el tamao del problema se divide en dos suponemos que n
es potencia de dos, por lo que podemos hacer n=2
m
, quedando:
T(2
m
)= T(2
m-1
) + 1, m 1, siendo el caso base T(2
0
)= 1.
Realizamos varias expansiones:
T(2
m
)= T(2
m-1
) + 1 =T(2
m-2
) + 1 + 1 = T(2
m-3
) + 1 + 1 + 1,
l y en general:
T(2
m
)= T(2
m-i
)+i, m i
Particularizando para m=i para as poder eliminar la recurrencia, Particularizando para m i para as poder eliminar la recurrencia,
tendramos:
T(2
m
)= T(2
0
) + m = m + 1
Como m= lg
2
n, deshaciendo el cambio, finalmente concluimos que
T(n)= lg
2
n + 1 O(lg
2
n).
Cambios de Variable Cambios de Variable
98
Un segundo ejemplo donde n es una potencia de 2, corresponde a la
resolucin de la recurrencia:
T(n)= 4T(n/2) + n
2
( ) ( / )
Al hacer el mismo cambio de variable que en el ejercicio anterior, se llega a
T(2
m
)= 4T(2
m-1
) + 4
m
,
O lo que es lo mismo:
t
m
= 4t
m-1
+ 4
m
L ( 4)
2
0 La ecuacin caracterstica es: (x-4)
2
=0
Y la solucin buscada tendr la forma:
t = c 4
m
+ c m4
m
t
m
= c
1
4 + c
2
m4 .
Deshaciendo los cambios, el tiempo de ejecucin es
T(n)= c
1
n
2
+ c
2
n
2
lg n O(n
2
lg n).
1 2
Bibliografa Bibliografa
99
Ecuacin recurrente (Wikipedia)
http://es.wikipedia.org/wiki/Ecuaci%C3%B3n_recurrente
Fundamentos de algoritmia, G. Brassard y P. Bratley , Prentice Hall, 1995

Vous aimerez peut-être aussi