Вы находитесь на странице: 1из 158

Anlisis de Algoritmos

Elizabeth Prez Corts


Ren Mac Kinney Romero
Universidad Autnoma Metropolitana

12 de septiembre de 2005
2
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 algo-


rtmica prctica y podr aplicar criterios para darles soluciones apro-
ximadas ecientes.

3
4
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 as-
trnomo 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 Conoci-
miento (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 lec-
tores empezaron a atribuirle no slo el libro sino, tambin, un esquema de
numeracin que hace uso de numerales indios, esto ltimo se le atribuy err-
neamente. 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 signi-
ca, 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 teo-
ra 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 pro-
blemas as como tambin encontrar soluciones aproximadas (no ptimas pero
aceptables).
ndice general

I Anlisis de algoritmos 11
1. Introduccin 13
1.1. Conceptos Bsicos . . . . . . . . . . . . . . . . . . . . . . . . 14
1.1.1. Denicin de algoritmo . . . . . . . . . . . . . . . . . . 14
1.2. Complejidad de algoritmos . . . . . . . . . . . . . . . . . . . . 15
1.3. Ejercicios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25

2. Comportamiento... 29
2.1. Dominio asinttico . . . . . . . . . . . . . . . . . . . . . . . . 29
2.2. Notacin de orden . . . . . . . . . . . . . . . . . . . . . . . . . 36
2.3. Interpretacin de los conceptos enunciados . . . . . . . . . . . 41
2.4. Dominio asinttico con lmites . . . . . . . . . . . . . . . . . . 43
2.5. Ejercicios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 46

3. Anlisis de Algoritmos Iterativos 49


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

4. Anlisis de Algoritmos Recursivos 59


4.1. Introduccin . . . . . . . . . . . . . . . . . . . . . . . . . . . . 59
4.2. Sistemas recurrentes . . . . . . . . . . . . . . . . . . . . . . . 60
4.2.1. Expansin de recurrencias . . . . . . . . . . . . . . . . 62
4.3. Aproximando por integrales . . . . . . . . . . . . . . . . . . . 76
4.4. Eleccin de la operacin bsica . . . . . . . . . . . . . . . . . 77

7
8 NDICE GENERAL

4.5. Ejercicios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 80

II Tcnicas de Diseo de Algoritmos 83


5. Dividir para vencer 87
5.1. Forma genrica . . . . . . . . . . . . . . . . . . . . . . . . . . 87
5.2. Forma de la Funcin Complejidad . . . . . . . . . . . . . . . . 88
5.3. Mergesort
Ordenamiento por intercalacin . . . . . . . . . . . . . . . . . 89
5.3.1. Problemas del algoritmo Mergesort. . . . . . . . . . . . 92
5.4. Quicksort . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 95
5.5. Ejercicios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 101

6. Mtodo vido 105


6.1. Problemas Tipo . . . . . . . . . . . . . . . . . . . . . . . . . . 105
6.2. Almacenamiento en Cintas . . . . . . . . . . . . . . . . . . . . 106
6.3. Problema de la mochila . . . . . . . . . . . . . . . . . . . . . . 108
6.4. Intercalacin ptima de archivos . . . . . . . . . . . . . . . . . 112
6.4.1. Problema . . . . . . . . . . . . . . . . . . . . . . . . . 112
6.4.2. Estrategia . . . . . . . . . . . . . . . . . . . . . . . . . 113
6.4.3. Generalizacin a arboles de grado k . . . . . . . . . . . 115
6.4.4. Aplicacin : Cdigo de Human . . . . . . . . . . . . . 115
6.5. Arboles Generadores mnimos . . . . . . . . . . . . . . . . . . 116
6.5.1. Problema . . . . . . . . . . . . . . . . . . . . . . . . . 116
6.5.2. Estrategia . . . . . . . . . . . . . . . . . . . . . . . . . 116

7. Bsqueda con retroceso (Backtrack) 119


7.1. Problemas Tipo . . . . . . . . . . . . . . . . . . . . . . . . . . 119
7.2. Mtodo de Solucin . . . . . . . . . . . . . . . . . . . . . . . . 120
7.3. n Reinas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 122
7.3.1. Restricciones explicitas . . . . . . . . . . . . . . . . . . 123
7.3.2. Restricciones implcitas . . . . . . . . . . . . . . . . . . 123
7.4. Suma de Subconjuntos . . . . . . . . . . . . . . . . . . . . . . 125
7.4.1. Formulacin 1 . . . . . . . . . . . . . . . . . . . . . . . 126
7.4.2. Restricciones . . . . . . . . . . . . . . . . . . . . . . . 126
7.4.3. Formulacin 2 . . . . . . . . . . . . . . . . . . . . . . . 127
7.4.4. Restricciones . . . . . . . . . . . . . . . . . . . . . . . 128
NDICE GENERAL 9

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


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

8. rboles de juego 133


8.1. Problema . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 133
8.2. Solucin . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 134
8.3. Mtodo Min-Max . . . . . . . . . . . . . . . . . . . . . . . . . 134
8.4. Funciones de Utilidad . . . . . . . . . . . . . . . . . . . . . . . 134
8.5. Gato (n-en lnea) . . . . . . . . . . . . . . . . . . . . . . . . . 136
8.5.1. Poda alfa-beta . . . . . . . . . . . . . . . . . . . . . . . 136
8.5.2. Reglas . . . . . . . . . . . . . . . . . . . . . . . . . . . 136

9. Complejidad de los algoritmos diseados con Backtrack. 137


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

III Problemas NP 141


10.Problemas Tratables e Intratables 143
10.1. Algoritmos No Deterministicos . . . . . . . . . . . . . . . . . . 143
10.2. Interpretaciones . . . . . . . . . . . . . . . . . . . . . . . . . . 144
10.3. Problema de decisin del Clan . . . . . . . . . . . . . . . . . . 150
10.4. Problema de la cobertura de nodos . . . . . . . . . . . . . . . 151
10.5. Problema de la planeacin . . . . . . . . . . . . . . . . . . . . 155
10.6. Generacin de cdigo ptimo . . . . . . . . . . . . . . . . . . . 156
10.7. Problemas NP Computables y No decidibles . . . . . . . . . . 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 tie-


ne 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, senci-


llez y facilidad de implantacin, depuracin y mantenimiento.

b) Criterios orientados a disminuir el costo de ejecucin: tiempo de pro-


cesador 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 he-
rramientas 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 permi-
tirn 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 algorit-
mos.

1.1.1. Denicin de algoritmo


Un algoritmo es un conjunto nito de instrucciones no ambiguas y efec-
tivas 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 perfecta-
mente 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 al-
goritmo, 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 ejem-
plo, 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 en100040 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, anloga-
mente 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 re-
solver 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 con- Nmero de elementos en el conjunto
junto
Multiplicar dos matrices Dimensin de las matrices
Recorrer un rbol Nmero de nodos en el rbol
Resolver un sistema de ecuaciones li- Nmero de ecuaciones y/o incgnitas
neales
Ordenar un conjunto de valores 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 distingui-
remos dos clases de funcin complejidad:

a) Funcin complejidad espacial. Mide la cantidad de memoria que nece-


sitar un algoritmo para resolver un problema de tamao n.

b) Funcin complejidad temporal. Indica la cantidad de tiempo que re-


quiere 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 implanta-


cin, 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 com-
plejidad, el anlisis temporal (y el espacial) se har nicamente con base al
algoritmo escrito en pseudocdigo. Como el pseudocdigo no se puede ejecu-
tar 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 o-
peraciones 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 operacio-


nes 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 eje-
cuta 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 to-
tal 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 canti-
dades 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 valo-
res 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 con-
sideraciones 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 ndi-
ces, las operaciones (d) y (e) se ejecutan una sola vez y no son proporcio-
nales 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
mayor1 A[1];
mayor2 A[2];
otro
mayor1 A[2];
mayor2 A[1];
is
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 con- Comparacin entre el valor y los ele-
junto mentos del conjunto
Multiplicar dos matrices Producto de los elementos de las ma-
trices
Recorrer un rbol Visitar un nodo
Resolver un sistema de ecuaciones li- Suma
neales
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 ope-
racin 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 compor-


tamiento 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 instan-
cia 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
k
X
ft (n) = 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 anloga-
mente, 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: Bsqueda lineal de un valor en un arreglo de
tamao n.
Tamao del Problema: n = nmero de elementos en el arreglo.
Operacin bsica: 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
1
P (i) =
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: Dado un arreglo de valores, encontrar el
producto de los dos nmeros mayores.
Tamao del Problema: n =nmero de elementos en el arreglo.
Operacin bsica: 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 particio-
nar 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 consu-
me; 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 25

1.3. 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 c12 = a11 b12 + a12 b22
c21 = a21 b11 + a22 b21 c22 = a21 b12 + a22 b22

sta involucra 8 multiplicaciones y 4 sumas.


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

m1 = (a11 + a22 )(b11 + b22 ) m5 = (a11 + a12 )b22


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

Ejercicio 1.2 El algoritmo 3 encuentra la representacin binaria de un en-


tero 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
r[i] 0
otro
r[i] 1;
y y1
is
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 proble-
ma, el nmero de operaciones que requiere el algoritmo es b 10
3
log N c+1.

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, efec-


te 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]; (* b = min{x1 , x2 , . . . , xn } *)
is
zah
termina.
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 con-
tiene 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 tem-
poral 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 necesi-
dad 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 velo-
cidad 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)|
4

0
0 1 2 4 5
k
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 matem-


ticamente 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

1 si n es par
f (n) = n y g(n) =
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 cum-
plen,
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 com-
portamiento 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 propieda-
des 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

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


sitiva.
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 asinttica-
mente 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 me-
todologa que se desarrollar en esta seccin para estimar, aproximadamen-
te, los costos (en espacio y tiempo) de las soluciones que proporcionan los
algoritmos y para comparar algoritmos con base en tales costos. La caracte-
rstica 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 si n es par
iii) f (n) = n, g(n) =
n3 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
f1 (n) = + 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 ).

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 re-
presentar 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 asinttica-
mente 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 desigual-


dad se cumple para n n0 , esto signica que para problemas de tamao n0
42 CAPTULO 2. COMPORTAMIENTO...

n
O(c )

O(n log n)

O(log n)

O(1)

O(n)

c
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 com-
plejidad 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, principal-
f (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)
a) Si lm = c, para alguna constante c 6= 0 entonces f y g son del
n g(n)
mismo orden.
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)
c) Si lm = , entonces f es de mayor orden que g.
n g(n)
44 CAPTULO 2. COMPORTAMIENTO...

Esta denicin resulta clara, si estudiamos el comportamiento de las fun-


ciones 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
Ejemplo 10 Sean f (n) = , y g(n) = 300n2 funciones de N a R. Mostrar,
2
usando la denicin de lmite, que O(f ) = O(g).
n2
2 1
lm = ,
n 300n2 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 f (n) = y lm g(n) =
n n

entonces
f (n) f 0 (n)
lm = 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.
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 = lm
n g(n) n n
1
n log e
= lm
n 1
1
= lm log e
n n
= 0,
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
= lm n
n e n e
2
= lm n
n e
= 0,
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)
lm = c, (2.1)
n g(n)

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)
c <e
g(n)
Para valores grandes de k y con e = 1 obtenemos

f (n)
c < 1, n k
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 algorit-
mo, 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 asin-
tticamente a las otras.

n, si n es par
i) f1 (n) =
n, si n es impar
n+1
ii) f2 (n) =
n+1
1
iii) f3 (n) = 3n2 log n + 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 mis-
mo grupo si y slo si se dominan asintticamente.

f1 (n) = n f7 (n) = 2n
f2 (n) = n3 f8 (n) = log n
f3 (n) = n log n f9 (n) = n n3 + 9n5
f4 (n) = n2 + log n f10 (n) = n2
1
f5 (n) = n 2 + log n f11 (n) = ln n
f6 (n) = 3n! 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)
5n3 + 6
ii) f (n) =
n+2
(n2 + 7)3n
iii) f (n) =
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 conten-
cin 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 algo-
ritmo 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 va-


lores 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 decrecien-

49
50 CAPTULO 3. ANLISIS DE ALGORITMOS ITERATIVOS

te,

n
X
ft (n) = n (i + 1)
i=2
Xn
=n 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, nece-


sitamos

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

n
X i+3
ft (n) =
i=2
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).

?
@
@
V C @ F
@
? @ ?
@
I1 I2
O(f ) 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 ite-
racin 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
Xn
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 :
n
X
cij = aik bkj , i, j [1, n].
k=1
54 CAPTULO 3. ANLISIS DE ALGORITMOS ITERATIVOS

-
@
@
I1 V @
O(f ) @
C
@
@
F
?

Figura 7: Complejidad de la iteracin

proc Matriz-Producto(n, A, B)
comienza
para i = 1 a n haz I1
para j = 1 a n haz I2
C[i, j] 0; I3
para k = 1 a n haz I4
C[i, j] C[i, j] + A[i, k] B[k, j]; I5
zah
zah
zah
termina.
Algoritmo 6: Producto de matrices
3.2. ANLISIS POR BLOQUES 55

Tamao del problema: n, la dimensin de las matrices.


Operacin bsica: la multiplicacin entre las entradas de las ma-
trices.
Caso : El algoritmo hace el mismo nmero de opera-
ciones 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 ).
n
X n
X n
X
1 Note que el anlisis es identico si hacemos b) 1 = n, c) n = n2 y d) n2 = n3 .
k=1 j=1 i=1
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 com-
plejidad temporal.

n
X
Ejemplo 15 Sea A un vector de coecientes y sea Pn (z) = 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; I1
para i = 0 a n haz I2
polinomio polinomio z + A[n i]; I3
zah
termina.
Algoritmo 7: Mtodo de Horner

Tamao del problema: n, el grado del polinomio.


Operacin bsica: la multiplicacin en I3 , pues se realiza un n-
mero de veces del mismo orden al tamao del
problema (el grado del polinomio).
Caso : El algoritmo hace el mismo nmero de opera-
ciones 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; r es el residuo
mientras (r > 0) haz
r a mod b;
a b;
b r;
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 ordena-


cin 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 elemen-


tos depende del tiempo que a ste le toma ordenar n 1 elemen-
tos, 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 que-
remos estudiar pueden ser modeladas matemticamente por funciones de-
nidas 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 tie-
nen 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 n-
mero entero n,

func Factorial(n)
comienza
si (n = 0) entonces
Factorial 1;
otro
Factorial n F actorial(n 1);
is
termina.
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 multipli-
cacin 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 ecua-


cin 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 ini-


cial, y
Si n > 0 entonces f (n) = f (n 1) + 1
= (n 1) + 1
=n satisface la ecuacin recu-
rrente, 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, iterativa-
mente 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 ob-
tendremos 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 elemen-
tos, 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 res-
tantes.
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 comple-


jidad 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
..
.
c f (2) c f (1) = cn2 b
n2 n1

cn1 f (1) = cn1 a

sumando todas las ecuaciones tenemos

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


n2
X
= cn1 a + b ci
i=0
4.2. SISTEMAS RECURRENTES 65

sabemos que
n
X
ci = n + 1, si c = 1
i=0
n
X cn+1 1
ci = , si c 6= 1
i=0
c1

entonces si c = 1

f (n) = a + b(n 1)

y si c 6= 1

b(cn1 1)
f (n) = cn1 +
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)
b(cn1 1)
ii) Si c > 1 entonces f (n) = cn1 a + .
c1
A continuacin ilustramos el uso del teorema anterior para resolver proble-
mas 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);
termina
is
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 dis-
co es una escritura de ini, , n.
Caso : El algoritmo hace el mismo nmero de opera-
ciones 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 :

n1 2n1 1
ft (n) = 2 + = 2n1 + (2n1 1) = 2n 1 es O(2n ).
1

Hasta ahora slo hemos analizado algoritmos que utilizaban memoria es-
ttica, los Algoritmos 10 y 11, por ser recursivos, requieren espacio para al-
macenar los registros de activacin de las diferentes llamadas, de tal manera
que mientras ms anidacin de ambientes exista, mayor cantidad de memo-
ria 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 tamaon1. 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 algorit-


mo 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
P otencia base
otro
P otencia base Potencia(base, exp 1);
is
termina.
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 69

c(anlogb a 1)
ii) Si a 6= 1 entonces f (n) =
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
k
X
=c 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)
f (bk ) =
a1
c
= (aak 1)
a1
70 CAPTULO 4. ANLISIS DE ALGORITMOS RECURSIVOS

pero
logb n
alogb n = blogb a
= blogb n logb a
= blogb a logb n
logb a
= blogb n
= nlogb a

entonces
c
f (n) = (aalogb n 1)
a1
c
f (n) = (anlogb a 1)
a1
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: n, el nmero de nodos en el rbol.


Operacin bsica: las asignaciones.
Casos: el algoritmo no tiene casos.
72 CAPTULO 4. ANLISIS DE ALGORITMOS RECURSIVOS

func Cuenta(raiz)
comienza
si (tipo(raiz) = hoja)) entonces
Cuenta 1
otro
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

n n1
Como ft (n) es montona creciente y 2
> 2
entonces ft ( n2 ) > ft ( n1
2
),
de esta forma se tiene el sistema

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
max A[ini]
otro
comienza
mitad bini+f
2
inc
;
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: n, el nmero de elementos en el arreglo.


Operacin bsica: las comparaciones entre elementos, pues el n-
mero total de ellas y el nmero total de opera-
ciones son del mismo orden (vase el Ejemplo
4.11).
Casos: 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
log b
como 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
Xn
1
i=1
i

para la que no se conoce una frmula cerrada, la escribimos como

n
X Z n
1 1
= 1+ dx = 1 + (ln x|x=n ln x|x=2 )
i=1
i 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 77

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


mente estar en funcin del tamao del problema, por lo tanto, pode-
mos 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 lag(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
max A[ini];
min A[ini];
otro
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. Conside-
raremos 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 recur-
sivas 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 n
2 2

n n n n
4 4 4 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, po-
demos 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 compa-


raciones 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 algo-
ritmo 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 (4.1)
2
n
f (n) = 2f ( ) + log n (4.2)
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 exac-


ta.
f (1) = 2 (4.3)
f (n) = 2f (n 1) + 1
f (1) = 1 (4.4)
n
f (n) = f (n 1) +
2
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 pro-
blemas 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 usa-
das 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 n-


mero de operaciones bsicas que hace es, aproximadamente, n2 .

2. Discuta la importancia del algoritmo para resolver otro tipo de proble-


mas 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 nive-


les 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 ex-
terno. 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 ejer-
cicio 3.2).

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


Parte II
Tcnicas de Diseo de Algoritmos

83
85

En este parte se estudiaran diversas tcnicas de diseo de algoritmos.


En cada captulo se estudiar una tcnica distinta empezando por ver que
tipo de problemas se pueden atacar utilizando la tcnica. Se estudia, adems,
el como hacer el anlisis de algoritmos que utilicen dicha tcnica as como
ejemplos concretos donde podemos utilizar la tcnica para su solucin.
No se pretende realizar un estudio exhaustivo sino presentar las tcnicas
mas comunes. Dichas tcnicas son:

Dividir para vencer.

Mtodo Avido.

Bsqueda con retroceso.

rboles de juego.

A continuacin se presentan cada una de ellas con una breve introduccin


Dividir para vencer
Mtodo Avido.
Bsqueda con retroceso.
rboles de jurgo.
86
Captulo 5

Dividir para vencer

Esta tcnica es muy utilizada en la solucin de problemas. Esto se debe a


que la idea bsica de esta tcnica es simple. Tenemos un problema complejo
al cual dividimos en subproblemas mas pequeos a resolver. Para resolver
cada subproblema seguimos el mismo procedimiento hasta que llegamos a un
problema que es trivial. Una vez resueltos los subproblemas los combinamos
para dar solucin al problema original.

5.1. Forma genrica


El Algoritmo 15 presenta la forma genrica de un algoritmo diseado
utilizando la tcnica de dividir para vencer.
El algoritmo recibe un problema p, el tamao de este problema n as
como una variable donde se guarda la solucin s. El problema p es dividido
en varios subproblemas que se guardan en el vector sp. Para resolver cada
subproblema el algoritmos se llama recursivamente donde el subproblema
ser a su vez dividido hasta que eventualmente lleguemos al caso donde la
solucin es trivial. Una vez resueltos todos los subproblemas se combinan
todas las soluciones encontradas (que se han guardado en el vector ssp) en
la solucin s.
Cuando el tamao del problema es lo sucientemente pequeo se calcula
de manera inmediata la solucin.

87
88 CAPTULO 5. DIVIDIR PARA VENCER

proc DividirParaVencer (p,n,s)


comienza
si pequeo(p, n) entonces
CalculaSolucinInmediata(p, n, s)
otro
sp = Divide(p, n, s, t)
sp es un arreglo de subproblemas
para i = 1 a nmero de subproblemas haz
DividirParavencer(sp[i], t[i], ssp[i])
t es un arreglo de tamaos de los subproblemas
ssp es un arreglo de soluciones del problema
zah
Combina(ssp, s)
is
termina.
Algoritmo 15: Dividir para Vencer

5.2. Forma de la Funcin Complejidad


La funcin complejidad para un problema de tamao n es un sistema de
ecuaciones recurrentes de la forma

f (m) = fCalculaSolucinInmediata(m)
k
X
f (n) = fDivide(n) + fCombina(n) + f (t[i])
i=1

donde m es el valor para el cual la funcin problema pequeo es verdadero y


k el nmero de subproblemas, es decir, el nmero de elementos de sp.
Esta tcnica es muy utilizada para resolver el problema de ordenar un
arreglo de valores as como de bsqueda. A continuacin veremos dos ejem-
plos de como utilizar dividir para vencer para ordenar un arreglo. Es impor-
tante destacar que pese a que la tcnica utilizada es la misma en ambos casos
los algoritmos resultantes son diferentes.
5.3. MERGESORT ORDENAMIENTO POR INTERCALACIN 89

5.3. Mergesort
Ordenamiento por intercalacin
Ejemplo 27 El ordenamiento por intercalamiento (mergesort), como se mues-
tra en el algoritmo 16, utiliza la tcnica de dividir para vencer de la siguiente
manera. Para ordenar un arreglo este se divide en dos mitades, cada mitad
es ordenada y ambas mitades ya ordenadas se intercalan para dar la solucin.

proc Mergesort(ini, f in)


comienza
si ini < f in entonces
mitad (ini+f2
in)

Mergesort(ini, mitad)
Mergesort(mitad + 1, f in)
Intercala(ini, mitad, f in)
is
termina.
Algoritmo 16: Mergesort

El algoritmo utiliza el hecho de que un arreglo de tamao 1 ya esta orde-


nado, en el caso base no se realiza ninguna operacin. En el caso recursivo
el algoritmo 17 es utilizado para combinar las dos mitades ordenadas en un
arreglo ya ordenado.

Anlisis Temporal
Tamao del problema: n, el tamao del arreglo.
Operacin bsica: asignaciones entre elementos del arreglo.
Primero es necesario hacer el anlisis del algoritmo que intercala, algo-
ritmo 17. El algoritmo hace 2n operaciones. Esto lo podemos ver de manera
informal de la siguiente manera. Primero, el algoritmo copia todos los ele-
mentos de el arreglo A al arreglo B intercalndolos en orden. Despus, copia
los elementos del arreglo B al A ya en orden. Debido a que el algoritmo de
ordenamiento no realiza comparaciones se tiene un solo caso.
Caso nico:
90 CAPTULO 5. DIVIDIR PARA VENCER

proc Intercala(ini, mitad, f in)


comienza
ini1 ini
ini2 mitad + f in
k1
mientras (ini1 mitad) (ini2 f in) haz
si A[ini1 ] < A[ini2 ] entonces
B[k] A[ini1]
ini1 ini1 + 1
otro
B[k] A[ini]
ini ini2 + 1
is
k k+1
zah
si ini > mitad entonces se acabo arreglo izquierdo
para j = ini2 a f in haz
B[k] A[j]
k k+1
zah
is
para j ini a f in haz
A[j] B[j]
termina.
Algoritmo 17: Intercala
5.3. MERGESORT ORDENAMIENTO POR INTERCALACIN 91

f (1) = 0
intercala
z}|{ n
f (n) = 2n +2f ( )
2

Si asumimos que n = 2k podemos expandir la recurrencia utilizando el


hecho de que
n
f (n) 2f ( ) = 2n
2
de la siguiente forma

f (2k ) 2f (2k1 ) = 2 2k
2f (2k1 ) 22 f (2k2 ) = 22 2k1
22 f (2k2 ) 23 f (2k3 ) = 23 2k2
..
.
2k2 f (22 ) 2k1 f (21 ) = 2k1 22
2k1 f (21 ) 21 f (20 ) = 2k 21

Sumando todas las ecuaciones tendremos que

k
X
k
f (2 ) = 2k+1 = k 2k+1
i=1

pero como asumimos n = 2k eso implica que k = log(n) y por lo tanto

f (n) = log(n) n

es decir
f (n) es O(n log n)

Anlisis Espacial
Memoria esttica.
92 CAPTULO 5. DIVIDIR PARA VENCER

Observamos que en el algoritmo de intercala se necesitan de n celdas para


los arreglos A y B. Dado que estas son variables globales es la nica memoria
esttica se necesita. Por lo tanto

Fme (n) = 2n + c es O(n)

Memoria dinmica.
En el caso de la memoria dinmica debemos saber el nmero de llamadas
recursivas realizadas. En este caso la relacin de recurrencia es

Fmd (1) = c
n
Fmd (n) = c + Fmd ( )
2

ya que despus de cada llamada recursiva esta libera los recursos que haya
utilizado. Por lo tanto de memoria dinmica la funcin es

Fmd (n) = c log n es O(log n)

5.3.1. Problemas del algoritmo Mergesort.


Existen dos problemas con el algoritmo de ordenamiento por intercala-
miento. Estos son
1. Exceso de llamadas recursivas.
Solucin propuesta: Cortar la recursividad en n = 16; utilizar insercin
directa. El algoritmo 18 es el algoritmo de insercin directa el cual se
puede utilizar para aquellos casos donde n 16.
El anlisis para el algoritmo cambia ya que en el caso base se hace
la insercin directa. Este algoritmo si vara de acuerdo a como se en-
cuentren los datos en el arreglo. El anlisis del algoritmo de insercin
directa sera de la siguiente manera:
Mejor caso: El arreglo est ordenado de manera ascendente.
En este caso el ciclo mientras nunca se realiza y por lo tanto

Ft (n) = 3(n 1) es O(n)

contando las asignaciones.


5.3. MERGESORT ORDENAMIENTO POR INTERCALACIN 93

proc InsercinDirecta(ini, f in)


comienza
para j ini + 1 a f in haz
x A[j]
ij1
mientras x < A[i] i ini haz
A[i + 1] A[i]
ii1
zah
A[i + 1] x
zah
termina.
Algoritmo 18: Insercin Directa

Peor Caso: El arreglo est ordenado ascendentemente.


En este caso el ciclo mientras se ejecuta siempre j ini veces. Si supo-
nemos ini = 1 tendremos
n j n
X X X
Ft (n) = (3 + 2) = 3 + 2(j 1)
j=2 i=0 j=2

que es O(n2 ).
Para el algoritmo de mergesort lo que cambiara sera el caso base:
si (ini f in + 1 < 16) entonces
InsercinDirecta(ini, f in)
otro
...
Y por lo tanto

Aprox. total de llamadas


nmero de llamadas recursivas .
25

2. Utilizacin de un arreglo auxiliar (i.e copiado sistemtico)


solucin propuesta: Usar ligas como sucede en el algoritmo 19.
94 CAPTULO 5. DIVIDIR PARA VENCER

proc Intercala2 (l1 , l2 , lr )


comienza
k0
mientras l1 6= 0 l2 6= 0 haz
si A[l1 ] < A[l2 ] entonces
k l1 ;
ligas[k] l1 ;
l1 ligas[k];
ligas[k] l2 ;
k l2 ;
l2 ligas[l2 ];
is
zah
si l1 6= 0 entonces
ligas[k] l2 ;
otro
ligas[k] l1 ;
lr ligas[0];
is
termina.
Algoritmo 19: Intercala con ligas
5.4. QUICKSORT 95

5.4. Quicksort
Ejemplo 28 Quicksort El algoritmo de ordenamiento rpido (quicksort),
como se muestra en el algoritmo 20, utiliza tambin la tcnica de dividir para
vencer. En este caso la estrategia es tomar un elemento como pivote y poner
en una parte a los elementos menores al pivote y en la otra a aquellos mayores
al pivote. Despus se hacen llamadas recursivas para ordenar ambas partes.
En este caso tambin se aprovecha el hecho de que un arreglo de tamao 1
esta ya ordenado.

proc Quicksort(ini, f in)


comienza
si ini < f in entonces
pivote Particin(ini, f in)
Quicksort(ini, pivote 1)
Quicksort(pivote + 1, f in)
is
termina.
Algoritmo 20: Quicksort

El algoritmo que parte el arreglo en dos partes (no iguales) esta denido
en el algoritmo 21. Este algoritmo parte el arreglo en dos partes utilizando
al primer elemento del arreglo como pivote.

Anlisis Temporal
Tamao del problema: Tamao del arreglo
Operacin bsica: Comparaciones
Para hacer el anlisis temporal notamos que el algoritmo particin realiza
n comparaciones. De manera informal esto sucede por que el pivote se com-
para contra todos los elementos del arreglo. Hacemos el anlisis de quicksort
caso por caso.
Peor Caso: Ocurre cuando el pivote es el primer elemento
En este caso el arreglo se divide en dos partes, una de tamao n 1 y
otra de tamao 1. Como ya dijimos el arreglo de tamao 1 ya esta ordenado
y supongamos que no necesitamos realizar ninguna operacin. Por lo tanto
96 CAPTULO 5. DIVIDIR PARA VENCER

func Particin(ini, f in)


comienza
x A[ini];
men ini 1;
may f in + 1;
repite
repite men men + 1hasta A[men] > x;
repite may may 1hasta A[may] < x;
si men < may entonces
Intercambia(men, may)
is
hasta men may;
A[ini] A[may];
A[may] x;
Particin may;
termina.
Algoritmo 21: Particin

tendremos

f (1) = 0
f (n) = f (1) + f (n 1) + |{z}
n +1 = f (n 1) + n + 1
particin

es decir

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

y expandiendo las recurrencias tendremos

f (n) f (n 1) = n + 1
f (n 1) f (n 2) = (n 1) + 1
f (n 2) f (n 3) = (n 2) + 1
..
.
f (2) f (1) = 2 + 1
5.4. QUICKSORT 97

sumando las ecuaciones obtenemos

n
X n(n + 1)
f (n) = (i + 1) = + (n 2)
2
2

que es O(n2 ).
Mejor caso:El pivote esta exactamente a la mitad
En este caso el arreglo se divide en dos partes del mismo tamao. Si
suponemos que n = 2k cada parte tendr un tamao 2k 1 (por que el
pivote ya esta en orden). La gura 9 muestra el rbol de llamadas recursivas
que se realizan.

f (2k )

f (2k1 1) f (2k1 1)

f (2k2 1) f (2k2 1) f (2k2 ) f (2k2 )

Figura 9: rbol de Llamadas

En este caso expresamos la relacin de recurrencias como una desigualdad


de tal manera que

f (1) 0
n
f (n) 2f ( ) + n + 1
2

es decir

n
f (n) 2f ( ) n + 1,
2
98 CAPTULO 5. DIVIDIR PARA VENCER

como asumimos n = 2k tendremos

f (2k ) 2f (2k1 ) 2k + 1
2f (2k1 ) 22 f (2k2 ) 2k + 2
22 f (2k2 ) 23 f (2k3 ) 2k + 22
..
.
2k2 f (22 ) 2k2 f (2) 2k + 2k2
2k1 f (2) 2k f (1) 2k + 2k1

por lo tanto
k1
X
k k 2k1
f (2 ) k2 + 2i k2k + 1 n log n + n 1
i=0
2

que es O(n log n).


Caso medio: El pivote se distribuye uniformemente en todo el arreglo.
Esto signica que las llamadas recurrentes pueden tener las siguientes
formas:

f (0) + f (n 1) + n + 1
f (1) + f (n 2) + n + 1
f (2) + f (n 3) + n + 1
..
.
f (n 3) + f (2) + n + 1
f (n 2) + f (1) + n + 1
f (n 1) + f (0) + n + 1

Si tomamos todas esas ecuaciones y las sumamos tendremos


2[f (0) + f (1) + f (2) + + f (n 1)] + n(n + 1)
f (n) =
n
es decir

nf (n) = 2[f (0) + f (1) + f (2) + + f (n 1)] + n(n + 1).


5.4. QUICKSORT 99

Resolvemos la recurrencia para n 1 y obtenemos


(n 1)f (n 1) = 2[f (0) + f (1) + f (2) + + f (n 2)] + (n 1)n
restando la ecuacin para nf (n) y (n 1)f (n 1) obtenemos
nf (n) [(n 1)f (n 1)] = 2f (n 1) + 2n
nf (n) = [2 + n 1]f (n 1) + 2n
nf (n) = (n + 1)f (n 1) + 2n

Con lo cual obtenemos la relacin de recurrencia


f (1) = 0
n+1
f (n) = f (n 1) + 2
n
Resolviendo la relacin de recurrencia tendremos
f (n) f (n 1) 2
=
n+1 n n+1
f (n 1) f (n 2) 2
=
n n1 n
f (n 2) f (n 3) 2
=
n+1 n n1
..
.
f (3) f (2) 2
=
4 3 4
f (2) f (1) 2
=
4 2 3

por lo que
X1 n+1
f (n)
=2
n+1 i=3
i
despejando f (n) tenemos
n+1
X Z n+1
1 dx
f (n) = 2(n + 1) 2(n + 1)
i=3
i 3 x
100 CAPTULO 5. DIVIDIR PARA VENCER

utilizando aproximacin por integrales. Finalmente tendremos

f (n) 2(n + 1)[log(n + 1) log 3]

que es O(n log n).


El algoritmo adolece del exceso de llamadas recursivas, como mergesort.
El algoritmo 22 es una versin iterativa del algoritmo.

proc QuicksortIterativo(ini, f in)


comienza
MetePila(ini, f in)
mientras PilaVacia() haz
SacaPila(ini, f in)
mientras (ini < f in) haz
pivote Particin(ini, f in);
MetePila(pivote + 1, f in);
f in pivote 1;
zah
zah
termina.
Algoritmo 22: Quicksort Iterativo

Anlisis Espacial

En el caso del anlisis espacial, la memoria necesitada por el algoritmo


de quicksort, tenemos tambin varios casos.
Peor Caso: Se da cuando se tienen sistemticamente problemas de tamao
0 y (n 1) por resolver.
5.5. EJERCICIOS 101

f (1) = c
f (n) = c = f (n 1) = O(n)
..
.
f (n) = c + f (n 1)
f (n 1) = c + f (n 2)
..
.
f (2) = c + f (1)
..
.
f (n) = c(n)

Mejor Caso: Se da cuando se tienen sistemas problemas de tamao 0 y


(n-1) por resolver.

f (n) = c = O(1)

Para ahorrar memoria dinmica:


si pivote ini < f in pivote entonces
MetePila(pivote + 1, f in)
f in pivote 1
otro
MetePila(ini, pivote)
ini pivote + 1
is
Introducir el cdigo anterior en el mientras mas profundo.

5.5. Ejercicios
Ejercicio 5.1 Realice el anlisis espacial para el peor caso de quicksort.
Ejercicio 5.2 Par ms cercano. Dado un conjunto de puntos en el plano
cartesiano (x, y) el problema es encontrar aquellos dos puntos que se encuen-
tran ms cerca el uno del otro. Haga el anlisis del algoritmo.
102 CAPTULO 5. DIVIDIR PARA VENCER

Ejercicio 5.3 Bsqueda en Arboles-B. Un rbol B de orden n es un rbol


cuyo nodo est formado por a lo mas n 1 elementos con n hijos. Los hijos
estn ordenados de tal forma que los elementos a la izquierda son menores
y a la derecha son mayores. Escriba un algoritmo para hacer bsquedas en
arboles B de orden n. Haga el anlisis del algoritmo.

J Q

B C K L R S

Figura 5.1: Arbol-B de orden 3

Ejercicio 5.4 Disee un algoritmo para encontrar el mnimo y mximo de


un arreglo utilizando divide y vencers. Haga el anlisis del algoritmo.

Ejercicio 5.5 Elabore un algoritmo para encontrar una moneda falsa en un


arreglo de n monedas. Haga el anlisis de dicho algoritmo. Asuma que conoce
la funcin falsa que regresa verdadero si la moneda es falsa y es de orden
constante.

Ejercicio 5.6 Dado un rbol binario de bsqueda como el que se ve en la


Figura 5.2 escriba un algoritmo para hacer bsquedas en l. Haga el anlisis
de dicho algoritmo. Diga si el orden del algoritmo domina asintticamente a
log2 n (el orden de bsqueda para un rbol binario de bsqueda).
5.5. EJERCICIOS 103

5 10

2 11 14

Figura 5.2: rbol Binario de Bsqueda


104 CAPTULO 5. DIVIDIR PARA VENCER
Captulo 6
Mtodo vido

El mtodo vido es un mtodo que se utiliza para encontrar la solucin


ptima a un problema. La manera de lograrlo es tomar un elemento a la
vez e irlo agregando a la solucin siempre que y cuando el hacerlo mantenga
la solucin ptima encontrada hasta ese momento. Esto se puede ver en el
algoritmo 23.

proc Avido(A, n, sol)


comienza
sol vacia
mientras SolCompleta(sol) haz
elem seleccion(A)
si EsViable(sol, elem) entonces
sol sol elem
A A elem
is
zah
termina.
Algoritmo 23: Mtodo vido

6.1. Problemas Tipo


Reciben como entrada un conjunto de elementos, la salida es un subcon-
junto de esos elementos que cumplen ciertas restricciones. Cada uno de estos

105
106 CAPTULO 6. MTODO VIDO

subconjuntos es llamado una solucin factible o viable. Se requiere encontrar


una solucin factible que maximice o minimice una funcin objetivo. Esta
solucin es llamada la solucin ptima.
En la mayora de los casos es necesario probar que la estrategia de solu-
cin adoptada conduce a una solucin ptima. Esta tcnica se utiliza para
resolver una gran cantidad de problemas de optimizacin. En cada uno de
ellos identicamos la funcin objetivo y se demuestra que la estrategia nos
conduce a la solucin ptima.

6.2. Almacenamiento en Cintas


Ejemplo 29 El problema del almacenamiento ptimo con cintas es el sigui-
ente. Se tienen n programas en una cinta de longitud L, cada programa i
tiene una longitud li , 1 i n. Claramente

n
X
li L.
i=0

Asumimos que cada vez que se desea leer un programa, la cinta se lee desde
el comienzo. Es decir, que si los programas se encuentran almacenados en el
orden I =< i1 , i2 , . . . , in > el tiempo necesario para recuperar el programa k
es
k
X
tk lij .
j=1

El tiempo promedio esperado de lectura (TPEL) es entonces

n k n
1 XX 1X
TPEL = lij = (n k + 1)lik
n k=1 j=1 n k=1

Funcin objetivo
Encuentra un orden para almacenar los programas de tal manera que el
TPEL sea el menor posible.
6.2. ALMACENAMIENTO EN CINTAS 107

proc AOC(l, n, Ord)


comienza
Ord vacio;
i 1;
mientras (i n) haz
p ProgramaMasPequeo(l);
Ord[i] p;
i i + 1;
zah
termina.
Algoritmo 24: AOC

Estrategia
El algoritmo 24 utiliza la estrategia de tomar al programa que tenga la
menor longitud e ir la agregando a la solucin los programas de tal manera
que la solucin se mantenga ptima, es decir en orden ascendente.

Teorema 13 EL algoritmo AOC encuentra el ordenamiento que minimiza


TPEL. Si l1 l2 l3 ln entonces el orden < 1, 2, 3, . . . , n >
minimiza
n X
X k
lj
k=1 j=1

sobre todas las permutaciones de programas.

Demostracin 9 Sea I =< i1 , i2 , . . . , in > una permutacin del conjunto


de ndices {1, 2, 3, . . . , n}. Entonces sea D(I) ptima de tal forma que

n
X
D(I) = (n k + 1)lij .
k=1

Deben existir en I un par de ndices a, b tales que a < b y lia > lib .
108 CAPTULO 6. MTODO VIDO

Si permutamos los programas a y b tendremos D(I 0 ) tal que


n
X
0
D(I ) = (n k + 1)lij + (n a + 1)lib + (n b + 1)lia
k=1
0
D(I) D(I ) = (n a + 1)lia (n b + 1)lia + (n b + 1)lib (n a + 1)lib
= (b a)lia + (a b)lib
= (b a)(lia lib ) > 0

contradiccin

El ptimo esta dado por el orden < 1, 2, 3, . . . , n > .

6.3. Problema de la mochila


Ejemplo 30 Problema de la mochila se plantea de la siguiente forma. Se
tienen n objetos y una mochila. Cada objeto tiene un peso pi y un valor
vi 1 i n. La mochila tiene una capacidad M . El problema consiste en
seleccionar los objetos o (fracciones de ellos) tales que
n
X
xi v i
i=1

tenga un valor mximo cumpliendo 0 xi 1 y


n
X
xi pi M, vi > 0, pi > 0, 1 i n
i=1

Supongamos que n = 3, M = 20 y

(v1 , v2 , v3 ) = (24, 25, 15)


(p1 , p2 , p3 ) = (18, 15, 10)
6.3. PROBLEMA DE LA MOCHILA 109

podremos tener en nuestra mochila


X X
xi v i pi vi
1 1 1
( , , ) 24 16.5
2 3 4
5
( , 1, 0) 31.6 20
18
2
(0, , 1) 31.6 20
3
y en particular

24 25 15 4 5 3
( , , )=( , , )
18 15 10 3 3 2
tomando los objetos por mayor unidad de peso

1
= (0, 1, )
2
= 32.5

Estrategia
Tomar los objetos de mayor valor por unidad de peso. El algoritmo 25
muestra el algoritmo para resolver el problema de la mochila utilizando el
mtodo vido.
vi v2 vn
Teorema 14 Si ... el algoritmo Mochila genera la solucin
pi p2 pn
ptima.

Sea x = (x1 , x2 , . . . , xn ) la solucin generada por el algoritmo. Sea j el


primer ndice tal que xj 6= 1 xi = 11 i < j, y 0 xj 1 con
xi = 0j < i n.
Supongo que existe una solucin ptima Y = (y1 , y2 , y3 , . . . , yn )
Recorremos X y Y hasta encontrar el primer ndice k tal que xk 6= yk .
Puede pasar que

1. k < j yk < xk
110 CAPTULO 6. MTODO VIDO

proc M ochila(p, v, x, k, M )
comienza
i 0;
peso 0;
valor 0;
ordena(p, v, ppv);
mientras peso < M haz
k ppv[i];
si p[k] < (M peso) entonces
x[k] 1
otro
(M peso)
x[k] ;
p[k]
is
peso peso + x[k] p[k];
valor valor + v[k] x[k];
i i + 1;
zah
termina.
Algoritmo 25: Mochila
6.3. PROBLEMA DE LA MOCHILA 111

2. k > j yk < xk

3. k = j

Si k existe yk < xk . Pero eso tambin implica que l tal que l > k y
yl 6= 0. Construimos ahora una Y 0 tal que Y y Y 0 son idnticas excepto en

los ndices k y l. Sustituimos yk0 = yk + y yl0 = yl con lo cual
pk pl
n
X n
X
yi0 pi = yi pi
i=1 i=1

Note que

yk0 pk = (yk + )pk = yk +
pk
y

yl0 pl = (yl + )pl = yl
pl

Si hacemos yk0 tan grande como podamos tendremos dos posibilidades:

1. yk0 = xk

2. yk0 < xk en cuyo caso existe l0 tal que l0 > k y yl0 6= 0 y podemos hacer
el razonamiento superior hasta hacer yk0 = xk .

Pero, qu pasa con la suma de valores? Para ellas tendremos


n
X n
X
yi0 pi yi pi
i=1 i=1

Por que

yk0 vk = yk vk + vk
pk

yl0 vl = yl vl vl
pl
112 CAPTULO 6. MTODO VIDO

y
vk vl
>
pk pl
Es decir que podemos hacer Y 0 idntico a X hasta k y mantenerlo ptimo.
Es claro que podemos seguir este razonamiento para k + 1, k + 2 . . . , n. X es
ptimo.
Construiremos una solucin Z en la cual vamos a hacer crecer yk hasta
xk y decrecer yk+1 , ..., yn . Tendremos por lo tanto:
n
X n
X n
X
pk pi
v i xi = vi yi + (yk Xk )vk (yi xi )vi
i=1 i=1
xk i=k+1 pi
n
X X vk
vi yi + [(yk xk )pk (yi xi )pi ]
i=1
pk

!
i) >! y es optima
ii) Z es optima y se parece a x hasta xk , si aplicamos el mismo procedi-
miento tendremos z 0 xk + 1X
x es optima

6.4. Intercalacin ptima de archivos


Ejemplo 31 Sabemos que intercalar 2 archivos ordenados de longitud n y
m respectivamente cuesta O(n + m). El problema de intercalacin ptima es
cuando se desea mezclar n archivos ordenados.
Para n archivos hay varias maneras de hacer la intercalacin: Se puede
proceder por pares de archivos, ordenndolos de acuerdo a tu tamao, inter-
calando elementos de todos a la vez, etc. Lo primero que debemos tratar es
ver como hacer el intercalamiento.

6.4.1. Problema
Determinar la manera ptima de intercalar los registros de los n archivos
ordenados.
6.4. INTERCALACIN PTIMA DE ARCHIVOS 113

6.4.2. Estrategia
Tomar cada vez los dos archivos mas pequeos. Este problema puede
representarse como un rbol binario en el que las hojas son los archivos
iniciales y los nodos internos las intercalaciones, la Figura 10 muestra un
ejemplo. Si F1 esta a una distancia de 3 los registros de Fi se movieron tres
veces. Si di es la distancia del nodo Fi a la raz y li es la longitud del archivo
Fi entonces el nmero total de movimientos es
n
X
li di
i=1

que es la longitud del camino externo ponderada.

y3 y3

y2 y1 y2

y1 x1 x2 x3 x4

x1 x2 x3 x4

Figura 10: Problema de intercalacin ptima visto como rbol

Un rbol de intercalacin ptimo corresponde a un rbol binario con


longitud de camino externo ponderado mnimo. El algoritmo 26 muestra un
algoritmo vido de intercalamiento ptimo.

Teorema 15 Si L inicialmente contiene n 1 nodos con longitud (l1 , l2 , l3 , . . . , ln )


el algoritmo IOA genera un rbol de intercalacin ptimo de dos en dos para
n archivos con esas longitudes.

Demostracin 10 Suponemos que existe T un rbol de intercalamiento p-


timo.
114 CAPTULO 6. MTODO VIDO

proc IOA(L, n)
comienza
para i = 1 a n 1 haz
nodo Creanodo();
Izq(nodo) M enor(L); menor elimina el
Der(nodo) M enor(L); nodo de vuelta
Long(nodo) Long(Izq(nodo) + Long(Der(nodo));
Inserta(L, nodo);
zah
termina.
Algoritmo 26: Algoritmo de Intercalacin vido

Sea P un nodo interno de distancia mxima a la raz como el que se


muestra en la gura

Observemos que el algoritmo genera en la primera iteracin

<-P l1 + l2

lr lm l1 l2

Si intercambiamos l1 y l2 con lr y ln , la longitud de camino externo pon-


derado del rbol resultante T 00 es

LCEP(T ) LCEP(T 00 ).

Adems:
6.4. INTERCALACIN PTIMA DE ARCHIVOS 115

Si LCEP(T ) = LCEP(T 00 ) entonces l1 , l2 , lr , ln estn en el mismo nivel.

Si LCEP(T ) > LCEP(T 00 ) estaban en diferentes niveles. Contradic-


cin!

6.4.3. Generalizacin a arboles de grado k


Notemos que
n mod (k 1) = 1

Por lo que a lo mas se tienen que agrupar k2 archivos comodines de longitud


0.

6.4.4. Aplicacin : Cdigo de Human


Si en lugar de longitudes tenemos frecuencias

a=000
b=001
25 c=01
d=10
e=11

35 60

15 20 30 30

5 10
116 CAPTULO 6. MTODO VIDO

6.5. Arboles Generadores mnimos


Ejemplo 32 Un rbol generador mnimo se dene as. Sea G =< V, A >
un grafo conectado no dirigido. Un subgrafo T =< V, A0 > de G es un rbol
generador de G si T es un rbol (A0 A y T no tiene ciclos). Si cada arco
a tiene un costo c(a) entonces el costo del rbol T ser
X
c(T ) = c(a)
aA0

El problema es encontrar un rbol generador de costo mnimo.

6.5.1. Problema
Encontrar un rbol generador de costo mnimo.

0716G2534 5 0716E2534 0716G2534 0716E2534

3 0716A25?34 2 3 0716A2534 2
7 ??? 6
3 ?? 3
??

0716C25?34 3 0716F2534 2 0716B2534 0716C2534 3 0716F2534 2 0716B2534
??
??
?? 5
6 ?
5 5
8?>9
D <;
:= 8?>9
D := <
;

Figura 11: Grca y su rbol generador de costo mnimo

6.5.2. Estrategia
Existen dos estrategias bsicas

Tomar el arco de menos costo que una un vrtice conectado con uno
no conectado.

Toman el menor arco que no forme ciclo.

El algoritmo de Kruskal que se muestra en el algoritmo 27 utiliza la


segunda estrategia para encontrar un rbol generador de costo mnimo.
6.5. ARBOLES GENERADORES MNIMOS 117

proc Kruskal(G, A, n)
comienza
A vacio;
para i = 1 a n 1 haz
arco M enor(G);
si F ormaCiclo(arco, A) entonces
A A arco;
is
zah
termina.
Algoritmo 27: Kruskal

Teorema 16 El algoritmo de Kruskal genera un rbol generador de costo


mnimo para un grafo conectado no dirigido G.

Demostracin 11 Usamos las siguientes suposiciones:


Suponemos que existe T un rbol generador de costo mnimo.

Sea a el arco de menor costo considerado en Tk (el rbol generado por


el algoritmo de Kruskal) que no esta en T.

Observamos que si agregamos el arco a a T tenemos un ciclo nico. En


ese ciclo nico, hay un arco a0 que esta en T y que no esta en Tk (sino Tk
tendra un ciclo).
Observamos que c(a) c(a0 ). Si construimos un rbol T 0 cambiamos a0
por a.

c(T 0 ) = c(T ) + c(a) c(a0 )


c(T 0 ) c(T )

El rbol obtenido sigue siendo generador y ptimo c(T 0 ) c(T ). Podemos


seguir este razonamiento hasta que T 0 = Tk . Tk es ptimo.
118 CAPTULO 6. MTODO VIDO
Captulo 7
Bsqueda con retroceso
(Backtrack)

Esta tcnica se utiliza en algoritmos de bsqueda. Los algoritmos dise-


ados en base a esta tcnica pueden realizar una bsqueda exhaustiva de
un espacio grande de bsqueda (del orden n! o an cn ). Para ser efectiva
normalmente deben de utilizarse heursticas que permitan reducir el espacio
de bsqueda tanto como sea posible. El principio es sencillo, tratar todas las
soluciones posibles para un problema.

7.1. Problemas Tipo


La solucin se expresa como una tupla

(x1 , x2 , x3 , ..., xn ), xi Si

y debe satisfacer una funcin objetivo

F (x1 , x2 , x3 , ..., xn ).

Cada uno de los valores xi de la tupla puede tomar uno de varios posibles
valores Si . Si |Si | = mi entonces existen m1 m2 m3 mn posibles
valores para (x1 , x2 , x3 , ..., xn ).

119
120 CAPTULO 7. BSQUEDA CON RETROCESO (BACKTRACK)

7.2. Mtodo de Solucin


Existen dos formas adicionales de buscar soluciones a este tipo de pro-
blemas:

1. Mtodo vido.

2. Explorar todo el espacio de soluciones.

En el caso del mtodo vido solo encontramos una solucin si existe una
estrategia que nos permita usar el mtodo vido. Cosa que no siempre sucede.
Explorar todo el espacio de soluciones por otro lado puede resultar demasiado
costoso y por tanto nunca encontrar una solucin.
El mtodo de bsqueda con retroceso construye las tuplas elemento por
elemento y en cada paso evala la tupla parcial para decidir si puede llagar
a ser una solucin. En caso de no ser as la tupla parcial es eliminada. Si la
tupla parcial es x1 , x2 , x3 , . . . , xk se eliminan mk+1 mk+2 . . . mn tuplas
por explorar.
Sobre una tupla existen dos tipos de restricciones.

Restricciones explicitas Determinan los valores de los componentes de la


tupla.

Restricciones implcitas Determinan si una tupla es o no una solucin.


Dicen como se relacionan los elementos de la tupla entre ellos.

El espacio de soluciones en el conjunto de tuplas denido por las restric-


ciones explicitas. Este espacio se puede representar por un rbol como se
muestra en la gura 12. En la raz tenemos a la solucin vaca. En cada nivel
elegimos entre los posibles valores xi . En el nivel 1 elegimos a un posible x1 ,
ya que lo elegimos en el nivel 2 elegimos a un posible x2 y as sucesivamente.
En el rbol que representa el espacio de soluciones cada nodo representa
un estado del problema. Llamaremos estados solucin a aquellos cuyo camino
desde la raz hasta el nodo dene una tupla en el estado de soluciones. Un
estado solucin es un estado respuesta si la tupla denida por el camino
desde la raz hasta el nodo satisface las condiciones implcitas. Al rbol que
representa el espacio de soluciones lo llamaremos rbol de espacio de estados.
Un nodo vivo en la generacin del rbol de es un nodo que aun no se
descarta. Un nodo muerto es un nodo descartado y el nodo que se esta ex-
plorando actualmente es el e-nodo. Para resolver un problema con backtrack
7.2. MTODO DE SOLUCIN 121

Sol
x321 =S321

Figura 12: Espacio de soluciones

se tiene que generar sistemticamente el rbol de espacio de estados a partir


de la raz.
Hay esencialmente dos maneras de generar el rbol de espacio de estados
a partir de la raz:

a) Tan pronto como un hijo S del e-nodo R es generado, S se convierte


en el nodo e-nodo. R volver a ser el n-nodo una vez que el subrbol
con raz en S sea explorado (bsqueda en profundidad).

b) El n-nodo deja de serlo hasta que se convierte en un nodo muerto


(bsqueda por nivel).

En ambos casos se utilizan funciones de corte para matar nodos y as


evitar la construccin completa del rbol de espacio de estados:

A la generacin del rbol de espacio de estados a profundidad con


funciones de corte se le llama backtracking o bsqueda con retroceso.

A la generacin del rbol de espacio de estados de acuerdo a la segunda


tcnica se le llama branch & boundo (ramicacin y acotamiento).

El Algoritmo genrico para la generacin del rbol espacio de estados por


Backtrack se muestra en el algoritmo 28.
122 CAPTULO 7. BSQUEDA CON RETROCESO (BACKTRACK)

proc Backtrack(n)
comienza
nivel 1;
mientras nivel > 0 haz
si xk T (x1 , x2 , . . . , xi )
Bi (x1 , x2 , . . . , xi ) entonces
si (x1 , x2 , . . . , xk )
es un camino al estado respuesta
entonces
imprime(x1 , x2 , . . . , xk );
nivel nivel + 1;
is
otro
nivel nivel 1;
is
zah
termina.
Algoritmo 28: Backtrack

Sea x1 , x2 , . . . , xk un camino desde la raz hasta un nodo en el rbol de


espacio de estados, T (x1 , x2 , . . . , xi ) es una funcin que regresa el conjunto
de todos los posibles valores para xi+1 tales que (x1 , x2 , . . . , xi+1 ) es tambin
un camino a un estado del problema. Bi (x1 , x2 , . . . , xi ) es una funcin tal que
Bi es falsa si (x1 , x2 , . . . , xi ) no puede ser extendido para alcanzar un estado
respuesta.
El Algoritmo genrico para la generacin del rbol espacio de estados por
Backtrack en forma recursiva se muestra en el algoritmo 29.

7.3. n Reinas
Ejemplo 33 El problema de las n reinas consiste en colocar n reinas en
un tablero de ajedrez de n n de manera que no se ataquen mutuamen-
te. La solucin se puede expresar como la tupla de posiciones de las reinas
(q1 , q2 , . . . , qn ). Si cada posicin es representada como (r, c) (rengln, colum-
7.3. N REINAS 123

proc RBacktrack(n)
comienza
para cada xk T (x1 , x2 , . . . , xi ) haz
si Bk (x1 , x2 , . . . , xk ) entonces
si (x1 , x2 , . . . , xk )
es un camino al estado respuesta
entonces
imprime(x1 , x2 , . . . , xk );
is
RBacktrack(nivel + 1);
is
zah
termina.
Algoritmo 29: Backtrack Recursivo

na) tendremos un total de



n2
n
posibles soluciones.
Pero si notamos que cada reina debe estar en un rengln diferente (las
reinas atacan cualquier pieza en su mismo rengln) entonces la solucin se
puede expresar como (c1 , c2 , c3 , . . . , cn ) donde ci es la columna en la que se
coloca a la reina en el rengln i. Lo cual reduce nuestro espacio de soluciones
a solo n! (por que dos reinas no pueden estar en la misma columna).

7.3.1. Restricciones explicitas


Al denir el problema de la segunda forma declaramos de manera explicita
que las reinas deben estar en diferente columna

ci 6= cj i 6= j, 1 i, j n.

7.3.2. Restricciones implcitas


La restriccin implcita, las tuplas que son solucin, son aquellas donde
las reinas no se atacan. Ya nos aseguramos que las reinas no estn en el mismo
124 CAPTULO 7. BSQUEDA CON RETROCESO (BACKTRACK)

rengln ni en la misma columna. Solo falta asegurarse de que las reinas deben
estar en diferente diagonal. Eso lo logramos vericando que

|cj ci | 6= |j i|.

El algoritmo coloca (algoritmo 30) se encarga de vericar que las restric-


ciones explicitas e implcitas se cumplan. El algoritmo checa que la ltima
reina en colocarse (la xi+1 ) cumpla con las restricciones. Este algoritmo es la
implementacin de la funcin B para el problema de las n reinas.

func Coloca(reinas)
comienza
para i = 1 a reinas 1 haz
si (x[i] = x[reina] |x[i] x[reina]| = |i reina|)
entonces
Coloca f also;
is
zah
Coloca verdadero
termina.
Algoritmo 30: Verica que la reina se pueda colocar

Ya que tenemos un algoritmo para decidir si dado un estado es posible


llegar a un estado respuesta solo necesitamos producir los posibles valores
de las reinas para cada estado. El espacio de soluciones del problema de las
(n=4) reinas se puede representar por el rbol en la gura 13.

c21 234= 1

Figura 13: Espacio de Soluciones para Reinas 4


7.4. SUMA DE SUBCONJUNTOS 125

Como se ve en la gura solo es necesario generar todos los posibles valores


de columnas para obtener el siguiente estado. El algoritmo 31 muestra el
algoritmo necesario para encontrar la solucin para n reinas. En cada estado
se generan todas las posibles columnas y se utiliza la funcin Coloca para
vericar si es posible alcanzar un estado respuesta.

proc Reinas(n)
comienza
reina 1
x[reina] 0
mientras reinas > 0 haz
x[reina] x[reina] + 1;
mientras (x[reina] n) Coloca(reina) haz
x[reina] x[reina] + 1
zah
si (x[reina] n) entonces
si (reina = n) entonces
imprime(x);
otro
reina reina + 1;
x[reina] 0;
is
otro
reina reina 1;
is
zah
termina.
Algoritmo 31: Solucin a las n Reinas

7.4. Suma de Subconjuntos


Ejemplo 34 Se tiene un conjunto de enteros V y se desea encontrar todos
los subconjuntos tales que la suma de los elementos sea igual a un entero M .
Por ejemplo, para el conjunto

{11, 13, 24, 7} y M = 31


126 CAPTULO 7. BSQUEDA CON RETROCESO (BACKTRACK)

tendremos las soluciones siguientes:

S1 = {11, 13, 7}
S2 = {24, 7}

Este problema se puede formular de dos maneras distintas, aunque en


ambos casos tendremos al conjunto representado como un vector

< v1 , v2 , v3 , . . . , vn > .

7.4.1. Formulacin 1
Podemos representar la solucin con

(x1 , x2 , x3 , . . . , xk )

donde xi en (x1 , x2 , x3 , . . . , xk ) signica que vxi esta en la tupla. As las


soluciones para el ejemplo se expresan

S1 = (1, 2, 4)
S2 = (3, 4)

Para generar las posibles tuplas solo necesitamos hacer que

xi 1, 2, 3, . . . , n

y que la tupla
(x1 , x2 , x3 , . . . , xk )
satisfaga
n
X
vxi = M.
i=1

7.4.2. Restricciones
Para esta formulacin del problema tendremos que las restricciones que
tenemos son
7.4. SUMA DE SUBCONJUNTOS 127

Explicitas 1 xi ni y
n
X
vxi = M.
i=1

Implcitas Ningn nmero puede aparecer dos veces en la tupla.


El algoritmo 32 resuelve el problema utilizando este planteamiento del
problema.

proc Subconjuntos(elem, vacum, resto)


comienza
x[elem] 1;
si vacum + v[elem] = M
entonces
imprime(x);
otro
si (vacum + v[elem] + v[elem + 1]) M
entonces
Subconjuntos(elem + 1, vacum, resto v[elem]);
is
is
x[elem] 0;
si (vacum + v[elem]) M (vacum + resto v[elem])
entonces
Subconjuntos(elem + 1, vacum, resto v[elem]);
is
termina.
Algoritmo 32: Subconjuntos para primer planteamiento

7.4.3. Formulacin 2
La solucin ser una tupla

(x1 , x2 , x3 , . . . , xn ) con xi 0, 1

y si xi = 1 signica que vi esta en el subconjunto. Si xi = 0 signica que


vi no esta en el subconjunto. La tupla (x1 , x2 , x3 , . . . , xn ). As las soluciones
128 CAPTULO 7. BSQUEDA CON RETROCESO (BACKTRACK)

para el ejemplo se expresan

S1 = (1, 1, 0, 1)
S2 = (0, 0, 1, 1)

que debe cumplir


n
X
xi vi = M.
i=1

7.4.4. Restricciones
Para esta formulacin del problema tendremos que las restricciones que
tenemos son
Explicitas n
X
0
xi = y vxi = M.
1
i=1

Implcitas En este caso no existe ninguna restriccin implcita.


El algoritmo 33 resuelve el problema utilizando este planteamiento del
problema.
Considerando
k
X k
X
v i xi + vi < M
i=1 i=k+1
k
X
vi xi + vk+1 > M
i=1

7.5. Coloreado de grcas


Ejemplo 35 Sea G un grafo y m un nmero entero positivo de colores. El
problema de coloreado de grcas consiste asignar a cada vrtice en G un
color de manera que ningn par de vrtices adyacentes tengan el mismo color.
(El problema de encontrar el nmero ms pequeo para colorear una grca es
conocido como el problema de optimizacin de m-coloreabilidad, m es llamado
el nmero cromtico de G)
7.5. COLOREADO DE GRFICAS 129

proc Subconjuntos(elem, vacum)


comienza
para i = 0 a 1 haz
x[elem] i;
si vacum + v[elem] i = M
entonces
imprime(x);
otro
si vacum + v[elem] i < M
entonces
Subconjuntos(elem + 1, vacum + v[elem] i);
is
is
zah
termina.
Algoritmo 33: Subconjuntos para segundo planteamiento

7.5.1. Solucin
Expresamos a la solucin como la tupla (x1 , x2 , x3 , . . . , xn ) con xi {1, . . . , m}
donde xi es color asignado al vrtice i, por lo que vemos a V como un vector
< v1 , v2 , . . . , vn > con |V | = n. La restriccin se expresa como

xi 6= xj i 6= j si (i, j) A.

El rbol de espacio de estados:


130 CAPTULO 7. BSQUEDA CON RETROCESO (BACKTRACK)

func SeColorea(nodo)
comienza
para vrtice = 1 a nodo 1 haz
si (G[vertice, nodo]) (x[vertice] = x[nodo])
entonces
SeColorea F ;
is
zah
SeColorea V ;
termina.
Algoritmo 34: SeColorea

proc m-coloreado(n, m)
comienza
nodo 1;
x[nodo] 0;
mientras nodo > 0 haz
repite
x[nodo] x[nodo] + 1;
hasta x[nodo] > m sepuedecolorear(nodo);
si (x[nodo] =< m) entonces
si (nodo = n)
Imprime(x);
otro
nodo nodo + 1;
x[nodo] 0;
is
otro
nodo nodo 1;
is
zah
termina.
Algoritmo 35: m-coloreado
7.5. COLOREADO DE GRFICAS 131

proc RMColoreado(nodo, color, m)


comienza
para color = 1 a m haz
x[nodo] color;
si sepuedecolorear(nodo)
entonces
si (nodo = n) entonces
imprime(x);
RMColoreado(nodo + 1);
is
is
zah
termina.
Algoritmo 36: m-coloreado recursivo
132 CAPTULO 7. BSQUEDA CON RETROCESO (BACKTRACK)
Captulo 8
rboles de juego

Una variante de la tcnica de backtrack son los rboles de juegos. Estos


se utilizan para programar que la computadora juegue partidas de cosas que
van desde gato hasta ajedrez.
Las principales caractersticas son:

2 jugadores alternan las jugadas

el estado del juego se puede representar por una conguracin espec-


ca.

suponemos un nmero innito de conguraciones.

el juego tiene reglas que aseguran su terminacin.

A cada uno de estos juegos se le asocia un rbol de juego (rbol de espacio


de estados) en donde la raz es la conguracin de partido y los hijos de cada
nodo son las posibilidades de tiro a partir de ese nodo. Las hojas del rbol
de juego representan las conguraciones en donde alguno de los coecientes
ya gan o donde hay una situacin de empate.

8.1. Problema
Encontrar un camino hacia el triunfo del jugador que tiene el turno en la
raz del rbol.

133
134 CAPTULO 8. RBOLES DE JUEGO

8.2. Solucin
Hacer la bsqueda con retroceso en el rbol de juego utilizando el mtodo
MiniMax, y las funciones de corte dadas por la tcnica poda alfa-beta.

8.3. Mtodo Min-Max


A cada hoja del rbol de juego se le asigna un valor que puede ser k, 0
o k (k constante).
k si la computadora pierde.
0 si es empate.
k si la computadora gana.
Los valores se propagan hacia arriba en el rbol de acuerdo a las reglas:
Si un nodo corresponde a una posicin en el tablero donde hay un
movimiento de la computadora, el valor ser el mximo de los valores
de los nodos hijos. Es decir, se supone que la computadora har el
movimiento ms favorable para ella, o sea que produce el resultado con
mayor valor.
Si el nodo corresponde a una posicin del tablero donde hay un movi-
miento del usuario, entonces el valor ser el mnimo de los valores de
los nodos hijos. Es decir, se presume que el usuario har el movimiento
que le cause ms dao.
Si la raz tiene un valor k , la computadora tiene una estrategia ganadora
a partir de la conguracin inicial del juego. Si tiene un valor0, entonces
ningn jugador tiene una estrategia ganadora. Si tiene un valor k el
usuario tiene una estrategia ganadora.
El algoritmo 37 es un algoritmo genrico para evaluar un rbol de juego.
Recibe como parmetro el modo en que se evalua la funcin (Min o Max).

8.4. Funciones de Utilidad


Es una funcin que permite evaluar la probabilidad de que la computadora
gane a partir de la conguracin de la raz.
8.4. FUNCIONES DE UTILIDAD 135

proc Eval(T ab, M odo)


comienza
si hoja(T ) entonces
Eval utilidad(T );
otro
si M odo = M ax entonces
valor ;
otro
valor ;
is
para cada H hijos(T ) haz
si (M odo = M ax)
entonces
valor M ax(Eval(H, M in), valor);
otro
valor M in(Eval(H, M ax), valor);
is
zah
Eval valor;
is
termina.
Algoritmo 37: Evala MiniMax
136 CAPTULO 8. RBOLES DE JUEGO

8.5. Gato (n-en lnea)


Ejemplo 36 El juego de n-en lnea se juega as. Dado un tablero de n n
cada jugador se turna poniendo un smbolo en el tablero (usualmente y
). El jugador que logre poner n smbolos en lnea primero gana. Al 3-en
lnea tambien se le conoce como gato.

8.5.1. Poda alfa-beta


La poda alfa-beta trata de reducir el tamao del rbol usando valores
nales y tentativos para cada nodo. Estos se denen de la siguiente manera:

valor nal resulta de la aplicacin de la evaluacin Min-Max.

valor tentativo es una cota inferior de valor nal para nodos Max es
una cota superior del valor nal para nodos Min.

8.5.2. Reglas
Si todos los hijos de un nodo T ya se podaron o se exploraron entonces
valor nal(T)<-valor tentativo Vf H

Si un nodo T tiene un valor vt y uno de los hijos de T , el nodo H tiene


un valor nal vf H .

i) T es un nodo Max y vt < vf H vt vf H .


ii) T es un nodo Min y vt > vf H vt vf H .

Si un nodo T tiene un valor tentativo vf T y su descendiente, el nodo H


tiene un valor tentativo vf H

i) T es un nodo Max vtT > vtH se podan todos los hijos no


considerados de H.
ii) T es un nodo Max vtT 6 vtH se podan todos los hijos no
considerados de H.
Captulo 9
Complejidad de los algoritmos
diseados con Backtrack.

Depende de:

1. La cantidad de trabajo realizada para solucionar el siguiente valor de


la entrada que se est considerando.

2. La cantidad de valores existentes para la siguiente entrada |Si|.

3. La cantidad de trabajo necesaria para determinar si una solucin parcial


nos lleva a un nodo supuesto.

4. La cantidad de soluciones parciales que satisfacen la funcin de evalua-


cin B.

Observe que : los puntos 1, 2, 3 no dependen de la instancia del problema ;


4 si depende.

En el problema donde se pide encontrar una solucin, un algoritmo de


backtrack genera al menos O(n) estados.

En el peor de los casos un algoritmo de backtrack explora la totalidad


del rbol.

reinas - O(p(n)n!)
En los ejemplos anteriores: subconjuntos - O(2n )

coloreado - O(p(n)mn )

137
138CAPTULO 9. COMPLEJIDAD DE LOS ALGORITMOS DISEADOS CON BACKT

9.1. Planicacin y Acotamiento


Generacin del rbol de espacio de estados en donde el nodo en expansin
(e-nodo) deja de serlo slo cuando se convierte en nodo muerto. El algoritmo
38 muestra su forma general.

proc RamaAcota(raiz)
comienza
nodo raiz;
Q Colavacia();
Encola(Q, nodo);
mientras Escolavacia(Q) HaySolucin haz
nodo Desencola(a);
si nodo es solucin entonces
imprime(nodo);
HaySolucin verdad;
otro
para cada hijoHdenodo haz
si la solucin parcial (incluyendo H)
conduce a un nodo respuesta entonces
Encola(Q, H)
is
zah
is
zah
termina.
Algoritmo 38: Planicacin y Acotamiento

9.1.1. Problema de la ramicacin y acotamiento


Entre los problemas que podemos encotrar para este algoritmo tenemos
que hace bsquedas ciegas.
Si se pudiera calcular la cantidad del trabajo necesaria para llegar a la
solucin a partir de un nodo dado, se hace el clculo para todos los nodos
vivos y se toma el nodo con menor valor para continuar la bsqueda.
9.1. PLANIFICACIN Y ACOTAMIENTO 139

9.1.2. Bsqueda de menor costo


La cantidad de nodos que se debe generar para encontrar la solucin.

La cantidad de niveles que hay que descender para llegar a la respuesta.

Si estas funciones estn disponibles entonces

Se genera el mnimo de nodos.

Se generan slo nodos que conducen a un estado respuesta.

Problema: Esas funciones no son prcticas.


Solucin: Estimar la cantidad de trabajo.

A cada nodo T se le asigna un costo con la siguiente funcin

C(T ) = h(g) + g(T )

donde

h(T ): Cantidad de trabajo necesaria para llegar de la raz a T .

g(T ): Una estimacin de la cantidad de trabajo necesaria para llegar


de T a un nodo respuesta.

El algoritmo 39 muestra al algoritmo general utilizando estas funciones.


140CAPTULO 9. COMPLEJIDAD DE LOS ALGORITMOS DISEADOS CON BACKT

proc BusquedaMenCosto(raiz)
comienza
nodo raiz;
inserta(vivos, nodo);
mientras N ovacio(vivos) Haysolucion haz
nodo traeM enoryelimina(vivos);
inserta(muertos, nodos);
si nodoessolucion entonces
imprime(nodo);
Haysolucion verdad;
otro
para cada hijoHsucesordenodo haz
ca ux c( H);
si Encuentra(vivas, H) Hn odo.costo > ca ux
entonces
H.costo ca ux;
Esta v;
otro
si Encuentra(M uertos, H) H.nodo.costo > ca ux
entonces
H.costo ca ux;
Eliminar(M uertos, H);
Inserta(vivos, H);
Esta v;
is
is
si esta entonces
H.costo ca ux;
is
inserta(vivos, H);
zah
is
zah
termina.
Algoritmo 39: Busqueda Menor Costo
Parte III
Problemas NP

141
Captulo 10
Problemas Tratables e Intratables

Los problemas computacionales los podemos dividir en dos conjuntos


Tratables Problemas para los cuales existe un algoritmo de complejidad
polinomial.

Intratables Problemas para los que no se conoce ningn algoritmo de com-


plejidad polinomial.
A los problemas tratables se les conoce tambin como problemasP (de or-
den polinomial). Asimismo a los problemas no tratables se les llama tambin
NP (de orden no determinstico polinomial). Entre estos ltimos podemos
encontrar los siguientes ejemplos:
Agente Viajero.

Caminos Hamiltonianos. Encontrar un camino en un grafo que pasa


una sola vez por cada nodo. O(n!).

Caminos Eulerianos. Encontrar un camino en un grafo que pasa una


sola vez por cada arco.

10.1. Algoritmos No Deterministicos


Hasta el momento siempre hemos diseado algoritmos determinsticos.
En un algoritmo determinstico, el resultado es nico en el sentido de que
cada instruccin tiene un resultado conocido dependiente del contexto. Pode-
mos denir otra categora, la de algoritmos no determinsticos donde algunas

143
144 CAPTULO 10. PROBLEMAS TRATABLES E INTRATABLES

instrucciones den resultados no determinados de antemano. Para ello aumen-


taremos nuestro conjunto de instrucciones con las siguientes tres:
Elige(S). Es una funcin que regresa uno de los elementos de S. Si
S={ Mercurio, Venus, Tierra } y P=Elige(S) entonces P=Mercurio o
P=Venus o P=Tierra.
xito. Notica una ejecucin exitosa.
Fracaso. Notica una ejecucin no exitosa.
Algoritmos no determinstico.

Ejemplo 37 Bsqueda de un elemento x en un arreglo A. El algoritmo 40


muestra un algoritmo de bsqueda de manera no determinstica.

func BuscaND(A, x, indice)


comienza
i elige(1, ..., n);
si A[i] = x entonces
indice i;
Exito;
otro
F racaso;
is
termina.
Algoritmo 40: Bsqueda no Deterministica

10.2. Interpretaciones
Podemos interpretar la instruccin Elige de las siguientes maneras:
1. Elige es mgica y siempre devuelve el valor que necesitamos.

2. Al llamar a elige, el programa se multiplica, despus del llamado hay


tantas copias como valores pueden devolver el llamado. La ejecucin de
la instruccin xito detiene todas las copias del programa. La ejecucin
de la instruccin Fracaso detiene la copia del programa que la ejecuta.
10.2. INTERPRETACIONES 145

Cualquiera de las interpretaciones es equivalente. Pero no deben de utilizarse


para el diseo de algoritmos.

Ejemplo 38 Ordenamiento de un arreglo A con n elementos.

proc OrdenaND(A, n)
comienza
para i = 1 a n haz
B[i] elige(A);
A A B[i];
zah
Exito;
termina.
Algoritmo 41: Ordena no deterministico. Elige mgica

El algoritmo 41 fu diseado pensando en la primera interpretacin. Pero


si utilizamos la segunda interpretacin el algoritmo regresar siempre exito
lo cual es erroneo.

proc OrdenaND(A, n)
comienza
para i = 1 a n haz
B[i] elige(A);
A A B[i];
zah
i 1;
mientras i < n B[i] B[i + 1] haz
i i + 1;
si i = n entonces
Exito;
otro
F racaso;
termina.
Algoritmo 42: Ordena no deterministico. Multiprocesos

El algoritmo 41 por otro lado regresa el resultado correcto independien-


temente de la interpretacin de Elige.
146 CAPTULO 10. PROBLEMAS TRATABLES E INTRATABLES

Ejemplo 39 Se tiene un conjunto de N enteros y se busca un subconjunto


en donde la suma de los elementos sea M . El problema de decisin de los
subconjuntos consiste en decidir si para un conjunto A dado existe un sub-
conjunto tal que los elementos sumen M . El algoritmo 43 muestra la solucin
para este problema.

proc DecisionSubconjuntoND(A, n, M, res)


comienza
vacum 0;
mientras vacum < M haz
val elige(A);
A A val;
vacum vacum + val;
zah
si vacum = M entonces
res verdad;
Exito;
otro
res F also;
F racaso;
is
termina.
Algoritmo 43: Decisin de subconjuntos

Ejemplo 40 Problema de la mochila entero. Cuando se habl de los algorit-


mos vidos se vi el problema de la mochila donde era posible poner fracciones
de los objetos en la mochila. Aqu eso no es posible y tenemos n objetos:

con valor vi , 1 i n
con peso pi , 1 i n

La solucin esta dado por la tupla

(x1 , . . . , xn ) con xi {0, 1}


10.2. INTERPRETACIONES 147

sujeta a
n
X
xi p i M
i=1
y maximizando
n
X
xi v i .
i=1
El problema de decisin de la mochila consiste en decidir si para un con-
junto de objetos tenemos un subconjunto tal que la restriccin de pesos se
cumpla y
Xn
xi vi = k.
i=1

proc DecisinMochila(v, p, M, K, res)


comienza
vacum 0;
pacum 0;
para i = 1 a n haz
x[i] elige(0, 1);
vacum vacum + v[i] p[i];
pacum pacum + p[i] x[i];
zah
si (pacum M ) (vacum K) entonces
res verdad;
Exito;
otro
res f also;
F racaso;
termina.
Algoritmo 44: Problema de la mochila

Ejemplo 41 Sean x1 , x2 , . . . , xn variables booleanas, una literal es una va-


riable o su negacin. Una frmula del clculo Proposicional se forma con lite-
rales y operadores (conjuncin) y (disyuncin). Una frmula de clculo
proposicional est en forma normal conjuntiva (CNF) si se expresa como
C1 C2 CR
148 CAPTULO 10. PROBLEMAS TRATABLES E INTRATABLES

donde Ci son frmulas que constan de literales y operadores.


El Problema de Satisfacibilidad consiste en determinar si una expresin
E(x1 , x2 , . . . , xn ) en forma CNF es verdadera para una asignacin de valores
de verdad a sus variables. E(x1 ) para x1 x1 no es satisfacible.

proc SatisfacibilidadND
comienza
para i = 1 a n haz
x[i] elige({v, F });
zah
si evalua(F, x) entonces
res verdad;
Exito;
otro
res f also;
F racaso;
is
termina.
Algoritmo 45: Satisfacibilidad

Denicin 5 P es el conjunto de problemas para los cuales existe una solu-


cin algortmica deterministica de complejidad polinomial.

Denicin 6 NP es el conjunto de problemas para los que existe una solu-


cin no determinstica de complejidad polinomial.

Teorema 17 (Cook) Cualquier problema no determinsticamente polino-


mial se reduce en tiempo polinomial al problema de la satisfacibilidad (SAT).
Es decir
X N P X SAT .

Teorema 18 (Cook-Levin) Satisfacibilidad esta en P N P = P


Es evidente que P N P pero N P P ?

Denicin 7 Una transformacin polinomial de un lenguaje L1 1 a un


lenguaje L2 1 es una funcin f : 1 2 que satisface las siguientes
dos condiciones:
10.2. INTERPRETACIONES 149

1. Existe una maquina de turing deterministica (DTM) que computa f.

2. Para toda x 1 , x L1 si y solo si f (x) L2 .


Escribiremos L1 L2 para signicar que L1 se reduce a L2 .

Ejemplo 42 Ordenar un arreglo que se reduce a encontrar el menor elemen-


to.

Suponemos que existe Menor(i, j ), i j, 1 i, j n que devuelve el


elemento menor del segmento del arreglo A[i . . . j].

proc Ordena(A, n)
comienza
para i 1 a n haz
j M enor(i, n) > O(nR ) > O(n( k + 1))P
intercambia(i, j)O(1)Ordenaalf aobtenermenor
zah
termina.

Denicin 8 Un problema es NP duro si satisfacibilidad se reduce a l


Denicin 9 Un problema es NP completo si es NP duro y est en NP
N P completo N P Duros? SI
N P Duros N P completos? NO
Por demostrar NP Duros * N P Completos
Usamos el problema del paro que consiste en decir si un programa se va
detener o no para una entrada espacca.
P.D. Halt N P D i.e S Halt
Asumimos que existe AHalt P que resuelve el problema de paro.
Necesitamos construir un algoritmo ASHalt P tal que genere un pro-
grama (y su entrada) que se detenga si la expresin es satisfacible y que no
se detenga en el caso contrario.
Obviamente As da V para expresiones satisfactibles y F para expresiones
no satisfacibles. S Halt Halt NP Duros paro Halt ( N P NP
Duros ( NP Completos
150 CAPTULO 10. PROBLEMAS TRATABLES E INTRATABLES

proc B(Exp, n)
comienza
x (00...0)
mientras (X (11...1)) Evalua(Exp, x) haz
me(x)
si Evalua(Exp, x) entonces
repite
hasta (F also)
termina.

proc S.Halt(Exp, n)
comienza
Escribe(B, Exp, n)
termina.

10.3. Problema de decisin del Clan


El siguiente es otro ejemplo de reducibilidad:

Ejemplo 43 Problema de decisin del Clique (Clan):


Dada una graca G =< V, A > un clique es una subgraca completa. El
problema de decisin del clique consiste en decidir si una graca G tiene un
clique de tamao K .

P.D. Clique es NPC i.e clique NP y S Clique


1)P.D. S Clique
0716G2534 0716E2534

3 0716A2534 2

3
0716C2534 3 0716F2534 2 0716B2534



5
8?9>
D =
: ;
<
Debemos construir As P
proponemos el siguiente algoritmo de transformacion.
Sea E = C1 C2 Ck co-variables booleanas X1 , X2 , . . . , Xk .
10.4. PROBLEMA DE LA COBERTURA DE NODOS 151

Formamos G de la siguiente manera

V = {(l, i)| la literal l esta en la clausula Ci }


A = {(l, i)}

Sea E = C1 C2 Ck con variables booleanas x1 , x2 , . . . , xk formadas


G de la siguiente manera
V = {(l, i)| la literal l esta en la clusula Ci }
A = {(l, i), (v, j)|i 6= j l 6= v}

P.D. La grca construida con el algoritmo AsClique de tamao k si y


slo E es satisfacible.
) E es satisfacible P.D. G tiene un clique de tamao k
Si E es satisfacible quiere decir que todas las clusulas pueden ser verda-
deras simultaneamente i e que al menos una literal es verdadera en cada
clusula para alguna asignacin de valores de verdad a las variables.
Sea S =< l, i > | l es verdadera en la clusula Ci y S contiene un vrtice
para cada i |S| = k y los vrtices en S estn conectados todos entre s
(por construccin los vrtices en S y los arcos entre ellos forman un cliqu
de tamao k ).
) Hipotesis G tiene un cliqu de tamao k .
P.D. E es satisfacible.
Sea S el conjunto de vrtices del cliqu |S| = k y S contiene un vrtice
por clusula < l, i >, 1 i k .
Si asignamos a l el valoe verdadero cuando sea una variable en x1 , . . . , xn
y el valor falso cuando sea su negacin voy a tener una asignacin de
variables de verdad que hacen verdaderos TODAS las clusulas E es sa-
tisfacible.
Por lo tanto Cliqu es NPD.

10.4. Problema de la cobertura de nodos


Un conjunto de vrtices es una cobertura de una grca G si todos los
arcos de G inciden a un vrtice de la cobertura.
152 CAPTULO 10. PROBLEMAS TRATABLES E INTRATABLES

0716G2534 0716E2534

07162534
A ???
??
??
?
0716C25?34 0716F2534 07162534
?? B
??
??
?
8?9 >
D=:;<

Figura 14: Los vertices {A, B, C} son cobertura de la Grca G

El problema de la cobertura de nodos consiste en determinar si una grca


G tiene una cobertura de tamao k .
P.D. Cob NPC i.e Cob es NPD y Cob NP.
1) Cob es NPDuro i.e. S Cob
Si demuestro Cliqu Cob y se que S Cliqu S Cob.
P.D. Cliqu Cob.
Suponemos que existe Acob P
tenemos que construir AClique P .
Proponemos el siguiente algoritmo ACliqueCob .
Sea G =< V, A > construimos G0 =< V 0 , A0 > tal que V 0 = V y
A =(i, j)|i, j V y(i, j)(N opertenece)A.
0

P.D. G tiene un Cliqu de tamao k si y solo si G0 tiene una cobertura


de tamao n k .
) G tiene un Cliqu de tamao k .
P.D. G0 tiene una cobertura de tamao n k .
Sea S el conjunto de vrtices que forman el Cliqu en G |S| = k . Por
construccin los arcos en G0 unen un vrtice en S con uno que no est en S
o dos vrtices fuera de S todos los arcos G0 inciden al menos a uno de los
n k vrtices que no estan en S G0 tiene una cobertura de tamao n k .
) G0 tiene una cobertura de tamao n k .
P.D. G tiene un Cliqu de tamao k .
Sea S el conjunto de vrtices que forman la cobertura |S| = n k . Todos
los arcos en G0 inciden a un vrtice en S , es decir que entre los k arcos
restantes no hay ningn arco por construccin que en G esos arcos estan
completamente conectados G tiene un cliqu de tamao k . Cliqu
10.4. PROBLEMA DE LA COBERTURA DE NODOS 153

Cob y como S Cliqu


S Cob Cob es NPD
Para demostrar que un problema es NPDuro, tengo que demostrar que
S L.

Escoger un problema M NPDuros

Asumir que existe un algoritmo AL que resuelve el problema L y que


AL P .

Mostrar que se puede encontrar una instancia de L a partir de una


instancia de M en tiempo polimonial determinstico.

Mostrar que a partir de la respuesta dada por AL a la instancia de L


permite obtener (en tiempo polinomial determinstico) la respuesta a
la instancis de M que se alimento a AM L .

Dado que M NPDuros, sabemos que S M y como se demostr


que M L. S L S NPDuros.

Para demostrar que un problema L es NP Completo:

Mostrar que L es NPDuros.

Construir un algoritmo en NP que resuelva L.

Problema de desicin del nmero cromtico, consiste en decidir si una


grca G tiene una coloracin de tamao m.
P.D Col es NPCompleto.
i) Col es NPDuro i.eS Col
Asumir que existe ACol P .
Tratar de construir AS P
Tenemos que dar ASCol P que transforma una instancia del problema
de satisfacibilidad en una instancia del problema de decisin del nmero
cromtico.
Consideramos que E CN F3 (cada clusula tiene a lo ms 3 literales).
Suponemos tambin que hay n variables y que n > 3.
Dada una expresin E construimos la grca G de la siguiente manera.
154 CAPTULO 10. PROBLEMAS TRATABLES E INTRATABLES

V = x1 , x2 , . . . , xn .Un vrtice por variable booleana.


x1 , x2 , . . . , xn .Un vrtice par variable booleana negada.
y1 , y2 , . . . , yn .Un vrtice adecuado por variable booleana.
c1 , c2 , . . . , cp .Un vrtice por clusula.
A = (xi , xi )|1 i n
(yi , xj )|i 6= j1 6= i, j n
(yi , xi )|i 6= j1 i, j n
(yi , yj )|i 6= j1 i, j n
(cj , xi )|xi no cj , 1 j k, i i n
(cj , xi )|xi no cj , 1 j k, i i n

P.D. E es satisfacible si y solo si G tiene una coloracin de tamao n + 1.


Hipotesis E es satisfacible G tiene una coloracin de tamao n + 1.
Observe que los vrtices yi forman un Cliqu de tamao n necesitamos
n colores para colorarlos. Supongamos que a cada yi se leasigna el color i.
Dado que yi no es adyacente a xi , ni a xi , una de estas dos literales puede
ser coloreads con el color i, la otra requiere un color adicinal.
Llamaremos al color n + 1 el color falso y a los otros colores verdaderos.
Ohserve que si una literal esta coloreda con el color falso, su negada esta
coloreada con un color verdadero. La coloracin as efectuada equivale a una
asignacin de valores de verdad a las variables de E .
Cada clusula contiene a lo ms 3 literales y hay al menos n variables
n > 3. Cada Ci es adyacente almenos un par xi , xj , entonces Ci es adyacente
a una variable coloreada conel color falso, entonces Ci se puede colorear con
un color verdadero. Si E es satisfacible G tiene una coloracin de tamao
n + 1.
* Puesto que, como E es satisfacible, todas las clusulas son satisfacibles
para laguna asignacin de valores de verdad; si asignamos los colores de
manera que l es coloreada con el color n + 1 si en la asignacin l es falso y
el color verdadero si l es verdadero, hay al menos una literal verdadera por
clusula coloreada con un color verdadero, ese mismo color es el que nos sirve
para colorear Ci .
10.5. PROBLEMA DE LA PLANEACIN 155

10.5. Problema de la planeacin


n trabajos requeriendo un tiempo ti para ejecutarse. m procesadores.
Una planeacin es una asignacin de los trabajos a los procesadores. Pa-
ra cada trabajo wi , la planeacin espacca, los intervalos de tiempo y los
procesadores en los cuales el trabajo va a ser procesado. Si fi es el tiempo de
terminacin el trabajo wi , el tiempo promedio de terminacin es:
n
1X
tpt = fi
n i=1
Si asociamos a cada trabajo un costo Ci , el tiempo promedio de termina-
cin ponderado es:
n
1X
tpt = fi C i
n i=1
Sea Ti el tiempo en el que el procesador pi termina su trabajo. El tiempo
de terminacin de la planeacin es:

tt = M ax(Ti ), 1 i n
Una planeacin es no apropiativa cuando un trabajo se ejecuta desde el
principio hasta el n en el mismo procesador.
Una planeacin es apropiativa cuando el trabajo no necesariamente se
ejecuta completamente en el mismo procesador.
P.D. El problema de decidir si un conjunto de trabajos tiene una planea-
cin no apropiativa para m procesadores con un tiempo de terminacin T es
NPDuro (i.e S Plan)
Utilizaremos el problema de la particin: Dado un conjunto de nmeros
enteros y un nmero m decidir si es posible particionar el conjunto en m
subconjuntos tal que la suma de los elementos de la particin sea igual.
Si m = 2
A = {2, 7, 10, 25, 20}
El problema de decisin de la particin es NP Completo.
P.D Particin Plan.
- Suponemos que existe AP lan P
- Construir Aparticion P
Proponemos al siguiente algoritmo:
156 CAPTULO 10. PROBLEMAS TRATABLES E INTRATABLES

Dados A = {a1 , a2 , . . . , an } y k enteros positivos


w = t1 , t2 , . . . , tn donde ti = ai .
el nmero de procesadores, m = k y el tiempo de terminacin es:
n
1 X
ti = ti
m i=1

10.6. Generacin de cdigo ptimo


Cuando las expresiones aritmticas tienen expresiones comunes se utiliza
un grafo acclico dirigido para representarlas. Cada nodo interno contiene
un operador y un grado de salida diferente de cero. Si asumimos operadores
binarios, cada nodo tiene un grado de salida 2.

a +

b *

Figura 15: a + b + (a c)

Una hoja es un nodo con grado de salida cero. Un nodo es un nivel 1 si


sus nodos hijos son ambas hojas. Un nodo compartido es un nodo con ms
de un padre. Un gad hoja si todos sus nodos compartidos son nodos hoja. Un
gad de nivel 1 es aquel en el cual todos sus nodos compartidos son de nivel
1.

a) El problema de generar el cdigo objeto ptimo para gads de nivel 1


es NP Duros an cuando la mquina tenga un slo registro.
10.7. PROBLEMAS NP COMPUTABLES Y NO DECIDIBLES 157

+ +

a b c

Figura 16: (a + b) (a + b + c)

b) Determinar el nmero r de registros necesariso para evaluar un gad de


nivel 1 si almacenara en memorias es NP Duros.

LOAD A1 R1
ADD R1 BR1
STORE T1 R 1
ADD R1 C1 R1
STORE T2 R 1
LOAD T1 R 1
MULT R1 T2 R1

LOAD aR1
ADD R1 bR1
ADD R1 cR1
MULT R 1 T2 R 1

10.7. Problemas NP Computables y No decidi-


bles
Suponer que tenemos tiempo y memoria innitos y vamos a considerar
problemas con una cantidad nita de instancias.
Un problema es no computable si no existe un algoritmo que sea capaz
de dar una respuesta a cualquier instancia del problema.
El problema del tapizado (a domini). Dado un conjunto de cartas , cada
una innita, si es posible tapizar cualquier rea nita con ellas.
158 CAPTULO 10. PROBLEMAS TRATABLES E INTRATABLES

Las cartas deben ser coloreadas de manera que sus lados adyacentes ten-
gan el mismo color.

Вам также может понравиться