Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Objetivos
Al nalizar el curso el alumno:
Ser capaz de estimar los recursos de cmputo (memoria y tiempo) que
un algoritmo requiere para ejecutarse.
Conocer y ser capaz de utilizar tcnicas de diseo adecuadas para
construir soluciones ecientes a diversas clases de problemas.
Reconocer los problemas para los cuales no se conoce solucin algortmica prctica y podr aplicar criterios para darles soluciones aproximadas ecientes.
Prefacio
El concepto de algoritmo es de importancia central en las ciencias de la
computacin; matemticos y cientcos de la computacin lo han denido
en forma diferente. La palabra proviene del nombre de un matemtico y astrnomo medieval de Uzbekistn, Mohammed ibn-Musa al-Khwarizmi, quien
dio las reglas para efectuar las 4 operaciones aritmticas bsicas (suma, resta,
multiplicacin y divisin) en el siglo IX.
El astrnomo medieval se estableci en Bagdad en la Casa del Conocimiento (Bait al-Hikma); escribi dos libros que jugaron un papel importante
en la historia de las matemticas, uno de los cuales concierne al arte indio
de contar. Cuando su obra apareci traducida al latn en Europa, los lectores empezaron a atribuirle no slo el libro sino, tambin, un esquema de
numeracin que hace uso de numerales indios, esto ltimo se le atribuy errneamente. La nueva notacin se convirti en la de al-Khwarizmi, y en forma
descuidada fue nombrada algorismi y, nalmente, algorism o algorithm.
Esta palabra, originalmente derivada del nombre al-Khwarizmi, ahora signica, ms ampliamente, cualquier regla particular de proceder u operar (tal
como lo es el mtodo euclidiano para encontrar el mximo comn divisor
de dos enteros). A partir de entonces y hasta nuestros das, la palabra, por
todo lo que representa, ha motivado muchos estudios de tipo terico tanto
en matemticas como en computacin.
En la primera parte de este curso se introducen los conceptos bsicos
para el anlisis de algortmos; se propone un procedimiento para estimar la
cantidad de recursos que un algoritmo consume cuando se ejecuta en una
computadora. Lo anterior nos permite conocer su valor prctico, es decir,
determinar si existe una solucin algortmica eciente para un problema en
particular. Enseguida, se da importancia a la velocidad de crecimiento de la
demanda de recursos por un algoritmo, conforme el tamao del problema que
resuelve se incrementa. El procedimiento presentado nos permite comparar
5
6
y evaluar los costos de algoritmos tanto iterativos como recursivos.
En la segunda parte del curso nos avocamos al estudio de las principales
tcnicas de diseo de algoritmos. Para cada una de ellas se caracterizan los
problemas a los que la tcnica se puede aplicar, se presenta el mtodo general
y se dan algunos ejemplos.
Finalmente, la tercera parte del curso est enfocada al estudio de la teora en torno a los problemas cuya solucin algortmica no se conoce o la
conocida requiere tantos recursos que en trminos prcticos no resuelve mas
que problemas triviales. La teora presentada permite identicar estos problemas as como tambin encontrar soluciones aproximadas (no ptimas pero
aceptables).
ndice general
I Anlisis de algoritmos
11
1. Introduccin
13
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
2. Comportamiento...
2.1.
2.2.
2.3.
2.4.
2.5.
Dominio asinttico . . . . . . . . . . . . .
Notacin de orden . . . . . . . . . . . . . .
Interpretacin de los conceptos enunciados
Dominio asinttico con lmites . . . . . . .
Ejercicios . . . . . . . . . . . . . . . . . .
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
14
14
15
25
29
29
36
41
43
46
49
49
52
52
52
53
57
59
59
60
62
76
77
NDICE GENERAL
4.5. Ejercicios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 80
II
6. Mtodo vido
6.1.
6.2.
6.3.
6.4.
Problemas Tipo . . . . . . . . . . . . . . .
Almacenamiento en Cintas . . . . . . . . .
Problema de la mochila . . . . . . . . . . .
Intercalacin ptima de archivos . . . . . .
6.4.1. Problema . . . . . . . . . . . . . .
6.4.2. Estrategia . . . . . . . . . . . . . .
6.4.3. Generalizacin a arboles de grado k
6.4.4. Aplicacin : Cdigo de Human . .
6.5. Arboles Generadores mnimos . . . . . . .
6.5.1. Problema . . . . . . . . . . . . . .
6.5.2. Estrategia . . . . . . . . . . . . . .
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
83
87
. . . . . . . . . . . 87
. . . . . . . . . . . 88
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
89
92
95
101
105
105
106
108
112
112
113
115
115
116
116
116
119
119
120
122
123
123
125
126
126
127
128
NDICE GENERAL
8. rboles de juego
8.1.
8.2.
8.3.
8.4.
8.5.
Problema . . . . . . .
Solucin . . . . . . . .
Mtodo Min-Max . . .
Funciones de Utilidad .
Gato (n-en lnea) . . .
8.5.1. Poda alfa-beta .
8.5.2. Reglas . . . . .
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
133
133
134
134
134
136
136
136
137
III Problemas NP
141
143
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
143
144
150
151
155
156
157
10
NDICE GENERAL
Parte I
Anlisis de algoritmos
11
Captulo 1
Introduccin
En las Ciencias de la Computacin cuando se dice que un problema tiene solucin, signica que existe un algoritmo susceptible de implantarse en
una computadora, capaz de producir la respuesta correcta para cualquier
instancia del problema en cuestin.
Para ciertos problemas es posible encontrar ms de un algoritmo capaz
de resolverlos, lo cual nos enfrenta al problema de escoger alguno de ellos. La
tarea de decidir cul de ellos es el mejor debe basarse en criterios acordes a
nuestros intereses. En la mayora de los casos la eleccin de un buen algoritmo
est orientada hacia la disminucin del costo que implica la solucin del
problema; bajo este enfoque es posible dividir los criterios en dos clases:
a) Criterios orientados a minimizar el costo de desarrollo: claridad, sencillez y facilidad de implantacin, depuracin y mantenimiento.
b) Criterios orientados a disminuir el costo de ejecucin: tiempo de procesador y cantidad de memoria utilizados.
Si el programa que implanta el algoritmo se va a ejecutar unas cuantas
veces, el costo de desarrollo es dominante, en este caso se debe dar ms
peso a los primeros criterios. Por el contrario, si el programa se va a utilizar
frecuentemente, dominar el costo de ejecucin, y por ende, se debe elegir un
algoritmo que haga uso eciente de los recursos de la computadora, es decir,
se le debe evaluar prioritariamente bajo los criterios de la segunda clase. En
cualquier caso, ninguno de los criterios de evaluacin debe eliminarse por
completo; pues, por ejemplo, si se implanta un sistema con algoritmos muy
13
14
CAPTULO 1. INTRODUCCIN
ecientes pero confusos, puede suceder que despus no sea posible darle el
mantenimiento adecuado.
Los recursos que consume un algoritmo pueden estimarse mediante herramientas tericas y constituyen, por lo tanto, una base conable para la
eleccin de un algoritmo. En las Ciencias de la Computacin, la actividad
dedicada a determinar la cantidad de recursos que consumen los algoritmos
se le denomina anlisis de algoritmos.
La primera seccin de este captulo presenta los conceptos que nos permitirn introducir despus, en secciones posteriores, las tcnicas utilizadas para
la medicin de los recursos que consume un algoritmo y las bases tericas
sobre las que estas se fundamentan.
x log(0)
o
x (10 o 35)/3
x 2 + 8, mensaje Une('Hola','Mundo')
son efectivas, mientras que
x cardinalidad(nmeros naturales)
15
no lo es.
Si un conjunto de instrucciones tiene todas las caractersticas de un algoritmo, excepto ser nito en tiempo se le denomina proceso computacional.
Los sistemas operativos son el mejor ejemplo de proceso computacional, pues
estn diseados para ejecutar tareas mientras las haya pendientes, y cuando
stas se terminan, el sistema operativo entra en un estado de espera, hasta
que llegan ms, pero nunca termina.
Se asume que un problema tiene solucin algortmica si adems de que el
algoritmo existe, su tiempo de ejecucin es razonablemente corto. Por ejemplo, es posible disear un algoritmo para jugar ajedrez que triunfe siempre: el
algoritmo elige la siguiente tirada examinando todas las posibles secuencias
de movimientos desde el tablero actual hasta uno donde sea claro el resultado
y elige la tirada que le asegure el triunfo; el pequeo inconveniente de este
algoritmo es que dicho espacio de bsqueda se ha estimado en 100040 tableros
por lo que puede tardarse miles de aos en tomar una decisin. Por lo tanto,
para nes prcticos se considera que si un problema tiene una solucin que
toma aos en computar, dicha solucin no existe.
Considrese ahora el problema de ordenar un conjunto de valores, si el
conjunto tiene 2 elementos es ms fcil resolverlo que si tiene 20, anlogamente un algoritmo que resuelva el problema tardar ms tiempo mientras
ms grande sea el conjunto y requerir una cantidad de memoria mayor para
almacenar los elementos del conjunto.
En general la cantidad de recursos que consume un algoritmo para resolver un problema se incrementa conforme crece el tamao del problema.
Dependiendo del problema en particular, uno o varios de sus parmetros ser
elegido como tamao del problema. Haciendo una cuidadosa observacin, es
relativamente fcil efectuar una eleccin atinada.
En la Figura 1 se presenta una serie de problemas y una sugerencia acerca
del parmetro que se puede elegir como tamao del problema.
1.2.
Complejidad de algoritmos
16
CAPTULO 1. INTRODUCCIN
PROBLEMA
17
una variable simple, sin importar el tipo al que pertenezca. Las variables que
tengan valores de un tipo simple ocuparn una celda de memoria, mientras
que a las variables de tipos compuestos se les asignan tantas celdas como
requieran los elementos que las componen.
El tiempo que emplea un algoritmo en ejecutarse reeja la cantidad de
trabajo realizado, as, la complejidad temporal da una medida de la cantidad
de tiempo que requerir la implantacin de un algoritmo para resolver el
problema, por lo que se le puede determinar en forma experimental. Por
ejemplo, para encontrar el valor de la funcin complejidad de un algoritmo
A que se codica un lenguaje de programacin L, se compila utilizando el
compilador C y se ejecuta en la mquina M, damos algunas entradas al
programa y medimos el tiempo de procesador empleado para resolver los
casos del problema.
Proceder de esta manera presenta, entre otros, el inconveniente de que
los resultados obtenidos dependen de:
a) las entradas proporcionadas,
b) la calidad del cdigo generado por el compilador utilizado, y
c) de la mquina en que se hagan las corridas.
Para evitar que estos factores se reejen en el clculo de la funcin complejidad, el anlisis temporal (y el espacial) se har nicamente con base al
algoritmo escrito en pseudocdigo. Como el pseudocdigo no se puede ejecutar para medir la cantidad de tiempo que consume, la complejidad temporal
no se expresar en unidades de tiempo, sino en trminos de la cantidad de
operaciones que realiza. Cada operacin requiere cierta cantidad constante
de tiempo para ser ejecutada, por esta razn si se cuenta el nmero de operaciones realizadas por el algoritmo se obtiene una estimacin del tiempo
que le tomar resolver el problema.
Dado un algoritmo, se puede determinar que tipos de operaciones utiliza
y cuantas veces las ejecuta para una entrada especca. Observemos este
procedimiento en el siguiente ejemplo.
18
CAPTULO 1. INTRODUCCIN
termina.
cuando se introduzca el concepto de orden, se dir que ambas cantidades son del mismo orden
19
20
CAPTULO 1. INTRODUCCIN
mayor1 A[1];
mayor2 A[2];
mayor1 A[2];
mayor2 A[1];
i 3;
mientras i n haz
si A[i] > mayor1 entonces
mayor2 mayor1;
mayor1 A[i];
otrosi A[i] > mayor2 entonces
mayor2 A[i];
is
i i + 1;
zah
termina.
Algoritmo 2: Producto de los valores ms grandes de una lista de nmeros.
PROBLEMA
OPERACIN BSICA
Recorrer un rbol
Resolver un sistema de ecuaciones lineales
Ordenar un conjunto de valores
21
Ejemplo 3 Considrese el Algoritmo 1, para hacer el anlisis de su comportamiento tomemos como operacin bsica las comparaciones con elementos
del arreglo y como caso muestra: A = [2, 7, 4, 1, 3] y n = 5.
Si Valor = 2, se hace una comparacin, ft (5) = 1
Si Valor = 4, se hacen tres comparaciones, ft (5) = 3
Si Valor = 8, se hacen cinco comparaciones, y ft (5) = 5
Del Ejemplo 3 es posible descubrir que la funcin complejidad no es tal,
en realidad es una relacin, ya que para un mismo tamao de problema se
obtienen distintos valores de la funcin complejidad. Como ste, hay muchos
algoritmos en los que el nmero de operaciones depende, no slo del tamao
del problema, sino tambin de la instancia especca que se presente, entonces
de qu manera se puede expresar el valor de la funcin complejidad? A
continuacin damos una respuesta.
Sea I(n) = {I1 , I2 , I3 , . . . , Ik } el conjunto de instancias del problema cuyo
tamao es n. Sea O(n) = {O1 , O2 , O3 , . . . , Ok } el conjunto formado por el
nmero de operaciones que un algoritmo realiza para resolver cada instancia.
Entonces, Oj es el nmero de operaciones ejecutadas para resolver la instancia Ij , para 1 j k. Se distinguen tres casos en el valor de la funcin
complejidad temporal
22
CAPTULO 1. INTRODUCCIN
a) Peor caso
ft (n) = max({O1 , O2 , O3 , . . . , Ok })
b) Mejor caso
ft (n) = mn({O1 , O2 , O3 , . . . , Ok })
c) Caso medio
ft (n) =
k
X
Oi P (i)
i=1
Anlisis Temporal
i) Mejor caso: ocurre cuando el valor es el primer elemento del arreglo.
ft (n) = 1
ii) Peor caso: sucede cuando el valor no se encuentra en el arreglo.
ft (n) = n + 1
23
P (i) =
1
n+1
n+1
1 X
(n + 1)(n + 2)
n+2
ft (n) =
i=
=
n + 1 i=1
2(n + 1)
2
Anlisis Temporal
i) Mejor caso: ocurre cuando el arreglo est ordenado ascendentemente
(en cada iteracin slo hace la primera comparacin)
ft (n) = 1 + (1 (n 2)) = n 1
ii) Peor caso: el arreglo est ordenado de manera descendente (se hacen
dos comparaciones por iteracin en el ciclo)
ft (n) = 1 + (2 (n 2)) = 2n 3
|U |
iii) Caso medio: en este problema se tienen
n! casos, donde U es
n
el conjunto del que se extraen los elementos del arreglo.
Y para hacer el clculo se deben contar las operaciones que se haran en
cada caso.
24
CAPTULO 1. INTRODUCCIN
5
(5n 7)
ft (n) = 1 + (n 2) =
3
3
comparaciones.
Es importante mencionar que no todos los algoritmos presentan casos, y
resulta interesante tener una herramienta para detectar cundo se particionar el anlisis en casos; por el momento la nica ayuda con la que se cuenta
es la intuicin y preguntarse: se puede resolver el problema de manera trivial
para alguna instancia especca? Si la respuesta es armativa el algoritmo
tendr casos, por lo que el problema de deteccin se reduce a contestar esta
simple pregunta.
Con lo expuesto en esta seccin y con habilidades (formales e informales)
de conteo, se puede estimar la cantidad de recursos que un algoritmo consume; pero el objetivo no slo es conocer dicha cantidad, sino, ms an, poder
comparar el comportamiento de distintos algoritmos, con el n de decidir
cul de ellos utilizar bajo circunstancias especcas. En la siguiente seccin
se dan las bases tericas para tomar de manera conable la decisin.
1.3. EJERCICIOS
1.3.
25
Ejercicios
m1
m2
m3
m4
Ejercicio 1.2 El algoritmo 3 encuentra la representacin binaria de un entero decimal positivo. El algoritmo se basa en divisiones sucesivas por 2. As,
para un entero positivo N se calcula:
N = 2q0 + r0
q0 = 2q1 + r1
q1 = 2q2 + r2
..
.
qk1 = 2qk + rk
donde cada residuo ri es 0 o 1. El algoritmo se detiene cuando qk = 0. La
representacin binaria es entonces N 2 = rk rk1 . . . r1 r0 .
i) Denir uno de los parmetros como tamao del problema, justique su
eleccin.
26
CAPTULO 1. INTRODUCCIN
proc RepresentacinBinaria(N,N2)
comienza
y N;
i 0;
mientras (y 6= 0) haz
si par (y) entonces
otro
is
r[i] 0
r[i] 1;
y y1
y y/2;
i i + 1;
zah
k i 1;
N 2 r[0...k];
termina.
Ejercicio 1.4 Para el algoritmo de ordenamiento denominado Burbuja, efecte el anlisis temporal y espacial en todos los casos.
1.3. EJERCICIOS
27
b X[1];
para j 2 a n haz
si (X[j] < b) entonces
b X[j];
is
zah
termina.
(* b = min{x1 , x2 , . . . , xn } *)
Ejercicio 1.7 Dada una lista ordenada con representacin ligada sencilla,
escriba un algoritmo para insertar un elemento y obtenga la complejidad temporal del mismo.
28
CAPTULO 1. INTRODUCCIN
Captulo 2
Comportamiento Asinttico de
Funciones
2.1.
Dominio asinttico
30
CAPTULO 2. COMPORTAMIENTO...
En otros trminos, podemos decir que si una funcin domina a otra, su velocidad de crecimiento es mayor o igual. Si esas funciones estn representando
el consumo de recursos de la computadora, obviamente la funcin dominada
crecer a lo ms a la misma velocidad de la otra.
5
m|f (n)|
|g(n)|
|n| m|n3 |, n k,
31
|n2 | > m
n2 > m
|g(n)| m|c||g(n)|, n k
32
CAPTULO 2. COMPORTAMIENTO...
|g(n)| mc|g(n)|,
tomando m = 1c ,
1
|g(n)| c|g(n)|, n k
c
y k = 0,
|g(n)| |g(n)|, n 0
f d.a. g.
ii) Igualmente se tiene que demostrar que g d.a. f, esto es:
m 0, k 0 tales que
|cg(n)| m|g(n)|, n k
esto es,
c|g(n)| m|g(n)|, n k
tomando m = c y k = 0,
c|g(n)| c|g(n)|, n 0
g d.a. f.
En el siguiente ejemplo se consideran funciones que no se dominan en el
sentido asinttico.
Ejemplo 8 Sean
f (n) = n y g(n) =
1 si n es par
n3 si n es impar
33
n > m2
1
t(n) f (n)
t(n) = kf (n)
|t(n)| k|f (n)|
i.e. f (n) domina asintticamente a cualquier t(n), dicho de otra manera la
demanda de recursos se va a regir por el modelo de crecimiento que observe
f (n).
A continuacin se expone una serie de teoremas que establecen propiedades y relaciones basadas en el concepto de dominio asinttico.
34
CAPTULO 2. COMPORTAMIENTO...
f M f d.a.f.
Si tomamos m = 1 y k = 0 la desigualdad |f (n)| m|f (n)|, n k se
cumplen, por lo tanto f d.a. f y
la relacin es reexiva.
ii) P.D. La relacin es transitiva. Debemos mostrar que si f, g, h M tal
que f d.a. g y g d.a. h f d.a. h.
|g(n)| m1 |f (n)|, n k1
y
|h(n)| m2 |g(n)|, n k2
por lo que
35
|h(n)| |g(n)|, n k
|c + n| m|n|, n k
Si m = 2 y k = c, se cumple que
|c + n| 2|n|, n c
de lo anterior se tiene que g d.a. h y f d.a. g
f d.a. h.
ii) Demostrar que h d.a. f.
Demostraremos que h d.a. g, es decir, m 0, k 0 tales que |n|
m|n + c|, n k.
Para m = 1,
|n| |n + c|, n 0.
Por lo tanto h d.a. g y sabemos que g d.a. f h d.a. f,
f y h se dominan asintticamente.
El Teorema 2 induce a concebir el conjunto de funciones de N a R como
la unin de distintos subconjuntos ajenos, de tal manera que dos funciones
estn en el mismo subconjunto si se dominan asintticamente. Se sugiere
consultar los conceptos de relacin de equivalencia y particin [?].
36
CAPTULO 2. COMPORTAMIENTO...
37
f es O(g) y g no es O(f ).
ii) f (n) = n, g(n) = cn
f es O(g) y g es O(f ).
1
iii) f (n) = n, g(n) =
n3
si n es par
si n es impar
Demostracin 3 Tenemos
a) f es O(f ); dado que f d.a. f f es O(f ).
b) f es O(g) m1 0 y k1 0 tales que
|f (n)| m1 |g(n)|, n k1 .
P.D. cf es O(g) i.e., m 0, k 0, tales que
38
CAPTULO 2. COMPORTAMIENTO...
Si tomamos m = |c|m1
|f (n)| m1 |g(n)|, n k1
|h(n)| m2 |g(n)|, n k2
Sumando las desigualdades trmino a trmino
39
40
CAPTULO 2. COMPORTAMIENTO...
Demostracin 5 Tenemos,
41
1
+ 63 es O(1).
n2
1
f2 (n) = rn + + kn log n es O(n log n).
n
f3 (n) = .6n3 + 31n + 468 es O(n3 ).
f1 (n) =
2.3.
Utilizando las propiedades establecidas por los teoremas, podemos representar el conjunto de funciones de N a R como se muestra en la Figura 4
donde todas las funciones que estn en la corona O(f ) dominan asintticamente a f y son dominadas por f. Equivalentemente podemos decir que cada
corona representa un subconjunto de la particin inducida por la relacin de
equivalencia denida en el Teorema 5.
Ahora bien, si tenemos 2 algoritmos A1 y A2 que resuelven el mismo
problema y deseamos elegir el que requiera la menor cantidad de recursos,
haremos la eleccin calculando primero sus complejidades y luego el orden
de las mismas. Pueden ocurrir dos casos:
1. Que uno de los algoritmos, digamos A1 , tenga una funcin complejidad
f1 (n) que domine a f2 (n), pero que f2 (n) no domine a f1 (n), i.e. se
encuentran en particiones diferentes, expresado de otra manera:
42
CAPTULO 2. COMPORTAMIENTO...
O(c )
O(n log n)
O(log n)
O(1)
O(n)
O(n )
O(n!)
43
2.4.
Existen varias formas para mostrar que una funcin es o no, del mismo
orden que otra. A continuacin se da una denicin que se basa, principalf (n)
mente, en el comportamiento del cociente
cuando n tiende a ser innito,
g(n)
tal denicin implica el uso de lmites.
a) Si lm
f (n)
b) Si lm
= 0, f es O(g), pero g no es O(f ); i.e., f es de orden
n g(n)
menor que g.
f (n)
= , entonces f es de mayor orden que g.
n g(n)
c) Si lm
44
CAPTULO 2. COMPORTAMIENTO...
Esta denicin resulta clara, si estudiamos el comportamiento de las funciones f (n) = 1 y g(n) = n, cuando se toma el lmite del cociente n1 si
n . Armamos entonces que si los valores de n son grandes, g(n) crece
ms rpido que f (n) y el valor del lmite es 0, luego por el caso (b) de la
denicin anterior podemos armar que f (n) es O(g(n)).
n2
, y g(n) = 300n2 funciones de N a R. Mostrar,
2
usando la denicin de lmite, que O(f ) = O(g).
n2
2
1
,
600
De la Denicin 3(a) se tiene que son del mismo orden, pues el lmite es
distinto de cero (en general dos funciones que dieren por un factor constante
son del mismo orden).
Frecuentemente se usa la regla de L'Hpital para calcular el lmite, pues
encontrar el lmite para la derivada en ocasiones es ms sencillo que para la
funcin misma. La regla de L'Hpital establece que si
lm
n 300n2
lm f (n) = y lm g(n) =
entonces
f (n)
f 0 (n)
= lm 0
n g(n)
n g (n)
donde f 0 y g 0 son las derivadas de f y g respectivamente. Lo anterior tambin
es vlido con n 6 ** revisar <- **y solo si f (n) y g(n) son diferenciables.
Si se desea revisar el concepto de lmite y derivada sugerimos ver [?].
Los siguientes ejemplos aplican el resultado anterior.
lm
Ejemplo 11 Mostrar que f (n) = log n es O(n), pero g(n) = n no es O(log n).
Usando limites, la identidad log n = ln n log e y la regla de LHpital
f (n)
(ln n log e)
= lm
n g(n)
n
n
lm
= lm
1
n log e
1
1
= lm log e
n n
= 0,
n
45
n2
2n
= lm n
n
n e
n e
2
= lm n
n e
= 0,
lm
f (n)
= c,
n g(n)
lm
(2.1)
f (n)
<e
c
g(n)
f (n)
< 1, n k
c
g(n)
f (n)
g(n) c < 1, n k
|f (n)| < (c + 1)|g(n)|, n k
Con m = (c + 1), se tiene
46
CAPTULO 2. COMPORTAMIENTO...
2.5. Ejercicios
Ejercicio 2.1 Determine cuales de las siguientes funciones dominan asintticamente a las otras.
n, si n es par
i) f1 (n) =
n, si n es impar
ii) f2 (n) =
n+1
n+1
1
n2
Ejercicio 2.2 Para que valores de n se satisface la expresin 10n log n >
2n2 ?
Ejercicio 2.3
1. Agrupe las siguientes funciones; dos funciones f y g pertenecen al mismo grupo si y slo si se dominan asintticamente.
f1 (n) = n
f2 (n) = n3
f3 (n) = n log n
f4 (n) = n2 + log n
1
f5 (n) = n 2 + log n
f6 (n) = 3n!
f7 (n) = 2n
f8 (n) = log n
f9 (n) = n n3 + 9n5
f10 (n) = n2
f11 (n) = ln n
f12 (n) = (log n)2
2.5. EJERCICIOS
47
Ejercicio 2.4 Encuentre una funcin g(n) (de la forma AB ), tal que f (n)
sea O(g(n)), para cada uno de los siguientes casos:
i) f (n) = C(n, 2)
ii) f (n) =
iii) f (n) =
5n3 + 6
n+2
(n2 + 7)3n
2n
iv) f (n) = n!
Ejercicio 2.6 Cuando decimos que una expresin f (n) es O(log n), porqu
no es necesario especicar la base del logaritmo?
Ejercicio 2.7 Probar las siguientes aseveraciones, y vericar que cada una
de las contenciones es propia.
i) O(n) O(n log n)
ii) O(n log n) O(nd ), d > 1
iii) O(cn ) O(n!), c > 1
ii) Sean c, d R, donde 0 < c < d, entonces O(cn ) O(dn ) y la contencin es propia.
Ejercicio 2.11 Mostrar que para todas constantes a, b > 0 (log2 n)a es O(nb ).
48
CAPTULO 2. COMPORTAMIENTO...
Captulo 3
Anlisis de Algoritmos Iterativos
3.1.
Introduccin
Ejemplo 13 El algoritmo 5, realiza una ordenacin ascendente de los valores del arreglo A. Estimar su complejidad temporal.
Tamao del problema: n, la dimensin del arreglo A.
Operacin bsica:
Asignaciones.
Anlisis Temporal
a) Mejor Caso: Ocurre cuando el arreglo est ordenado,
50
ft (n) = n
=n
n
X
i=2
n
X
(i + 1)
i + (n 1)
i=2
n+1
=n
1 + (n 1)
2
n2 + 3n 4
ft (n) =
, es O(n2 ).
2
i+1
1
1X
(2 + 3 + 4 + + (i + 1)) =
j
i
i j=2
1 (i + 1)(i + 2)
=
1
i
2
(i + 1)(i + 2) 2
=
2i
i2 + 3i
=
2i
i+3
=
asignaciones.
2
3.1. INTRODUCCIN
51
ft (n) =
n
X
i+3
i=2
=
=
=
=
=
1X
n(i + 3)
2
1
n(n + 1)
1 + 3(n 1)
2
2
1
[n(n + 1) 2 + 6(n 1)]
4
1 2
(n + n 2 + 6n 6)
4
n2 7n
+
2 es O(n2 ).
4
4
proc InsercinDirecta(ini, n, A)
comienza
para i = ini + 1 a n haz
comienza
x A[i];
j i 1;
zah
A[j + 1] x;
termina
zah
termina.
Algoritmo 5: Ordenacin por Insercin Directa
52
3.2.1. Secuencia
Sea {I1 , I2 } una secuencia de instrucciones, con complejidades O(f ) y
O(g) respectivamente, entonces el orden de la secuencia es, por el Teorema
6, O(max(f, g)). Ver Figura 5.
?
I1
O(f )
?
I2
O(g)
?
53
I1
O(f )
@ F
I2
O(g)
3.2.3. Iteracin
Si el bloque de complejidad O(f ) se realiza n veces, deducimos que la iteracin es O(nf (n)). En muchas ocasiones la complejidad del bloque depende
de algn ndice. Si la complejidad es O(f (i)) para 1 i n la complejidad
n
X
de la iteracin es
f (i). Ver gura 7.
i=1
cij =
n
X
k=1
aik bkj ,
i, j [1, n].
54
I1
O(f )
V
@
@
F
?
C[i, j] 0;
para k = 1 a n haz
C[i, j] C[i, j] + A[i, k] B[k, j];
zah
zah
zah
termina.
I1
I2
I3
I4
I5
55
Anlisis Temporal
De manera informal podemos decir que para obtener una entrada de cij
se hacen n multiplicaciones, como la matriz C tiene n n entradas se tiene
que:
ft (n) = n(n2 ) = n3 es O(n3 ).
Nosotros podemos obtener el resultado anterior, si asignamos un orden
(segn su comportamiento asinttico) a cada bloque de instrucciones segn
las estructuras de control:
a) I5 tiene orden constante, entonces es O(1)
b) Como I5 est dentro del ciclo I4 entonces el orden es O(n 1) = O(n).
c) El ciclo I2 contiene al conjunto de instrucciones I3 e I4 , si I3 es O(1)
se tiene que la secuencia tiene orden O(n), pero sta se realiza n veces,
as el orden para este bloque es O(n n) = O(n2 ).
d) Por ltimo, el ciclo I1 contiene a la instruccin I2 que se realiza n veces
de sta forma el orden para I1 , y en consecuencia para el Algoritmo 6,
es:
O(n n2 ) = O(n3 ).1
Anlisis Espacial
n
X
k=1
1 = n, c)
n
X
j=1
n = n2 y d)
n
X
i=1
n2 = n3 .
56
n
X
A[i]z i un po-
i=0
polinomio 0;
para i = 0 a n haz
polinomio polinomio z + A[n i];
zah
termina.
I1
I2
I3
Anlisis Temporal
a) I3 es de orden O(1),
b) I2 contiene a la instruccin de orden O(1), que se ejecuta n veces, de
esta manera el orden de I2 es O(n),
c) El orden de ft (n) para el Algoritmo 7, est dado por la secuencia I1 ,
de orden O(1), e I2 ; tomando max(O(I1 ), O(I2 )) se tiene:
ft (n) es O(n).
3.3. EJERCICIOS
57
Anlisis Espacial
3.3.
Ejercicios
r es el residuo
zah
Mximo-Comn-Divisor a;
termina.
Algoritmo 8: Mximo comn divisor de dos enteros
58
Ejercicio 3.3 Disee un algoritmo iterativo para los algoritmos de ordenacin Quicksort y Mergesort. Encuentre la complejidad temporal y espacial
para cada uno de ellos.
Captulo 4
Anlisis de Algoritmos Recursivos
4.1.
Introduccin
60
Factorial 1;
Factorial n F actorial(n 1);
61
f (0) = 0.
Si se tiene una condicin inicial, tal como f (0) = 0, entonces podemos
calcular f (n), usando la ecuacin recurrente, para otros valores de n. As
f (1) = f (0) + 1 = 1
f (2) = f (1) + 1 = 2
f (3) = f (2) + 1 = 3
f (4) = f (3) + 1 = 4
Una solucin a un sistema recurrente es una funcin que satisface la ecuacin recurrente y las condiciones iniciales.
La solucin a nuestro sistema es f (n) = n.
Comprobmoslo:
62
=0
= f (n 1) + 1
= (n 1) + 1
=n
f (n) f (n 1) = 1
63
expandemos la recurrencia
f (n) f (n 1) = 1
f (n 1) f (n 2) = 1
f (n 2) f (n 3) = 1
..
.
f (2) f (1) = 1
f (1) f (0) = 1
f (0) = 0
sumando todas las ecuaciones
f (n) = 1| + 1 +{z + 1}
n veces
f (n) = n
P (n) nP (n 1) = 0
nP (n 1) n(n 1)P (n 2) = 0
..
.
n(n 1)(n 2) . . . 2 P (1) n(n 1)(n 2) 1 P (0) = 0
P (0) = 1
64
Los sistemas recurrentes obtenidos cuando se intenta calcular la complejidad de los algoritmos recursivos con frecuencia se ajustan a alguna forma
estndar y si conocemos la solucin genrica para sa forma, nos ahorraremos
el tener que hallar la solucin cada vez que se presente un caso as. El sistema
de nuestro ejemplo inicial es de la siguiente forma:
f (1) = a,
f (n) = cf (n 1) + b
f (n) cf (n 1) = b
cf (n 1) c2 f (n 2) = cb
c2 f (n 2) c3 f (n 3) = c2 b
..
.
n2
n1
c f (2) c f (1) = cn2 b
cn1 f (1) = cn1 a
sumando todas las ecuaciones tenemos
n2
X
i=0
ci
65
sabemos que
n
X
ci = n + 1, si c = 1
i=0
n
X
i=0
ci =
cn+1 1
, si c 6= 1
c1
entonces si c = 1
f (n) = a + b(n 1)
y si c 6= 1
f (n) = cn1 +
b(cn1 1)
c1
b(cn1 1)
.
c1
A continuacin ilustramos el uso del teorema anterior para resolver problemas donde el sistema recurrente resultante se ajusta a la forma especicada
por el teorema.
f (1) = k
f (h) = kf (h 1)
66
f (h) = kk h1 = k h .
is
termina.
termina
Anlisis Temporal
La relacin de recurrencia esta dada por
ft (1) = 1
ft (n) = 2f (n 1) + 1
67
ft (n) = 2
n1
2n1 1
+
= 2n1 + (2n1 1) = 2n 1 es O(2n ).
1
Hasta ahora slo hemos analizado algoritmos que utilizaban memoria esttica, los Algoritmos 10 y 11, por ser recursivos, requieren espacio para almacenar los registros de activacin de las diferentes llamadas, de tal manera
que mientras ms anidacin de ambientes exista, mayor cantidad de memoria consumirn. Los siguientes ejemplos ilustran el clculo de la complejidad
espacial dinmica para algoritmos recursivos.
Anlisis Espacial
El algoritmo recibe 4 parmetros y necesita una localidad de memoria
adicional para almacenar la direccin de retorno. Para resolver un problema
de tamao n > 1, el algoritmo debe almacenar los valores de las variables y su
direccin de retorno, por lo tanto necesitar 5 celdas de memoria dinmica,
ms las que consuma para resolver un problema de tamao n1. Observamos
que hace 2 llamadas recursivas con argumento n1, pero cuando el primero de
ellos termina, la memoria consumida se libera y es reutilizada por la segunda
llamada, entonces podemos expresar la funcin complejidad espacial por el
siguiente sistema:
fe (1) = 5,
pues para n = 1 no se hacen llamadas recursivas
fe (n) = fe (n 1) + 5
Para aplicar el Teorema 9, hacemos a = 5, b = 5, c = 1 y obtenemos
Ejemplo 21 Encontrar la complejidad, espacial y temporal, para el algoritmo que evala la potencia de un nmero baseexp (Algoritmo 11).
Tamao del problema:
n, el exponente.
68
P otencia base
P otencia base Potencia(base, exp 1);
69
c(anlogb a 1)
a1
f (bk ) af (bk1 ) = c
af (bk1 ) a2 f (bk2 ) = ac
..
.
ak1 f (b1 ) ak f (b0 ) = ak1 c
sumando las ecuaciones
f (bk ) = c + ac + + ak1 c + ak c
=c
k
X
ai
i=0
f (bk ) = c(k + 1)
c(ak+1 1)
a1
c
=
(aak 1)
a1
f (bk ) =
70
pero
alogb n = blogb a
logb n
= blogb n logb a
= blogb a logb n
= blogb n
logb a
= nlogb a
entonces
c
(aalogb n 1)
a1
c
f (n) =
(anlogb a 1)
a1
f (n) =
71
f (1) c
n
f (n) af ( ) + c, para n = bk donde k > 0,
b
Con S{bk |b, k N b > 1, k > 0.} se tienen las soluciones:
1. si a = 1 entonces f es O(log n) en S
2. si a 6= 1 entonces f es O(nlogb a ) en S
g(1) = c
n
g(n) = ag( ) + c, para n = bk y k > 0
b
Por el Teorema 10 es fcil ver que la funcin g es O(log n) en S si a = 1, y
O(nlogb a ) en S si a 6= 1.
As tenemos que la funcin g es una cota para la funcin f en S, es decir
f (n) g(n), si n S.
Por la Denicin 4 la funcin f es O(log n) en S cuando a = 1 y f es
O(nlogb a ) en S si a 6= 1.
El siguiente ejemplo ilustra la aplicacin del teorema anterior.
72
func Cuenta(raiz)
comienza
si (tipo (raiz) = hoja)) entonces
otro
Cuenta 1
Cuenta 1 + Cuenta(hijoizq(raiz))
+Cuenta(hijoder (raiz));
is
termina.
Algoritmo 12: Cuenta el nmero de nodos en un rbol binario
Anlisis Temporal
n
2
>
n1
2
entonces ft ( n2 ) > ft ( n1
),
2
ft (1) 1
n
ft (n) 2f ( ) + 1
2
73
max A[ini]
comienza
inc
;
mitad bini+f
2
Mximo (ini, mitad, max);
Mximo (mitad + 1, f in, max_aux );
si (max_aux > max)
entonces max max_aux ;
is
termina
is
termina.
Algoritmo 13: Bsqueda del mximo en un arreglo de elementos
Tamao del problema:
Operacin bsica:
Casos:
Anlisis Temporal
ft (1) = 0
n
ft (n) = 2ft ( ) + 1
2
Este sistema recurrente cumple con las desigualdades,
ft (1) 1
n
ft (n) 2ft ( ) + 1
2
74
ft (n) es O(nlogb a ) en S
Como log2 2 = 1, entonces
Anlisis Espacial
Como es claro la complejidad espacial es de dos tipos:
1. Esttica
fee (n) = n
2. Dinmica
Se tiene el sistema recurrente:
75
log b
log bi
f (bi+1 ) m1 log bi (1 + 1)
f (bi+1 ) 2m 1 log bi
f (j) < f (bi+1 ) 2m1 log bi 2m1 log j
f (j) 2m1 log j
76
1
= 1+
i
n
2
1
dx = 1 + (ln x|x=n ln x|x=2 )
x
1 + ln n ln 2
por lo que podemos utilizar este valor para acotar la sumatoria sin perder de
vista que la igualdad es ahora una desigualdad.
4.4.
77
78
max A[ini];
min A[ini];
comienza
termina
termina.
Algoritmo 14: Bsqueda del mximo y el mnimo
c) comparaciones entre los mximos y los mnimos
d) operaciones involucradas en la obtencin del ndice mitad
las operaciones a y d las dejamos de lado por estar asociadas a ndices,
las operaciones b y c son buenos candidatos para hacer el anlisis. Consideraremos la operacin c.
Demostramos que O(nmero de comparaciones) = O(total de operaciones).
Dado que el arreglo es siempre de la forma 2k , el rbol de llamadas recursivas se puede representar por el rbol de la Figura 8, en donde cada nodo
est etiquetado con el tamao de problema que recibe.
En el rbol hay
g(n)
nodos internos, y
+
g(n) + 1 nodos externos por lo que hay
2g(n) + 1 nodos en total
en cada llamada recursiva se hacen a lo ms
79
n
2
n
2
n
4
n
4
n
4
n
4
80
4.5. Ejercicios
Ejercicio 4.1 Resuelva los siguientes sistemas recurrentes donde f (1) = 1
y para n 2
n
f (n) = 8f ( ) + n2
2
n
f (n) = 2f ( ) + log n
2
(4.1)
(4.2)
f (1) = 4
f (n) = (f (n 1))2
4.5. EJERCICIOS
81
f (1) = 2
f (n) = 2f (n 1) + 1
f (1) = 1
n
f (n) = f (n 1) +
2
(4.3)
(4.4)
Ejercicio 4.5 Elabore algoritmos recursivos para resolver los siguientes problemas y calcule su complejidad temporal y espacial.
82
1. Implemente un algoritmo basado en este mtodo y muestre que el nmero de operaciones bsicas que hace es, aproximadamente, n2 .
2. Discuta la importancia del algoritmo para resolver otro tipo de problemas que involucran matrices n n (obtener la matriz inversa, solucin
de sistemas de ecuaciones lineales simultneas, etc.)
Ejercicio 4.8 La longitud de camino de un rbol es la suma de los niveles de todos los nodos en el rbol. Si en la suma se consideran nicamente
los niveles de los nodos externos, a sta se llama la longitud de camino externo. Escriba un algoritmo recursivo para calcular tal longitud en un rbol
binario. Determine el orden del nmero de operaciones bsicas que realiza su
algoritmo.
Ejercicio 4.9 Escriba una versin recursiva del Algoritmo 8 (vease el ejercicio 3.2).