Cap´ıtulo 1

Introducci´ on al an´alisis de
algoritmos
1.1. Medida de eficacia de algoritmos
¿Qu´e analizar en un algoritmo? Tenemos diferentes opciones.
Correcci´on
Uso de memoria
Rendimiento en ejecuci´on: cu´ anto va a tardar
En este curso nos vamos a centrar en la tercera opci´on, es decir, en estudiar
el tiempo de ejecuci´on de un algoritmo. Para llevar a cabo esta tarea tambi´en
podemos considerar diferentes opciones:
Opci´ on 1. Medir la duraci´on de la ejecuci´on con un reloj seg´ un los siguientes
pasos:
(1) escoger un pseudoc´ odigo ⇒ (2) escribir un programa ⇒ (3) generar un
ejecutable ⇒ (3) seleccionar las entradas al algoritmo y ⇒ (4) ejecutar sobre las
entradas midiendo tiempos con un reloj.
Esta aproximaci´on se demuestra poco pr´ actica ya que tiene muchas depen-
dencias:
Depende de la pericia del programador.
Depende de la calidad y los par´ ametros del compilador.
Depende del tipo de m´ aquina y, sobre todo, de los datos sobre los que se
ejecute.
1
Principal pega: el tiempo empleado sobre unas entradas no dice nada sobre lo
que se tardar´a sobre otras.
Opci´ on 2. An´alisis de tiempos abstractos de ejecuci´on sobre pseudoc´ odigo.
Es la que usaremos en el curso.
1.2. Tiempo abstracto de ejecuci´ on
Para medir los tiempos abstractos de ejecuci´on de un algoritmo necesitamos
definir la unidad de tiempo abstracto. La unidad de tiempo que vamos a consid-
erar ser´a la “sentencia elemental”, esto es, una l´ınea simple de pseudoc´ odigo que
no contenga ninguna llamada a otra funci´ on. (Por supuesto, tendremos que tener
cuidado con estas sentencias “no elementales”.)
Definiremos tae o tiempo abstracto de ejecuci´on como el n´ umero de
unidades de tiempo abstracto ejecutadas, es decir el n´ umero de sentencias el-
ementales ejecutadas para unas entradas dadas.
M´as formalmente, para un algoritmo A y una entrada I definimos t
A
(I) como
el n´ umero de sentencias elementales de A que se ejecutan sobre la entrada I.
La base del an´alisis est´a por tanto en el pseudoc´ odigo.
Ejemplo 1. Ordenaci´ on por selecci´ on
El siguiente pseudoc´ odigo ordena una tabla T con ´ındice al primer elemento
P e ´ındice al ´ ultimo elemento U:
SelectSort(tabla T,ind P, ind U)
(1) i=P;
(2) mientras i < U :
| m= min(T,i,U): // NO es sentencia elemental; hay que hacer algo
(2) | swap(T[i],T[m]); // tampoco lo es ... pero la tomamos como tal!
| i++;
ind min(tabla T, ind P, ind U)
(1) m=P;
(2) para i de P+1 a U: // la tomamos como sentencia simple
| si T[i]<T[m]:
(2) | m=i;
(1) devolver m;
Las instrucciones marcadas con (1) son instrucciones que se ejecutan una sola
vez, las instrucciones marcadas con (2) se ejecutan repetidas veces. Un ejemplo
de funcionamiento del algoritmo sobre la tabla
”4 3 2 1”
Seguimos la evoluci´on de los ´ındices i y m:
i=1 m=4 swap(T[1],T[4]) 1 3 2 4
i=2 m=3 swap(T[2],T[3]) 1 2 3 4
i=3 m=3 swap(T[3],T[3]) 1 2 3 4
Vamos a calcular primero t
min
(T, P, U) tiempo abstracto de ejecuci´on de la
funci´ on min, es decir, cuantas ejecuciones de sentencias elementales hace min
para la tabla T entre P y U. Hay que observar que la condici´on T[m]>T[i] no
siempre es cierta y por tanto la asignaci´ on m=i no siempre se ejecuta.
Para superar esto, nos ponemos en el caso de “m´ as trabajo”, suponiendo que
siempre se cumple la condici´on y acotamos el n´ umero real de ejecuciones mediante
un ≤. Por lo tanto, esto nos lleva a
t
min
(T, P, U) ≤ 2 + 3 ×N´ umero de iteraciones del bucle.
donde contamos 3 sentencias elementales a lo sumo dentro del bucle de min.
Claramente el bucle se ejecuta U −P veces, lo que nos lleva a
t
min
(T, P, U) ≤ 2 + 3(U −P).
Por lo tanto, tomando el caso particular P = 1, U = N nos da
t
min
(T, P, U) ≤ 2 + 3(N −1).
Con esto ya podemos empezar a estimar tss(T, P, U). Como mezcla sentencias
b´asicas con la que contiene la llamada a min, que ejecuta un n´ umero variable de
sentencias b´asicas en cada iteraci´on, llegamos a:
tss(T, P, U) = 1 +
U−1

i=P
(4 + t
min
(T, i, U)) + 1
≤ 2 + 4(U −P) +
U−1

i=P
(2 + 3(U −i))
= 2 + 4(N −1) + 2(N −1) + 3
U−1

i=P
(U −i)
= 6N −4 + 3
N−1

j=1
j = 6N −4 + 3
N(N −1)
2
=
3
2
N
2
+
9
2
N −4.
Ejemplo 2. B´ usqueda binaria
ind BBin(tabla T,ind P, ind U,clave k)
(2) mientras P <= U :
| m= (P+U)/2;
(2) | si T[M]==k :
| devolver M;
| else si k < T[M] :
| U=M-1;
| else :
| P=M+1
(1) devover err;
El n´ umero de sentencias elementales que se ejecutan en cada iteraci´on del
bucle es mayor o igual que cinco:
una debida a la comprobaci´ on de la condici´on del bucle m´ as,
al menos cuatro, instrucciones dentro del bucle (como antes, no todas se ejecutan
en cada iteraci´on, por lo que de nuevo acotamos con un ≤.
Con esto se tiene
t
BBin
(T, P, U, ) ≤ 2 + 5 ∗ n. de iteraciones.
Por lo tanto es necesario estimar el n´ umero de iteraciones. Para ello estimamos
el tama˜ no de la subtabla despu´es de cada iteraci´on.
Tras cada iteraci´on:
iteraci´ on 1 2 3 .......
tama~ no de la subtabla N/2 N/4 N/8 .......
Supongamos que el n´ umero de elementos N de la tabla T es 2
l−1
< N ≤ 2
l
para alg´ un l ∈ N. Por lo tanto, l −1 < log
2
N ≤ l, esto es,
l = ⌈log
2
(N)⌉
donde el operador ⌈ ⌉ es el operador techo (a modo de ejemplo, ⌈2,7⌉ = 3)
Entonces, si el algoritmo llega a la iteraci´on l, tras la iteraci´on se seguir´ıa buscando
en una tabla de tama˜ no < N/2
l
≤ 1, lo que no es posible. Por lo tanto, no hay
m´ as de ⌈log
2
(N)⌉ iteraciones y se tiene que
T
BBin
(T, P, U, k) ≤ 2 + 5⌈log
2
N⌉
Observaci´ on El trabajo m´ aximo se produce agotando todas las iteraciones
(P > U), lo cual ocurre cuando la clave a buscar k no est´a en T.
Los ejemplos anteriores nos permiten establecer las siguientes observaciones:
1. Parece que para cualquier algoritmo A, a sus entradas I se les puede asignar
un tama˜ no de entrada τ(I) y se puede encontrar una cierta funci´ on f
A
tal que
tae
A
(I) ≤ f
A
(τ(I)) (1.1)
Hemos visto:
A I τ f
A
SelectSort (T,P,U) U-P+1
3
2
N
2
+ ...
BBin (T,P,U,k) U-P+1 5⌈log
2
N⌉ + 2
2. El tae nos permite generalizar los tiempos abstractos de ejecuci´on
para nuevas entradas y adem´ as estimar tiempos reales de ejecuci´on, como
podemos ver en el siguiente ejemplo.
Consideremos SelectSort con una entrada I tal que τ(I) = N y otra
entrada I

tal que τ(I

) = 2N. Se tiene entonces que
tae
SSort
(I

) =
3
2
(2N)
2
+ .... = 4(
3
2
N
2
+ ....) ≈ 4tae
SSort
(I).
En general si I

tiene un tama˜ no k veces mayor que el tama˜ no de I (i.e
τ(I

) = kN)
tae
SSort
(I

) = k
2
tae
SSort
(I) (1.2)
Supongamos ahora que un programa que implemente SelectSort tarda 1
segundo al ordenar una tabla de N = 1000 elementos. Entonces
Tama˜ no 1000 2000 10000 100000
Tiempo real de ejecuci´on 1 seg 4 seg 100 seg 10000 seg
3. En tae
SSort
(N) =
3
2
N
2
+ 6N − 6 el t´ermino que m´ as importa para valores
grandes de N es el correspondiente a N
2
. En el caso de tae
BBin
(N) =
2 + 5⌈log
2
N⌉ el t´ermino de mayor peso es ⌈log
2
N⌉.
4. El tae tal como lo hemos definido sigue siendo algo artificioso ya que su
valor puede depender de c´ omo se escriba el pseudoc´ odigo.
Por ejemplo los c´ odigos b´asicamente iguales de abajo dan lugar a taes dis-
tintos.
C´ odigo 1 C´ odigo 2
D=A+B+C; E=A+B;
F=C+E;
D=F;
tae 1 tae 3
Por tanto, hay que hacer algo a este respecto.
5. En SelectSort el t´ermino N
2
y en BBin el t´ermino ⌈log
2
N⌉ vienen de
ejecutar el bucle m´ as interno. Por esta raz´ on vamos a cambiar la unidad
de medida que usamos a la hora de calcular el tae. En lugar de contar el
n´ umero de sentencias b´asicas que se ejecutan lo que vamos a considerar es
el n´ umero de veces que se ejecuta una cierta operaci´on b´asica.
1.3. Operaci´ on b´asica de un algoritmo
La operaci´on b´asica (OB) de un algoritmo A es una sentencia elemental de
A que adem´ as cumple las siguientes condiciones:
1. Debe aparecer en el bucle m´ as interno del algoritmo. Debe ser la instrucci´on
que m´ as veces se ejecuta.
2. Debe ser una operaci´on representativa del algoritmo.
Ejemplo 1. En el caso de SelectSort la instrucci´on de comparaci´ on de claves
(cdc)
si T[i]<T[m]
cumple las condiciones 1 y 2 al estar en el bucle m´ as interno y tratarse de una
comparaci´ on de claves. La instrucci´on
m=P;
no siempre se ejecuta, y la instrucci´on
i++;
es una instrucci´on general de muchos algoritmos.
Ejemplo 2. En el caso de BBin tambi´en tomaremos la cdc como operaci´on
b´asica la instrucci´on
si T[M]==K
...
else si K < T[M]
...
else si
A partir de ahora usaremos en vez de t
abstractoej.
la nueva medida n
A
(I), que
es el n´ umero de veces que el algoritmo A ejecuta su operaci´on b´asica (OB) sobre
la entrada I. Veamos tres ejemplos, dos ya conocidos y uno nuevo.
Ejemplo 1: B´ usqueda binaria
Para calcular n
BBin
(T, P, U, k) analizamos los bucles del algoritmo vemos que
la operaci´on b´asica siempre se ejecuta una vez para cada iteraci´on del bucle. Por
tanto se tiene:
n
BBin
≤ 1 ∗ numero de ejecuciones del bucle = ⌈log
2
N⌉ (1.3)
Ejemplo 2: Ordenaci´ on por selecci´ on
Calculamos n
SSort
(T, P, U) usando como OB la cdc. S´olo hay cdcs en min y
dentro de la funci´ on min el n´ umero de veces que se ejecuta la operaci´on b´asica
depende de los valores de entrada. El coste total del algoritmo ser´a, tomando
P = 1 y U = N.
n
SSort
(T, 1, N) =
N−1

i=1
n
min
(T, i, N) =
N−1

i
N −i =
N
2
2

N
2
(1.4)
Ejemplo 3: M´etodo de la burbuja
Para el m´etodo de la burbuja para ordenaci´on veremos dos versiones.
Versi´on 1.
BurbujaSort_v1(Tabla T, ind P,ind U)
para i de U a P+1
para j de P a i-1
si T[j]>T[j+1] <---- Operaci´ on b´ asica
swap(T[j],T[j+1]);
La evoluci´on del algoritmo sobre la tabla T = [4 3 2 1] con P = 1 y U = 4 se
puede ver en la tabla 1.3.
Como ya establecimos, n
BSort
(T, P, U) ser´a el n´ umero de comparaciones de
clave (operaci´on b´asica) que realice el algoritmo para ordenar la tabla. Por tanto:

i j Operaciones Tabla
4 1
T[1]> T[2] ? Si
swap(T[1],T[2])
3,4,2,1
4 2
T[2]> T[3] ? Si
swap(T[2],T[3])
3,2,4,1
4 3
T[3]> T[4] ? Si
swap(T[3],T[4])
3,2,1,4
3 1
T[1]> T[2] ? Si
swap(T[1],T[2])
2,3,1,4
3 2
T[2]> T[3] ? Si
swap(T[2],T[3])
2,1,3,4
2 1
T[1]> T[2] ? Si
swap(T[1],T[2])
2,1,3,4
Burbuja
n
BSort
(T, P, U) =
U

i=P+1
n
BSort
(T, P, i) (1.5)
donde n
BSort
(T, P, i) es el n´ umero de veces que se ejecuta la operaci´on b´asica
para cada iteraci´on (valor fijo de i) del bucle externo. Tomando P = 1 y U = N
se tiene n
BSort
(T, P, i) = i −1 y
n
BSort
(T, 1, N) =
N

i=2
(i −1) =
N−1

i=1
i =
N
2
2

N
2
(1.6)
Podemos realizar las siguientes observaciones:
Esta versi´ on de BSort es bastante mala. Si ordenamos la tabla ya ordenada
T = [1, 2, ..., N] se tiene n
BSort
(T, 1, N) =
N
2
2

N
2
, es decir, tardaremos lo
mismo en ordenar una tabla ya ordenada que otra tabla desordenada.
Una soluci´ on a lo anterior es cambiar el pseudoc´ odigo a˜ nadiendo un detector
de ”swaps”.
Dicho detector ser´a un flag que se pondr´ a inicialmente al valor 0 para cada
iteraci´on de la variable i y que se cambiar´a al valor 1 si se produce alg´ un
swap. Si durante una iteraci´on completa de la variable j para un valor fijo
de i no se produce ning´ un swap significa que la tabla ya est´a ordenada y
por tanto no es necesario realizar m´ as comparaciones.
Versi´on 2.
BurbujaSort_v2(Tabla T, ind P,ind U)
Flag=1;
i=U;
mientras (Flag==1 && i>=P+1) :
Flag=0;
para j de P a i-1 :
si T[j]>T[j+1] :
swap(T[j],T[j+1]);
Flag=1;
i--;
Ahora se tiene que
n
BSort
([1, 2, 3, ...., N], 1, N) = N −1,
lo cual es mucho mejor que el pseudoc´ odigo anterior.
Sin embargo, el n´ umero de veces que se ejecuta la OB depende de la tabla
que se ordene y, en general, s´olo podemos decir que en la iteraci´on i se
cumple n
BSort
(T, P, i) ≤ i −1, por lo que seguimos teniendo que
n
BSort
([N, N −1, ..., 3, 2, 1], 1, N) ≤
N
2
2

N
2
.
1.4. Comparaci´on de algoritmos
A la vista de lo anterior nos gustar´ıa tener una manera de comparar algo-
ritmos. Por supuesto tendremos que poner algunas condiciones para poder com-
pararlos.
1. Que resuelvan el mismo problema (ordenaci´on, b´ usqueda, etc).
2. Que lo resuelvan usando la misma operaci´on b´asica.
Por tanto lo que vamos a considerar es F, familias de algoritmos que cumplan
las condiciones 1 y 2. Por ejemplo
F = {Algoritmos de ordenaci´on por comparaci´ on de clave}.
El m´etodo que seguiremos para comparar algoritmos ser´a el siguiente:
1. Considerar una familia F de algoritmos que cumplan las condiciones 1 y 2.
2. Para todo algoritmo A ∈ F encontrar f
A
tal que
n
A
(I) ≤ f
A
(τ(I)) (1.7)
3. Diremos que A
1
es mejor que A
2
si y solo si f
A
1
“es menor”que f
A
2
.
En general la comparaci´ on de rendimiento de algoritmos s´olo es relevante
para entradas grandes. Por ello compararemos las funciones f
A
1
(N) y f
A
2
(N)
para valores grandes de N (es decir cuando N →∞).
1.5. Comparaci´on asint´ otica de funciones
En esta secci´ on vamos a definir los principales operadores de comparaci´ on
asint´ otica de funciones. En general, y salvo que se indique lo contrario, todas las
funciones que vamos a considerar ser´an positivas.
1.5.1. f = o(g)
Dadas dos funciones positivas, f y g diremos que f = o(g) si
l´ım
N→∞
f(N)
g(N)
= 0 (1.8)
Ejemplo. Sean f(N) = N
k
y g(N) = N
k+ǫ
con ǫ > 0. Se tiene que f = o(g)
ya que l´ım
N→∞
N
k
N
k+ǫ
= 0
Ejemplo. Sean f(N) = ln N y g = N
ǫ
con ǫ > 0. Se tiene que f = o(g), el
c´ alculo del l´ımite se puede realizar f´acilmente aplicando la regla de L’Hopital.
Este operador corresponder´ıa (por supuesto de una forma muy gen´erica) al
operador matem´ atico “<”. Es decir, en este caso consideramos que la funci´ on f
es “claramente m´ as peque˜ na”que la funci´ on g.
1.5.2. f = O(g)
Decimos que f = O(g) si existen N
0
y Ctales que
f(N) ≤ Cg(N) ∀N ≥ N
0
. (1.9)
Ejemplo. Sean f(N) = N
2
y g(N) = N
2
+

N. Se tiene que
i f = O(g) ya que ∀N, f(N) ≤ g(N)
ii g = O(f) ya que ∀N, g(N) ≤ 2f(N); es decir, si tomamos N
0
= 1 y C = 2,
se puede ver f´acilmente que N
2
+

N ≤ 2N
2
porque

N ≤ N
2
.
Observaci´ on f = o(g) ⇒ f = O(g), pues si
f(N)
g(N)
−→ 0 entonces, por la
definici´on de l´ımite debe haber un N
0
tal que para todo N ≥ N
0
se tiene
f(N)
g(N)
≤ 1 ⇐f(N) ≤ g(N).
Por tanto, basta tomar el mismo N
0
que el del l´ımite y C = 1.
El rec´ıproco en general es falso, es decir f = O(g) f = o(g). Para ver
lo anterior basta tomar f(N) = N
2
y g(N) = N
2
+

N. Ya hemos visto que
f = O(g); sin embargo se tiene l´ım
N→∞
f(N)
g(N)
=
f(N)
g(N)
=
N
2
N
2
+

N
= 1 = 0.
Es importante adem´ as recalcar sobre la observaci´on anterior que las las afir-
maciones positivas se demuestran y en las afirmaciones negativas se
encuentra un contraejemplo. Aplicaremos esta observaci´on repetidas veces.
La notaci´on O nos permite adem´ as eliminar algunas constantes y t´erminos de
menor peso en las comparaciones. En particular:
1. Las constantes multiplicativas no importan ya que si f = O(g) ⇒
f = O(kg) para cualquier valor de k. Por lo tanto siempre nos quedaremos
con la expresi´on m´ as simple y significativa. Es decir, si hemos encontrado
que f = O(3N
2
) diremos que f = O(N
2
) o por ejemplo si tenemos que
f = O(e
π
3
N
2
), de nuevo escribiremos simplemente f = O(N
2
).
2. Adem´ as si f = O(g) y h = o(g) entonces f = O(g + h), es decir, los
t´erminos menos significativos no importan. Por tanto, en el caso de
la suma de varias funciones nos quedaremos con el t´ermino m´as significativo
y no diremos f = O(N
2
+ N) sino f = O(N
2
).
La notaci´on asint´ otica f = O(g) corresponde (se˜ nalando siempre que de forma
general y dentro del marco de las comparaciones asint´ oticas) a la comparaci´ on
matem´ atica f ≤ g. Hay que se˜ nalar que puede ocurrir perfectamente que con la
notaci´on matem´ atica se verifique que f(x) ≥ g(x) ∀x y sin embargo se verifique
f = O(g).
1.5.3. f = Ω(g)
Decimos que f = Ω(g) si y s´olo si g = O(f).
Esta notaci´on corresponder´ıa a la comparaci´ on matem´ atica f ≥ g.
1.5.4. f = Θ(g)
Decimos que f = Θ(g) si y solo si se verifica: f = O(g) y f = Ω(g).
Tambi´en se puede aplicar cualquiera de las condiciones equivalentes, es decir
f = Θ(g) si f = O(g) y g = O(f) o si g = Ω(f) y g = O(f) o si g = Ω(f) y f =
Ω(g). Esta notaci´on corresponde al igual matem´ atico (f = g). De nuevo se˜ nalar
que puede ocurrir perfectamente que f(x) = g(x) ∀x y sin embargo f = Θ(g).
Es f´acil demostrar, aplicando la definici´on anterior, la siguiente propiedad:
f = Θ(g) ⇔g = Θ(f) (1.10)
La siguiente propiedad nos sera muy ´ util para la comparaci´on Θ de dos fun-
ciones:
Si l´ım
N→∞
f(N)
g(N)
= L, con 0 < L < ∞, entonces f = Θ(g).
La demostraci´on es la siguiente:
f
g
−L →0 ⇒ ∃N
0
t.q. ∀N ≥ N
0
,
¸
¸
¸
¸
f
g
−L
¸
¸
¸
¸

L
2
⇒ −
L
2

f
g
−L ≤
L
2

L
2

f
g

3L
2
con lo cual se tiene:
f(N) ≤
3L
2
g(N) ⇒f = O(g)
g(N) ≤
2
L
f(N) ⇒g = O(g)
y por tanto f = Θ(g).
Con esta propiedad es f´acil ver que N
2
+ N = Θ(N
2
) ya que
l´ım
N→∞
N
2
+ N
N
2
= 1 = 0, ∞
1.5.5. f ∼ g
Diremos que f es asint´ oticamente equivalente a g, esto es, f ∼ g, si
l´ım
N→∞
f(N)
g(N)
= 1. (1.11)
N´otese que f ∼ g es un caso particular de f = Θ(g) en el que la constante del
l´ımite vale exactamente 1. Esta observaci´on nos permite afirmar:
f ∼ g ⇒f = Θ(g) (1.12)
ya que si f ∼ g entonces l´ım
N→∞
f(N)
g(N)
= 1 = L con 0 < L < ∞. Se puede
considerar, por tanto, que la comparaci´ on ∼ es m´ as precisa que la comparaci´ on
Θ.
En la figura inferior se puede ver la diferencia entre ambas notaciones.
C g
1
f
g
C g
2
θ
f= (g)
f~g
g
f
1.5.6. f = g + O(h)
Si h = o(g) diremos que f = g + O(h) si
|f −g| = O(h) (1.13)
Ejemplo.
Sea f(N) = N
2
+

N + ln N entonces si g(N) = N
2
se tiene que:
f ∼ g. Basta con dividir el numerador y el denominador por el t´ermino de
mayor grado, en este caso N
2
.
f = g + O(

N), ya que |f −g| =

N + ln(N), sin embargo el t´ermino de
mayor peso en

N + ln(N) es

N.
En general se verifica que
f = g + O(h) ⇒f ∼ h (1.14)
La demostraci´on es la siguiente: si |f −g| = O(h) existen C y N
0
tales que
0 ≤
¸
¸
¸
¸
f(N)
g(N)
−1
¸
¸
¸
¸
=
|f(N) −g(N)|
g(N)

C h(N)
g(N)
.
Como
h
g
→0, entonces
Ch
g
→0 y, por tanto
¸
¸
¸
¸
f
g
−1
¸
¸
¸
¸
→0 ⇒
f
g
→1.
Se tiene, por tanto, la siguiente cadena de comparaciones de precisi´on decre-
ciente:
f = g + O(h) ⇒f ∼ g ⇒f = Θ(g) ⇒f = O(g) (1.15)
En general, intentaremos ser lo m´ as precisos posible. Por ejemplo, en el caso
de los polinomios P(N) = a
k
N
k
+ a
k−1
N
k−1
+ ... + a
0
, con a
k
= 0 podr´ıamos
establecer las siguientes comparaciones:
P(N) = O(N
k
)
P(N) = Θ(N
k
), ya que l´ım
N→∞
P(N)
N
k
= a
k
= 0.
P(N) ∼ a
k
N
k
, ya que l´ım
N→∞
P(N)
a
k
N
k
= 1.
P(N) = a
k
N
k
+ O(N
k−1
), siendo ´esta la expresi´on m´ as precisa.
1.6. Crecimiento de funciones
En esta secci´ on vamos a obtener algunas f´ormulas para el crecimiento de
funciones expresadas como sumas. El caso m´ as simple es el de la suma de los
t´erminos de la progresi´ on aritm´etica elemental
f(N) = S
N
=
N

i=1
i =
N(N + 1)
2
=
N
2
2
+ O(N) (1.16)
Una expresi´on m´ as general de la formula anterior corresponde a la suma de
los t´erminos de una progresi´ on aritm´etica general:
f(N) = S
N
=
N

i=1
(ai + b) = a
N

i=1
i + bN
=
a
2
N
2
+
a
2
N + bN
=
a
2
N
2
+ O(N)
Estudiamos la suma de los t´erminos de una progresi´ on geom´etrica de raz´ on
x = 1:
S
N
=
N

i=1
x
i
=
x · x
N
−x
x −1
=
x
N+1
−x
x −1
(1.17)
N´otese que la f´omula no tiene sentido si x = 1, pero entonces S
N
= N. En la
expresi´on anterior podemos distinguir dos casos:
Si x > 1. Se tiene S
N
= Θ(x
N
)
Si x < 1. Cambiando de signo el numerador y el denominador se tiene:
S
N
=
x −x
N+1
1 −x
N→∞
−→
x
1 −x
(1.18)
Una vez obtenida la f´ormula anterior, se pueden estimar alguna sumas derivadas,
como por ejemplo la suma S
N
=

N
i=1
ix
i
. Se pueden calcular mediante la sigu-
iente expresi´on:
S
N
=
N

i=1
ix
i
= x
N

i=1
ix
i−1
= x
d
dx
_
N

i=1
x
i
_
= x
d
dx
_
x
N+1
−x
x −1
_
= Θ(Nx
N
)
(1.19)
Para sumas derivadas con potencias de i se aplica el siguiente m´etodo similar,
considerando ahora derivadas segundas
S
N
=
N

i=1
i
2
x
i
= x
2
N

i=1
i(i −1)x
i−2
+
N

i=1
ix
i
= x
2
d
2
dx
2
(....) = Θ(N
2
x
N
)
En general se tiene:
S
N
=
N

i=1
i
k
x
i
= Θ(N
k
x
N
) (1.20)
La siguiente f´ormula se puede demostrar por inducci´on
S
N
=
N

i=1
i
2
=
N(N + 1)(2N + 1)
6
=
N
3
3
+ O(N
2
) (1.21)
Hay f´ormulas similares pare sumas de otras potencias. Sin embargo, si s´olo
estamos interesados en el crecimiento de estas sumas, se puede aplicar un m´etodo
general.
1.7. Estimaci´on de sumas mediante integrales
El m´etodo de estimaci´ on de sumas por integrales nos permitir´ a aproximar el
valor de ciertas sumas de las cuales no tengamos una expresi´on cerrada.
Sea f funci´ on creciente en el intervalo [i −1, i + 1], se tiene:
_
i
i−1
f(x)dx ≤ f(i) ≤
_
i+1
i
f(x)dx (1.22)
En el siguiente gr´ afico se puede ver la anterior acotaci´on del valor de f(i)
Si f es creciente en el intervalo [0, N] podemos sumar la expresi´on (1.26)
para los valores i = 1, 2, .., N, con lo que se obtiene
N

i=1
_
i
i−1
f(x)dx ≤
N

i=1
f(i) ≤
N

i=1
_
i+1
i
f(x)dx
Finalmente, usando las propiedades de la suma de integrales obtenemos:
_
N
0
f(x)dx ≤ S
N
=
N

i=1
f(i) ≤
_
N+1
1
f(x)dx (1.23)
Ejemplo 1: Calcular S
N
=

N
i=1
i
2
. Aplicando la f´ormula (1.27) a la funci´ on
f(x) = x
2
se tiene
_
N
0
x
2
dx ≤ S
N

_
N+1
1
x
2
dx

_
X
3
3
_
N
0
≤ S
N

_
X
3
3
_
N+1
1

N
3
3
≤ S
N

(N + 1)
3
3

1
3
⇒ S
N

N
3
3
.
ya que dividiendo los tres t´erminos de la desigualdad por
N
3
3
se tiene:
1 ≤
S
N
N
3
3

_
N + 1
N
_
3

1
N
3
N→∞
−→ 1
y por tanto
S
N
N
3
3
N→∞
−→ 1 ⇒S
N

N
3
3
Tambi´en se puede demostrar que S
N
=
N
3
3
+ O(N
2
). Para ello, en lugar de
dividir, restamos
N
3
3
en los tres t´erminos de la desigualdad, con lo que se obtiene:
0 ≤ S
N

N
3
3

_
N + 1
N
_
3

1
N
3

N
3
3
=
N
3
3
+ N
2
+ .... −
N
3
3
= N
2
+ O(N)
y como 0 ≤ S
N

N
3
3
se tiene que S
N

N
3
3
=
¸
¸
¸S
N

N
3
3
¸
¸
¸ y por tanto:
¸
¸
¸
¸
S
N

N
3
3
¸
¸
¸
¸
≤ N
2
+ O(N) ⇒S
N
=
N
3
3
+ O(N
2
)
En general, usando el m´etodo de aproximaci´on de sumas por integrales se
puede demostrar:
N

i=1
i
k

N
k+1
k + 1
(1.24)
N

i=1
i
k
=
N
k+1
k + 1
+ O(N
k
) (1.25)
Ejemplo 2: Vamos a estimar S
N
=

N
i=1
log i = log N!
En este caso log x es de nuevo una funci´ on creciente y por tanto podemos
aplicar de nuevo la f´ormula (1.27), teniendo en cuenta que l´ım
x→∞
xlog x = 0 se
tiene:
_
N
0
log x dx ≤ S
N

_
N+1
1
log x dx
⇒ [xlog x −x]
N
0
≤ S
N
≤ [xlog x −x]
N+1
1
⇒ N log N −N ≤ S
N
≤ (N + 1) log (N + 1) −(N + 1) + 1
dividiendo ahora los tres t´erminos de la desigualdad por N log N obtenemos:
1 −
1
log N

S
N
Nl log N

(N + 1) log(N + 1)
Nlog N

N
N log N
,
dado que (f´ acilmente por L’Hopital)
l´ım
N→∞
(N + 1) log (N + 1)
N log N

N
N log N
= l´ım
N→∞
_
1 −
1
log N
_
= 1,
y se llega a
l´ım
N→∞
S
N
N log N
= 1 ⇒S
N
∼ N log N (1.26)
Con algo m´ as de trabajo se puede demostrar que S
N
= N log N + O(N).
Dado que log N! ∼ N log N podr´ıamos preguntarnos si
e
log N!
= N! ∼ e
N log N
.
La respuesta es no. De hecho, en general si
f = Θ(g) e
f
= O(e
g
)
Al ser lo anterior una negaci´on vamos a dar un contraejemplo.
Sea f = 2N
2
y g = N
2
, por tanto e
f
= e
2N
2
= (e
N
2
)
2
= (e
g
)
2
y por tanto se
tiene que e
g
= o(e
f
) y por tanto e
f
= O(e
g
).
Tambi´en se puede demostrar que f ∼ g e
f
∼ e
g
. Por ejemplo, sea f =
N
2
+ N y g = N
2
sin embargo
l´ım
N→∞
e
N
2
+N
e
N
2
= l´ım
N→∞
e
N
2
e
N
e
N
2
= l´ım
N→∞
e
N
= ∞= 1
Para la estimaci´ on de N! existe la f´ormula de Stirling:
N! ∼

2πN
_
N
e
_
N
(1.27)
Ejemplo 3 vamos a estimar el crecimiento del N-´esimo n´ umero harm´onico,
es decir H
N
=

N
i=1
1
i
.
La funci´ on f(x) =
1
x
es una funci´ on decreciente, por lo tanto la f´ormula (1.27)
no es v´ alida. Afortunadamente usando un argumento similar se pude demostrar
que si f(x) es una funci´ on decreciente en el intervalo [0, N + 1] se verifica :
_
N
0
f(x)dx ≥ S
N
=
N

i=1
f(i) ≥
_
N+1
1
f(x)dx (1.28)
Por tanto, para estimar el crecimiento de H
N
podemos escribir
_
N
0
1
x
dx ≥ H
N

_
N+1
1
1
x
dx ⇒log x|
N
0
≥ H
N
≥ log x|
N+1
1
El problema con la acotaci´on anterior es que
l´ım
x→0
log x = −∞
y por tanto se tiene la in´ util desigualdad ∞ ≥ H
N
y H
N
no queda acotado
superiormente por una funci´ on de N. Si observamos la integral vemos que este
valor infinito viene producido por el valor 0 del l´ımite inferior de la primera
integral. Una posible soluci´ on para evitar ese valor ser´ıa quitar de alguna forma
el primer t´ermino del sumatorio. Por tanto convertimos H
N
=

N
i=1
1
i
en H
N
=
1 +

N
i=2
1
i
. Con lo que se obtiene:
_
N
1
1
x
dx ≥

N
i=2
1
i

_
N+1
2
1
x
dx
⇒1 +
_
N
1
1
x
dx ≥ 1 +
N

i=2
1
x
. ¸¸ .
H
N

_
N+1
1
1
x
dx
Con este cambio obtenemos:
1 + log N ≥ H
N
≥ log (N + 1)
y dividiendo los tres t´erminos por log N y tomando l´ımites se tiene que:
H
N
∼ log N (1.29)
Se puede demostrar tambi´en que l´ım
N→∞
(H
N
−log N) = γ constante y por
tanto
H
N
= log N + O(1).
El n´ umero γ es la constante de Euler y su valor es aproximadamente γ = 0,577...
(En el a˜ no 2006 se alcanz´o el record de cifras calculadas de la constante de Euler
con un total de 116 millones de cifras decimales exactas).
1.8. Complejidad de Algoritmos
Hasta ahora hemos calculado el tiempo abstracto de ejecuci´on de algunos
algoritmos calculando el n´ umero de veces que se ejecutaba la operaci´on b´asica
del algoritmo. Tambi´en hemos comparado algoritmos mediante la comparaci´ on
asint´ otica de las funciones que acotaban el n´ umero de operaciones b´asicas como
funci´ on del tama˜ no de la entrada n
A
(I) ≤ f(τ(I)).
Sin embargo, en el esquema anterior hay un cierto desequilibrio, ya que el
trabajo (n´ umero de operaciones b´asicas) que realiza un algoritmo depende de
cada entrada en particular. Sin embargo las funciones f solamente dependen del
tama˜ no de la entrada τ(I). Como ejemplo de este desequilibrio retomemos el
ejemplo de la ordenaci´on mediante burbuja BSort.
Si A = BSort se tiene
n
BSort
(T, P, U) ≤
N
2
2

N
2
que es una cantidad elevada.
n
BSort
([1, 2, ...., N], P, U) = N − 1 que es un valor mucho menor que el
anterior.
En vista de lo anterior ¿qu´e funci´ on f deber´ıamos usar para comparar BSort
con otros algoritmos? ¿N
2
o N − 1? Est´ a claro que tenemos que controlar la
dependencia del rendimiento de alguna manera independiente de las entradas
individuakes que se consideren.
Tenemos que precisar la funci´ on que vamos a comparar, para ello definimos
el Espacio de Entradas de un Algoritmo.
Dado un Algoritmo A y un tama˜ no N definimos el espacio de entradas (E
A
(N))
de tama˜ no N para el algoritmo A como:
E
A
(N) = {I entradas de A : τ(I) = N} (1.30)
Vamos a calcular algunos espacios de entrada.
Ejemplo 1: E
BSort
(N). En principio podr´ıamos establecer
E
BSort
(N) = {(T, P, U) : U −P + 1 = N}
Es decir, cualquier tabla T (por grande que sea), m´ as dos n´ umeros enteros
cualesquiera tales que U −P + 1 = N.
Este espacio de entradas es demasiado general (y demasiado grande) por lo
que convendr´ıa precisar un espacio de entradas E
A
(N) mucho m´ as manejable.
Para ello, tenemos que observar que lo que importa en T, en general, es que la
tabla est´e m´ as o menos desordenada, no los valores iniciales y finales P y U, por
tanto una primera acotaci´on simple ser´ıa imponer P = 1 y U = N.
Tambi´en podemos observar que no son importantes los n´ umeros que est´en
en la tabla T, sino el desorden relativo entre ellos. Es decir, por ejemplo, BSort
realizar´a las mismas comparaciones al ordenar la tabla T = [3, 1, 2] que al ordenar
la tabla T

= [25, 3, 12]. Con esta observaci´on podemos establecer que 1 ≤ T[i] ≤
N.
Con estas observaciones podemos establecer que
E
BSort
(N) = Permutaciones de N Elementos = Σ
N
(1.31)
Este espacio es mucho m´ as manejable que el que ten´ıamos inicialmente. Su
tama˜ no es |E
BSort
(N)| = |Σ
N
| = N!.
Ejemplo 2: E
BBin
(N).
En el caso de la b´ usqueda binaria podemos establecer como primera aproxi-
maci´on el siguiente espacio de entradas:
E
BBin
(N) = {(T, P, U, k) : k cualquiera, U −P + 1 = N, T ordenada}
De nuevo estamos ante un espacio inmanejable por ser demasiado general.
La primera acotaci´on simple puede ser de nuevo P = 1, U = N. A la hora de
buscar una clave k que est´e en la tabla, da igual cuales sean los elementos T[i]
de la tabla (por supuesto, han de estar ordenados); por tanto, podemos, al igual
que en el caso de la burbuja, asumir que la tabla T verifica 1 ≤ T[i] ≤ N. Sin
embargo al estar la tabla T ordenada podemos tomar T = [1, 2, ..., N]. Tambi´en
podemos observar que BBin realiza siempre el mismo trabajo para cualquier clave
que no est´e en la tabla por lo que a efectos de trabajo, basta considerar una clave
gen´erica
ˆ
k = [1, 2, 3, ..N]. Con estas observaciones podemos establecer el siguiente
espacio de entradas para BBin:
E
BBin
(N) = {1, 2, 3, ..., N,
ˆ
k} (1.32)
Por tanto, el espacio de entradas est´a formado por las N + 1 posibles claves
que podemos pasarle al algoritmo, es decir, los N elementos de la tabla T, que
corresponden a las b´ usquedas con ´exito y un elemento que no est´a en T y que
por tanto corresponde a las b´ usquedas con fracaso. En este caso, por tanto, el
tama˜ no del espacio de entradas es |E
BBin
(N)| = N + 1.
1.9. Casos Peor, Mejor y Medio
Una vez definido el espacio de entradas de un algoritmo, vamos a definir lo
que entendemos por casos peor, mejor y medio del algoritmo. Dado un algoritmo
A con espacio de entradas de tama˜ no N, E
A
(N), definimos:
Caso Peor
W
A
(N) = max{n
A
(I) : I ∈ E
A
(N)} (1.33)
Caso Mejor
B
A
(N) = min{n
A
(I) : I ∈ E
A
(N)} (1.34)
Caso Medio
A
A
(N) =

I∈E
A
(N)
n
A
(I)p(I) (1.35)
donde p(I) es la probabilidad con la que aparece la entrada I.
Como B
A
(N) ≤ n
A
(I) ≤ W
A
(N) para todo I ∈ E
A
(N) se verifica que
B
A
(N)p(I) ≤ n
A
(I)p(I) ≤ W
A
(N)p(I)∀I ∈ E
A
(N)
y por tanto

I∈E
A
(N)
B
A
(N)p(I) ≤

I∈E
A
(N)
n
A
(I)p(I) ≤

I∈E
A
(N)
W
A
(N)p(I)
Como

I∈E
A
(N)
p(I) = 1 se tiene:
B
A
(N) ≤ A
A
(N) ≤ W
A
(N) (1.36)
Los casos m´ as simples (aunque no siempre) de calcular son W
A
(N) y B
A
(N) para
los cuales daremos un m´etodo de general estimaci´ on. Los casos m´ as interesantes
suelen ser W
A
(N) y A
A
(N).
1.10. C´alculo de los casos peor y mejor
El c´ alculo del caso mejor de un algoritmo para un tama˜ no de entrada N se
puede realizar en general en dos pasos:
Paso 1: Encontrar f
A
tal que si τ(I) = N
n
A
(I) ≤ f
A
(N)
A veces, en lugar de pedir la desigualdad estricta pediremos n
A
(I) = O(f
A
(N)).
Paso 2: Encontrar una entrada
˜
I tal que
n
A
(
˜
I) ≥ f
A
(N)
A partir de estos dos pasos obtenemos las siguientes desigualdades:
Por 1: W
A
(N) ≤ f
A
(N) o bien W
A
(N) = O(f
A
(N))
Por 2: W
A
(N) ≥ f
A
(N) o bien W
A
(N) = Ω(f
A
(N)),
y por tanto, juntando 1 y 2 obtenemos W
A
(N) = f
A
(N) o bien W
A
(N) =
Θ(f
A
(N))
El caso mejor se calcula de una forma similar.
Paso 1: Encontrar f
A
tal que si τ(I) = N
n
A
(I) ≥ f
A
(N)
Paso 2: Encontrar una entrada
˜
I tal que
n
A
(
˜
I) ≤ f
A
(N)
Ejemplo 1: W
BSort
(N).
Vamos a calcular W
BSort
(N), caso peor de la burbuja para tablas de N ele-
mentos. Para el paso 1 ya vimos que n
BSort
(σ) ≤
N
2
2

N
2
∀σ ∈ Σ
N
y por tanto
podemos decir
W
BSort
(N) ≤
N
2
2

N
2
=
N
2
2
+ O(N)
Para el paso 2 tomamos ˜ σ = [N, N − 1, N − 2, ...,2, 1]. Es f´acil ver que
n
BSort
(˜ σ) =
N
2
2

N
2
con lo que se tiene:
W
BSort
(N) ≥
N
2
2

N
2
Considerando ahora 1 y 2 obtenemos
W
BSort
(N) =
N
2
2

N
2
=
N
2
2
+ O(N)
Se puede demostrar (se deja como ejercicio) que B
BSort
(N) = N −1.
En general el caso medio es m´ as complicado ya que el resultado depende de
la distribuci´ on de probabilidad p(I). Una posible simplificaci´on es suponer que
todas las entradas son equiprobables, en este caso se tiene:
p
A
(I) =
1
|E
A
(N)|
(1.37)
En este caso, para el algoritmo BSort se tendr´ıa:
p(σ) =
1
N!
∀σ ∈ E
BSort
(N)
En el caso de la b´ usqueda binaria:
p(k) =
1
N + 1
∀k ∈ E
BBin
(N)
En algunas ocasiones es relativamente f´acil calcular A
A
(N), por ejemplo, en
el caso de la b´ usqueda lineal.
Ejemplo 2: A
BLin
(N).
El pseudoc´ odigo de la b´ usqueda lineal es el siguiente:
ind BLin(tabla T,ind P, ind U, clave k)
para i de P a U
si k==T[i]
devolver i;
devolver error;
La operaci´on b´asica es la comparaci´ on de clave si k == T[i] dentro del bucle.
Para un tama˜ no de entrada N podr´ıamos proponer como espacio de entradas,
tomando P = 1, U = N:
E
BLin
= {σ ∈ Σ
N
, 1, N, k cualquiera}
donde Σ
N
es el conjunto de permutaciones de N elementos.
De nuevo este espacio es muy grande y podemos reducirlo. Si se trata de
una b´ usqueda con ´exito, el trabajo para buscar una clave que est´e en la tabla
depender´ a exclusivamente de la posici´on que ocupe la clave a buscar. Si la clave
no est´a en la tabla, el n´ umero de cdcs es N pues se recorre la tabla completa. Por
tanto, podemos de nuevo considerar como espacio de entradas:
E
BLin
(N) = {1, 2, 3, ..., N,
ˆ
k} (1.38)
con
ˆ
k una clave gen´erica tal que
ˆ
k = [1, 2, 3, ..N]. Adem´ as con este espacio tenemos
dos posibles situaciones.
La clave no est´a en la tabla. En este caso se tiene n
BLin
= N.
La clave est´a en la posici´on i de la tabla (es decir, T[i] == k). En este caso
se tiene n
BLin
(i) = i.
Si asumimos equiprobabilidad de las entradas se tiene:
p(k == i, 1 ≤ i ≤ N) = p(k = [1, 2, 3, ..N]) =
1
N + 1
,
Con estas observaciones es f´acil ver W
BLin
(N) = N y B
BLin
(N) = 1.
Para calcular el caso medio recurrimos a la definici´on
A
BLin
(N) =
N

i=1
n
BLin
(i)
1
N + 1
. ¸¸ .
b´ usqueda con ´ exito
+ N
1
N + 1
. ¸¸ .
b´ usqueda sin ´ exito
=
1
N + 1
N

i=1
i +
N
N + 1
=
1
N + 1
N(N + 1)
2
+
N
N + 1
. ¸¸ .
O(1)
=
N
2
+ O(1)
Ejemplo 3: A
e
BLin
(N).
Vamos a calcular el caso medio de la b´ usqueda lineal con ´exito suponiendo
ahora que:
p(k == i) =
1
C
N
log i
i
donde C
N
es una constante de normalizaci´ on necesaria para que p(k == i) veri-
fique la condici´on de distribuci´ on de probabilidad; esto es,
N

i=1
p(k == i) = 1 ⇒
N

i=1
1
C
N
log i
i
= 1 ⇒C
N
=
N

i=1
log i
i
.
Como en este caso se trata de b´ usquedas con ´exito, es decir, la clave k a buscar
siempre est´a en la tabla, se tiene que p(k = [1, 2, 3, ...N]) = 0.
Aplicamos ahora la definici´on del caso medio:
A
N
= A
e
BLin
(N) =
N

i=1
n
BLin
(i)p(k == i) =
N

i=1
i
1
C
N
log i
i
=
=
N

i=1
1
C
N
log i =
1
C
N
N

i=1
log i
=
S
N
C
N
.
donde:
S
N
=
N

i=1
log i
El valor de S
N
ya lo calculamos previamente en (1.30), por lo tanto se tiene:
S
N
∼ N log N
Ahora vamos a estimar el valor de C
N
; para ello usaremos el m´etodo de aprox-
imaci´ on por integrales.
La funci´ on f(x) =
log x
x
es una funci´ on decreciente y por tanto tendremos
que usar la f´ormula (1.32).
_
N
0
log x
x
dx ≥ C
N

_
N+1
1
log x
x
dx

_
1
2
(log x)
2
_
N
0
≥ C
N

_
1
2
(log x)
2
_
N+1
1
Observamos, al igual que ocurri´o en la estimaci´ on de la serie harm´onica, que la
suma no queda bien acotada ya que log 0 = −∞. El problema de nuevo aparece
por el l´ımite inferior de la primera integral. La soluci´ on, al igual que en el caso
de la serie harm´onica, pasa por sacar fuera del sumatorio el primer t´ermino:
C
N
=
N

i=1
log i
i
=
log 1
1
. ¸¸ .
0
+
N

i=2
log i
i
=
N

i=2
log i
i
con lo que se ahora se tiene:
_
N
1
log x
x
dx ≥ C
N

_
N+1
2
log x
x
dx

_
1
2
(log x)
2
_
N
1
≥ C
N

_
1
2
(log x)
2
_
N+1
2

1
2
(log N)
2
≥ C
N

1
2
(log N + 1)
2

1
2
(log 2)
2
Dividiendo ahora los tres t´erminos de la desigualdad por
1
2
(log N)
2
se tiene:
1 ≥
C
N
1
2
(log N)
2

1
2
(log N + 1)
2
1
2
(log N)
2

1
2
(log 2)
2
1
2
(log N)
2
N→∞
−→ 1
Por lo tanto
l´ım
N→∞
C
N
1
2
(log N)
2
= 1 ⇒C
N

1
2
(log N)
2
Tenemos hasta ahora una igualdad A
N
=
S
N
C
N
y dos igualdades asint´ oticas
C
N

1
2
(log N)
2
y S
N
∼ N log N.
Podemos suponer entonces que
A
N

N log N
1
2
(log N)
2
=
2N
log N
Para ver que lo anterior es cierto tenemos que comprobar que
l´ım
N→∞
A
N
_
2N
log N
_ = 1
Para ello reescribimos el l´ımite anterior de la siguiente manera:
l´ım
N→∞
A
N
_
2N
log N
_ = l´ım
N→∞
_
S
N
C
N
_
_
N log N
1
2
(log N)
2
_ = l´ım
N→∞
_
S
N
N log N
_
1
_
C
N
1
2
(log N)
2
_ = 1
y por tanto:
A
N

2N
log N

Principal pega: el tiempo empleado sobre unas entradas no dice nada sobre lo que se tardar´ sobre otras. a Opci´n 2. An´lisis de tiempos abstractos de ejecuci´n sobre pseudoc´digo. o a o o Es la que usaremos en el curso.

1.2.

Tiempo abstracto de ejecuci´n o

Para medir los tiempos abstractos de ejecuci´n de un algoritmo necesitamos o definir la unidad de tiempo abstracto. La unidad de tiempo que vamos a considerar ser´ la “sentencia elemental”, esto es, una l´ a ınea simple de pseudoc´digo que o no contenga ninguna llamada a otra funci´n. (Por supuesto, tendremos que tener o cuidado con estas sentencias “no elementales”.) Definiremos tae o tiempo abstracto de ejecuci´n como el n´mero de o u unidades de tiempo abstracto ejecutadas, es decir el n´mero de sentencias elu ementales ejecutadas para unas entradas dadas. M´s formalmente, para un algoritmo A y una entrada I definimos tA (I) como a el n´mero de sentencias elementales de A que se ejecutan sobre la entrada I. u La base del an´lisis est´ por tanto en el pseudoc´digo. a a o Ejemplo 1. Ordenaci´n por selecci´n o o El siguiente pseudoc´digo ordena una tabla T con ´ o ındice al primer elemento P e´ ındice al ultimo elemento U: ´ SelectSort(tabla T,ind P, ind U) (1) i=P; (2) mientras i < U : | m= min(T,i,U): // NO es sentencia elemental; hay que hacer algo (2) | swap(T[i],T[m]); // tampoco lo es ... pero la tomamos como tal! | i++; ind min(tabla T, ind P, ind U) (1) m=P; (2) para i de P+1 a U: // la tomamos como sentencia simple | si T[i]<T[m]: (2) | m=i; (1) devolver m; Las instrucciones marcadas con (1) son instrucciones que se ejecutan una sola vez, las instrucciones marcadas con (2) se ejecutan repetidas veces. Un ejemplo de funcionamiento del algoritmo sobre la tabla ”4 3 2 1”

Claramente el bucle se ejecuta U − P veces.Seguimos la evoluci´n de los ´ o ındices i y m: i=1 m=4 swap(T[1]. Por lo tanto. U ) = 1 + (4 + tmin (T. nos ponemos en el caso de “m´s trabajo”. llegamos a: a o U −1 i=P tss(T. i. U ). U ) tiempo abstracto de ejecuci´n de la o funci´n min. P. P. es decir. Como mezcla sentencias b´sicas con la que contiene la llamada a min. suponiendo que a siempre se cumple la condici´n y acotamos el n´mero real de ejecuciones mediante o u un ≤.T[3]) 1 2 3 4 Vamos a calcular primero tmin (T. que ejecuta un n´mero variable de a u sentencias b´sicas en cada iteraci´n. Con esto ya podemos empezar a estimar tss(T. 2 2 . P. ´ donde contamos 3 sentencias elementales a lo sumo dentro del bucle de min. Hay que observar que la condici´n T[m]>T[i] no o siempre es cierta y por tanto la asignaci´n m=i no siempre se ejecuta. P. U ) ≤ 2 + 3 × N umero de iteraciones del bucle. cuantas ejecuciones de sentencias elementales hace min o para la tabla T entre P y U .T[3]) 1 2 3 4 i=3 m=3 swap(T[3]. U )) + 1 U −1 i=P ≤ 2 + 4(U − P ) + (2 + 3(U − i)) U −1 i=P = 2 + 4(N − 1) + 2(N − 1) + 3 = 6N − 4 + 3 N −1 j=1 (U − i) j = 6N − 4 + 3 N (N − 1) 2 3 2 9 = N + N − 4.T[4]) 1 3 2 4 i=2 m=3 swap(T[2]. tomando el caso particular P = 1. esto nos lleva a tmin (T. Por lo tanto. U ) ≤ 2 + 3(N − 1). o Para superar esto. U ) ≤ 2 + 3(U − P ). lo que nos lleva a tmin (T. P. P. U = N nos da tmin (T.

esto es. (2) | si T[M]==k : | devolver M. a Los ejemplos anteriores nos permiten establecer las siguientes observaciones: TBBin (T. U. l − 1 < log2 N ≤ l. no hay n m´s de ⌈log2 (N )⌉ iteraciones y se tiene que a Observaci´n El trabajo m´ximo se produce agotando todas las iteraciones o a (P > U ). k) ≤ 2 + 5⌈log2 N ⌉ l = ⌈log2 (N )⌉ .ind P. Por lo tanto. instrucciones dentro del bucle (como antes. El n´mero de sentencias elementales que se ejecutan en cada iteraci´n del u o bucle es mayor o igual que cinco: una debida a la comprobaci´n de la condici´n del bucle m´s.. P. U. n e o Tras cada iteraci´n: o iteraci´n o tama~o de la subtabla n 1 N/2 2 N/4 3 N/8 . B´ squeda binaria u ind BBin(tabla T.. P. ⌈2... lo que no es posible.. Para ello estimamos u el tama˜o de la subtabla despu´s de cada iteraci´n. no todas se ejecutan en cada iteraci´n.. o o a al menos cuatro. | else : | P=M+1 (1) devover err. si el algoritmo llega a la iteraci´n l.. de iteraciones. ) ≤ 2 + 5 ∗ n. por lo que de nuevo acotamos con un ≤. Supongamos que el n´mero de elementos N de la tabla T es 2l−1 < N ≤ 2l u para alg´n l ∈ N .7⌉ = 3) Entonces. .. | else si k < T[M] : | U=M-1.clave k) (2) mientras P <= U : | m= (P+U)/2... Por lo tanto. o Con esto se tiene tBBin (T. u donde el operador ⌈ ⌉ es el operador techo (a modo de ejemplo.. Por lo tanto es necesario estimar el n´mero de iteraciones. tras la iteraci´n se seguir´ buscando o o ıa l en una tabla de tama˜o < N/2 ≤ 1. lo cual ocurre cuando la clave a buscar k no est´ en T .Ejemplo 2. ind U..

a sus entradas I se les puede asignar un tama˜ o de entrada τ (I) y se puede encontrar una cierta funci´n fA n o tal que taeA (I) ≤ fA (τ (I)) (1.1.. e 4. El tae nos permite generalizar los tiempos abstractos de ejecuci´n o para nuevas entradas y adem´s estimar tiempos reales de ejecuci´n. o o Por ejemplo los c´digos b´sicamente iguales de abajo dan lugar a taes diso a tintos... 2 2 En general si I ′ tiene un tama˜o k veces mayor que el tama˜o de I (i. .) ≈ 4taeSSort (I).2) Supongamos ahora que un programa que implemente SelectSort tarda 1 segundo al ordenar una tabla de N = 1000 elementos. Consideremos SelectSort con una entrada I tal que τ (I) = N y otra entrada I ′ tal que τ (I ′ ) = 2N .U... = 4( N 2 + . Se tiene entonces que 3 3 taeSSort (I ′ ) = (2N )2 + . El tae tal como lo hemos definido sigue siendo algo artificioso ya que su valor puede depender de c´mo se escriba el pseudoc´digo.P..e n n τ (I ′ ) = kN ) taeSSort (I ′ ) = k 2 taeSSort (I) (1.k) τ U-P+1 U-P+1 fA + . 5⌈log2 N ⌉ + 2 3 2 N 2 2.P. Entonces Tama˜o n Tiempo real de ejecuci´n o 1000 1 seg 2000 4 seg 10000 100 seg 100000 10000 seg 3.1) Hemos visto: A SelectSort BBin I (T.U) (T. como a o podemos ver en el siguiente ejemplo. En el caso de taeBBin (N ) = 2 + 5⌈log2 N ⌉ el t´rmino de mayor peso es ⌈log2 N ⌉. Parece que para cualquier algoritmo A.. En taeSSort (N ) = 3 N 2 + 6N − 6 el t´rmino que m´s importa para valores e a 2 2 grandes de N es el correspondiente a N ..

En el caso de SelectSort la instrucci´n de comparaci´n de claves o o (cdc) si T[i]<T[m] cumple las condiciones 1 y 2 al estar en el bucle m´s interno y tratarse de una a comparaci´n de claves.3. En el caso de BBin tambi´n tomaremos la cdc como operaci´n e o b´sica la instrucci´n a o . o Ejemplo 1. o Ejemplo 2. D=F. En lugar de contar el n´mero de sentencias b´sicas que se ejecutan lo que vamos a considerar es u a el n´mero de veces que se ejecuta una cierta operaci´n b´sica. es una instrucci´n general de muchos algoritmos. no siempre se ejecuta. Operaci´n b´sica de un algoritmo o a La operaci´n b´sica (OB) de un algoritmo A es una sentencia elemental de o a A que adem´s cumple las siguientes condiciones: a 1. Debe ser la instrucci´n a o que m´s veces se ejecuta. Debe aparecer en el bucle m´s interno del algoritmo. a 2. hay que hacer algo a este respecto. F=C+E. y la instrucci´n o i++. u o a 1. En SelectSort el t´rmino N 2 y en BBin el t´rmino ⌈log2 N ⌉ vienen de e e ejecutar el bucle m´s interno.C´digo 1 o D=A+B+C. tae 3 tae 1 Por tanto. Debe ser una operaci´n representativa del algoritmo. 5. Por esta raz´n vamos a cambiar la unidad a o de medida que usamos a la hora de calcular el tae. La instrucci´n o o m=P. C´digo 2 o E=A+B.

dos ya conocidos y uno nuevo. P. Como ya establecimos. nSSort (T. Veamos tres ejemplos. else si K < T[M] ..ind U) para i de U a P+1 para j de P a i-1 si T[j]>T[j+1] <---.. k) analizamos los bucles del algoritmo vemos que la operaci´n b´sica siempre se ejecuta una vez para cada iteraci´n del bucle. P. U. Ejemplo 1: B´ squeda binaria u Para calcular nBBin (T. U ) usando como OB la cdc.T[j+1]). S´lo hay cdcs en min y o dentro de la funci´n min el n´mero de veces que se ejecuta la operaci´n b´sica o u o a depende de los valores de entrada. que es el n´mero de veces que el algoritmo A ejecuta su operaci´n b´sica (OB) sobre u o a la entrada I. P. Por o a o tanto se tiene: nBBin ≤ 1 ∗ numero de ejecuciones del bucle = ⌈log2 N ⌉ (1. La evoluci´n del algoritmo sobre la tabla T = [4 3 2 1] con P = 1 y U = 4 se o puede ver en la tabla 1. N ) = N −1 i N −i= N2 N − 2 2 (1. ind P. U ) ser´ el n´mero de comparaciones de a u clave (operaci´n b´sica) que realice el algoritmo para ordenar la tabla. o BurbujaSort_v1(Tabla T.si T[M]==K . tomando a P = 1 y U = N.4) Ejemplo 3: M´todo de la burbuja e Para el m´todo de la burbuja para ordenaci´n veremos dos versiones. El coste total del algoritmo ser´. e o Versi´n 1. la nueva medida nA (I). nBSort (T. else si A partir de ahora usaremos en vez de tabstractoej.. N ) = N −1 i=1 nmin (T. 1.3. Por tanto: o a .3) Ejemplo 2: Ordenaci´n por selecci´n o o Calculamos nSSort (T. i..Operaci´n b´sica o a swap(T[j].

2.6) Podemos realizar las siguientes observaciones: Esta versi´n de BSort es bastante mala.2.2.1 3.5) donde nBSort (T. i) = i − 1 y N nBSort (T. N ] se tiene nBSort (T. Si ordenamos la tabla ya ordenada o 2 T = [1. es decir. i) es el n´mero de veces que se ejecuta la operaci´n b´sica u o a para cada iteraci´n (valor fijo de i) del bucle externo.4. .1.3.2. 1.4 2.1 3.4.. i) (1. N ) = N − N .T[2]) T[2]> T[3] ? Si swap(T[2].T[2]) Tabla 3. P.3.T[2]) T[2]> T[3] ? Si swap(T[2].T[3]) T[3]> T[4] ? Si swap(T[3]. Tomando P = 1 y U = N o se tiene nBSort (T.4 2.T[3]) T[1]> T[2] ? Si swap(T[1].3.T[4]) T[1]> T[2] ? Si swap(T[1]. P..1. ..1. 1. N ) = i=2 (i − 1) = N −1 i=1 i= N2 N − 2 2 (1. P. Una soluci´n a lo anterior es cambiar el pseudoc´digo a˜adiendo un detector o o n de ”swaps”. P.Burbuja i 4 4 4 3 3 2 j 1 2 3 1 2 1 Operaciones T[1]> T[2] ? Si swap(T[1].4 2. U ) = i=P +1 nBSort (T.1.4 U nBSort (T. tardaremos lo 2 2 mismo en ordenar una tabla ya ordenada que otra tabla desordenada.

ind P.Dicho detector ser´ un flag que se pondr´ inicialmente al valor 0 para cada a a iteraci´n de la variable i y que se cambiar´ al valor 1 si se produce alg´n o a u swap. 1.. o Sin embargo.. Por supuesto tendremos que poner algunas condiciones para poder compararlos. Que resuelvan el mismo problema (ordenaci´n. Ahora se tiene que nBSort ([1. i=U.T[j+1]). b´squeda.. 3. 2. para j de P a i-1 : si T[j]>T[j+1] : swap(T[j]. o BurbujaSort_v2(Tabla T. i) ≤ i − 1. 3. a Versi´n 2. . 2. Que lo resuelvan usando la misma operaci´n b´sica. el n´mero de veces que se ejecuta la OB depende de la tabla u que se ordene y. mientras (Flag==1 && i>=P+1) : Flag=0. N ]. por lo que seguimos teniendo que nBSort ([N. Comparaci´n de algoritmos o A la vista de lo anterior nos gustar´ tener una manera de comparar algoıa ritmos.. .. N ) = N − 1.. o a . N ) ≤ N2 N − . 1. P. N − 1. en general. 1. Si durante una iteraci´n completa de la variable j para un valor fijo o de i no se produce ning´n swap significa que la tabla ya est´ ordenada y u a por tanto no es necesario realizar m´s comparaciones. Flag=1. i--.ind U) Flag=1. 1].. 2 2 1. etc). s´lo podemos decir que en la iteraci´n i se o o cumple nBSort (T. o u 2. lo cual es mucho mejor que el pseudoc´digo anterior.4.

Diremos que A1 es mejor que A2 si y solo si fA1 “es menor”que fA2 . f y g diremos que f = o(g) si l´ ım f (N ) =0 g(N ) (1. Comparaci´n asint´tica de funciones o o En esta secci´n vamos a definir los principales operadores de comparaci´n o o asint´tica de funciones. Por ello compararemos las funciones fA1 (N ) y fA2 (N ) para valores grandes de N (es decir cuando N → ∞). Sean f (N ) = N k y g(N ) = N k+ǫ con ǫ > 0. 2. en este caso consideramos que la funci´n f a o es “claramente m´s peque˜a”que la funci´n g. Para todo algoritmo A ∈ F encontrar fA tal que nA (I) ≤ fA (τ (I)) 3.8) N →∞ Ejemplo.7) 1. a Este operador corresponder´ (por supuesto de una forma muy gen´rica) al ıa e operador matem´tico “<”. En general. Sean f (N ) = ln N y g = N ǫ con ǫ > 0. el c´lculo del l´ a ımite se puede realizar f´cilmente aplicando la regla de L’Hopital. a 1. o o El m´todo que seguiremos para comparar algoritmos ser´ el siguiente: e a 1. En general la comparaci´n de rendimiento de algoritmos s´lo es relevante o o para entradas grandes. Se tiene que f = o(g) k ya que l´ N →∞ NN = 0 ım k+ǫ Ejemplo. todas las o funciones que vamos a considerar ser´n positivas. Considerar una familia F de algoritmos que cumplan las condiciones 1 y 2.1. Por ejemplo F = {Algoritmos de ordenaci´n por comparaci´n de clave}. Se tiene que f = o(g). familias de algoritmos que cumplan las condiciones 1 y 2.Por tanto lo que vamos a considerar es F . Es decir. (1. y salvo que se indique lo contrario.5.5. a n o . f = o(g) Dadas dos funciones positivas.

si hemos encontrado o a que f = O(3N 2 ) diremos que f = O(N 2 ) o por ejemplo si tenemos que 3 f = O(eπ N 2 ). Sean f (N ) = N 2 y g(N ) = N 2 + N . g(N ) ≤ 2f (N ). La notaci´n asint´tica f = O(g) corresponde (se˜alando siempre que de forma o o n general y dentro del marco de las comparaciones asint´ticas) a la comparaci´n o o matem´tica f ≤ g. Por tanto. si tomamos N0 = 1 y C = 2.9) Decimos que f = O(g) si existen N0 y Ctales que f (N ) ≤ Cg(N ) ∀N ≥ N0 .2. o La notaci´n O nos permite adem´s eliminar algunas constantes y t´rminos de o a e menor peso en las comparaciones. En particular: 1.1. Hay que se˜alar que puede ocurrir perfectamente que con la a n notaci´n matem´tica se verifique que f (x) ≥ g(x) ∀x y sin embargo se verifique o a f = O(g). a ) Observaci´n f = o(g) ⇒ f = O(g). √ Ejemplo. f (N ) ≤ g(N ) ii g = O(f ) ya que ∀N. de nuevo escribiremos simplemente f = O(N 2 ). Por lo tanto siempre nos quedaremos con la expresi´n m´s simple y significativa. Ya hemos visto que 2 ) ) f = O(g). Es decir. ım g(N g(N + Es importante adem´s recalcar sobre la observaci´n anterior que las las afira o maciones positivas se demuestran y en las afirmaciones negativas se encuentra un contraejemplo. es decir f = O(g) f = o(g). sin embargo se tiene l´ N →∞ f (N ) = f (N ) = N 2N √N = 1 = 0. Aplicaremos esta observaci´n repetidas veces. g(N ) Por tanto. Adem´s si f = O(g) y h = o(g) entonces f = O(g + h). Para ver √ 2 2 lo anterior basta tomar f (N ) = N y g(N ) = N + N . f = O(g) (1. basta tomar el mismo N0 que el del l´ ımite y C = 1. Se tiene que i f = O(g) ya que ∀N. por la o g(N definici´n de l´ o ımite debe haber un N0 tal que para todo N ≥ N0 se tiene f (N ) ≤ 1 ⇐ f (N ) ≤ g(N ). los a t´rminos menos significativos no importan. El rec´ ıproco en general es falso. √ √ se puede ver f´cilmente que N 2 + N ≤ 2N 2 porque N ≤ N 2 .5. en el caso de e la suma de varias funciones nos quedaremos con el t´rmino m´s significativo e a y no diremos f = O(N 2 + N ) sino f = O(N 2 ). es decir. Las constantes multiplicativas no importan ya que si f = O(g) ⇒ f = O(kg) para cualquier valor de k. pues si f (N ) −→ 0 entonces. . 2. es decir.

f = Ω(g) Decimos que f = Ω(g) si y s´lo si g = O(f ). f = Θ(g) Decimos que f = Θ(g) si y solo si se verifica: f = O(g) y f = Ω(g).10) La siguiente propiedad nos sera muy util para la comparaci´n Θ de dos fun´ o ciones: ) Si l´ N →∞ f (N ) = L. Es f´cil demostrar. o ıa o a 1.5. aplicando la definici´n anterior. De nuevo se˜alar o a n que puede ocurrir perfectamente que f (x) = g(x) ∀x y sin embargo f = Θ(g).1. −L ≤ g g 2 f L L f 3L L ⇒ − ≤ −L≤ ⇒ ≤ ≤ 2 g 2 2 g 2 con lo cual se tiene: 3L g(N ) ⇒ f = O(g) 2 2 f (N ) ⇒ g = O(g) g(N ) ≤ L f (N ) ≤ y por tanto f = Θ(g). es decir e f = Θ(g) si f = O(g) y g = O(f ) o si g = Ω(f ) y g = O(f ) o si g = Ω(f ) y f = Ω(g). o Esta notaci´n corresponder´ a la comparaci´n matem´tica f ≥ g.3. Esta notaci´n corresponde al igual matem´tico (f = g). ∀N ≥ N0 . la siguiente propiedad: a o f = Θ(g) ⇔ g = Θ(f ) (1. Con esta propiedad es f´cil ver que N 2 + N = Θ(N 2 ) ya que a N2 + N = 1 = 0. con 0 < L < ∞. Tambi´n se puede aplicar cualquiera de las condiciones equivalentes. ∞ N →∞ N2 l´ ım .5.4.q. entonces f = Θ(g). ım g(N La demostraci´n es la siguiente: o f f L − L → 0 ⇒ ∃N0 t.

por tanto. Basta con dividir el numerador y el denominador por el t´rmino de e mayor grado.1. (1. N →∞ g(N ) l´ ım (1. que la comparaci´n ∼ es m´s precisa que la comparaci´n o a o Θ. sin embargo el t´rmino de ). en este caso N 2 .5.11) f ∼g N´tese que f ∼ g es un caso particular de f = Θ(g) en el que la constante del o l´ ımite vale exactamente 1. Se puede ım g(N considerar.6.12) ) ya que si f ∼ g entonces l´ N →∞ f (N ) = 1 = L con 0 < L < ∞.5. f = g + O(h) Si h = o(g) diremos que f = g + O(h) si |f − g| = O(h) Ejemplo.5. Esta observaci´n nos permite afirmar: o f ∼ g ⇒ f = Θ(g) (1. √ Sea f (N ) = N 2 + N + ln N entonces si g(N ) = N 2 se tiene que: f ∼ g. f ∼ g. si o f (N ) = 1. √ √ f = g + O( N √ ya que |f − g|√ N + ln(N ). C1g f g f g C2g f=θ(g) f~g 1. = e mayor peso en N + ln(N ) es N .13) . Diremos que f es asint´ticamente equivalente a g. En la figura inferior se puede ver la diferencia entre ambas notaciones. esto es.

por tanto f f − 1 → 0 ⇒ → 1. P (N ) ak N k = 1. P (N ) = ak N k + O(N k−1 ).15) En general. g(N ) g(N ) g(N ) Ch g → 0.En general se verifica que f = g + O(h) ⇒ f ∼ h (1. ya que l´ N →∞ ım P (N ) ∼ ak N k . por tanto.6. intentaremos ser lo m´s precisos posible. siendo ´sta la expresi´n m´s precisa. en el caso a de los polinomios P (N ) = ak N k + ak−1 N k−1 + . + a0 .16) Una expresi´n m´s general de la formula anterior corresponde a la suma de o a los t´rminos de una progresi´n aritm´tica general: e o e . El caso m´s simple es el de la suma de los a t´rminos de la progresi´n aritm´tica elemental e o e N f (N ) = SN = i=1 i= N (N + 1) N2 = + O(N ) 2 2 (1. g g Se tiene.. e o a 1. Por ejemplo. la siguiente cadena de comparaciones de precisi´n decreo ciente: f = g + O(h) ⇒ f ∼ g ⇒ f = Θ(g) ⇒ f = O(g) (1. con ak = 0 podr´ ıamos establecer las siguientes comparaciones: P (N ) = O(N k ) P (N ) = Θ(N k ).14) La demostraci´n es la siguiente: si |f − g| = O(h) existen C y N0 tales que o 0≤ Como h g C h(N ) f (N ) |f (N ) − g(N )| −1 = ≤ . ya que l´ N →∞ ım P (N ) Nk = ak = 0. entonces → 0 y.. Crecimiento de funciones En esta secci´n vamos a obtener algunas f´rmulas para el crecimiento de o o funciones expresadas como sumas.

pero entonces SN = N .17) N´tese que la f´mula no tiene sentido si x = 1.18) Una vez obtenida la f´rmula anterior. Se pueden calcular mediante la sigui=1 iente expresi´n: o N N SN = i=1 ix = x i=1 i ix i−1 d =x dx N xi i=1 =x d dx (1. Cambiando de signo el numerador y el denominador se tiene: SN = x − xN +1 N →∞ x −→ 1−x 1−x (1.19) Para sumas derivadas con potencias de i se aplica el siguiente m´todo similar.) = Θ(N 2 xN ) dx2 En general se tiene: N SN = i=1 ik xi = Θ(N k xN ) (1.20) . se pueden estimar alguna sumas derivadas.. e considerando ahora derivadas segundas N N N xN +1 − x x−1 = Θ(N xN ) SN = i=1 i x =x 2 i 2 i=1 i(i − 1)x i−2 + i=1 ixi = x2 d2 (. o como por ejemplo la suma SN = N ixi . En la o o expresi´n anterior podemos distinguir dos casos: o Si x > 1. Se tiene SN = Θ(xN ) Si x < 1.N N f (N ) = SN = i=1 (ai + b) = a i=1 i + bN a 2 a N + N + bN = 2 2 a 2 = N + O(N ) 2 Estudiamos la suma de los t´rminos de una progresi´n geom´trica de raz´n e o e o x = 1: N SN = i=1 xi = xN +1 − x x · xN − x = x−1 x−1 (1...

se tiene: i i−1 i+1 f (x)dx ≤ f (i) ≤ f (x)dx i (1. N ] podemos sumar la expresi´n (1. con lo que se obtiene N i i−1 N N i+1 i=1 f (x)dx ≤ i=1 f (i) ≤ f (x)dx i=1 i Finalmente. o o Sea f funci´n creciente en el intervalo [i − 1.7. si s´lo o o estamos interesados en el crecimiento de estas sumas. 1. Estimaci´n de sumas mediante integrales o El m´todo de estimaci´n de sumas por integrales nos permitir´ aproximar el e o a valor de ciertas sumas de las cuales no tengamos una expresi´n cerrada. 2. Sin embargo. i + 1].23) .La siguiente f´rmula se puede demostrar por inducci´n o o N SN = i=1 i2 = N3 N (N + 1)(2N + 1) = + O(N 2 ) 6 3 (1. se puede aplicar un m´todo e general.21) Hay f´rmulas similares pare sumas de otras potencias..26) o para los valores i = 1.22) En el siguiente gr´fico se puede ver la anterior acotaci´n del valor de f (i) a o Si f es creciente en el intervalo [0. usando las propiedades de la suma de integrales obtenemos: N 0 N N +1 f (x)dx ≤ SN = i=1 f (i) ≤ f (x)dx 1 (1.. N . .

25) i=1 . restamos N en los tres t´rminos de la desigualdad. Aplicando la f´rmula (1. − = N 2 + O(N ) N 3 3 3 N3 3 se tiene que SN − = SN − N3 3 y por tanto: SN − N3 N3 + O(N 2 ) ≤ N 2 + O(N ) ⇒ SN = 3 3 En general. Para ello. 3 ya que dividiendo los tres t´rminos de la desigualdad por e 1≤ y por tanto SN N3 3 N →∞ N3 3 se tiene: SN N3 3 ≤ N +1 N 3 − 1 N →∞ −→ 1 N3 −→ 1 ⇒ SN ∼ 3 N3 3 Tambi´n se puede demostrar que SN = N + O(N 2 )...24) (1.27) a la funci´n o o N +1 x dx ≤ SN ≤ N 2 x2 dx 1 N +1 ⇒ ⇒ ⇒ X3 X3 ≤ SN ≤ 3 0 3 1 N3 (N + 1)3 1 ≤ SN ≤ − 3 3 3 N3 SN ∼ . en lugar de e 3 3 e dividir.Ejemplo 1: Calcular SN = f (x) = x2 se tiene N 0 N 2 i=1 i . usando el m´todo de aproximaci´n de sumas por integrales se e o puede demostrar: N i=1 N ik ∼ ik = N k+1 k+1 N k+1 + O(N k ) k+1 (1.. con lo que se obtiene: 3 N3 0 ≤ SN − ≤ 3 y como 0 ≤ SN − N +1 N N3 3 3 1 N3 N3 N3 2 − 3− = + N + .

teniendo en cuenta que l´ x→∞ x log x = 0 se o ım tiene: N 0 N +1 log x dx ≤ SN ≤ log x dx 1 ⇒ [x log x − x]N ≤ SN ≤ [x log x − x]N +1 0 1 ⇒ N log N − N ≤ SN ≤ (N + 1) log (N + 1) − (N + 1) + 1 dividiendo ahora los tres t´rminos de la desigualdad por N log N obtenemos: e 1− 1 SN (N + 1) log(N + 1) N ≤ ≤ − . Tambi´n se puede demostrar que f ∼ g e ef ∼ eg . log N N l log N N log N N log N dado que (f´cilmente por L’Hopital) a 1 N (N + 1) log (N + 1) − = l´ ım 1 − N →∞ N →∞ N log N N log N log N l´ ım y se llega a SN = 1 ⇒ SN ∼ N log N N →∞ N log N l´ ım (1. Por ejemplo. o Sea f = 2N 2 y g = N 2 . a Dado que log N ! ∼ N log N podr´ ıamos preguntarnos si elog N! La respuesta es no.Ejemplo 2: Vamos a estimar SN = N log i = log N ! i=1 En este caso log x es de nuevo una funci´n creciente y por tanto podemos o aplicar de nuevo la f´rmula (1. ef = O(eg ) Al ser lo anterior una negaci´n vamos a dar un contraejemplo. en general si f = Θ(g) = N ! ∼ eN log N . por tanto ef = e2N = (eN )2 = (eg )2 y por tanto se tiene que eg = o(ef ) y por tanto ef = O(eg ). Con algo m´s de trabajo se puede demostrar que SN = N log N + O(N ).26) = 1.27). sea f = N 2 + N y g = N 2 sin embargo eN +N eN eN l´ ım = l´ ım = l´ eN = ∞ = 1 ım 2 2 N →∞ eN N →∞ eN N →∞ 2 2 2 2 . De hecho.

Afortunadamente usando un argumento similar se pude demostrar a que si f (x) es una funci´n decreciente en el intervalo [0. para estimar el crecimiento de HN podemos escribir N +1 1 1 dx ≥ HN ≥ dx ⇒ log x|N ≥ HN ≥ log x|N +1 0 1 x x 1 0 El problema con la acotaci´n anterior es que o N x→0 l´ log x = −∞ ım y por tanto se tiene la in´til desigualdad ∞ ≥ HN y HN no queda acotado u superiormente por una funci´n de N .28) Por tanto. Por tanto convertimos HN = N 1 en HN = e i=1 i 1 + N 1 . Con lo que se obtiene: i=2 i N 1 N 1 dx ≥ x 1 dx ≥ 1 + x N 1 i=2 i N N +1 ≥ 2 N +1 1 1 dx x 1 dx x ⇒1+ 1 i=2 1 ≥ x HN Con este cambio obtenemos: 1 + log N ≥ HN ≥ log (N + 1) HN ∼ log N y dividiendo los tres t´rminos por log N y tomando l´ e ımites se tiene que: (1. Si observamos la integral vemos que este o valor infinito viene producido por el valor 0 del l´ ımite inferior de la primera integral.27) o o o no es v´lida.Para la estimaci´n de N ! existe la f´rmula de Stirling: o o √ N ! ∼ 2πN N e N (1.29) . e u o N 1 es decir HN = i=1 i . Una posible soluci´n para evitar ese valor ser´ quitar de alguna forma o ıa el primer t´rmino del sumatorio.27) Ejemplo 3 vamos a estimar el crecimiento del N-´simo n´mero harm´nico. por lo tanto la f´rmula (1. 1 La funci´n f (x) = x es una funci´n decreciente. N + 1] se verifica : o N 0 N N +1 f (x)dx ≥ SN = i=1 f (i) ≥ f (x)dx 1 (1.

El n´mero γ es la constante de Euler y su valor es aproximadamente γ = 0. Dado un Algoritmo A y un tama˜o N definimos el espacio de entradas (EA (N )) n de tama˜o N para el algoritmo A como: n EA (N ) = {I entradas de A : τ (I) = N } (1. u (En el a˜o 2006 se alcanz´ el record de cifras calculadas de la constante de Euler n o con un total de 116 millones de cifras decimales exactas). Complejidad de Algoritmos Hasta ahora hemos calculado el tiempo abstracto de ejecuci´n de algunos o algoritmos calculando el n´mero de veces que se ejecutaba la operaci´n b´sica u o a del algoritmo. En principio podr´ ıamos establecer EBSort (N ) = {(T.. P. Ejemplo 1: EBSort (N ). Sin embargo las funciones f solamente dependen del tama˜o de la entrada τ (I). 2. U ) : U − P + 1 = N } . ya que el trabajo (n´mero de operaciones b´sicas) que realiza un algoritmo depende de u a cada entrada en particular.. P. En vista de lo anterior ¿qu´ funci´n f deber´ e o ıamos usar para comparar BSort con otros algoritmos? ¿N 2 o N − 1? Est´ claro que tenemos que controlar la a dependencia del rendimiento de alguna manera independiente de las entradas individuakes que se consideren.. Tambi´n hemos comparado algoritmos mediante la comparaci´n e o asint´tica de las funciones que acotaban el n´mero de operaciones b´sicas como o u a funci´n del tama˜o de la entrada nA (I) ≤ f (τ (I)). para ello definimos o el Espacio de Entradas de un Algoritmo.Se puede demostrar tambi´n que l´ N →∞ (HN − log N ) = γ constante y por e ım tanto HN = log N + O(1). U ) ≤ N2 2 − N 2 que es una cantidad elevada. Tenemos que precisar la funci´n que vamos a comparar. o Si A = BSort se tiene nBSort (T.. nBSort ([1.577. . Como ejemplo de este desequilibrio retomemos el n ejemplo de la ordenaci´n mediante burbuja BSort. 1. P...8. en el esquema anterior hay un cierto desequilibrio.30) Vamos a calcular algunos espacios de entrada. N ]. U ) = N − 1 que es un valor mucho menor que el anterior. o n Sin embargo.

Con esta observaci´n podemos establecer que 1 ≤ T [i] ≤ o N. 12]. el u tama˜o del espacio de entradas es |EBBin (N )| = N + 1. 2] que al ordenar a la tabla T ′ = [25. Sin embargo al estar la tabla T ordenada podemos tomar T = [1. P. basta considerar una clave e ˆ gen´rica k = [1.. por tanto. 2. A la hora de o buscar una clave k que est´ en la tabla. por ejemplo. 3. que corresponden a las b´squedas con ´xito y un elemento que no est´ en T y que u e a por tanto corresponde a las b´squedas con fracaso.. U − P + 1 = N.. 3. los N elementos de la tabla T . N ]. T ordenada} De nuevo estamos ante un espacio inmanejable por ser demasiado general. .32) Por tanto. da igual cuales sean los elementos T [i] e de la tabla (por supuesto.. por e a tanto una primera acotaci´n simple ser´ imponer P = 1 y U = N . al igual que en el caso de la burbuja. o ıa Tambi´n podemos observar que no son importantes los n´meros que est´n e u e en la tabla T . En el caso de la b´squeda binaria podemos establecer como primera aproxiu maci´n el siguiente espacio de entradas: o EBBin (N ) = {(T. Con estas observaciones podemos establecer que EBSort (N ) = P ermutaciones de N Elementos = ΣN (1. U. U = N . 3. . es decir.31) Este espacio es mucho m´s manejable que el que ten´ a ıamos inicialmente. . cualquier tabla T (por grande que sea). Este espacio de entradas es demasiado general (y demasiado grande) por lo que convendr´ precisar un espacio de entradas EA (N ) mucho m´s manejable. podemos. n Ejemplo 2: EBBin (N ). m´s dos n´meros enteros a u cualesquiera tales que U − P + 1 = N . La primera acotaci´n simple puede ser de nuevo P = 1. el espacio de entradas est´ formado por las N + 1 posibles claves a que podemos pasarle al algoritmo. 2. han de estar ordenados). no los valores iniciales y finales P y U . en general. En este caso.N ]. BSort realizar´ las mismas comparaciones al ordenar la tabla T = [3. tenemos que observar que lo que importa en T . Con estas observaciones podemos establecer el siguiente e espacio de entradas para BBin: ˆ EBBin (N ) = {1. k} (1. k) : k cualquiera. 2. asumir que la tabla T verifica 1 ≤ T [i] ≤ N . sino el desorden relativo entre ellos. Es decir. n . N.. es que la tabla est´ m´s o menos desordenada. ıa a Para ello. 1. Su tama˜o es |EBSort (N )| = |ΣN | = N !. por tanto... Tambi´n e podemos observar que BBin realiza siempre el mismo trabajo para cualquier clave que no est´ en la tabla por lo que a efectos de trabajo.Es decir.

Como BA (N ) ≤ nA (I) ≤ WA (N ) para todo I ∈ EA (N ) se verifica que BA (N )p(I) ≤ nA (I)p(I) ≤ WA (N )p(I)∀I ∈ EA (N ) y por tanto I∈EA (N ) BA (N )p(I) ≤ I∈EA (N ) nA (I)p(I) ≤ WA (N )p(I) I∈EA (N ) Como I∈EA (N ) p(I) = 1 se tiene: BA (N ) ≤ AA (N ) ≤ WA (N ) (1. Los casos m´s interesantes e o a suelen ser WA (N ) y AA (N ). Dado un algoritmo A con espacio de entradas de tama˜o N . EA (N ).35) donde p(I) es la probabilidad con la que aparece la entrada I.9.36) Los casos m´s simples (aunque no siempre) de calcular son WA (N ) y BA (N ) para a los cuales daremos un m´todo de general estimaci´n.33) (1. definimos: n Caso Peor WA (N ) = max{nA (I) : I ∈ EA (N )} Caso Mejor BA (N ) = min{nA (I) : I ∈ EA (N )} Caso Medio AA (N ) = I∈EA (N ) (1. Mejor y Medio Una vez definido el espacio de entradas de un algoritmo. Casos Peor. vamos a definir lo que entendemos por casos peor. .34) nA (I)p(I) (1.1. mejor y medio del algoritmo.

Vamos a calcular WBSort (N ). Paso 1: Encontrar fA tal que si τ (I) = N nA (I) ≥ fA (N ) ˜ Paso 2: Encontrar una entrada I tal que ˜ nA (I) ≤ fA (N ) Ejemplo 1: WBSort (N ). C´lculo de los casos peor y mejor a El c´lculo del caso mejor de un algoritmo para un tama˜o de entrada N se a n puede realizar en general en dos pasos: Paso 1: Encontrar fA tal que si τ (I) = N nA (I) ≤ fA (N ) A veces.1. 1]. en lugar de pedir la desigualdad estricta pediremos nA (I) = O(fA (N )).. . caso peor de la burbuja para tablas de N ele2 mentos. Para el paso 1 ya vimos que nBSort (σ) ≤ N − N ∀σ ∈ ΣN y por tanto 2 2 podemos decir N2 N N2 − = + O(N ) 2 2 2 Para el paso 2 tomamos σ = [N.2. N − 2.. juntando 1 y 2 obtenemos WA (N ) = fA (N ) o bien WA (N ) = Θ(fA (N )) El caso mejor se calcula de una forma similar. ˜ Paso 2: Encontrar una entrada I tal que ˜ nA (I) ≥ fA (N ) A partir de estos dos pasos obtenemos las siguientes desigualdades: Por 1: WA (N ) ≤ fA (N ) o bien WA (N ) = O(fA (N )) Por 2: WA (N ) ≥ fA (N ) o bien WA (N ) = Ω(fA (N )). Es f´cil ver que ˜ a N N2 nBSort (˜ ) = 2 − 2 con lo que se tiene: σ WBSort (N ) ≤ . y por tanto. N − 1..10.

ind U. La operaci´n b´sica es la comparaci´n de clave si k == T [i] dentro del bucle. 1. k cualquiera} donde ΣN es el conjunto de permutaciones de N elementos. tomando P = 1. o a o Para un tama˜o de entrada N podr´ n ıamos proponer como espacio de entradas.37) En este caso. Una posible simplificaci´n es suponer que o o todas las entradas son equiprobables. devolver error. por ejemplo. De nuevo este espacio es muy grande y podemos reducirlo. en a el caso de la b´squeda lineal. N. para el algoritmo BSort se tendr´ ıa: 1 ∀σ ∈ EBSort (N ) N! En el caso de la b´squeda binaria: u p(σ) = 1 ∀k ∈ EBBin (N ) N +1 En algunas ocasiones es relativamente f´cil calcular AA (N ). en este caso se tiene: WBSort (N ) = pA (I) = 1 |EA (N )| (1. El pseudoc´digo de la b´squeda lineal es el siguiente: o u p(k) = ind BLin(tabla T.ind P. u Ejemplo 2: ABLin (N ). clave k) para i de P a U si k==T[i] devolver i.WBSort (N ) ≥ Considerando ahora 1 y 2 obtenemos N2 N − 2 2 N2 N2 N − = + O(N ) 2 2 2 Se puede demostrar (se deja como ejercicio) que BBSort (N ) = N − 1. Si se trata de una b´squeda con ´xito. el trabajo para buscar una clave que est´ en la tabla u e e . En general el caso medio es m´s complicado ya que el resultado depende de a la distribuci´n de probabilidad p(I). U = N : EBLin = {σ ∈ ΣN .

N ]) = N ABLin (N ) = i=1 nBLin (i) 1 + N +1 N 1 N +1 b´squeda con exito u ´ b´squeda sin exito u ´ 1 = N +1 = N i+ i=1 N N +1 N 1 N (N + 1) N = + + O(1) N +1 2 N +1 2 O(1) Ejemplo 3: Ae (N ). 3. 3. Adem´s con este espacio tenemos e a dos posibles situaciones.38) ˆ ˆ con k una clave gen´rica tal que k = [1. 2.N ]. 2. esto es. 2. Si asumimos equiprobabilidad de las entradas se tiene: 1 . i .. el n´mero de cdcs es N pues se recorre la tabla completa. La clave no est´ en la tabla. a La clave est´ en la posici´n i de la tabla (es decir. a Para calcular el caso medio recurrimos a la definici´n o p(k == i. podemos de nuevo considerar como espacio de entradas: ˆ EBLin (N ) = {1. 1 ≤ i ≤ N ) = p(k = [1. k} (1. . Si la clave a o no est´ en la tabla. . N +1 Con estas observaciones es f´cil ver WBLin (N ) = N y BBLin (N ) = 1. En este caso se tiene nBLin = N .... . N. T [i] == k). 3. En este caso a o se tiene nBLin (i) = i..depender´ exclusivamente de la posici´n que ocupe la clave a buscar. BLin Vamos a calcular el caso medio de la b´squeda lineal con ´xito suponiendo u e ahora que: 1 log i p(k == i) = CN i donde CN es una constante de normalizaci´n necesaria para que p(k == i) verio fique la condici´n de distribuci´n de probabilidad. o o N N i=1 p(k == i) = 1 ⇒ i=1 1 log i = 1 ⇒ CN = CN i N i=1 log i . Por a u tanto.

N ]) = 0. o N 0 log x dx ≥ CN ≥ x N 0 N +1 1 log x dx x N +1 1 ⇒ 1 (log x)2 2 ≥ CN ≥ 1 (log x)2 2 Observamos..Como en este caso se trata de b´squedas con ´xito. pasa por sacar fuera del sumatorio el primer t´rmino: o e N CN = i=1 log 1 log i + = i 1 0 N i=2 log i = i N i=2 log i i con lo que se ahora se tiene: . La soluci´n. al igual que en el caso o de la serie harm´nica. que la o o o suma no queda bien acotada ya que log 0 = −∞.30). o o La funci´n f (x) = log x es una funci´n decreciente y por tanto tendremos o x que usar la f´rmula (1. 2. El problema de nuevo aparece por el l´ ımite inferior de la primera integral. al igual que ocurri´ en la estimaci´n de la serie harm´nica.. . la clave k a buscar u e siempre est´ en la tabla. para ello usaremos el m´todo de aproxe imaci´n por integrales. 3. a Aplicamos ahora la definici´n del caso medio: o N N AN = = Ae (N ) BLin N = i=1 nBLin (i)p(k == i) = i=1 N i 1 log i = CN i i=1 1 1 log i = CN CN log i i=1 = donde: SN .32). por lo tanto se tiene: SN ∼ N log N Ahora vamos a estimar el valor de CN . se tiene que p(k = [1. CN N SN = i=1 log i El valor de SN ya lo calculamos previamente en (1. es decir.

N 1 log x dx ≥ CN ≥ x N N +1 2 log x dx x N +1 1 ⇒ ≥ CN ≥ (log x)2 2 1 2 1 1 1 2 2 ⇒ (log N ) ≥ CN ≥ (log N + 1) − (log 2)2 2 2 2 1 Dividiendo ahora los tres t´rminos de la desigualdad por 2 (log N )2 se tiene: e 1 1 (log N + 1)2 (log 2)2 N →∞ CN 2 2 1≥ 1 ≥ 1 − 1 −→ 1 (log N )2 (log N )2 (log N )2 2 2 2 1 (log x)2 2 Por lo tanto N →∞ 1 (log 2 l´ ım CN 1 = 1 ⇒ CN ∼ (log N )2 2 2 N) SN CN Tenemos hasta ahora una igualdad AN = CN ∼ 1 (log N )2 y SN ∼ N log N . 2 Podemos suponer entonces que AN ∼ 1 (log 2 y dos igualdades asint´ticas o 2N N log N = 2 log N N) Para ver que lo anterior es cierto tenemos que comprobar que l´ ım AN 2N log N N →∞ =1 Para ello reescribimos el l´ ımite anterior de la siguiente manera: SN CN N log N 1 (log N )2 2 N →∞ l´ ım AN 2N log N = l´ ım N →∞ = l´ ım N →∞ SN N log N 1 CN 1 (log N )2 2 =1 y por tanto: AN ∼ 2N log N .

Sign up to vote on this title
UsefulNot useful