Está en la página 1de 82

Anlisis de Algoritmos

Elizabeth Prez Corts


Ren Mac Kinney Romero
Universidad Autnoma Metropolitana
12 de septiembre de 2005

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

1.1. Conceptos Bsicos . . . . . .


1.1.1. Denicin de algoritmo
1.2. Complejidad de algoritmos . .
1.3. Ejercicios . . . . . . . . . . .

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

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 . . . . . . . . . . . . . . . . . .

3. Anlisis de Algoritmos Iterativos


3.1. Introduccin . . . . . . . . .
3.2. Anlisis por bloques . . . .
3.2.1. Secuencia . . . . . .
3.2.2. Seleccin condicional
3.2.3. Iteracin . . . . . . .
3.3. Ejercicios . . . . . . . . . .

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

4. Anlisis de Algoritmos Recursivos


4.1. Introduccin . . . . . . . . . . . .
4.2. Sistemas recurrentes . . . . . . .
4.2.1. Expansin de recurrencias
4.3. Aproximando por integrales . . .
4.4. Eleccin de la operacin bsica .
7

.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

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

Tcnicas de Diseo de Algoritmos

5. Dividir para vencer

5.1. Forma genrica . . . . . . . . . . . . . . .


5.2. Forma de la Funcin Complejidad . . . . .
5.3. Mergesort
Ordenamiento por intercalacin . . . . . .
5.3.1. Problemas del algoritmo Mergesort.
5.4. Quicksort . . . . . . . . . . . . . . . . . .
5.5. Ejercicios . . . . . . . . . . . . . . . . . .

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 . . . . . . . . . . . . . .

7. Bsqueda con retroceso (Backtrack)


7.1. Problemas Tipo . . . . . . . .
7.2. Mtodo de Solucin . . . . . .
7.3. n Reinas . . . . . . . . . . . .
7.3.1. Restricciones explicitas
7.3.2. Restricciones implcitas
7.4. Suma de Subconjuntos . . . .
7.4.1. Formulacin 1 . . . . .
7.4.2. Restricciones . . . . .
7.4.3. Formulacin 2 . . . . .
7.4.4. Restricciones . . . . .

.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.

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

7.5. Coloreado de grcas . . . . . . . . . . . . . . . . . . . . . . . 128


7.5.1. Solucin . . . . . . . . . . . . . . . . . . . . . . . . . . 129

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

9. Complejidad de los algoritmos diseados con Backtrack.

137

III Problemas NP

141

10.Problemas Tratables e Intratables

143

9.1. Planicacin y Acotamiento . . . . . . . . . . . . . . . . . . . 138


9.1.1. Problema de la ramicacin y acotamiento . . . . . . . 138
9.1.2. Bsqueda de menor costo . . . . . . . . . . . . . . . . 139

10.1. Algoritmos No Deterministicos . . . . . . . .


10.2. Interpretaciones . . . . . . . . . . . . . . . .
10.3. Problema de decisin del Clan . . . . . . . .
10.4. Problema de la cobertura de nodos . . . . .
10.5. Problema de la planeacin . . . . . . . . . .
10.6. Generacin de cdigo ptimo . . . . . . . . .
10.7. Problemas NP Computables y No decidibles

.
.
.
.
.
.
.

.
.
.
.
.
.
.

.
.
.
.
.
.
.

.
.
.
.
.
.
.

.
.
.
.
.
.
.

.
.
.
.
.
.
.

.
.
.
.
.
.
.

.
.
.
.
.
.
.

.
.
.
.
.
.
.

.
.
.
.
.
.
.

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.

1.1. Conceptos Bsicos


En esta seccin presentamos los conceptos bsicos del anlisis de algoritmos.

1.1.1. Denicin de algoritmo


Un algoritmo es un conjunto nito de instrucciones no ambiguas y efectivas que indican cmo resolver un problema, producen al menos una salida,
reciben cero o ms entradas y, para ejecutarse, necesitan una cantidad nita
de recursos.
Una instruccin es no ambigua cuando la accin a ejecutar est perfectamente denida, por ejemplo, instrucciones del tipo:

x log(0)
o

x (10 o 35)/3

no pueden formar parte de un algoritmo.


Una instruccin es efectiva cuando se puede ejecutar en un intervalo nito
de tiempo, por ejemplo, las instrucciones

x 2 + 8, mensaje Une('Hola','Mundo')
son efectivas, mientras que

x cardinalidad(nmeros naturales)

1.2. COMPLEJIDAD DE ALGORITMOS

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

La funcin complejidad, f (n), donde n es el tamao del problema, da una


medida de la cantidad de recursos que un algoritmo necesitar al implantarse
y ejecutarse en alguna computadora. Puesto que la cantidad de recursos que
consume un algoritmo crece conforme el tamao del problema se incrementa,
la funcin complejidad es montona creciente (f (n) > f (m) n > m) con

16

CAPTULO 1. INTRODUCCIN

PROBLEMA

TAMAO DEL PROBLEMA

Bsqueda de un elemento en un conjunto


Multiplicar dos matrices
Recorrer un rbol
Resolver un sistema de ecuaciones lineales
Ordenar un conjunto de valores

Nmero de elementos en el conjunto


Dimensin de las matrices
Nmero de nodos en el rbol
Nmero de ecuaciones y/o incgnitas
Nmero de elementos en el conjunto

Figura 1: Eleccin del tamao del problema.


respecto al tamao del problema.
La memoria y el tiempo de procesador son los recursos sobre los cuales
se concentra todo el inters en el anlisis de un algoritmo, as pues distinguiremos dos clases de funcin complejidad:
a) Funcin complejidad espacial. Mide la cantidad de memoria que necesitar un algoritmo para resolver un problema de tamao n.
b) Funcin complejidad temporal. Indica la cantidad de tiempo que requiere un algoritmo para resolver un problema de tamao n; viene a
ser una medida de la cantidad de CPU que requiere el algoritmo.
La cantidad de memoria que utiliza un algoritmo depende de la implantacin, no obstante, es posible obtener una medida del espacio necesario con la
sola inspeccin del algoritmo. Para obtener esta cantidad es necesario sumar
todas las celdas de memoria que utiliza. En general se requerirn dos tipos
de celdas de memoria:
a) Celdas estticas. Son las que se utilizan en todo el tiempo que dura la
ejecucin del programa, por ejemplo, las variables globales.
b) Celdas dinmicas. Se emplean slo durante un momento de la ejecucin,
y por tanto pueden ser asignadas y devueltas conforme se ejecuta el
algoritmo, por ejemplo, el espacio de la pila utilizado por las llamadas
recursivas.
En este contexto, una celda de memoria no tiene una medida fsica en
correspondencia, se le utilizar slo para especicar el espacio empleado por

1.2. COMPLEJIDAD DE ALGORITMOS

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.

Ejemplo 1 Considrese el Algoritmo 1, que realiza bsqueda lineal sobre un

arreglo A con n elementos, y devuelve la posicin en la que se encuentra el


elemento Valor; si Valor no se encuentra devuelve n + 1. El algoritmo realiza
sumas (+), asignaciones (), comparaciones ( y 6=) y operaciones lgicas
().

18

CAPTULO 1. INTRODUCCIN

Si el ciclo mientras se realiza k veces, el algoritmo ejecutar las operaciones siguientes:

k sumas (una por cada iteracin).


k + 2 asignaciones (las del ciclo y las realizadas fuera del ciclo).
k + 1 operaciones lgicas (la condicin se debe probar k + 1 veces,
la ltima es para saber que el ciclo no debe volver a ejecutarse).
k + 1 comparaciones con el ndice.
k + 1 comparaciones con elementos de A.
k + 1 accesos a elementos de A.
6k + 6 operaciones en total.

func BsquedaLineal (V alor, A, n)


comienza
i 1;

mientras (i n) (A[i] 6= V alor) haz


i i + 1;
zah;
BsquedaLineal i;

termina.

Algoritmo 1: Bsqueda lineal


Del Ejemplo 1 notamos que el nmero de veces que se ejecutan algunas
operaciones, para valores sucesivamente mayores que k, presenta un modelo
de crecimiento similar al que tiene el nmero total de operaciones que ejecuta el algoritmo1 . Para hacer una estimacin de la cantidad de tiempo que
tarda un algoritmo en ejecutarse, no es necesario contar el nmero total de
operaciones que realiza. Se puede elegir alguna, a la que se identicar como
operacin bsica que observe un comportamiento parecido al del nmero total de operaciones realizadas y que, por lo tanto, ser proporcional al tiempo
1 Posteriormente,

cuando se introduzca el concepto de orden, se dir que ambas cantidades son del mismo orden

1.2. COMPLEJIDAD DE ALGORITMOS

19

total de ejecucin. Para el algoritmo anterior se puede contar cualquiera de


las operaciones mencionadas. En general, debe procurarse que la operacin
bsica, en la cual se basa el anlisis, de alguna forma est relacionada con el
tipo de problema que se intenta resolver, ignorando las asignaciones de valores iniciales y las operaciones sobre variables para control de ciclos (ndices).
La operacin bsica en el Algoritmo 1 (bsqueda lineal) es la comparacin
entre los elementos del arreglo y el valor buscado, pues cumple con las consideraciones anteriores.

Ejemplo 2 El Algoritmo 2 obtiene el producto de los dos valores ms gran-

des contenidos en un arreglo A de n enteros. Tomaremos este problema para


ejemplicar la eleccin de la operacin bsica con miras a hacer el anlisis
del algoritmo.
En este algoritmo se realizan las siguientes operaciones:
a) Comparacin entre mayor1 , mayor2 y los elementos del arreglo.
b) Asignaciones a mayor1 y mayor2
c) Asignacin al ndice i
d) Asignacin a la funcin
e) Producto de los mayores
f ) Incremento al ndice i
g) Comparacin entre el ndice i y la longitud del arreglo n
Las operaciones (c), (f) y (g) no se consideran por realizarse entre ndices, las operaciones (d) y (e) se ejecutan una sola vez y no son proporcionales al nmero total de operaciones. Entonces, se tiene que las operaciones
que se pueden considerar para hacer el anlisis son: las comparaciones entre
mayor1 , mayor2 y los elementos del arreglo y las asignaciones a los elementos
mayores.
Con el n de remarcar an ms la eleccin de la operacin bsica, la
Figura 2 ilustra la seleccin de operaciones bsicas en algunos algoritmos
muy comunes.
Resumiendo, el anlisis de un algoritmo se puede hacer considerando slo
aquella operacin que cumpla los siguientes criterios:

20

CAPTULO 1. INTRODUCCIN

func Producto2Mayores (A, n)


comienza
si A[1] > A[2] entonces
otro
is

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

Producto2Mayores mayor1 mayor2;

termina.
Algoritmo 2: Producto de los valores ms grandes de una lista de nmeros.

PROBLEMA

OPERACIN BSICA

Bsqueda de un elemento en un conjunto


Multiplicar dos matrices

Comparacin entre el valor y los elementos del conjunto


Producto de los elementos de las matrices
Visitar un nodo
Suma

Recorrer un rbol
Resolver un sistema de ecuaciones lineales
Ordenar un conjunto de valores

Comparacin entre valores

Figura 2: Eleccin de la operacin bsica para algunos problemas.

1.2. COMPLEJIDAD DE ALGORITMOS

21

a) Debe estar relacionada con el tipo de problema que se resuelve.


b) Debe ejecutarse un nmero de veces cuyo modelo de crecimiento sea
similar al del nmero total de operaciones que efecta el algoritmo.
Si ninguna de las operaciones encontradas cumple con ambos criterios,
es posible declinar el primero. Si aun as no es posible encontrar una operacin representativa, se debe hacer un anlisis global, contando todas las
operaciones.
En la teora de algoritmos es muy frecuente usar el trmino instancia para
indicar un caso especco de un problema. As, por ejemplo, si el problema
es la multiplicacin de 2 enteros positivos una instancia es el par de nmeros
a multiplicar, v.g. (1966, 24).
Con los conceptos enunciados hasta aqu es posible calcular la funcin
complejidad temporal ft (n) para un algoritmo simple. En el Ejemplo 3 se
calcula dicha funcin para el algoritmo 1.

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

donde P (i) es la probabilidad de que ocurra la instancia Ii .


En otras palabras, el mejor caso se presenta cuando para una entrada de
tamao n, el algoritmo ejecuta el mnimo nmero posible de operaciones, el
peor caso cuando hace el mximo y en el caso medio se consideran todos
los casos posibles para calcular el promedio de las operaciones que se hacen
tomando en cuenta la probabilidad de que ocurra cada instancia.
Los casos en la funcin complejidad espacial, se pueden denir anlogamente, considerando ahora el conjunto C(n), como el conjunto formado por
el nmero de celdas de memoria utilizadas por el algoritmo para resolver cada
instancia del problema.
En los Ejemplos 4 y 5 se ilustra el anlisis temporal de los Algoritmos 1
y 2. Para estos problemas el nmero de operaciones vara considerablemente
para instancias diferentes del mismo tamao.

Ejemplo 4 Algoritmo de bsqueda lineal.


Problema:

Tamao del Problema:


Operacin bsica:

Bsqueda lineal de un valor en un arreglo de


tamao n.
n = nmero de elementos en el arreglo.
Comparacin del valor con los elementos del
arreglo.

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

1.2. COMPLEJIDAD DE ALGORITMOS

23

iii) Caso medio:

ft (n) = 1P (1) + 2P (2) + 3P (3) + 4P (4) + ... + nP (n) + nP (n + 1)


donde P (i) es la probabilidad de que el valor se encuentre en la localidad
i, (1 i n) y P (n + 1) es la probabilidad de que no est en el arreglo. Si
se supone que todos los casos son igualmente probables

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

Ejemplo 5 Algoritmo producto mayores.


Problema:

Tamao del Problema:


Operacin bsica:

Dado un arreglo de valores, encontrar el


producto de los dos nmeros mayores.
n =nmero de elementos en el arreglo.
Comparacin entre los elementos del arreglo
y los mayores.

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

La tarea de conteo bajo esta metodologa resulta excesivamente laboriosa,


por lo que se recurrir a otro mecanismo. El algoritmo hace siempre una
comparacin al inicio y en el interior del ciclo puede ser que se realice una
comparacin o dos; obsrvese que para cada A[i] puede ser cierta una de tres
aseveraciones:
i) A[i] > mayor1 se hace una comparacin
ii) mayor1 A[i] > mayor2 se hacen dos comparaciones
iii) mayor2 A[i] se hacen dos comparaciones.
Si cada caso tiene la misma probabilidad de ocurrencia, entonces en promedio,
se harn
1
5
(1 + 2 + 2) =
3
3
comparaciones por iteracin, por lo tanto el algoritmo realizar en promedio

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

Ejercicio 1.1 La regla para multiplicar las matrices A y B de dimensin


2 2, y obtener C = AB, es:

c11 = a11 b11 + a12 b21


c21 = a21 b11 + a22 b21

c12 = a11 b12 + a12 b22


c22 = a21 b12 + a22 b22

sta involucra 8 multiplicaciones y 4 sumas.


Disee un algoritmo que use solamente 7 multiplicaciones. Cuntas sumas usa su algoritmo?
[Sugerencia. Exprese cada entrada de la matriz C, como una suma de las
frmulas de Strassen:

m1
m2
m3
m4

= (a11 + a22 )(b11 + b22 )


= (a21 + a22 )b11
= a11 (b12 b22 )
= a22 (b21 b11 )

m5 = (a11 + a12 )b22


m6 = (a21 a11 )(b11 + b12 )
m7 = (a12 a22 )(b21 + b22 )

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.

Algoritmo 3: Representacin binaria.


ii) Elija la operacin bsica para basar el anlisis temporal y calcule la
complejidad temporal.
iii) Muestre que si elige el valor del nmero N como el tamao del problema, el nmero de operaciones que requiere el algoritmo es b 10
log N c+1.
3

Ejercicio 1.3 Suponer que se desea encontrar el elemento menor de una


secuencia nita de enteros x1 , x2 , . . . , xn , usando el algoritmo 4.

i) Sugerir una medida razonable, para el tamao del problema.


ii) Realice el anlisis temporal y espacial para el algoritmo.

Ejercicio 1.4 Para el algoritmo de ordenamiento denominado Burbuja, efecte el anlisis temporal y espacial en todos los casos.

Ejercicio 1.5 Para el algoritmo 2 muestre que el modelo de crecimiento del


total de operaciones, conforme el tamao del problema se incrementa, es
similar al que observa la operacin bsica.

1.3. EJERCICIOS

27

proc BuscaMnimo (X)


comienza

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 } *)

Algoritmo 4: Valor mnimo.


Ejercicio 1.6 Se tiene un archivo de n registros y cada registro contiene m
datos que deben actualizarse peridicamente.

i) Disee un algoritmo que actualice tal archivo. Dicho algoritmo recibe


como entrada el nmero de registros en el archivo y una lista que contiene los nmero de registro que se han de actualizar. Si un nmero de
registro est en la lista, todos sus datos se actualizan.
ii) Denir uno de los parmetros como tamao del problema.
iii) Elegir una operacin bsica.
Calcular la complejidad temporal en el mejor caso, en el peor caso y en el
caso medio, asumiendo que P (0) = 0, P (1) = P (2) = P (3) = = P (n),
y despus asumiendo que P (k) = ( n2k2 + n); 0 k n, donde P (k) es la
probabilidad de que deban actualizarse los datos de k registros.

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.

Ejercicio 1.8 Dado un arreglo con n elementos, escribir un algoritmo para

obtener el ksimo elemento ms pequeo, encontrando los k menores si


k n2 y los n k + 1 mayores si k > n2 . Para este algoritmo, obtngase la
complejidad temporal en todos los casos.

28

CAPTULO 1. INTRODUCCIN

Captulo 2
Comportamiento Asinttico de
Funciones
2.1.

Dominio asinttico

Cuando se implanta un algoritmo para resolver problemas pequeos, el


costo adicional generado por el grado de ineciencia del algoritmo elegido es
poco signicativo. Por el contrario, cuando el tamao del problema es grande,
la cantidad de recursos que el algoritmo necesite puede crecer tanto que lo
haga imprctico. Por esta razn, para elegir entre dos algoritmos es necesario
saber cmo se comportan con problemas grandes. En atencin a esta necesidad se estudiar la velocidad de crecimiento de la cantidad de recursos que un
algoritmo requiere conforme el tamao del problema se incrementa, es decir,
se estudiar el comportamiento asinttico de las funciones complejidad. La
Denicin 1 introduce el concepto fundamental.

Denicin 1 Sean f y g funciones de N a R. Se dice que f domina asint-

ticamente a g o que g es dominada asintticamente por f, si k 0 y m 0


tales que
|g(n)| m|f (n)|, n k

El hecho de que una funcin domine asintticamente a otra se interpreta


como se muestra en la Figura 3. En ella se representan las grcas de las
funciones m|f (n)| y |g(n)|, donde k es el valor a partir del cual m|f (n)| es
mayor que |g(n)|, y esta relacin de magnitud se conserva conforme n crece.
29

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)|

Figura 3: Representacin grca del concepto de dominio asinttico.


Puesto que las funciones complejidad son funciones con dominio N, los
nmeros naturales, y contradominio R, los nmeros reales; los conceptos y
las propiedades de dominio asinttico proporcionan una manera conveniente
de expresarlas y manipularlas.
Con la intencin de aclarar la denicin, a continuacin se presentan
algunos ejemplos.

Ejemplo 6 Sean f (n) = n y g(n) = n3


i) Demostrar que g domina asintticamente a f. Esto es, demostrar que

m 0, k 0 tales que |f (n)| m|g(n)| n k.


Substituyendo f (n) y g(n) da

|n| m|n3 |, n k,

2.1. DOMINIO ASINTTICO

31

si se toma m = 1 y k = 0, las desigualdades anteriores se cumplen, por


lo tanto, m y k existen, y en consecuencia g domina asintticamente a
f.
ii) Demostrar que f no domina asintticamente a g. Expresado matemticamente se tiene

(m 0, k 0 tales que |g(n)| m|f (n)|, n k)


aplicando la negacin se tiene

m 0, k 0, n k tal que |g(n)| > m|f (n)|


sustituyendo g y f en cada lado de la desigualdad

|n3 | > m|n|


simplicando

|n2 | > m
n2 > m

n > m para al menos una n k

si se toma n > max ( m, k) ambas desigualdades se cumplen,


f no domina asintticamente a g.
En lo subsecuente se utilizarn las iniciales d.a. como sinnimo de domina
asintticamente a.

Ejemplo 7 Sea g una funcin de N a R y f (n) = cg(n) con c > 0 y c R.


Demostrar que f y g se dominan asintticamente.
i) Por demostrar, f d.a. g.

m 0, k 0 tales que |g(n)| m|cg(n)|, n k


pero |ab| = |a||b| por lo tanto

|g(n)| m|c||g(n)|, n k

32

CAPTULO 2. COMPORTAMIENTO...

Como c > 0, entonces

|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

Demostrar que f y g no se dominan asintticamente.


i) Primero se debe demostrar que f no-d.a. g. Utilizando la negacin de
la denicin se expresa que

m 0, k 0; n k tal que |g(n)| > m|f (n)|.

2.1. DOMINIO ASINTTICO

33

Considerando el caso cuando n es impar y substituyendo f y g en la


desigualdad, se tiene

|n3 | > m|n|


n2 > m
1

n > m2
1

Entonces para toda n impar > max (m 2 , k) las desigualdades se cumplen,


f no-d.a. g.
ii) Tambin se debe demostrar que g no-d.a. f. Esto es

m 0, k 0; n k tal que |f (n)| > m|g(n)|


Tomando el caso para el cual n es par, se obtiene

|n| > m|1| para alguna n k


|n| > m
Entonces para toda n > max(m, k) se satisfacen los requisitos,
g no-d.a. f.
Cuando se hace el anlisis terico para obtener la funcin complejidad
f (n) que caracterice a un algoritmo, se est obteniendo un modelo de comportamiento para la demanda de recursos en funcin del parmetro n, de tal
forma que si t(n) es la cantidad real del recurso que se consume para una
implantacin especca del algoritmo se tiene que

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...

Teorema 1 Sea M el conjunto de funciones de N a R. La relacin binaria


sobre este conjunto denida como

{< f, g > |f, g M y g domina asintticamente a f }


y es reexiva y transitiva.

Demostracin 1 La demostracin la realizamos por partes


i) P.D. La relacin denida es reexiva, es decir,

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.

Sabemos que m1 , m2 , k1 y k2 0 tales que:

|g(n)| m1 |f (n)|, n k1
y

|h(n)| m2 |g(n)|, n k2
por lo que

|h(n)| m1 m2 |g(n)|, n max(k1 , k2 )


con m = m1 m2 y k = max(k1 , k2 ) se satisface la denicin, por lo
tanto f d.a. h y
la relacin es transitiva.
El siguiente ejemplo ilustra la aplicacin de la propiedad de transitividad.

2.1. DOMINIO ASINTTICO

35

Ejemplo 9 Sean f (n) = cn, g(n) = n y h(n) = c + n funciones de N a R,

con c > 0 y c R. Demostrar que f y h se dominan asintticamente.


Sabemos, por la demostracin del ejemplo 7, que f (n) = cn d.a. g(n) = n
y viceversa.
i) Demostrar que f d.a. h. Demostraremos que g d.a. h, es decir, que
m 0 y k 0 tales que

|h(n)| |g(n)|, n k
|c + n| m|n|, n k
Si m = 2 y k = c, se cumple que

|c + n| 2|n|, n c
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 [?].

Teorema 2 Sean f y g funciones en M, la relacin binaria f g f y g


se dominan asintticamente es una relacin de equivalencia sobre M.

Demostracin 2 P.D. que la relacin descrita es simtrica, reexiva y transitiva.

36

CAPTULO 2. COMPORTAMIENTO...

i) La relacin es simtrica, es decir, f g g f.


Puesto que f g f d.a. g y g d.a. f entonces por denicin g f
y
La relacin es simtrica.
ii) La relacin es reexiva. Se sigue del teorema 1.
iii) La relacin es transitiva. Es decir, si f, g, h M y f g y g h
f h,
Sabemos que f d.a. g y g d.a. h f d.a. h.
Adems h d.a. g y g d.a. f h d.a. f por lo tanto f g,
La relacin es transitiva.
Dado que toda relacin de equivalencia induce una particin, la relacin
descrita particiona el conjunto de funciones de N a R en subconjuntos tales
que todos los elementos de un mismo subconjunto se dominan asintticamente entre s. Se ha demostrado que las funciones n, n + c y cn(c R) se
encuentran en un mismo subconjunto de la particin.
Los conceptos hasta aqu citados son parte de la descripcin de una metodologa que se desarrollar en esta seccin para estimar, aproximadamente, los costos (en espacio y tiempo) de las soluciones que proporcionan los
algoritmos y para comparar algoritmos con base en tales costos. La caracterstica principal de esta propuesta es que deben ignorarse factores constantes
y concentrarse en el comportamiento del algoritmo cuando los tamaos del
problema son grandes.

2.2. Notacin de orden


Cuando describimos cmo es que el nmero de operaciones f (n) depende
del tamao n, lo que nos interesa es encontrar el patrn de crecimiento para
la funcin complejidad y as caracterizar al algoritmo; una vez hecha esta
caracterizacin podremos agrupar las funciones de acuerdo al nmero de
operaciones que realizan. Para tal propsito se da la siguiente denicin.

Denicin 2 El conjunto de todas las funciones que son asintticamente

dominadas por una funcin g es denotado O(g) y se lee orden de g , o bien


O-grande de g .

2.2. NOTACIN DE ORDEN

37

Si f O(g), entonces f se dice ser O(g).


Por ejemplo:
i) f (n) = n, g(n) = 2n3 + 50

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

f no es O(g) y g tampoco es O(f ).


La notacin O-grande nos permite ignorar constantes convenientemente,
as siempre podremos escribir O(n3 ) en vez de O(2n3 + 50).
El siguiente teorema establece algunas relaciones importantes entre una
funcin f y el conjunto O(f ).

Teorema 3 Sean f, g y h M, entonces:


a) f es O(f ).
b) Si f es O(g) cf es O(g) para c R. Es decir, el conjunto O(g) es
cerrado bajo la multiplicacin por una constante.
c) Si f es O(g) y h es O(g) (f + h) es O(g) donde (f + h)(n) =
f (n) + g(n), i.e. O(g) es cerrado bajo la suma de funciones.

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

|cf (n)| m|g(n)|, n k


con c R.

38

CAPTULO 2. COMPORTAMIENTO...

Si tomamos m = |c|m1

|cf (n)| |c|m1 |g(n)|, n k1


|c||f (n)| |c|m1 |g(n)|, n k1
|f (n)| m1 |g(n)|, n k1

entonces con m = |c|m1 y k = k1 la desigualdad |f (n)| m1 |g(n)| se


cumple y en consecuencia cf es O(g).
c) f es O(g) y h es O(g) (f + h) es O(g)
Sabemos que existen m1 , m2 , k1 , k2 0 tales que:

|f (n)| m1 |g(n)|, n k1
|h(n)| m2 |g(n)|, n k2
Sumando las desigualdades trmino a trmino

|f (n)| + |h(n)| m1 |g(n)| + m2 |g(n)|, n max(k1 , k2 )


Por la desigualdad del tringulo

|f (n) + h(n)| |f (n)| + |h(n)|


Sustituyendo en la suma

|f (n) + h(n)| (m1 + m2 )|g(n)|, n max(k1 , k2 )


Con m = m1 + m2 y k = max(k1 , k2 ) se cumple que

|f (n) + h(n)| m|g(n)|, n k


y por ende g d.a. (f + h),
(f + h) es O(g).
El siguiente teorema establece que f es O(g) si y slo si todas las funciones
dominadas asintticamente por f son tambin dominadas asintticamente
por g.

2.2. NOTACIN DE ORDEN

39

Teorema 4 Sean f y g funciones de N a R, f es O(g) O(f ) O(g).


Demostracin 4
() Si f es O(g) entonces O(f ) O(g).
Si f es O(g), por denicin g d.a. f. Sea h una funcin arbitraria tal que
f d.a. h, por transitividad g d.a. h, luego entonces h es O(g). Dado que h
puede ser cualquier elemento de O(f ) podemos concluir que O(f ) O(g).
() Si O(f ) O(g) entonces f es O(g).
f es O(f ) (ver teo. 2.3), y como O(f ) O(g) f es O(g).
Dado que las funciones complejidad estn en M, es posible clasicar
los algoritmos segn el orden de su funcin complejidad. Gran parte de
los algoritmos tienen complejidad que cae en uno de los siguientes casos:
O(1)
Complejidad constante
O(log n)
Complejidad logartmica
O(n)
Complejidad lineal
O(n log n)
Complejidad n log n
2
O(n )
Complejidad cuadrtica
n
O(c ), c > 1 Complejidad exponencial
O(n!)
Complejidad factorial
Y es posible relacionarlos atendiendo a su orden mediante el resultado
del siguiente teorema.

Teorema 5 Sea c R y c > 1, entonces


O(1) O(log n) O(n) O(n log n) O(n2 ) O(cn ) O(n!)
y las contenciones son propias.
Interpretando este teorema de acuerdo a nuestros intereses podemos decir
que un algoritmo con complejidad factorial consume ms recursos que uno
con complejidad exponencial y uno con complejidad exponencial consume
ms que uno con complejidad cuadrtica, etc. La demostracin se deja al
lector.
Con frecuencia encontraremos que al analizar un algoritmo, una seccin de
cdigo es de un orden y otra parte es de otro orden, entonces nos preguntamos
cul es el orden del algoritmo?, la respuesta se establece a continuacin.

40

CAPTULO 2. COMPORTAMIENTO...

Teorema 6 Sean f, g, h1 , h2 funciones de N a R. Si f es O(h1 ) y g es O(h2 )

entonces f + g es O(max(h1 , h2 )), donde una funcin es mayor que otra si


la domina asintticamente.

Demostracin 5 Tenemos,

f esO(h1 ), i.e. m1 0 y k1 0 tales


|f (n)| m1 |h1 (n)|, n k1

adems g es O(h2 ), es decir m2 0 y k2 0 tales que

|g(n)| m2 |h2 (n)|, n k2


Sumando las ecuaciones obtenemos

|f (n)| + |g(n)| m1 |h1 (n)| + m2 |h2 (n)|, n max(k1 , k2 )


Por la desigualdad del tringulo, se tiene

|f (n) + g(n)| |f (n)| + |g(n)|


Por el teorema 3 y sustituyendo lo anterior

|f (n)| + |g(n)| (m1 + m2 ) max(h1 (n), h2 (n)), n max(k1 , k2 )


Si |h(n)| = max(h1 (n), h2 (n)) y k = max(k1 , k2 )

|f (n) + g(n)| (m1 + m2 )|h(n)|, n k


(f + g) es O(max(h1 , h2 ))
Frecuentemente se tiene ms de un algoritmo que expresa la solucin de un
problema, si en particular se tiene un algoritmo que hace O(n2 ) operaciones
y otro que hace O(n3 ), qu algoritmo se preferira? Para hacer una eleccin
razonable debe considerarse el resultado del teorema 7.

Teorema 7 Sean c, d R y 0 < c < d, entonces O(nc ) O(nd ) y la


contencin es propia.

Como consecuencia del teorema anterior tenemos un resultado similar al


que se presenta con el lgebra elemental : para determinar el grado de un
polinomio se elige el trmino de mayor grado, para estimar el orden de una
expresin asinttica se usa el trmino ms representativo.

2.3. INTERPRETACIN DE LOS CONCEPTOS ENUNCIADOS

41

Teorema 8 Si P (n) es un polinomio en n de grado k, entonces P (n) es


O(nk ).

Suponga que las siguientes funciones representan funciones complejidad


para tres algoritmos que resuelven un mismo problema:

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) =

Los rdenes de las mismas se obtienen fcilmente aplicando una y otra


vez los resultados enunciados y en base a stos es posible hacer una eleccin
si seguimos el criterio que se describe en la siguiente seccin.

2.3.

Interpretacin de los conceptos enunciados

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:

m, n0 0 n n0 tal que |f1 (n)| > m|f2 (n)|.


Dado que las funciones complejidad son montonas crecientes la desigualdad se cumple para n n0 , esto signica que para problemas de tamao n0

42

CAPTULO 2. COMPORTAMIENTO...

O(c )

O(n log n)
O(log n)
O(1)
O(n)

O(n )

O(n!)

Figura 4: El conjunto de funciones de N a R.

2.4. DOMINIO ASINTTICO CON LMITES

43

en adelante el algoritmo A1 consume ms recursos que A2 , por lo tanto si


queremos optimizar los recursos de la mquina debemos elegir el de la complejidad dominada.
El otro caso posible es que el orden de ambas funciones complejidad sea
el mismo, en sta situacin, las cantidades de los recursos que consumen los
algoritmos crecen de manera similar, y la eleccin del algoritmo debe basarse
en la comparacin de las funciones complejidad ms que en su orden.
Comparar los algoritmos en base al comportamiento asinttico de sus
funciones complejidad es una herramienta de eleccin muy poderosa que, sin
embargo debe ser utilizada con cuidado pues, por ejemplo, si tenemos dos
algoritmos con funciones complejidad

f (n) = cn, es O(n) y


g(n) = an2 , es O(n2 ) con a y c constantes
en base a lo dicho, elegiramos el algoritmo cuya funcin complejidad es
f (n), sin embargo, si c = 25 y a = 1, g(n) < f (n) para n < 25, por lo tanto
tambin es importante tomar en cuenta el tamao del problema especico.

2.4.

Dominio asinttico con lmites

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.

Denicin 3 Sean f y g funciones de N a R.


f (n)
= c, para alguna constante c 6= 0 entonces f y g son del
n g(n)
mismo orden.

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).

Ejemplo 10 Sean f (n) =

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

De la Denicin 3(b) se tiene que f es O(n) [ y g no es O(f ) ].

2.4. DOMINIO ASINTTICO CON LMITES

45

Ejemplo 12 Sean f (n) = n2 y g(n) = en las funciones complejidad para


los algoritmos A y B respectivamente, que resuelven un mismo problema.
Determinar cual de los algoritmos es ptimo asintticamente.
Usando LHpital da

n2
2n
= lm n
n
n e
n e
2
= lm n
n e
= 0,
lm

as n2 es O(en ), [ y en no es O(n2 )], por tanto A es ptimo en el sentido


asinttico.
Mostraremos ahora la equivalencia entre las deniciones que se han citado
(vea las Deniciones 1 y 3), para determinar la complejidad de un algoritmo.
Para hacer esto partimos de la expresin

f (n)
= c,
n g(n)
lm

(2.1)

y con esta obtener una expresin de la forma indicada por la def. 1.


La ecuacin 2.1 dice que para toda e > 0, k 0 tal que n k, se tiene
la desigualdad

f (n)

<e

c
g(n)

Para valores grandes de k y con e = 1 obtenemos

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

|f (n)| < m|g(n)|, n k


De esta manera se da una cota superior, en trminos de la funcin g(n),
de los valores de f (n) para valores grandes de n, que es precisamente lo que
dice la Denicin 1.

46

CAPTULO 2. COMPORTAMIENTO...

Como ya se mencion la anterior Denicin 3 es otra herramienta para


estudiar el comportamiento de la funcin complejidad asociada a un algoritmo, el inconveniente con ella es que implica conceptos matemticos que no
son elementales como los de la Denicin 1.

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

iii) f3 (n) = 3n2 log n +

1
n2

iv) f4 (n) = 4n3


v) f5 (n) = log 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. Ordene los grupos formados en el inciso 1 en forma creciente segn su


orden.

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.5 Muestre que para cualesquiera constantes positivas c0 , c1 , c2 , . . . , ck


la expresin c0 + c1 n + c2 n2 + + ck nk es O(nk ). Pruebe que la expresin
no es O(nk1 ).

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

Ejercicio 2.8 Demostrar los siguientes resultados.


i) Sean f, g funciones con dominio N. Entonces
a) f es O(g) y g es O(f ) O(f ) = O(g).
b) Si f es O(g) y g es O(h) f es O(h).

ii) Sean c, d R, donde 0 < c < d, entonces O(cn ) O(dn ) y la contencin es propia.

Ejercicio 2.9 Pruebe que O(log n) = O(log(n + k)), n, k > 0.


Ejercicio 2.10 Pruebe que R, 0 i n, ik es O(nk+1 ), si k N; si no es
el caso, demuestre lo contrario.

Ejercicio 2.11 Mostrar que para todas constantes a, b > 0 (log2 n)a es O(nb ).

48

CAPTULO 2. COMPORTAMIENTO...

Captulo 3
Anlisis de Algoritmos Iterativos
3.1.

Introduccin

De acuerdo a los conceptos enunciados, debe resultar claro que el anlisis


de un algoritmo precisa de un conteo de los recursos consumidos. En un algoritmo sin llamadas recursivas, una vez seleccionados el tamao del problema
y la operacin bsica, el anlisis se realiza utilizando tcnicas tradicionales
de conteo (sucesiones, progresiones aritmticas, sumas, etc.) y el concepto de
orden de una funcin.
En el ejemplo siguiente se ilustra el anlisis temporal de un algoritmo
iterativo de ordenacin.

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,

ft (n) = 2(n 1), es O(n).


b) Peor Caso: Sucede cuando el arreglo est ordenado en forma decrecien49

50

CAPTULO 3. ANLISIS DE ALGORITMOS ITERATIVOS


te,

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

c) Caso Medio: Para colocar un elemento A[i] en su lugar correcto, necesitamos

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

As, tenemos que

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;

mientras (j ini) (A[j] > x) haz


A[j + 1] A[j];
j j 1;

zah

A[j + 1] x;

termina
zah
termina.
Algoritmo 5: Ordenacin por Insercin Directa

52

CAPTULO 3. ANLISIS DE ALGORITMOS ITERATIVOS

3.2. Anlisis por bloques


En el captulo anterior se desarroll un modelo matemtico para comparar
y evaluar el costo (en espacio y tiempo) de los algoritmos, que considera el
comportamiento de las funciones complejidad cuando el tamao del problema
es grande. Esta herramienta proporciona un importante medio para hacer
un anlisis ms dinmico, que se basa principalmente en el conocimiento
del orden de los bloques de instrucciones; aqu cabe sealar que un bloque
de instrucciones puede ser un algoritmo del cual conocemos su complejidad
computacional. Para determinar el orden de un bloque, es necesario tener en
mente el orden de las estructuras de control ms usuales, con este objeto a
continuacin se presenta el anlisis de las estructuras de control.

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)
?

Figura 5: Complejidad de la secuenciacin

3.2.2. Seleccin condicional


En el constructor seleccin condicional se evala la condicin C, si es
verdadera, se ejecuta el bloque I1 que tiene complejidad O(f ) y si evala a
falso se ejecuta I2 que es O(g) como se ve en la Figura 6; tomando en cuenta
sto, la complejidad de la seleccin es:

3.2. ANLISIS POR BLOQUES

53

i) En el peor caso, esta determinada por el orden de la instruccin que


implica ms operaciones, esto es O(max(f, g)).
ii) Para el mejor caso, se considera la instruccin con menor nmero de
operaciones, de esta manera la complejidad ser O(mn(f, g)).
iii) Se toma en cuenta la probabilidad P de que la condicin sea verdadera
y entonces la complejidad en el caso promedio es O(P f ) + O((1 P )g).
?
@

I1
O(f )

@ F

I2
O(g)

Figura 6: Complejidad de la seleccin condicional

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

Se hizo ya el anlisis de tres algoritmos iterativos, ahora utilizando las


tcnicas que hemos descrito analizaremos paso a paso un algoritmo sencillo
que requiere el conocimiento de conceptos elementales de algebra lineal.

Ejemplo 14 Sean A y B dos matrices de nn con entradas reales. Calcular


la matriz producto C = AB. El algoritmo que se utilizar, es implicado por
la denicin del producto de matrices, donde la matriz C tiene la forma :

cij =

n
X
k=1

aik bkj ,

i, j [1, n].

54

CAPTULO 3. ANLISIS DE ALGORITMOS ITERATIVOS

I1
O(f )

V
@

@
F
?

Figura 7: Complejidad de la iteracin

proc Matriz-Producto (n, A, B)


comienza
para i = 1 a n haz
para j = 1 a n haz

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.

Algoritmo 6: Producto de matrices

I1
I2
I3
I4
I5

3.2. ANLISIS POR BLOQUES


Tamao del problema:
Operacin bsica:
Caso :

55

n, la dimensin de las matrices.


la multiplicacin entre las entradas de las matrices.
El algoritmo hace el mismo nmero de operaciones en todos los casos.

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

fe (n) = espacio de (n) + espacio de (A, B, C),


fe (n) = 1 + 3n2 es O(n2 ).
1 Note que el anlisis es identico si hacemos b)

n
X
k=1

1 = n, c)

n
X
j=1

n = n2 y d)

n
X
i=1

n2 = n3 .

56

CAPTULO 3. ANLISIS DE ALGORITMOS ITERATIVOS

A continuacin se realiza el anlisis de un algoritmo numrico omitiendo


los detalles de su funcionamiento para estimar el orden de la funcin complejidad temporal.

Ejemplo 15 Sea A un vector de coecientes y sea Pn (z) =

n
X

A[i]z i un po-

i=0

linomio de grado n, evaluado para un argumento real z. Encontrar la funcin


complejidad, temporal y espacial, para el algoritmo que evala Pn (z).

proc Horner (n, z, A)


comienza

polinomio 0;
para i = 0 a n haz
polinomio polinomio z + A[n i];

zah
termina.

I1
I2
I3

Algoritmo 7: Mtodo de Horner


Tamao del problema:
Operacin bsica:
Caso :

n, el grado del polinomio.


la multiplicacin en I3 , pues se realiza un nmero de veces del mismo orden al tamao del
problema (el grado del polinomio).
El algoritmo hace el mismo nmero de operaciones en todos los casos.

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

fe (n) = espacio de (n) + espacio de (z, polinomio) + espacio de (A),


fe (n) = 1 + (1 + 1) + (n + 1) = 4 + n, i.e. es O(n).

3.3.

Ejercicios

Ejercicio 3.1 Escriba un algoritmo que dado un conjunto de nmeros en-

teros diferentes y ordenados, devuelva el primer valor x tal que A[x] = x.


Calcule la complejidad espacial y temporal del algoritmo.

Ejercicio 3.2 El mximo comn divisor de dos enteros positivos n y m,


denotado por M CD(n, m), es el nico entero positivo k tal que
1. k divide a m y n,
2. todos los dems enteros que dividen a m y n son menores que k.
El Algoritmo 8 encuentra el M CD de dos enteros positivos, obtenga las
expresiones para su complejidad espacial y temporal.

func Mximo-Comn-Divisor (m, n)


comienza
a max(n, m);
b mn(n, m);
r 1;
mientras (r > 0) haz
r a mod b;
a b;
b r;

r es el residuo

zah

Mximo-Comn-Divisor a;

termina.
Algoritmo 8: Mximo comn divisor de dos enteros

58

CAPTULO 3. ANLISIS DE ALGORITMOS ITERATIVOS

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.

Ejercicio 3.4 El mnimo comn mltiplo (MCM) de dos enteros positivos m


y n, es el entero ms pequeo que es un mltiplo de ambos nmeros. Disee
un algoritmo iterativo para encontrar el MCM de dos enteros. Determine el
orden de su complejidad temporal.

Captulo 4
Anlisis de Algoritmos Recursivos
4.1.

Introduccin

La recursividad es un fenmeno que se presenta en muchos problemas de


forma natural, delegando la solucin de un problema en la solucin de otro
ms pequeo. Los siguientes son dos ejemplos clsicos:
El costo de mover n piezas de equipo pesado depende del costo
por el movimiento de n 1 piezas ms un costo adicional por el
costo de mover la ensima pieza
El tiempo requerido por cierto algoritmo para ordenar n elementos depende del tiempo que a ste le toma ordenar n 1 elementos, ms el tiempo adicional requerido para colocar al ensimo
elemento en su lugar correcto
Como se observa existen situaciones en las cuales las cantidades que queremos estudiar pueden ser modeladas matemticamente por funciones denidas en forma recursiva. Una ecuacin que expresa una funcin de este tipo
recibe el nombre de ecuacin recurrente, si adems estn dados uno o ms
valores de n especcos, lo que se tiene es un sistema recurrente.
Los algoritmos, al igual que las funciones, tambin pueden ser denidos
recursivamente, de hecho tienen mucho en comn pues ambos aceptan un
conjunto de entradas, generan salidas correspondientes a las entradas y tienen una regla o conjunto de reglas para obtener las salidas a partir de las
entradas. As que muchos conceptos que se aplican a funciones se aplicarn,
frecuentemente, tambin a los algoritmos.
59

60

CAPTULO 4. ANLISIS DE ALGORITMOS RECURSIVOS

Cuando se quiere calcular la demanda de recursos de un algoritmo denido


recursivamente, la funcin complejidad que resulta no est denida slo en
trminos del tamao del problema y algunas constantes, sino en trminos de
la funcin complejidad misma. Adems no es una sola ecuacin, dado que
existen otras (al menos una) que determinan la cantidad de recursos para
los casos base de los algoritmos recursivos. Dada esta situacin, para poder
obtener el comportamiento del algoritmo, es necesario resolver el sistema
recurrente obtenido. En esta seccin se muestra el principio de anlisis de
los algoritmos recursivos y la obtencin de las funciones complejidad a partir
de la solucin de los sistemas recurrentes mediante la tcnica expansin de
recurrencias.

4.2. Sistemas recurrentes


Consideremos el Algoritmo recursivo 9 que calcula el factorial de un nmero entero n,

func Factorial (n)


comienza
si (n = 0) entonces
otro
is
termina.

Factorial 1;
Factorial n F actorial(n 1);

Algoritmo 9: Factorial de un nmero


Para encontrar la complejidad temporal debemos elegir una operacin tal
que el orden del nmero de veces que se realiza sea igual al orden del total
de operaciones que hace el algoritmo, puesto que la funcin es recursiva, la
parte ms costosa es la recursin y tenemos que elegir una operacin que
se efecte en todas las llamadas que hace el algoritmo o en un nmero de
ellas que sea del mismo orden que el orden del nmero total de llamadas.
De las operaciones que realiza el algoritmo podemos contar multiplicaciones,
veamos que dicha operacin cumple con las condiciones estipuladas.
El algoritmo para resolver un problema de tamao n, hace una multiplicacin y resuelve un problema de tamao n 1 hace una multiplicacin y

4.2. SISTEMAS RECURRENTES

61

resuelve un problema de tamao n 2 . . . y resuelve un problema de tamao


1 hace una multiplicacin y resuelve un problema de tamao 0, para el que
ya no ejecuta dicha operacin.
Puesto que la funcin tiene 2 partes, el caso base y la parte recursiva, la
funcin complejidad se puede expresar como un sistema de 2 ecuaciones:

f (0) = 0, para el caso base


f (n) = f (n 1) + 1, para el caso general
Nuestras ecuaciones forman lo que se conoce como un sistema recurrente.
En un sistema de esta naturaleza se distinguen 2 partes:
i) La ecuacin recurrente, que da el valor de una funcin en un punto n
en trminos de su valor en otros puntos m con n > m. En nuestro caso,
la ecuacin
f (n) = f (n 1) + 1
da el valor de f (n) en trminos del valor de f (n 1).
ii) Un conjunto de valores de frontera o condiciones iniciales (los valores
de una funcin en puntos especcos) que determinan, junto con la
ecuacin recurrente, completamente a una funcin. En nuestro ejemplo

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

CAPTULO 4. ANLISIS DE ALGORITMOS RECURSIVOS


Si n = 0 entonces f (0)

=0

satisface la condicin inicial, y

Si n > 0 entonces f (n)

= f (n 1) + 1
= (n 1) + 1
=n

satisface la ecuacin recurrente, por lo tanto es una


solucin al sistema.
Para encontrar la solucin a un sistema recurrente existe toda una teora
que expone diversos mtodos. En el anlisis de algortimos recursivos, los
sistemas recurrentes que resultan son de baja complejidad y en la mayora
de los casos basta la aplicacin de una tcnica muy simple para resolverlos.
En esta seccin se expondr el mtodo de expansin de recurrencias que ser
utilizado siempre que sea necesario resolver un sistema de ste tipo.

4.2.1. Expansin de recurrencias


Este mtodo de solucin, consiste en utilizar la recurrencia misma para
substituir f (n) por su valor en trminos de f (m), donde m < n, iterativamente hasta encontrar una condicin de frontera f (r) que tendr un valor
constante. En la ecuacin recurrente se ponen todos los terminos con f en el
lado izquierdo y se realiza la expansin. Al sumar todas las ecuaciones obtendremos una expresin para f (n) en trminos de n y algunas constantes.
A sta expresin nal se le denomina forma cerrada para f (n).

Ejemplo 16 Utilicemos el sistema obtenido para la funcin factorial:


f (n) = f (n 1) + 1
ponemos los terminos de f en el lado izquierdo

f (n) f (n 1) = 1

4.2. SISTEMAS RECURRENTES

63

expandemos la recurrencia

f (n) f (n 1) = 1
f (n 1) f (n 2) = 1
f (n 2) f (n 3) = 1
..
.
f (2) f (1) = 1
f (1) f (0) = 1
f (0) = 0
sumando todas las ecuaciones

f (n) = 1| + 1 +{z + 1}
n veces

f (n) = n

Ejemplo 17 El nmero de permutaciones de n objetos se puede expresar


usando el siguiente sistema recurrente:
P (0) = 1,
pues slo hay una permutacin de 0 elementos, y
P (n) = nP (n 1), porque podemos elegir un elemento de los n
posibles y despus cualquier secuencia que sea
una permutacin de los n 1 elementos restantes.
Solucin:

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

CAPTULO 4. ANLISIS DE ALGORITMOS RECURSIVOS

sustituyendo P (0) y sumando ecuaciones

P (n) n(n 1)(n 2) 2 1 = 0


P (n) = n!

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

donde a, b y c son enteros no negativos y f : N R.


Encontraremos la solucin genrica aplicando el mtodo expuesto.

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

f (n) = cn1 a + b + cb + c2 b + + cn2 b


= cn1 a + b

n2
X
i=0

ci

4.2. SISTEMAS RECURRENTES

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

A continuacin presentamos un teorema basado en lo anterior.

Teorema 9 Sean a, b y c enteros no negativos y f : N R. tal que


f (1) = a
f (n) = cf (n 1) + b
entonces
i) Si c = 1 entonces f (n) = a + b(n 1)
ii) Si c > 1 entonces f (n) = cn1 a +

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.

Ejemplo 18 Encontrar el mayor nmero de hojas que puede tener un rbol


de altura h, donde cada nodo tiene grado k 2.

f (1) = k
f (h) = kf (h 1)

66

CAPTULO 4. ANLISIS DE ALGORITMOS RECURSIVOS

del teorema anterior, a = k, b = 0 y c = k por lo tanto

f (h) = kk h1 = k h .

Ejemplo 19 Encontrar la funcin complejidad temporal para el algoritmo

que resuelve el problema de las torres de Hanoi, que consiste en lo siguiente:


se tienen n discos apilados de mayor a menor, en la torre fuente, y se tienen
que mover a la torre destino utilizando una torre auxiliar; los discos se tienen
que mover uno a uno y apilarlos de tal forma que nunca quede un disco bajo
otro mayor que l. La solucin recursiva al problema se ilustra en el Algoritmo
10.

proc Hanoi (n, ini, med, f in)


comienza
si (n = 1) entonces escribe (ini, , f in);
otro
comienza

Hanoi (n 1, ini, f in, med);


escribe (ini, , f in);
Hanoi (n 1, med, ini, f in);

is
termina.

termina

Algoritmo 10: Torres de Hanoi


Encontraremos ahora la funcin complejidad temporal del Algoritmo 10.
Tamao del problema: n, nmero de discos a mover.
Operacin bsica:
movimientos de disco, pues se hace en todas
las llamadas recursivas. Un movimiento de disco es una escritura de ini, , n.
Caso :
El algoritmo hace el mismo nmero de operaciones en todos los casos.

Anlisis Temporal
La relacin de recurrencia esta dada por

ft (1) = 1
ft (n) = 2f (n 1) + 1

4.2. SISTEMAS RECURRENTES

67

Para aplicar el teorema anterior hacemos a = 1, b = 1, c = 2 :

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.

Ejemplo 20 Encontrar la complejidad espacial dinmica para el algoritmo


que resuelve el problema de las torres de Hanoi.

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

fe (n) = 5 + 5(n 1) = 5n, que es O(n).

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

CAPTULO 4. ANLISIS DE ALGORITMOS RECURSIVOS

func Potencia(base, exp)


comienza
si (exp = 1) entonces
otro
is
termina.

P otencia base
P otencia base Potencia(base, exp 1);

Algoritmo 11: Potencia de un nmero


Anlisis Espacial
fe (1) = espacio(exp) + espacio(base) + espacio(direccin de retorno)
fe (1) = 3
fe (n) = fe (n 1) + 3
Para aplicar el Teorema 9, hacemos a = 3, b = 3 y c = 1 :

fe (n) = 3(n 1) + 3 = 3n que es O(n)


El sistema recurrente de nuestro siguiente teorema, aparece con mucha
frecuencia en algoritmos que dividen el problema inicial en a problemas de
tamao nb efectuando a lo ms c operaciones bsicas en cada llamada al
algoritmo. El siguiente teorema describe la forma cerrada del sistema para
los diferentes valores que puedan tomar las constantes involucradas.

Teorema 10 Sean a, b, c enteros tales que a 1, b > 1 y c > 0, y sea f una


funcin arbitraria de N a R cuyos valores siguen el sistema:
f (1) = c
n
f (n) = af ( ) + c
b
para argumentos de la forma n = bk , donde k N y k > 0, se tienen las
siguientes soluciones al sistema
i) Si a = 1 entonces f (n) = c(logb n + 1)

4.2. SISTEMAS RECURRENTES

ii) Si a 6= 1 entonces f (n) =

69

c(anlogb a 1)
a1

Demostracin 6 Sea el sistema


f (1) = c
n
f (n) = af ( ) + c
b
con n = bk y k 1 se tiene

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

Tenemos dos casos


i) Si a = 1, con n = bk

f (bk ) = c(k + 1)

y notamos que logb n = logb bk = k, luego entonces

f (n) = c(logb n + 1).


ii) En el segundo caso a 6= 1. Tendremos

c(ak+1 1)
a1
c
=
(aak 1)
a1

f (bk ) =

70

CAPTULO 4. ANLISIS DE ALGORITMOS RECURSIVOS

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) =

La forma cerrada para el sistema recurrente que enuncia el teorema slo


es vlida para argumentos de la forma bk , con b > 1 y k > 0. Qu orden
podemos asociarle a la funcin en su forma cerrada?, dado que una funcin es
de orden g si g la domina asintticamente y la denicin de d.a. implica que
el dominio se d en todos los naturales a partir de algn valor k especco, y
el teorema no asegura el dominio en un rango continuo de los naturales, no
es posible asociarle un orden a la funcin. Sin embargo, podemos enunciar
la siguiente denicin que nos caracteriza el comportamiento de una funcin
en un subconjunto de los naturales.

Denicin 4 Sean f y g funciones de N a R y S un subconjunto innito de


N. Se dice que f es O(g) en S si existen m 0, k 0 tales que
|f (n)| m|g(n)|, n S y n k.
En el marco de la denicin anterior diremos que si f cumple con las
restricciones planteadas en el Teorema 10, entonces:
i) Si a = 1, f es O(log n) en S
ii) Si a 6= 1, f es O(nlogb a ) en S, donde S = {bk |b, k N b > 1, k > 0.}
Ahora bien, cuando el sistema recurrente que resulte de un algoritmo no
tenga exactamente la forma del teorema, pero se puede escribir en esa forma
cambiando la igualdad por una desigualdad, se puede asegurar un orden
para la funcin, pero no una expresin exacta para el sistema recurrente,
esta aseveracin est respaldada por el siguiente teorema.

4.2. SISTEMAS RECURRENTES

71

Teorema 11 Sean a, b, c enteros tales que a, b y c > 0 y f una funcin de


N a R tal que

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

Demostracin 7 Sea g una solucin al sistema recurrente que plantea el

teorema (cuando se tiene la igualdad en las dos condiciones), as g tiene la


forma

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.

Ejemplo 22 El Algoritmo 12 cuenta el nmero de nodos en un rbol binario


con todos los niveles llenos. Realice su anlisis temporal.
Tamao del problema:
Operacin bsica:
Casos:

n, el nmero de nodos en el rbol.


las asignaciones.
el algoritmo no tiene casos.

72

CAPTULO 4. ANLISIS DE ALGORITMOS RECURSIVOS

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

ft (1) = 1, caso base


n1
ft (n) = 2f (
) + 1, caso general
2

Como ft (n) es montona creciente y


de esta forma se tiene el sistema

n
2

>

n1
2

entonces ft ( n2 ) > ft ( n1
),
2

ft (1) 1

n
ft (n) 2f ( ) + 1
2

Por el Teorema 11(2), con a = 2, b = 2 y c = 1, podemos concluir que ft


es O(n) en S, donde S = {2k |k N, k > 0}.
En el siguiente ejemplo, se analiza un algoritmo para encontrar el elemento
mximo en un arreglo utilizando recursividad; en l se aplica tambin el
resultado del Teorema 11.

Ejemplo 23 Encontrar la complejidad del Algoritmo 13, el cual encuentra


el elemento mximo en un arreglo A con n elementos.

4.2. SISTEMAS RECURRENTES

73

proc Mximo (ini, f in, max)


comienza
si (ini = f in) entonces
otro

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:

n, el nmero de elementos en el arreglo.


las comparaciones entre elementos, pues el nmero total de ellas y el nmero total de operaciones son del mismo orden (vase el Ejemplo
4.11).
el algoritmo no tiene 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

CAPTULO 4. ANLISIS DE ALGORITMOS RECURSIVOS

Aplicando el Teorema 11, con a = 2, b = 2 y c = 1 obtenemos

ft (n) es O(nlogb a ) en S
Como log2 2 = 1, entonces

ft (n) es O(n) en S, donde S = {2k |k N, k > 0}

Anlisis Espacial
Como es claro la complejidad espacial es de dos tipos:
1. Esttica

fee (n) = espacio(A)


entonces:

fee (n) = n

2. Dinmica
Se tiene el sistema recurrente:

fed (1) = espacio(ini) + espacio(f in) + espacio(mitad) + espacio(max)


+ espacio(max_aux) + espacio(direccin de retorno)
fed (1) = 6
n
fed (n) = fed ( ) + 6
2
Aplicando el Teorema 10, con a = 1, b = 2 y c = 6 obtenemos

fed (n) = 6(log2 n+1) que es O(log n) en S, donde S = {2k |k N, k > 0}


De lo anterior se tiene que la complejidad espacial es, por el Teorema 6,
max(fee (n), fed (n)), por lo tanto fe (n) es O(n).
Al aplicar los resultados de los Teoremas 10 y 11, slo podemos garantizar
la convergencia para el subconjunto S, en el siguiente teorema se establece
que, si la funcin cumple con ciertas restricciones, el comportamiento del
algoritmo es el mismo en todos los naturales.

4.2. SISTEMAS RECURRENTES

75

Teorema 12 Sea f : N R+ una funcin montona creciente tal que f es

O(g) en S, donde S = {bk |b, k N, k > 0, b > 1}, entonces


1. si g es O(log n) entonces f es O(log n) para toda n

2. si g es O(n log n) entonces f es O(n log n) para toda n


3. si g es O(nd ) entonces f es O(nd ), d 0 para toda n

Demostracin 8 Para el primer inciso tenemos


1. Hiptesis: f es O(g) en S, f : N R+ , f montona creciente y g es
O(log n).
Dado que f es O(g) en S, y g es O(log n) por transitividad f es O(log n)
en S, ahora bien, si mostramos que para todo j fuera de S, |f (j)|
m| log j|, para algn m 0 y k 0 especcos, esto implicara que f
es O(log n) para toda n.

Sea j tal que: bi < j < bi+1 , como f es montona creciente,

f (bi ) < f (j) < f (bi+1 ) y dado que f es O(log n) en S,


|f (bi )| m1 | log bi+1 |, n k1
como f : N R+ y la funcin logaritmo es creciente

f (bi+1 ) m1 log bi+1


f (bi+1 ) m1 log bbi
f (bi+1 ) m1 (log b + log bi )
log b
f (bi+1 ) m1 log bi (1 +
)
log bi
como

log b
log bi

1 podemos sustituirlo sin alterar la desigualdad

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

CAPTULO 4. ANLISIS DE ALGORITMOS RECURSIVOS

como j es cualquier nmero que no est en S, con m = 2m1 y k = k1

|f (j)| m| log j|, j k y j fuera de S f es O(log n).


las demostraciones para los incisos b) y c) siguen la misma metodologa y se
dejan como ejercicios al lector.
Para resolver un sistema recurrente, a menudo es necesario calcular la
ecuacin a la que converge alguna sucesin. Cuando surgen sumatorias para
las que no se conoce la solucin exacta, se suele acotar por arriba mediante el
uso del clculo integral, el apartado siguiente describe e ilustra brevemente
esta tcnica.

4.3. Aproximando por integrales


Recordemos que nuestro objetivo es conocer la cantidad de recursos que
un algoritmo consume para determinar, entre otras cosas, si es conveniente
codicarlo.
Cuando al expandir una recurrencia nos resulte en una sumatoria que no
sepamos a que converge, el clculo integral constituye una herramienta til,
pues nos d la posibilidad de obtener una cota superior para la sumatoria.
Describiremos el procedimiento mediante un ejemplo, suponga que tiene la
sumatoria
n
X
1
i
i=1
para la que no se conoce una frmula cerrada, la escribimos como
n
X
i=1

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. ELECCIN DE LA OPERACIN BSICA

4.4.

77

Eleccin de la operacin bsica

La eleccin de la operacin bsica para un algoritmo recursivo se debe


justicar dando una demostracin constructiva de que la cantidad de veces
que se ejecuta esta operacin observa un modelo de crecimiento similar al
del total de operaciones conforme el tamao del problema crece; es decir se
debe demostrar que el orden del total de operaciones que hace el algoritmo
es igual al orden del total de operaciones bsicas.
Podemos sintetizar el procedimiento en los siguientes pasos:
1. Se visualiza el rbol de llamadas recursivas del algoritmo, que obviamente estar en funcin del tamao del problema, por lo tanto, podemos decir que hay un nmero de nodos g(n).
2. Se obtiene una cota mxima para la cantidad de operaciones que el
algoritmo hace en cada llamada recursiva.
3. Con la funcion g(n) y la cota obtenida en el paso anterior podemos
obtener el orden del total de operaciones en trminos de esos 2 datos.
4. Visualizar la cantidad de llamadas en las que se hacen operaciones
bsicas y encontrar una cota para la cantidad de operaciones bsicas
que se efecta en cada nodo. Expresarlo en trminos de la g(n) obtenida
en el paso 1, y establecer el orden del total de operaciones bsicas.
5. Si el orden del total de operaciones es igual al orden de operaciones
bsicas, entonces la operacin elegida es vlida, en caso contrario, se
debe intentar con otra.
El siguiente par de ejemplos ilustran la eleccin de la operacin bsica
justicada mediante el proceso anterior.

Ejemplo 24 El Algoritmo 14 encuentra el elemento mximo y el mnimo de


un arreglo A con n enteros, donde n es de la forma n = 2k , k 0.
En este algoritmo se tienen las siguientes operaciones:
a) comparaciones entre ndices
b) asignaciones a max y min

78

CAPTULO 4. ANLISIS DE ALGORITMOS RECURSIVOS

proc Maxmin(ini, f in, max, min)


comienza
si (ini = f in) entonces
otro

max A[ini];
min A[ini];

comienza

mitad [(ini + f in)/2];


Maxmin(ini, mitad, max, min);
Maxmin(mitad + 1, f in, max1 , min1 );
si max1 > max entonces max max1 ; is
si min1 < min entonces min min1 ; is

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

c = max(Op. en las hojas, Op. en los nodos internos)


lo que implica entonces que se hacen en total

c(2g(n) + 1) operaciones, que es O(g(n)).

4.4. ELECCIN DE LA OPERACIN BSICA

79

n
2

n
2

n
4

n
4

n
4

n
4

Figura 8: rbol de llamadas recursivas para un problema de tamao n


La operacin bsica (o.b. en lo subsecuente) se efecta slo en los nodos
con tamao de problema mayor que 1, es decir, en los nodos internos, podemos decir entonces que si tenemos g(n) nodos internos y en cada nodo se
hacen 2 o.b., entonces

2(g(n) + 1) es O(g(n)) o.b.


dado que O(nmero de o.b.) = O(nmero total de operacines), las comparaciones pueden ser elegidas como o.b.

Ejemplo 25 La eleccin de la operacin bsica para el algoritmo del factorial

se justica mediante el siguiente razonamiento.


Si llamamos  g(n) al nmero de llamadas recursivas que hace el algoritmo para un problema de tamao n tenemos que hacer en total c g(n)
operaciones, donde la constante c representa las operaciones hechas en cada
llamada, por lo tanto el nmero total de llamadas recursivas y el nmero total
de operaciones son O(g(n)). En g(n) 1 llamadas se hacen multiplicaciones,
por lo tanto el nmero de multiplicaciones es O(g(n)), y se puede considerar
la operacin para el anlisis dado que: O(total de operaciones) = O(total de
multiplicaciones).

Ejemplo 26 Muestre que la eleccin de la operacin bsica para el Algoritmo


13 es correcta.

80

CAPTULO 4. ANLISIS DE ALGORITMOS RECURSIVOS

Para ver que esto es cierto, considrese el rbol de llamadas recursivas


de la Figura 8, donde g(n) representa el total de nodos, lo que se obtiene
sumando los nodos internos h(n) ms el total de nodos externos h(n) + 1. Si
llamamos g(n) al nmero de llamadas recursivas, que dependen del tamao
del problema n, entonces se tiene

O(llamadas recursivas) = O(g(n)),


luego entonces se hacen c g(n) operaciones, c es el nmero de operaciones
hechas en cada llamada; hasta aqu podemos armar que el nmero total de
operaciones es O(g(n)).
Observe que en cada nodo interno del rbol se hace una comparacin, as
total de operaciones bsicas = 1 h(n)
g(n) 1
=
2
es O(g(n))
de lo anterior conrmamos que la operacin se puede usar para el anlisis,
pues

O(total de operaciones) = O(total de operaciones bsicas)

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)

Ejercicio 4.2 Muestre que el nmero de funciones booleanas de n variables


est dado por la recurrencia:

f (1) = 4
f (n) = (f (n 1))2

4.5. EJERCICIOS

81

Ejercicio 4.3 Resulvanse las siguientes recurrencias. De una solucin exacta.

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.4 Muestre que la solucin al sistema recurrente


f (1) = c
n
f (n) = af ( ) + cn, para n = bk k > 0,
b
es:
1. si a > b entonces f es O(na)
2. si a = b entonces f es O(n log n)
3. si a < b entonces f es O(n)
donde a, b y c son enteros tales que a 1, b > 1 y c > 0, y f es una funcin
de N a R.

Ejercicio 4.5 Elabore algoritmos recursivos para resolver los siguientes problemas y calcule su complejidad temporal y espacial.

1. Encontrar una moneda falsa en un arreglo de n monedas con n = 2k


(el arreglo contiene los pesos de las monedas y la falsa pesa menos que
las otras).
2. Evaluar una expresin aritmtica en notacin inja que se encuentra
en un arreglo que contiene prioridades de aplicacin para los elementos
de la expresin (la prioridad de un operando es innita).

Ejercicio 4.6 Sea n una potencia de 2, y sean A y B dos matrices n

n. El mtodo de Strassen para obtener el producto C = AB, consiste en


particionar A y B en matrices componentes de n2 n2 y multiplicarlas usando
las frmulas mencionadas en el Ejercicio 1.1. Esto es, las frmulas son usadas recursivamente para multiplicar las matrices componentes reduciendo el
problema a multiplicar matrices de dimensin 2X2.

82

CAPTULO 4. ANLISIS DE ALGORITMOS RECURSIVOS

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.7 La altura de un rbol es el nivel mximo del rbol (o la distan-

cia mxima entre la raz y un nodo externo). Disee un algoritmo recursivo


para calcular la altura de un rbol binario. Cul es la complejidad temporal
de su algoritmo?

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).

Ejercicio 4.10 Demuestre los incisos b y c del Teorema 12.

También podría gustarte