análisisdealgoritmos · veces, el costo de desarrollo es dominante, en este caso se debe dar más...

158

Upload: phungdiep

Post on 20-Sep-2018

215 views

Category:

Documents


0 download

TRANSCRIPT

Análisis de Algoritmos

Elizabeth Pérez CortésRené Mac Kinney Romero

Universidad Autónoma Metropolitana

12 de septiembre de 2005

2

Objetivos

Al �nalizar el curso el alumno:

Será capaz de estimar los recursos de cómputo (memoria y tiempo) queun algoritmo requiere para ejecutarse.

Conocerá y será capaz de utilizar técnicas de diseño adecuadas paraconstruir soluciones e�cientes a diversas clases de problemas.

Reconocerá los problemas para los cuales no se conoce solución algo-rítmica práctica y podrá aplicar criterios para darles soluciones apro-ximadas e�cientes.

3

4

Prefacio

El concepto de algoritmo es de importancia central en las ciencias de lacomputación; matemáticos y cientí�cos de la computación lo han de�nidoen forma diferente. La palabra proviene del nombre de un matemático y as-trónomo medieval de Uzbekistán,Mohammed ibn-Musa al-Khwarizmi, quiendio las reglas para efectuar las 4 operaciones aritméticas básicas (suma, resta,multiplicación y división) en el siglo IX.

El astrónomo medieval se estableció en Bagdad en la �Casa del Conoci-miento� (Bait al-Hikma); escribió dos libros que jugaron un papel importanteen la historia de las matemáticas, uno de los cuales concierne alarte indiode contar. Cuando su obra apareció traducida al latín en Europa, los lec-tores empezaron a atribuirle no sólo el libro sino, también, un esquema denumeración que hace uso de numerales indios, esto último se le atribuyó erró-neamente. La nueva notación se convirtió en la deal-Khwarizmi, y en formadescuidada fue nombrada �algorismi� y, �nalmente, �algorism� o �algorithm�.Esta palabra, originalmente derivada del nombreal-Khwarizmi, ahora signi-�ca, más ampliamente, cualquier regla particular de proceder u operar (talcomo lo es el método euclidiano para encontrar el máximo común divisorde dos enteros). A partir de entonces y hasta nuestros días, la palabra, portodo lo que representa, ha motivado muchos estudios de tipo teórico tantoen matemáticas como en computación.

En la primera parte de este curso se introducen los conceptos básicospara el análisis de algorítmos; se propone un procedimiento para estimar lacantidad de recursos que un algoritmo consume cuando se ejecuta en unacomputadora. Lo anterior nos permite conocer su valor práctico, es decir,determinar si existe una solución algorítmica e�ciente para un problema enparticular. Enseguida, se da importancia a la velocidad de crecimiento de lademanda de recursos por un algoritmo, conforme el tamaño del problema queresuelve 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

técnicas de diseño de algoritmos. Para cada una de ellas se caracterizan losproblemas a los que la técnica se puede aplicar, se presenta el método generaly se dan algunos ejemplos.

Finalmente, la tercera parte del curso está enfocada al estudio de la teo-ría en torno a los problemas cuya solución algorítmica no se conoce o laconocida requiere tantos recursos que en términos prácticos no resuelve masque problemas triviales. La teoría presentada permite identi�car estos pro-blemas así como también encontrar soluciones aproximadas (no óptimas peroaceptables).

Índice general

I Análisis de algoritmos 111. Introducción 13

1.1. Conceptos Básicos . . . . . . . . . . . . . . . . . . . . . . . . 141.1.1. De�nición de algoritmo . . . . . . . . . . . . . . . . . . 14

1.2. Complejidad de algoritmos . . . . . . . . . . . . . . . . . . . . 151.3. Ejercicios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25

2. Comportamiento... 292.1. Dominio asintótico . . . . . . . . . . . . . . . . . . . . . . . . 292.2. Notación de orden . . . . . . . . . . . . . . . . . . . . . . . . . 362.3. Interpretación de los conceptos enunciados . . . . . . . . . . . 412.4. Dominio asintótico con límites . . . . . . . . . . . . . . . . . . 432.5. Ejercicios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 46

3. Análisis de Algoritmos Iterativos 493.1. Introducción . . . . . . . . . . . . . . . . . . . . . . . . . . . . 493.2. Análisis por bloques . . . . . . . . . . . . . . . . . . . . . . . 52

3.2.1. Secuencia . . . . . . . . . . . . . . . . . . . . . . . . . 523.2.2. Selección condicional . . . . . . . . . . . . . . . . . . . 523.2.3. Iteración . . . . . . . . . . . . . . . . . . . . . . . . . . 53

3.3. Ejercicios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 57

4. Análisis de Algoritmos Recursivos 594.1. Introducción . . . . . . . . . . . . . . . . . . . . . . . . . . . . 594.2. Sistemas recurrentes . . . . . . . . . . . . . . . . . . . . . . . 60

4.2.1. Expansión de recurrencias . . . . . . . . . . . . . . . . 624.3. Aproximando por integrales . . . . . . . . . . . . . . . . . . . 764.4. Elección de la operación básica . . . . . . . . . . . . . . . . . 77

7

8 ÍNDICE GENERAL

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

II Técnicas de Diseño de Algoritmos 835. Dividir para vencer 87

5.1. Forma genérica . . . . . . . . . . . . . . . . . . . . . . . . . . 875.2. Forma de la Función Complejidad . . . . . . . . . . . . . . . . 885.3. Mergesort

Ordenamiento por intercalación . . . . . . . . . . . . . . . . . 895.3.1. Problemas del algoritmo Mergesort. . . . . . . . . . . . 92

5.4. Quicksort . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 955.5. Ejercicios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 101

6. Método Ávido 1056.1. Problemas Tipo . . . . . . . . . . . . . . . . . . . . . . . . . . 1056.2. Almacenamiento en Cintas . . . . . . . . . . . . . . . . . . . . 1066.3. Problema de la mochila . . . . . . . . . . . . . . . . . . . . . . 1086.4. Intercalación óptima de archivos . . . . . . . . . . . . . . . . . 112

6.4.1. Problema . . . . . . . . . . . . . . . . . . . . . . . . . 1126.4.2. Estrategia . . . . . . . . . . . . . . . . . . . . . . . . . 1136.4.3. Generalización a arboles de grado k . . . . . . . . . . . 1156.4.4. Aplicación : Código de Hu�man . . . . . . . . . . . . . 115

6.5. Arboles Generadores mínimos . . . . . . . . . . . . . . . . . . 1166.5.1. Problema . . . . . . . . . . . . . . . . . . . . . . . . . 1166.5.2. Estrategia . . . . . . . . . . . . . . . . . . . . . . . . . 116

7. Búsqueda con retroceso (Backtrack) 1197.1. Problemas Tipo . . . . . . . . . . . . . . . . . . . . . . . . . . 1197.2. Método de Solución . . . . . . . . . . . . . . . . . . . . . . . . 1207.3. n Reinas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 122

7.3.1. Restricciones explicitas . . . . . . . . . . . . . . . . . . 1237.3.2. Restricciones implícitas . . . . . . . . . . . . . . . . . . 123

7.4. Suma de Subconjuntos . . . . . . . . . . . . . . . . . . . . . . 1257.4.1. Formulación 1 . . . . . . . . . . . . . . . . . . . . . . . 1267.4.2. Restricciones . . . . . . . . . . . . . . . . . . . . . . . 1267.4.3. Formulación 2 . . . . . . . . . . . . . . . . . . . . . . . 1277.4.4. Restricciones . . . . . . . . . . . . . . . . . . . . . . . 128

ÍNDICE GENERAL 9

7.5. Coloreado de grá�cas . . . . . . . . . . . . . . . . . . . . . . . 1287.5.1. Solución . . . . . . . . . . . . . . . . . . . . . . . . . . 129

8. Árboles de juego 1338.1. Problema . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1338.2. Solución . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1348.3. Método Min-Max . . . . . . . . . . . . . . . . . . . . . . . . . 1348.4. Funciones de Utilidad . . . . . . . . . . . . . . . . . . . . . . . 1348.5. Gato (n-en línea) . . . . . . . . . . . . . . . . . . . . . . . . . 136

8.5.1. Poda alfa-beta . . . . . . . . . . . . . . . . . . . . . . . 1368.5.2. Reglas . . . . . . . . . . . . . . . . . . . . . . . . . . . 136

9. Complejidad de los algoritmos diseñados con Backtrack. 1379.1. Plani�cación y Acotamiento . . . . . . . . . . . . . . . . . . . 138

9.1.1. Problema de la rami�cación y acotamiento . . . . . . . 1389.1.2. Búsqueda de menor costo . . . . . . . . . . . . . . . . 139

III Problemas NP 14110.Problemas Tratables e Intratables 143

10.1. Algoritmos No Deterministicos . . . . . . . . . . . . . . . . . . 14310.2. Interpretaciones . . . . . . . . . . . . . . . . . . . . . . . . . . 14410.3. Problema de decisión del Clan . . . . . . . . . . . . . . . . . . 15010.4. Problema de la cobertura de nodos . . . . . . . . . . . . . . . 15110.5. Problema de la planeación . . . . . . . . . . . . . . . . . . . . 15510.6. Generación de código óptimo . . . . . . . . . . . . . . . . . . . 15610.7. Problemas NP Computables y No decidibles . . . . . . . . . . 157

10 ÍNDICE GENERAL

Parte I

Análisis de algoritmos

11

Capítulo 1

Introducción

En las Ciencias de la Computación cuando se dice que un problema tie-ne solución, signi�ca que existe un algoritmo susceptible de implantarse enuna computadora, capaz de producir la respuesta correcta para cualquierinstancia del problema en cuestión.

Para ciertos problemas es posible encontrar más de un algoritmo capazde resolverlos, lo cual nos enfrenta al problema de escoger alguno de ellos. Latarea de decidir cuál de ellos es el mejor debe basarse en criterios acordes anuestros intereses. En la mayoría de los casos la elección de un buen algoritmoestá orientada hacia la disminución del costo que implica la solución delproblema; 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 implantación, depuración y mantenimiento.

b) Criterios orientados a disminuir el costo de ejecución: tiempo de pro-cesador y cantidad de memoria utilizados.

Si el programa que implanta el algoritmo se va a ejecutar unas cuantasveces, el costo de desarrollo es dominante, en este caso se debe dar máspeso a los primeros criterios. Por el contrario, si el programa se va a utilizarfrecuentemente, dominará el costo de ejecución, y por ende, se debe elegir unalgoritmo que haga uso e�ciente de los recursos de la computadora, es decir,se le debe evaluar prioritariamente bajo los criterios de la segunda clase. Encualquier caso, ninguno de los criterios de evaluación debe eliminarse porcompleto; pues, por ejemplo, si se implanta un sistema con algoritmos muy

13

14 CAPÍTULO 1. INTRODUCCIÓN

e�cientes pero confusos, puede suceder que después no sea posible darle elmantenimiento adecuado.

Los recursos que consume un algoritmo pueden estimarse mediante he-rramientas teóricas y constituyen, por lo tanto, una base con�able para laelección de un algoritmo. En las Ciencias de la Computación, la actividaddedicada a determinar la cantidad de recursos que consumen los algoritmosse le denomina análisis de algoritmos.

La primera sección de este capítulo presenta los conceptos que nos permi-tirán introducir después, en secciones posteriores, las técnicas utilizadas parala medición de los recursos que consume un algoritmo y las bases teóricassobre las que estas se fundamentan.

1.1. Conceptos BásicosEn esta sección presentamos los conceptos básicos del análisis de algorit-

mos.

1.1.1. De�nición de algoritmoUn algoritmo es un conjunto �nito de instrucciones no ambiguas y efec-

tivas que indican cómo resolver un problema, producen al menos una salida,reciben cero o más entradas y, para ejecutarse, necesitan una cantidad �nitade recursos.

Una instrucción es no ambigua cuando la acción a ejecutar está perfecta-mente de�nida, por ejemplo, instrucciones del tipo:

x ← log(0)

ox ← (10 o 35)/3

no pueden formar parte de un algoritmo.Una instrucción 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(números naturales)

1.2. COMPLEJIDAD DE ALGORITMOS 15

no lo es.Si un conjunto de instrucciones tiene todas las características de un al-

goritmo, excepto ser �nito en tiempo se le denominaproceso computacional.Los sistemas operativos son el mejor ejemplo de proceso computacional, puesestán diseñados para ejecutar tareas mientras las haya pendientes, y cuandoéstas se terminan, el sistema operativo entra en un estado de espera, hastaque llegan más, pero nunca termina.

Se asume que un problema tiene solución algorítmica si además de que elalgoritmo existe, su tiempo de ejecución es razonablemente corto. Por ejem-plo, es posible diseñar un algoritmo para jugar ajedrez que triunfe siempre: elalgoritmo elige la siguiente tirada examinando todas las posibles secuenciasde movimientos desde el tablero actual hasta uno donde sea claro el resultadoy elige la tirada que le asegure el triunfo; el pequeño inconveniente de estealgoritmo es que dicho espacio de búsqueda se ha estimado en100040 tablerospor lo que puede tardarse miles de años en tomar una decisión. Por lo tanto,para �nes prácticos se considera que si un problema tiene una solución quetoma años en computar, dicha solución no existe.

Considérese ahora el problema de ordenar un conjunto de valores, si elconjunto tiene 2 elementos es más fácil resolverlo que si tiene 20, análoga-mente un algoritmo que resuelva el problema tardará más tiempo mientrasmás grande sea el conjunto y requerirá una cantidad de memoria mayor paraalmacenar los elementos del conjunto.

En general la cantidad de recursos que consume un algoritmo para re-solver un problema se incrementa conforme crece el tamaño del problema.Dependiendo del problema en particular, uno o varios de sus parámetros seráelegido como tamaño del problema. Haciendo una cuidadosa observación, esrelativamente fácil efectuar una elección atinada.

En la Figura 1 se presenta una serie de problemas y una sugerencia acercadel parámetro que se puede elegir como tamaño del problema.

1.2. Complejidad de algoritmosLa función complejidad, f(n), donde n es el tamaño del problema, da una

medida de la cantidad de recursos que un algoritmo necesitará al implantarsey ejecutarse en alguna computadora. Puesto que la cantidad de recursos queconsume un algoritmo crece conforme el tamaño del problema se incrementa,la función complejidad es monótona creciente (f(n) > f(m) ⇔ n > m) con

16 CAPÍTULO 1. INTRODUCCIÓN

PROBLEMA TAMAÑO DEL PROBLEMABúsqueda de un elemento en un con-junto

Número de elementos en el conjunto

Multiplicar dos matrices Dimensión de las matricesRecorrer un árbol Número de nodos en el árbolResolver un sistema de ecuaciones li-neales

Número de ecuaciones y/o incógnitas

Ordenar un conjunto de valores Número de elementos en el conjunto

Figura 1: Elección del tamaño del problema.

respecto al tamaño del problema.La memoria y el tiempo de procesador son los recursos sobre los cuales

se concentra todo el interés en el análisis de un algoritmo, así pues distingui-remos dos clases de función complejidad:

a) Función complejidad espacial.Mide la cantidad de memoria que nece-sitará un algoritmo para resolver un problema de tamañon.

b) Función complejidad temporal. Indica la cantidad de tiempo que re-quiere un algoritmo para resolver un problema de tamañon; viene aser una medida de la cantidad de CPU que requiere el algoritmo.

La cantidad de memoria que utiliza un algoritmo depende de la implanta-ción, no obstante, es posible obtener una medida del espacio necesario con lasola inspección del algoritmo. Para obtener esta cantidad es necesario sumartodas las celdas de memoria que utiliza. En general se requerirán dos tiposde celdas de memoria:

a) Celdas estáticas. Son las que se utilizan en todo el tiempo que dura laejecución del programa, por ejemplo, las variables globales.

b) Celdas dinámicas.Se emplean sólo durante un momento de la ejecución,y por tanto pueden ser asignadas y devueltas conforme se ejecuta elalgoritmo, por ejemplo, el espacio de la pila utilizado por las llamadasrecursivas.

En este contexto, una celda de memoria no tiene una medida física encorrespondencia, se le utilizará sólo para especi�car el espacio empleado por

1.2. COMPLEJIDAD DE ALGORITMOS 17

una variable simple, sin importar el tipo al que pertenezca. Las variables quetengan valores de un tipo simple ocuparán una celda de memoria, mientrasque a las variables de tipos compuestos se les asignan tantas celdas comorequieran los elementos que las componen.

El tiempo que emplea un algoritmo en ejecutarse re�eja la cantidad detrabajo realizado, así, la complejidad temporal da una medida de la cantidadde tiempo que requerirá la implantación de un algoritmo para resolver elproblema, por lo que se le puede determinar en forma experimental. Porejemplo, para encontrar el valor de la función complejidad de un algoritmoA que se codi�ca un lenguaje de programación L, se compila utilizando elcompilador C y se ejecuta en la máquina M, damos algunas entradas alprograma y medimos el tiempo de procesador empleado para resolver loscasos del problema.

Proceder de esta manera presenta, entre otros, el inconveniente de quelos resultados obtenidos dependen de:

a) las entradas proporcionadas,

b) la calidad del código generado por el compilador utilizado, y

c) de la máquina en que se hagan las corridas.Para evitar que estos factores se re�ejen en el cálculo de la función com-

plejidad, el análisis temporal (y el espacial) se hará únicamente con base alalgoritmo escrito en pseudocódigo. Como el pseudocódigo no se puede ejecu-tar para medir la cantidad de tiempo que consume, la complejidad temporalno se expresará en unidades de tiempo, sino en términos de la cantidad deoperaciones que realiza. Cada operación requiere cierta cantidad constantede tiempo para ser ejecutada, por esta razón si se cuenta el número de o-peraciones realizadas por el algoritmo se obtiene una estimación del tiempoque le tomará resolver el problema.

Dado un algoritmo, se puede determinar que tipos de operaciones utilizay cuantas veces las ejecuta para una entrada especí�ca. Observemos esteprocedimiento en el siguiente ejemplo.

Ejemplo 1 Considérese el Algoritmo 1, que realiza búsqueda lineal sobre unarreglo A con n elementos, y devuelve la posición en la que se encuentra elelemento Valor; si Valor no se encuentra devuelven+1. El algoritmo realizasumas (+), asignaciones (←), comparaciones (≤ y 6=) y operaciones lógicas(∧).

18 CAPÍTULO 1. INTRODUCCIÓN

Si el ciclo mientras se realiza k veces, el algoritmo ejecutará las operacio-nes siguientes:

k sumas (una por cada iteración).k + 2 asignaciones (las del ciclo y las realizadas fuera del ciclo).k + 1 operaciones lógicas (la condición 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 BúsquedaLineal(V alor, A, n) ≡comienza

i ← 1;mientras (i ≤ n) ∧ (A[i] 6= V alor) haz

i ← i + 1;zah;BúsquedaLineal← i;

termina.Algoritmo 1: Búsqueda lineal

Del Ejemplo 1 notamos que el número de veces que se ejecutan algunasoperaciones, para valores sucesivamente mayores quek, presenta un modelode crecimiento similar al que tiene el número total de operaciones que eje-cuta el algoritmo1. Para hacer una estimación de la cantidad de tiempo quetarda un algoritmo en ejecutarse, no es necesario contar el número total deoperaciones que realiza. Se puede elegir alguna, a la que se identi�cará comooperación básica que observe un comportamiento parecido al del número to-tal de operaciones realizadas y que, por lo tanto, será proporcional al tiempo

1Posteriormente, cuando se introduzca el concepto deorden, se dirá que ambas canti-dades son del mismo orden

1.2. COMPLEJIDAD DE ALGORITMOS 19

total de ejecución. Para el algoritmo anterior se puede contar cualquiera delas operaciones mencionadas. En general, debe procurarse que la operaciónbásica, en la cual se basa el análisis, de alguna forma esté relacionada con eltipo de problema que se intenta resolver, ignorando las asignaciones de valo-res iniciales y las operaciones sobre variables para control de ciclos (índices).La operación básica en el Algoritmo 1 (búsqueda lineal) es la comparaciónentre 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 más gran-des contenidos en un arreglo A de n enteros. Tomaremos este problema paraejempli�car la elección de la operación básica con miras a hacer el análisisdel algoritmo.

En este algoritmo se realizan las siguientes operaciones:

a) Comparación entre mayor1,mayor2 y los elementos del arreglo.

b) Asignaciones a mayor1 y mayor2c) Asignación al índice i

d) Asignación a la función

e) Producto de los mayores

f) Incremento al índice i

g) Comparación 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 número total de operaciones. Entonces, se tiene que las operacionesque se pueden considerar para hacer el análisis son: las comparaciones entremayor1,mayor2 y los elementos del arreglo y las asignaciones a los elementosmayores.

Con el �n de remarcar aún más la elección de la operación básica, laFigura 2 ilustra la selección de operaciones básicas en algunos algoritmosmuy comunes.

Resumiendo, el análisis de un algoritmo se puede hacer considerando sóloaquella operación que cumpla los siguientes criterios:

20 CAPÍTULO 1. INTRODUCCIÓN

func Producto2Mayores(A, n) ≡comienzasi A[1] > A[2] entonces

mayor1 ← A[1];mayor2 ← A[2];

otromayor1 ← A[2];mayor2 ← A[1];

isi ← 3;mientras i ≤ n hazsi A[i] > mayor1 entonces

mayor2 ← mayor1;mayor1 ← A[i];

otrosi A[i] > mayor2 entoncesmayor2 ← A[i];

isi ← i + 1;

zahProducto2Mayores← mayor1×mayor2;

termina.Algoritmo 2: Producto de los valores más grandes de una lista de números.

PROBLEMA OPERACIÓN BÁSICABúsqueda de un elemento en un con-junto

Comparación entre el valor y los ele-mentos del conjunto

Multiplicar dos matrices Producto de los elementos de las ma-trices

Recorrer un árbol Visitar un nodoResolver un sistema de ecuaciones li-neales

Suma

Ordenar un conjunto de valores Comparación entre valores

Figura 2: Elección de la operación básica 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 número de veces cuyo modelo de crecimiento seasimilar al del número total de operaciones que efectúa 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-ración representativa, se debe hacer un análisis global, contando todas lasoperaciones.

En la teoría de algoritmos es muy frecuente usar el términoinstancia paraindicar un caso especí�co de un problema. Así, por ejemplo, si el problemaes la multiplicación de 2 enteros positivos una instancia es el par de númerosa multiplicar, v.g. (1966, 24).

Con los conceptos enunciados hasta aquí es posible calcular la funcióncomplejidad temporal ft(n) para un algoritmo simple. En el Ejemplo 3 secalcula dicha función para el algoritmo 1.

Ejemplo 3 Considérese el Algoritmo 1, para hacer el análisis de su compor-tamiento tomemos como operación básica las comparaciones con elementosdel arreglo y como caso muestra: A = [2, 7, 4, 1, 3] y n = 5.

Si Valor = 2, se hace una comparación, 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 función complejidad no es tal,en realidad es una relación, ya que para un mismo tamaño de problema seobtienen distintos valores de la función complejidad. Como éste, hay muchosalgoritmos en los que el número de operaciones depende, no sólo del tamañodel problema, sino también de la instancia especí�ca que se presente, entonces¾de qué manera se puede expresar el valor de la función complejidad? Acontinuación damos una respuesta.

Sea I(n) = {I1, I2, I3, . . . , Ik} el conjunto de instancias del problema cuyotamaño es n. Sea O(n) = {O1, O2, O3, . . . , Ok} el conjunto formado por elnúmero de operaciones que un algoritmo realiza para resolver cada instancia.Entonces, Oj es el número de operaciones ejecutadas para resolver la instan-cia Ij, para 1 ≤ j ≤ k. Se distinguen tres casos en el valor de la funcióncomplejidad temporal

22 CAPÍTULO 1. INTRODUCCIÓN

a) Peor casoft(n) = max({O1, O2, O3, . . . , Ok})

b) Mejor casoft(n) = mın({O1, O2, O3, . . . , Ok})

c) Caso medio

ft(n) =k∑

i=1

OiP (i)

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

tamaño n, el algoritmo ejecuta el mínimo número posible de operaciones, elpeor caso cuando hace el máximo y en el caso medio se consideran todoslos casos posibles para calcular el promedio de las operaciones que se hacentomando en cuenta la probabilidad de que ocurra cada instancia.

Los casos en la función complejidad espacial, se pueden de�nir análoga-mente, considerando ahora el conjuntoC(n), como el conjunto formado porel número de celdas de memoria utilizadas por el algoritmo para resolver cadainstancia del problema.

En los Ejemplos 4 y 5 se ilustra el análisis temporal de los Algoritmos 1y 2. Para estos problemas el número de operaciones varía considerablementepara instancias diferentes del mismo tamaño.

Ejemplo 4 Algoritmo de búsqueda lineal.Problema: Búsqueda lineal de un valor en un arreglo de

tamaño n.Tamaño del Problema: n = número de elementos en el arreglo.Operación básica: Comparación del valor con los elementos del

arreglo.

Análisis Temporali) 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 localidadi, (1 ≤ i ≤ n) y P (n + 1) es la probabilidad de que no esté en el arreglo. Sise supone que todos los casos son igualmente probables

P (i) =1

n + 1

ft(n) =1

n + 1

n+1∑i=1

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

2(n + 1)=

n + 2

2

Ejemplo 5 Algoritmo producto mayores.Problema: Dado un arreglo de valores, encontrar el

producto de los dos números mayores.Tamaño del Problema: n =número de elementos en el arreglo.Operación básica: Comparación entre los elementos del arreglo

y los mayores.

Análisis Temporali) Mejor caso: ocurre cuando el arreglo está ordenado ascendentemente

(en cada iteración sólo hace la primera comparación)

ft(n) = 1 + (1× (n− 2)) = n− 1

ii) Peor caso: el arreglo está ordenado de manera descendente (se hacendos comparaciones por iteración en el ciclo)

ft(n) = 1 + (2× (n− 2)) = 2n− 3

iii) Caso medio: en este problema se tienen( |U |

n

)n! casos, donde U es

el conjunto del que se extraen los elementos del arreglo.

Y para hacer el cálculo se deben contar las operaciones que se harían encada caso.

24 CAPÍTULO 1. INTRODUCCIÓN

La tarea de conteo bajo esta metodología resulta excesivamente laboriosa,por lo que se recurrirá a otro mecanismo. El algoritmo hace siempre unacomparación al inicio y en el interior del ciclo puede ser que se realice unacomparación o dos; obsérvese que para cadaA[i] puede ser cierta una de tresaseveraciones:

i) A[i] > mayor1 se hace una comparación

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 harán

1

3(1 + 2 + 2) =

5

3

comparaciones por iteración, por lo tanto el algoritmo realizará en promedio

ft(n) = 1 +5

3(n− 2) =

(5n− 7)

3

comparaciones.

Es importante mencionar que no todos los algoritmos presentan casos, yresulta interesante tener una herramienta para detectar cuándo se particio-nará el análisis en casos; por el momento la única ayuda con la que se cuentaes la intuición y preguntarse: ¾se puede resolver el problema de manera trivialpara alguna instancia especí�ca? Si la respuesta es a�rmativa el algoritmotendrá casos, por lo que el problema de detección se reduce a contestar esta�simple� pregunta.

Con lo expuesto en esta sección y con habilidades (formales e informales)de conteo, se puede estimar la cantidad de recursos que un algoritmo consu-me; pero el objetivo no sólo es conocer dicha cantidad, sino, más aún, podercomparar el comportamiento de distintos algoritmos, con el �n de decidircuál de ellos utilizar bajo circunstancias especí�cas. En la siguiente secciónse dan las bases teóricas para tomar de manera con�able la decisión.

1.3. EJERCICIOS 25

1.3. EjerciciosEjercicio 1.1 La regla para multiplicar las matrices A y B de dimensión2× 2, y obtener C = AB, es:

c11 = a11b11 + a12b21 c12= a11b12 + a12b22

c21 = a21b11 + a22b21 c22= a21b12 + a22b22

ésta involucra 8 multiplicaciones y 4 sumas.Diseñe un algoritmo que use solamente 7 multiplicaciones. ¾Cuántas su-

mas usa su algoritmo?[Sugerencia. Exprese cada entrada de la matrizC, como una suma de las

fórmulas 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 representación 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

...qk−1 = 2qk + rk

donde cada residuo ri es 0 o 1. El algoritmo se detiene cuando qk = 0. Larepresentación binaria es entonces N2 = rkrk−1 . . . r1r0.

i) De�nir uno de los parámetros como tamaño del problema, justi�que suelección.

26 CAPÍTULO 1. INTRODUCCIÓN

proc RepresentaciónBinaria(N,N2) ≡comienza

y ← N ;i ← 0;mientras (y 6= 0) hazsi par(y) entonces

r[i] ← 0otro

r[i] ← 1;y ← y − 1

isy ← y/2;i ← i + 1;

zahk ← i− 1;N2 ← r[0...k];

termina.Algoritmo 3: Representación binaria.

ii) Elija la operación básica para basar el análisis temporal y calcule lacomplejidad temporal.

iii) Muestre que si elige el valor del númeroN como el tamaño del proble-ma, el número de operaciones que requiere el algoritmo esb10

3log Nc+1.

Ejercicio 1.3 Suponer que se desea encontrar el elemento menor de unasecuencia �nita de enteros x1, x2, . . . , xn, usando el algoritmo 4.

i) Sugerir una medida razonable, para el tamaño del problema.

ii) Realice el análisis temporal y espacial para el algoritmo.

Ejercicio 1.4 Para el algoritmo de ordenamiento denominado Burbuja, efec-túe el análisis temporal y espacial en todos los casos.

Ejercicio 1.5 Para el algoritmo 2 muestre que el modelo de crecimiento deltotal de operaciones, conforme el tamaño del problema se incrementa, essimilar al que observa la operación básica.

1.3. EJERCICIOS 27

proc BuscaMínimo(X) ≡comienza

b ← X[1];para j ← 2 a n haz

si (X[j] < b) entoncesb ← X[j]; (* b = min{x1, x2, . . . , xn} *)

iszah

termina.Algoritmo 4: Valor mínimo.

Ejercicio 1.6 Se tiene un archivo de n registros y cada registro contiene mdatos que deben actualizarse periódicamente.

i) Diseñe un algoritmo que actualice tal archivo. Dicho algoritmo recibecomo entrada el número de registros en el archivo y una lista que con-tiene los número de registro que se han de actualizar. Si un número deregistro está en la lista, todos sus datos se actualizan.

ii) De�nir uno de los parámetros como tamaño del problema.

iii) Elegir una operación básica.

Calcular la complejidad temporal en el mejor caso, en el peor caso y en elcaso medio, asumiendo que P (0) = 0, P (1) = P (2) = P (3) = · · · = P (n),y después asumiendo que P (k) = ( 2k

n2 + n); 0 ≤ k ≤ n, donde P (k) es laprobabilidad de que deban actualizarse los datos de k registros.

Ejercicio 1.7 Dada una lista ordenada con representación 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 paraobtener el k−ésimo elemento más pequeño, encontrando los k menores sik ≤ n

2y los n − k + 1 mayores si k > n

2. Para este algoritmo, obténgase la

complejidad temporal en todos los casos.

28 CAPÍTULO 1. INTRODUCCIÓN

Capítulo 2

Comportamiento Asintótico deFunciones

2.1. Dominio asintóticoCuando se implanta un algoritmo para resolver problemas pequeños, el

costo adicional generado por el grado de ine�ciencia del algoritmo elegido espoco signi�cativo. Por el contrario, cuando el tamaño del problema es grande,la cantidad de recursos que el algoritmo necesite puede crecer tanto que lohaga impráctico. Por esta razón, para elegir entre dos algoritmos es necesariosaber cómo se comportan con problemas grandes. En atención a esta necesi-dad se estudiará la velocidad de crecimiento de la cantidad de recursos que unalgoritmo requiere conforme el tamaño del problema se incrementa, es decir,se estudiará el comportamiento asintótico de las funciones complejidad. LaDe�nición 1 introduce el concepto fundamental.

De�nición 1 Sean f y g funciones de N a R. Se dice que f domina asintó-ticamente a g o que g es dominada asintóticamente por f, si ∃k ≥ 0 y m ≥ 0tales que

|g(n)| ≤ m|f(n)|,∀n ≥ k

El hecho de que una función domine asintóticamente a otra se interpretacomo se muestra en la Figura 3. En ella se representan las grá�cas de lasfunciones m|f(n)| y |g(n)|, donde k es el valor a partir del cual m|f(n)| esmayor que |g(n)|, y esta relación de magnitud se conserva conformen crece.

29

30 CAPÍTULO 2. COMPORTAMIENTO...

En otros términos, podemos decir que si una función domina a otra, su velo-cidad de crecimiento es mayor o igual. Si esas funciones están representandoel consumo de recursos de la computadora, obviamente la función dominadacrecerá a lo más a la misma velocidad de la otra.

0

1

2

3

4

5

0 1 2 4 5

m|f(n)||g(n)|

k

Figura 3: Representación grá�ca del concepto de dominio asintótico.

Puesto que las funciones complejidad son funciones con dominioN, losnúmeros naturales, y contradominio R, los números reales; los conceptos ylas propiedades de dominio asintótico proporcionan una manera convenientede expresarlas y manipularlas.

Con la intención de aclarar la de�nición, a continuación se presentanalgunos ejemplos.

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

i) Demostrar que g domina asintóticamente 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 ASINTÓTICO 31

si se toma m = 1 y k = 0, las desigualdades anteriores se cumplen, porlo tanto, m y k existen, y en consecuencia g domina asintóticamente af.

ii) Demostrar que f no domina asintóticamente a g. Expresado matemá-ticamente se tiene

¬(∃m ≥ 0, k ≥ 0 tales que |g(n)| ≤ m|f(n)|,∀n ≥ k)

aplicando la negación 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|

simpli�cando

|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 asintóticamente a g.

En lo subsecuente se utilizarán las inicialesd.a. como sinónimo de dominaasintóticamente a.

Ejemplo 7 Sea g una función de N a R y f(n) = cg(n) con c > 0 y c ∈ R.Demostrar que f y g se dominan asintóticamente.

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 CAPÍTULO 2. COMPORTAMIENTO...

Como c > 0, entonces

|g(n)| ≤ mc|g(n)|,

tomando m = 1c,

|g(n)| ≤ 1

cc|g(n)|∀, n ≤ k

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 elsentido asintótico.

Ejemplo 8 Sean

f(n) = n y g(n) =

{1 si n es parn3 si n es impar

Demostrar que f y g no se dominan asintóticamente.

i) Primero se debe demostrar que f no-d.a. g. Utilizando la negación dela de�nición se expresa que

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

2.1. DOMINIO ASINTÓTICO 33

Considerando el caso cuando n es impar y substituyendo f y g en ladesigualdad, se tiene

|n3| > m|n|n2 > m

n > m12

Entonces para toda n impar > max (m12 , k) las desigualdades se cum-

plen,∴ f no-d.a. g.

ii) También 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 análisis teórico para obtener la función complejidadf(n) que caracterice a un algoritmo, se está obteniendo un modelo de com-portamiento para la demanda de recursos en función del parámetron, de talforma que si t(n) es la cantidad real del recurso que se consume para unaimplantación especí�ca del algoritmo se tiene que

t(n) ∝ f(n)

t(n) = kf(n)

|t(n)| ≤ k|f(n)|

i.e. f(n) domina asintóticamente a cualquier t(n), dicho de otra manera lademanda de recursos se va a regir por el modelo de crecimiento que observef(n).

A continuación se expone una serie de teoremas que establecen propieda-des y relaciones basadas en el concepto de dominio asintótico.

34 CAPÍTULO 2. COMPORTAMIENTO...

Teorema 1 Sea M el conjunto de funciones de N a R. La relación binariasobre este conjunto de�nida como

{< f, g > |f, g ∈ M y g domina asintóticamente a f}

y es re�exiva y transitiva.

Demostración 1 La demostración la realizamos por partes

i) P.D. La relación de�nida es re�exiva, es decir,

f ∈ M ⇒ fd.a.f.

Si tomamos m = 1 y k = 0 la desigualdad |f(n)| ≤ m|f(n)|,∀n ≥ k secumplen, por lo tanto f d.a. f y∴ la relación es re�exiva.

ii) P.D. La relación es transitiva. Debemos mostrar que sif, g, h ∈ M talque f d.a. g y g d.a. h ⇒ f d.a. h.

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

|g(n)| ≤ m1|f(n)|, ∀n ≥ k1

y

|h(n)| ≤ m2|g(n)|,∀n ≥ k2

por lo que

|h(n)| ≤ m1m2|g(n)|,∀n ≤ max(k1, k2)

con m = m1m2 y k = max(k1, k2) se satisface la de�nición, por lotanto f d.a. h y∴ la relación es transitiva.

El siguiente ejemplo ilustra la aplicación de la propiedad de transitividad.

2.1. DOMINIO ASINTÓTICO 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 asintóticamente.

Sabemos, por la demostración del ejemplo 7, quef(n) = cn d.a. g(n) = ny 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 asintóticamente.

El Teorema 2 induce a concebir el conjunto de funciones deN a R comola unión de distintos subconjuntos ajenos, de tal manera que dos funcionesestán en el mismo subconjunto si se dominan asintóticamente. Se sugiereconsultar los conceptos de relación de equivalencia y partición [?].

Teorema 2 Sean f y g funciones en M, la relación binaria f ≡ g ⇔ f y gse dominan asintóticamente es una relación de equivalencia sobreM.

Demostración 2 P.D. que la relación descrita es simétrica, re�exiva y tran-sitiva.

36 CAPÍTULO 2. COMPORTAMIENTO...

i) La relación es simétrica, es decir, f ≡ g ⇔ g ≡ f.

Puesto que f ≡ g ⇒ f d.a. g y g d.a. f entonces por de�nición g ≡ fy∴ La relación es simétrica.

ii) La relación es re�exiva. Se sigue del teorema 1.

iii) La relación 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.

Además h d.a. g y g d.a. f ⇒ h d.a. f por lo tanto f ≡ g,∴ La relación es transitiva.

Dado que toda relación de equivalencia induce una partición, la relacióndescrita particiona el conjunto de funciones deN a R en subconjuntos talesque todos los elementos de un mismo subconjunto se dominan asintótica-mente entre sí. Se ha demostrado que las funciones n, n + c y cn(c ∈ R) seencuentran en un mismo subconjunto de la partición.

Los conceptos hasta aquí citados son parte de la descripción de una me-todología que se desarrollará en esta sección para estimar, aproximadamen-te, los costos (en espacio y tiempo) de las soluciones que proporcionan losalgoritmos y para comparar algoritmos con base en tales costos. La caracte-rística principal de esta propuesta es que deben ignorarse factores constantesy concentrarse en el comportamiento del algoritmo cuando los tamaños delproblema son grandes.

2.2. Notación de ordenCuando describimos cómo es que el número de operacionesf(n) depende

del tamaño n, lo que nos interesa es encontrar el patrón de crecimiento parala función complejidad y así caracterizar al algoritmo; una vez hecha estacaracterización podremos agrupar las funciones de acuerdo al número deoperaciones que realizan. Para tal propósito se da la siguiente de�nición.

De�nición 2 El conjunto de todas las funciones que son asintóticamentedominadas por una función g es denotado O(g) y se lee �orden de g�, o bien�O-grande de g�.

2.2. NOTACIÓN 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).

iii) f(n) = n, g(n) =

{1 si n es parn3 si n es impar

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

La notación 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 unafunción 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) escerrado bajo la multiplicación 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.

Demostración 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 CAPÍTULO 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)| secumple 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 término a término

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

Por la desigualdad del triángulo

|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 quef es O(g) si y sólo si todas las funcionesdominadas asintóticamente por f son también dominadas asintóticamentepor g.

2.2. NOTACIÓN DE ORDEN 39

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

Demostración 4

(⇒) Si f es O(g) entonces O(f) ⊂ O(g).Si f es O(g), por de�nición g d.a. f. Sea h una función arbitraria tal que

f d.a. h, por transitividad g d.a. h, luego entonces h es O(g). Dado que hpuede 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 están en M, es posible clasi�carlos algoritmos según el orden de su función complejidad. Gran parte delos algoritmos tienen complejidad que cae en uno de los siguientes casos:O(1) Complejidad constanteO(log n) Complejidad logarítmicaO(n) Complejidad linealO(n log n) Complejidad �n log n�O(n2) Complejidad cuadráticaO(cn), c > 1 Complejidad exponencialO(n!) Complejidad factorialY 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 decirque un algoritmo con complejidad factorial consume más recursos que unocon complejidad exponencial y uno con complejidad exponencial consumemás que uno con complejidad cuadrática, etc. La demostración se deja allector.

Con frecuencia encontraremos que al analizar un algoritmo, una sección decódigo es de un orden y otra parte es de otro orden, entonces nos preguntamos¾cuál es el orden del algoritmo?, la respuesta se establece a continuación.

40 CAPÍTULO 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 función es mayor que otra sila domina asintóticamente.

Demostración 5 Tenemos,fesO(h1), i.e. ∃m1 ≥ 0 y k1 ≥ 0 tales

|f(n)| ≤ m1|h1(n)|, ∀n ≥ k1

además 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 triángulo, 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 más de un algoritmo que expresa la solución de unproblema, si en particular se tiene un algoritmo que haceO(n2) operacionesy otro que hace O(n3), ¾qué algoritmo se preferiría? Para hacer una elecciónrazonable debe considerarse el resultado del teorema 7.

Teorema 7 Sean c, d ∈ R y 0 < c < d, entonces O(nc) ⊂ O(nd) y lacontención es propia.

Como consecuencia del teorema anterior tenemos un resultado similar alque se presenta con el álgebra elemental : �para determinar el grado de unpolinomio se elige el término de mayor grado�, �para estimar el orden de unaexpresión asintótica se usa el término más representativo�.

2.3. INTERPRETACIÓN DE LOS CONCEPTOS ENUNCIADOS 41

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

Suponga que las siguientes funciones representan funciones complejidadpara tres algoritmos que resuelven un mismo problema:

f1(n) =1

n2+ 63 es O(1).

f2(n) = rn +1

n+ kn log n es O(n log n).

f3(n) = .6n3 + 31n + 468 es O(n3).

Los órdenes de las mismas se obtienen fácilmente aplicando una y otravez los resultados enunciados y en base a éstos es posible hacer una elecciónsi seguimos el criterio que se describe en la siguiente sección.

2.3. Interpretación de los conceptos enunciadosUtilizando las propiedades establecidas por los teoremas, podemos re-

presentar el conjunto de funciones deN a R como se muestra en la Figura 4donde todas las funciones que están en la coronaO(f) dominan asintótica-mente a f y son dominadas por f. Equivalentemente podemos decir que cadacorona representa un subconjunto de la partición inducida por la relación deequivalencia de�nida en el Teorema 5.

Ahora bien, si tenemos 2 algoritmos A1 y A2 que resuelven el mismoproblema y deseamos elegir el que requiera la menor cantidad de recursos,haremos la elección calculando primero sus complejidades y luego el ordende las mismas. Pueden ocurrir dos casos:

1. Que uno de los algoritmos, digamosA1, tenga una función complejidadf1(n) que domine a f2(n), pero que f2(n) no domine a f1(n), i.e. seencuentran 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 monótonas crecientes la desigual-dad se cumple para n ≥ n0, esto signi�ca que para problemas de tamañon0

42 CAPÍTULO 2. COMPORTAMIENTO...

O(1)

O(log n)

O(n)

O(n log n)

O(n )c

O(c )n

O(n!)

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

2.4. DOMINIO ASINTÓTICO CON LÍMITES 43

en adelante el algoritmo A1 consume más recursos que A2, por lo tanto siqueremos optimizar los recursos de la máquina debemos elegir el de la com-plejidad dominada.

El otro caso posible es que el orden de ambas funciones complejidad seael mismo, en ésta situación, las cantidades de los recursos que consumen losalgoritmos crecen de manera similar, y la elección del algoritmo debe basarseen la comparación de las funciones complejidad más que en su orden.

Comparar los algoritmos en base al comportamiento asintótico de susfunciones complejidad es una herramienta de elección muy poderosa que, sinembargo debe ser utilizada con cuidado pues, por ejemplo, si tenemos dosalgoritmos con funciones complejidad

f(n) = cn, es O(n) yg(n) = an2, es O(n2) con a y c constantes

en base a lo dicho, elegiríamos el algoritmo cuya función complejidad esf(n), sin embargo, si c = 25 y a = 1, g(n) < f(n) para n < 25, por lo tantotambién es importante tomar en cuenta el tamaño del problema especi�co.

2.4. Dominio asintótico con límitesExisten varias formas para mostrar que una función es o no, del mismo

orden que otra. A continuación se da una de�nición que se basa, principal-mente, en el comportamiento del cociente f(n)

g(n)cuando n tiende a ser in�nito,

tal de�nición implica el uso de límites.

De�nición 3 Sean f y g funciones de N a R.

a) Si lımn→∞

f(n)

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

mismo orden.

b) Si lımn→∞

f(n)

g(n)= 0, f es O(g), pero g no es O(f); i.e., f es de orden

menor que g.

c) Si lımn→∞

f(n)

g(n)= ∞, entonces f es de mayor orden que g.

44 CAPÍTULO 2. COMPORTAMIENTO...

Esta de�nición resulta clara, si estudiamos el comportamiento de las fun-ciones f(n) = 1 y g(n) = n, cuando se toma el límite del cociente 1

nsi

n →∞. A�rmamos entonces que si los valores de n son grandes, g(n) crecemás rápido que f(n) y el valor del límite es 0, luego por el caso (b) de lade�nición anterior podemos a�rmar que f(n) es O(g(n)).

Ejemplo 10 Sean f(n) =n2

2, y g(n) = 300n2 funciones de N a R. Mostrar,

usando la de�nición de límite, que O(f) = O(g).

lımn→∞

n2

2

300n2=

1

600,

De la De�nición 3(a) se tiene que son del mismo orden, pues el límite esdistinto de cero (en general dos funciones que di�eren por un factor constanteson del mismo orden).

Frecuentemente se usa la regla de L'Hôpital para calcular el límite, puesencontrar el límite para la derivada en ocasiones es más sencillo que para lafunción misma. La regla de L'Hôpital establece que si

lımn→∞

f(n) = ∞ y lımn→∞

g(n) = ∞entonces

lımn→∞

f(n)

g(n)= lım

n→∞f ′(n)

g′(n)

donde f ′ y g′ son las derivadas de f y g respectivamente. Lo anterior tambiénes válido con n 6∈ ∃ ** revisar <- **y solo si f(n) y g(n) son diferenciables.Si se desea revisar el concepto de límite 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 L�Hôpital

lımn→∞

f(n)

g(n)= lım

n→∞(ln n log e)

n

= lımn→∞

1n log e

1

= lımn→∞

1

nlog e

= 0,

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

2.4. DOMINIO ASINTÓTICO CON LÍMITES 45

Ejemplo 12 Sean f(n) = n2 y g(n) = en las funciones complejidad paralos algoritmos A y B respectivamente, que resuelven un mismo problema.Determinar cual de los algoritmos es óptimo asintóticamente.

Usando L�Hôpital da

lımn→∞

n2

en= lım

n→∞2n

en

= lımn→∞

2

en

= 0,

así n2 es O(en), [ y en no es O(n2)], por tanto A es óptimo en el sentidoasintótico.

Mostraremos ahora la equivalencia entre las de�niciones que se han citado(vea las De�niciones 1 y 3), para determinar la complejidad de un algoritmo.Para hacer esto partimos de la expresión

lımn→∞

f(n)

g(n)= c, (2.1)

y con esta obtener una expresión de la forma indicada por la def. 1.La ecuación 2.1 dice que para toda e > 0, ∃k ≥ 0 tal que ∀n ≥ k, se tiene

la desigualdad ∣∣∣∣f(n)

g(n)− c

∣∣∣∣ < e

Para valores grandes de k y con e = 1 obtenemos∣∣∣∣f(n)

g(n)− c

∣∣∣∣ < 1,∀n ≥ k

∣∣∣∣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 términos de la funcióng(n),de los valores de f(n) para valores grandes de n, que es precisamente lo quedice la De�nición 1.

46 CAPÍTULO 2. COMPORTAMIENTO...

Como ya se mencionó la anterior De�nición 3 es otra herramienta paraestudiar el comportamiento de la función complejidad asociada a un algorit-mo, el inconveniente con ella es que implica conceptos matemáticos que noson elementales como los de la De�nición 1.

2.5. EjerciciosEjercicio 2.1 Determine cuales de las siguientes funciones dominan asin-tóticamente a las otras.

i) f1(n) =

{n, si n es par−n, si n es impar

ii) f2(n) =n + 1

n + 1

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

iv) f4(n) = 4n3

v) f5(n) = log n2

Ejercicio 2.2 ¾Para que valores de n se satisface la expresión 10n log n >2n2 ?

Ejercicio 2.3

1. Agrupe las siguientes funciones; dos funcionesf y g pertenecen al mis-mo grupo si y sólo si se dominan asintóticamente.

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

f5(n) = n12 + 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 según suorden.

2.5. EJERCICIOS 47

Ejercicio 2.4 Encuentre una función g(n) (de la forma AB), tal que f(n)sea O(g(n)), para cada uno de los siguientes casos:

i) f(n) = C(n, 2)

ii) f(n) =5n3 + 6

n + 2

iii) f(n) =(n2 + 7)3n

2n

iv) f(n) = n!

Ejercicio 2.5 Muestre que para cualesquiera constantes positivasc0, c1, c2, . . . , ck

la expresión c0 + c1n + c2n2 + · · · + ckn

k es O(nk). Pruebe que la expresiónno es O(nk−1).

Ejercicio 2.6 Cuando decimos que una expresión f(n) es O(log n), ¾porquéno es necesario especi�car la base del logaritmo?Ejercicio 2.7 Probar las siguientes aseveraciones, y veri�car que cada unade 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-ción 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 esel caso, demuestre lo contrario.Ejercicio 2.11 Mostrar que para todas constantesa, b > 0 (log2 n)a es O(nb).

48 CAPÍTULO 2. COMPORTAMIENTO...

Capítulo 3

Análisis de Algoritmos Iterativos

3.1. IntroducciónDe acuerdo a los conceptos enunciados, debe resultar claro que el análisis

de un algoritmo precisa de un conteo de los recursos consumidos. En un algo-ritmo sin llamadas recursivas, una vez seleccionados el tamaño del problemay la operación básica, el análisis se realiza utilizando técnicas tradicionalesde conteo (sucesiones, progresiones aritméticas, sumas, etc.) y el concepto deorden de una función.

En el ejemplo siguiente se ilustra el análisis temporal de un algoritmoiterativo de ordenación.

Ejemplo 13 El algoritmo 5, realiza una ordenación ascendente de los va-lores del arreglo A. Estimar su complejidad temporal.

Tamaño del problema: n, la dimensión del arreglo A.Operación básica: Asignaciones.

Análisis 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 CAPÍTULO 3. ANÁLISIS DE ALGORITMOS ITERATIVOS

te,

ft(n) = n

n∑i=2

(i + 1)

= n

n∑i=2

i + (n− 1)

= nn + 1

2− 1 + (n− 1)

ft(n) =n2 + 3n− 4

2, es O(n2).

c) Caso Medio: Para colocar un elementoA[i] en su lugar correcto, nece-sitamos

1

i(2 + 3 + 4 + · · ·+ (i + 1)) =

1

i

i+1∑j=2

j

=1

i

((i + 1)(i + 2)

2− 1

)

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

2i

=i2 + 3i

2i

=i + 3

2asignaciones.

3.1. INTRODUCCIÓN 51

Así, tenemos que

ft(n) =n∑

i=2

i + 3

2

=1

2

∑n(i + 3)

=1

2

[(n(n + 1)

2− 1

)+ 3(n− 1)

]

=1

4[n(n + 1)− 2 + 6(n− 1)]

=1

4(n2 + n− 2 + 6n− 6)

=n2

4+

7n

4− 2 es O(n2).

proc InserciónDirecta(ini, n, A) ≡comienzapara i = ini + 1 a n haz

comienzax ← A[i];j ← i− 1;mientras (j ≥ ini) ∧ (A[j] > x) haz

A[j + 1] ← A[j];j ← j − 1;

zahA[j + 1] ← x;

terminazah

termina.Algoritmo 5: Ordenación por Inserción Directa

52 CAPÍTULO 3. ANÁLISIS DE ALGORITMOS ITERATIVOS

3.2. Análisis por bloquesEn el capítulo anterior se desarrolló un modelo matemático para comparar

y evaluar el costo (en espacio y tiempo) de los algoritmos, que considera elcomportamiento de las funciones complejidad cuando el tamaño del problemaes grande. Esta herramienta proporciona un importante medio para hacerun análisis más dinámico, que se basa principalmente en el conocimientodel orden de los bloques de instrucciones; aquí cabe señalar que un bloquede instrucciones puede ser un algoritmo del cual conocemos su complejidadcomputacional. Para determinar el orden de un bloque, es necesario tener enmente el orden de las estructuras de control más usuales, con este objeto acontinuación se presenta el análisis de las estructuras de control.

3.2.1. SecuenciaSea {I1, I2} una secuencia de instrucciones, con complejidades O(f) y

O(g) respectivamente, entonces el orden de la secuencia es, por el Teorema6, O(max(f, g)). Ver Figura 5.

I1

O(f)

I2

O(g)

?

?

?

Figura 5: Complejidad de la secuenciación

3.2.2. Selección condicionalEn el constructor selección condicional se evalúa la condición C, si es

verdadera, se ejecuta el bloque I1 que tiene complejidad O(f) y si evalúa afalso se ejecuta I2 que es O(g) como se ve en la Figura 6; tomando en cuentaésto, la complejidad de la selección es:

3.2. ANÁLISIS POR BLOQUES 53

i) En el peor caso, esta determinada por el orden de la instrucción queimplica más operaciones, esto esO(max(f, g)).

ii) Para el mejor caso, se considera la instrucción con menor número deoperaciones, de esta manera la complejidad seráO(mın(f, g)).

iii) Se toma en cuenta la probabilidadP de que la condición sea verdaderay entonces la complejidad en el caso promedio es O(Pf)+O((1−P )g).

I1

O(f)I2

O(g)

C

¡¡

¡

@@

@

¡¡

¡

@@

@

?

?

V

?

F

?

Figura 6: Complejidad de la selección condicional

3.2.3. IteraciónSi el bloque de complejidadO(f) se realiza n veces, deducimos que la ite-

ración es O(nf(n)). En muchas ocasiones la complejidad del bloque dependede algún índice. Si la complejidad esO(f(i)) para 1 ≤ i ≤ n la complejidad

de la iteración esn∑

i=1

f(i). Ver �gura 7.

Se hizo ya el análisis de tres algoritmos iterativos, ahora utilizando lastécnicas que hemos descrito analizaremos paso a paso un algoritmo sencilloque requiere el conocimiento de conceptos elementales de algebra lineal.

Ejemplo 14 Sean A y B dos matrices de n×n con entradas reales. Calcularla matriz producto C = AB. El algoritmo que se utilizará, es implicado porla de�nición del producto de matrices, donde la matrizC tiene la forma :

cij =n∑

k=1

aikbkj, i, j ∈ [1, n].

54 CAPÍTULO 3. ANÁLISIS DE ALGORITMOS ITERATIVOS

I1

O(f) C

¡¡

¡

@@

@

¡¡

¡

@@

@¾V

-

?F

Figura 7: Complejidad de la iteración

proc Matriz-Producto(n,A, B) ≡comienzapara 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

zahzah

zahtermina.

Algoritmo 6: Producto de matrices

3.2. ANÁLISIS POR BLOQUES 55

Tamaño del problema: n, la dimensión de las matrices.Operación básica: la multiplicación entre las entradas de las ma-

trices.Caso : El algoritmo hace el mismo número de opera-

ciones en todos los casos.

Análisis TemporalDe manera informal podemos decir que para obtener una entrada decij

se hacen n multiplicaciones, como la matriz C tiene n× n entradas se tieneque:

ft(n) = n(n2) = n3 es O(n3).

Nosotros podemos obtener el resultado anterior, si asignamos un orden(según su comportamiento asintótico) a cada bloque de instrucciones segúnlas 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 ordenO(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 instrucción I2 que se realiza n vecesde ésta forma el orden para I1, y en consecuencia para el Algoritmo 6,es:

O(n× n2) = O(n3).1

Análisis Espacial

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

fe(n) = 1 + 3n2 es O(n2).

1Note que el análisis es identico si hacemos b)n∑

k=1

1 = n, c)n∑

j=1

n = n2 y d)n∑

i=1

n2 = n3.

56 CAPÍTULO 3. ANÁLISIS DE ALGORITMOS ITERATIVOS

A continuación se realiza el análisis de un algoritmo numérico omitiendolos detalles de su funcionamiento para estimar el orden de la función com-plejidad temporal.

Ejemplo 15 Sea A un vector de coe�cientes y sea Pn(z) =n∑

i=0

A[i]zi un po-

linomio de grado n, evaluado para un argumento real z. Encontrar la funcióncomplejidad, temporal y espacial, para el algoritmo que evalúaPn(z).

proc Horner(n, z, A) ≡comienza

polinomio ← 0; I1

para i = 0 a n haz I2

polinomio ← polinomio ∗ z + A[n− i]; I3

zahtermina.

Algoritmo 7: Método de Horner

Tamaño del problema: n, el grado del polinomio.Operación básica: la multiplicación en I3, pues se realiza un nú-

mero de veces del mismo orden al tamaño delproblema (el grado del polinomio).

Caso : El algoritmo hace el mismo número de opera-ciones en todos los casos.

Análisis Temporala) I3 es de orden O(1),

b) I2 contiene a la instrucción de orden O(1), que se ejecuta n veces, deesta 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

Análisis 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. EjerciciosEjercicio 3.1 Escriba un algoritmo que dado un conjunto de números 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 máximo común divisor de dos enteros positivos n y m,denotado por MCD(n,m), es el único entero positivo k tal que

1. k divide a m y n,

2. todos los demás enteros que dividen a m y n son menores que k.

El Algoritmo 8 encuentra el MCD de dos enteros positivos, obtenga lasexpresiones para su complejidad espacial y temporal.

func Máximo-Común-Divisor(m, n) ≡comienza

a ← max(n,m);b ← mın(n, m);r ← 1; r es el residuomientras (r > 0) haz

r ← a mod b;a ← b;b ← r;

zahMáximo-Común-Divisor← a;

termina.Algoritmo 8: Máximo común divisor de dos enteros

58 CAPÍTULO 3. ANÁLISIS DE ALGORITMOS ITERATIVOS

Ejercicio 3.3 Diseñe un algoritmo iterativo para los algoritmos de ordena-ción Quicksort y Mergesort. Encuentre la complejidad temporal y espacialpara cada uno de ellos.

Ejercicio 3.4 El mínimo común múltiplo (MCM) de dos enteros positivosmy n, es el entero más pequeño que es un múltiplo de ambos números. Diseñeun algoritmo iterativo para encontrar elMCM de dos enteros. Determine elorden de su complejidad temporal.

Capítulo 4

Análisis de Algoritmos Recursivos

4.1. IntroducciónLa recursividad es un fenómeno que se presenta en muchos problemas de

forma natural, delegando la solución de un problema en la solución de otromás pequeño. Los siguientes son dos ejemplos clásicos:

�El costo de mover n piezas de equipo pesado depende del costopor el movimiento de n− 1 piezas más un costo adicional por elcosto de mover la enésima pieza�

�El tiempo requerido por cierto algoritmo para ordenarn elemen-tos depende del tiempo que a éste le toma ordenarn− 1 elemen-tos, más el tiempo adicional requerido para colocar al enésimoelemento en su lugar correcto�

Como se observa existen situaciones en las cuales las cantidades que que-remos estudiar pueden ser modeladas matemáticamente por funciones de�-nidas en forma recursiva. Una ecuación que expresa una función de este tiporecibe el nombre de ecuación recurrente, si además están dados uno o másvalores de n especí�cos, lo que se tiene es un sistema recurrente.

Los algoritmos, al igual que las funciones, también pueden ser de�nidosrecursivamente, de hecho tienen mucho en común pues ambos aceptan unconjunto de entradas, generan salidas correspondientes a las entradas y tie-nen una regla o conjunto de reglas para obtener las salidas a partir de lasentradas. Así que muchos conceptos que se aplican a funciones se aplicarán,frecuentemente, también a los algoritmos.

59

60 CAPÍTULO 4. ANÁLISIS DE ALGORITMOS RECURSIVOS

Cuando se quiere calcular la demanda de recursos de un algoritmo de�nidorecursivamente, la función complejidad que resulta no está de�nida sólo entérminos del tamaño del problema y algunas constantes, sino en términos dela función complejidad misma. Además no es una sola ecuación, dado queexisten otras (al menos una) que determinan la cantidad de recursos paralos casos base de los algoritmos recursivos. Dada esta situación, para poderobtener el comportamiento del algoritmo, es necesario resolver el sistemarecurrente obtenido. En esta sección se muestra el principio de análisis delos algoritmos recursivos y la obtención de las funciones complejidad a partirde la solución de los sistemas recurrentes mediante la técnica expansión derecurrencias.

4.2. Sistemas recurrentesConsideremos el Algoritmo recursivo 9 que calcula el factorial de un nú-

mero entero n,

func Factorial(n) ≡comienzasi (n = 0) entonces

Factorial← 1;otro

Factorial← n× Factorial(n− 1);is

termina.Algoritmo 9: Factorial de un número

Para encontrar la complejidad temporal debemos elegir una operación talque el orden del número de veces que se realiza sea igual al orden del totalde operaciones que hace el algoritmo, puesto que la función es recursiva, laparte más costosa es la recursión y tenemos que elegir una operación quese efectúe en todas las llamadas que hace el algoritmo o en un número deellas que sea del mismo orden que el orden del número total de llamadas.De las operaciones que realiza el algoritmo podemos contar multiplicaciones,veamos que dicha operación cumple con las condiciones estipuladas.

El algoritmo para resolver un problema de tamañon, hace una multipli-cación y resuelve un problema de tamaño n − 1 hace una multiplicación y

4.2. SISTEMAS RECURRENTES 61

resuelve un problema de tamañon− 2 . . . y resuelve un problema de tamaño1 hace una multiplicación y resuelve un problema de tamaño 0, para el queya no ejecuta dicha operación.

Puesto que la función tiene 2 partes, el caso base y la parte recursiva, lafunción complejidad se puede expresar como un sistema de 2 ecuaciones:

f(0) = 0, para el caso basef(n) = f(n− 1) + 1, para el caso general

Nuestras ecuaciones forman lo que se conoce como unsistema recurrente.En un sistema de esta naturaleza se distinguen 2 partes:

i) La ecuación recurrente, que da el valor de una función en un puntonen términos de su valor en otros puntosm con n > m. En nuestro caso,la ecuación

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

da el valor de f(n) en términos del valor de f(n− 1).

ii) Un conjunto de valores de frontera o condiciones iniciales (los valoresde una función en puntos especí�cos) que determinan, junto con laecuación recurrente, completamente a una función. En nuestro ejemplo

f(0) = 0.

Si se tiene una condición inicial, tal como f(0) = 0, entonces podemoscalcular f(n), usando la ecuación recurrente, para otros valores den. 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 solución a un sistema recurrente es una función que satisface la ecua-ción recurrente y las condiciones iniciales.

La solución a nuestro sistema es f(n) = n.Comprobémoslo:

62 CAPÍTULO 4. ANÁLISIS DE ALGORITMOS RECURSIVOS

Si n = 0 entonces f(0) = 0 satisface la condición ini-cial, y

Si n > 0 entonces f(n) = f(n− 1) + 1= (n− 1) + 1= n satisface la ecuación recu-

rrente, por lo tanto es unasolución al sistema.

Para encontrar la solución a un sistema recurrente existe toda una teoríaque expone diversos métodos. En el análisis de algortimos recursivos, lossistemas recurrentes que resultan son de baja complejidad y en la mayoríade los casos basta la aplicación de una técnica muy simple para resolverlos.En esta sección se expondrá el método de expansión de recurrencias que seráutilizado siempre que sea necesario resolver un sistema de éste tipo.

4.2.1. Expansión de recurrencias

Este método de solución, consiste en utilizar la recurrencia misma parasubstituir f(n) por su valor en términos de f(m), donde m < n, iterativa-mente hasta encontrar una condición de frontera f(r) que tendrá un valorconstante. En la ecuación recurrente se ponen todos los terminos conf en ellado izquierdo y se realiza la expansión. Al sumar todas las ecuaciones ob-tendremos una expresión para f(n) en términos de n y algunas constantes.A ésta expresión �nal se le denomina forma cerrada para f(n).

Ejemplo 16 Utilicemos el sistema obtenido para la función 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 + · · ·+ 1︸ ︷︷ ︸n veces

∴ f(n) = n

Ejemplo 17 El número de permutaciones de n objetos se puede expresarusando el siguiente sistema recurrente:

P (0) = 1, pues sólo hay una permutación de 0 elemen-tos, y

P (n) = nP (n− 1), porque podemos elegir un elemento de los nposibles y después cualquier secuencia que seauna permutación de los n − 1 elementos res-tantes.

Solución:

P (n)− nP (n− 1) = 0

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

...n(n− 1)(n− 2) . . . 2× P (1)− n(n− 1)(n− 2) · · · × 1× P (0) = 0

P (0) = 1

64 CAPÍTULO 4. ANÁLISIS 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 formaestándar y si conocemos la solución genérica para ésa forma, nos ahorraremosel tener que hallar la solución cada vez que se presente un caso así. El sistemade 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 solución genérica aplicando el método expuesto.

f(n)− cf(n− 1) = b

cf(n− 1)− c2f(n− 2) = cb

c2f(n− 2)− c3f(n− 3) = c2b

...cn−2f(2)− cn−1f(1) = cn−2b

cn−1f(1) = cn−1a

sumando todas las ecuaciones tenemos

f(n) = cn−1a + b + cb + c2b + · · ·+ cn−2b

= cn−1a + b

n−2∑i=0

ci

4.2. SISTEMAS RECURRENTES 65

sabemos quen∑

i=0

ci = n + 1, si c = 1

n∑i=0

ci =cn+1 − 1

c− 1, si c 6= 1

entonces si c = 1

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

y si c 6= 1

f(n) = cn−1 +b(cn−1 − 1)

c− 1

A continuación 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

entoncesi) Si c = 1 entonces f(n) = a + b(n− 1)

ii) Si c > 1 entonces f(n) = cn−1a +b(cn−1 − 1)

c− 1.

A continuación ilustramos el uso del teorema anterior para resolver proble-mas donde el sistema recurrente resultante se ajusta a la forma especi�cadapor el teorema.

Ejemplo 18 Encontrar el mayor número de hojas que puede tener un árbolde altura h, donde cada nodo tiene grado k ≥ 2.

f(1) = k

f(h) = kf(h− 1)

66 CAPÍTULO 4. ANÁLISIS DE ALGORITMOS RECURSIVOS

del teorema anterior, a = k, b = 0 y c = k por lo tantof(h) = kkh−1 = kh.

Ejemplo 19 Encontrar la función complejidad temporal para el algoritmoque 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 tienenque mover a la torre destino utilizando una torre auxiliar; los discos se tienenque mover uno a uno y apilarlos de tal forma que nunca quede un disco bajootro mayor que él. La solución recursiva al problema se ilustra en el Algoritmo10.

proc Hanoi(n, ini, med, fin) ≡comienzasi (n = 1) entonces escribe(ini,→, f in);

otrocomienzaHanoi(n− 1, ini, fin, med);escribe(ini,→, f in);Hanoi(n− 1,med, ini, fin);

terminais

termina.Algoritmo 10: Torres de Hanoi

Encontraremos ahora la función complejidad temporal del Algoritmo 10.Tamaño del problema: n, número de discos a mover.Operación básica: 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 número de opera-ciones en todos los casos.

Análisis TemporalLa relación de recurrencia esta dada por

ft(1) = 1

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

4.2. SISTEMAS RECURRENTES 67

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

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

1= 2n−1 + (2n−1 − 1) = 2n − 1 es O(2n).

Hasta ahora sólo hemos analizado algoritmos que utilizaban memoria es-tática, los Algoritmos 10 y 11, por ser recursivos, requieren espacio para al-macenar los registros de activación de las diferentes llamadas, de tal maneraque mientras más anidación de ambientes exista, mayor cantidad de memo-ria consumirán. Los siguientes ejemplos ilustran el cálculo de la complejidadespacial dinámica para algoritmos recursivos.

Ejemplo 20 Encontrar la complejidad espacial dinámica para el algoritmoque resuelve el problema de las torres de Hanoi.

Análisis Espacial

El algoritmo recibe 4 parámetros y necesita una localidad de memoriaadicional para almacenar la dirección de retorno. Para resolver un problemade tamaño n > 1, el algoritmo debe almacenar los valores de las variables y sudirección de retorno, por lo tanto necesitará 5 celdas de memoria dinámica,más las que consuma para resolver un problema de tamañon−1. Observamosque hace 2 llamadas recursivas con argumenton−1, pero cuando el primero deellos termina, la memoria consumida se libera y es reutilizada por la segundallamada, entonces podemos expresar la función complejidad espacial por elsiguiente sistema:

fe(1) = 5, pues para n = 1 no se hacen llamadas recursivasfe(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 evalúa la potencia de un número baseexp (Algoritmo 11).

Tamaño del problema: n, el exponente.

68 CAPÍTULO 4. ANÁLISIS DE ALGORITMOS RECURSIVOS

func Potencia(base, exp) ≡comienzasi (exp = 1) entonces

Potencia ← baseotro

Potencia ← base× Potencia(base, exp− 1);is

termina.Algoritmo 11: Potencia de un número

Análisis Espacial

fe(1) = espacio(exp) + espacio(base) + espacio(dirección 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 muchafrecuencia en algoritmos que dividen el problema inicial ena problemas detamaño n

befectuando a lo más c operaciones básicas en cada llamada al

algoritmo. El siguiente teorema describe la forma cerrada del sistema paralos 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 unafunción arbitraria de N a R cuyos valores siguen el sistema:

f(1) = c

f(n) = af(n

b) + c

para argumentos de la forma n = bk, donde k ∈ N y k > 0, se tienen lassiguientes soluciones al sistema

i) Si a = 1 entonces f(n) = c(logb n + 1)

4.2. SISTEMAS RECURRENTES 69

ii) Si a 6= 1 entonces f(n) =c(anlogb a − 1)

a− 1

Demostración 6 Sea el sistema

f(1) = c

f(n) = af(n

b) + c

con n = bk y k ≥ 1 se tiene

f(bk)− af(bk−1) = c

af(bk−1)− a2f(bk−2) = ac

...ak−1f(b1)− akf(b0) = ak−1c

sumando las ecuaciones

f(bk) = c + ac + · · ·+ ak−1c + akc

= c

k∑i=0

ai

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

f(bk) =c(ak+1 − 1)

a− 1

=c

a− 1(aak − 1)

70 CAPÍTULO 4. ANÁLISIS DE ALGORITMOS RECURSIVOS

pero

alogb n = blogb alogb n

= blogb n logb a

= blogb a logb n

= blogb nlogb a

= nlogb a

entonces

f(n) =c

a− 1(aalogb n − 1)

f(n) =c

a− 1(anlogb a − 1)

La forma cerrada para el sistema recurrente que enuncia el teorema sóloes válida para argumentos de la forma bk, con b > 1 y k > 0. ¾Qué ordenpodemos asociarle a la función en su forma cerrada?, dado que una función esde orden g si g la domina asintóticamente y la de�nición de d.a. implica queel dominio se dé en todos los naturales a partir de algún valork especí�co, yel teorema no asegura el dominio en un rango continuo de los naturales, noes posible asociarle un orden a la función. Sin embargo, podemos enunciarla siguiente de�nición que nos caracteriza el comportamiento de una funciónen un subconjunto de los naturales.De�nición 4 Sean f y g funciones de N a R y S un subconjunto in�nito deN. 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 de�nición anterior diremos que si f cumple con lasrestricciones 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 formacambiando la igualdad por una desigualdad, se puede asegurar un ordenpara la función, pero no una expresión exacta para el sistema recurrente,esta aseveración 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 función deN a R tal que

f(1) ≤ c

f(n) ≤ af(n

b) + c, para n = bk donde k > 0,

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

Demostración 7 Sea g una solución al sistema recurrente que plantea elteorema (cuando se tiene la igualdad en las dos condiciones), asíg tiene laforma

g(1) = c

g(n) = ag(n

b) + c, para n = bk y k > 0

Por el Teorema 10 es fácil ver que la función g es O(log n) en S si a = 1, yO(nlogb a) en S si a 6= 1.

Así tenemos que la función g es una cota para la función f en S, es decir

f(n) ≤ g(n), si n ∈ S.

Por la De�nición 4 la función f es O(log n) en S cuando a = 1 y f esO(nlogb a) en S si a 6= 1.

El siguiente ejemplo ilustra la aplicación del teorema anterior.

Ejemplo 22 El Algoritmo 12 cuenta el número de nodos en un árbol binariocon todos los niveles llenos. Realice su análisis temporal.

Tamaño del problema: n, el número de nodos en el árbol.Operación básica: las asignaciones.Casos: el algoritmo no tiene casos.

72 CAPÍTULO 4. ANÁLISIS DE ALGORITMOS RECURSIVOS

func Cuenta(raiz) ≡comienzasi (tipo(raiz) = hoja)) entonces

Cuenta← 1otro

Cuenta← 1 + Cuenta(hijoizq(raiz))+Cuenta(hijoder(raiz));

istermina.

Algoritmo 12: Cuenta el número de nodos en un árbol binario

Análisis Temporal

ft(1) = 1, caso base

ft(n) = 2f(n− 1

2) + 1, caso general

Como ft(n) es monótona creciente y n2

> n−12

entonces ft(n2) > ft(

n−12

),de esta forma se tiene el sistema

ft(1) ≤ 1

ft(n) ≤ 2f(n

2) + 1

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

máximo en un arreglo utilizando recursividad; en él se aplica también elresultado del Teorema 11.

Ejemplo 23 Encontrar la complejidad del Algoritmo 13, el cual encuentrael elemento máximo en un arreglo A con n elementos.

4.2. SISTEMAS RECURRENTES 73

proc Máximo(ini, fin,max) ≡comienzasi (ini = fin) entonces

max ← A[ini]otro

comienzamitad ← bini+finc

2;

Máximo(ini,mitad, max);Máximo(mitad + 1, f in,max_aux);si (max_aux > max)entonces max ← max_aux;

istermina

istermina.Algoritmo 13: Búsqueda del máximo en un arreglo de elementos

Tamaño del problema: n, el número de elementos en el arreglo.Operación básica: las comparaciones entre elementos, pues el nú-

mero total de ellas y el número total de opera-ciones son del mismo orden (véase el Ejemplo4.11).

Casos: el algoritmo no tiene casos.

Análisis Temporal

ft(1) = 0

ft(n) = 2ft(n

2) + 1

Este sistema recurrente cumple con las desigualdades,

ft(1) ≤ 1

ft(n) ≤ 2ft(n

2) + 1

74 CAPÍTULO 4. ANÁLISIS 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}

Análisis EspacialComo es claro la complejidad espacial es de dos tipos:1. Estática

fee(n) = espacio(A)

entonces:

fee(n) = n

2. DinámicaSe tiene el sistema recurrente:

fed(1) = espacio(ini) + espacio(fin) + espacio(mitad) + espacio(max)

+ espacio(max_aux) + espacio(dirección de retorno)fed(1) = 6

fed(n) = fed(n

2) + 6

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, sólo podemos garantizarla convergencia para el subconjunto S, en el siguiente teorema se estableceque, si la función cumple con ciertas restricciones, el comportamiento delalgoritmo es el mismo en todos los naturales.

4.2. SISTEMAS RECURRENTES 75

Teorema 12 Sea f : N→ R+ una función monótona creciente tal que f esO(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

Demostración 8 Para el primer inciso tenemos1. Hipótesis: f es O(g) en S, f : N → R+, f monótona 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 algún m ≥ 0 y k ≥ 0 especí�cos, esto implicaría que fes O(log n) para toda n.

Sea j tal que: bi < j < bi+1, como f es monótona 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 función logaritmo es creciente

f(bi+1) ≤ m1 log bi+1

f(bi+1) ≤ m1 log bbi

f(bi+1) ≤ m1(log b + log bi)

f(bi+1) ≤ m1 log bi(1 +log b

log bi)

como log blog 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 CAPÍTULO 4. ANÁLISIS DE ALGORITMOS RECURSIVOS

como j es cualquier número 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 metodología y sedejan como ejercicios al lector.

Para resolver un sistema recurrente, a menudo es necesario calcular laecuación a la que converge alguna sucesión. Cuando surgen sumatorias paralas que no se conoce la solución exacta, se suele acotar por arriba mediante eluso del cálculo integral, el apartado siguiente describe e ilustra brevementeesta técnica.

4.3. Aproximando por integralesRecordemos que nuestro objetivo es conocer la cantidad de recursos que

un algoritmo consume para determinar, entre otras cosas, si es convenientecodi�carlo.

Cuando al expandir una recurrencia nos resulte en una sumatoria que nosepamos a que converge, el cálculo 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 lasumatoria

n∑i=1

1

i

para la que no se conoce una fórmula cerrada, la escribimos como

n∑i=1

=1

i≤ 1 +

∫ n

2

1

xdx = 1 + (ln x|x=n − ln x|x=2)

≤ 1 + ln n− ln 2

por lo que podemos utilizar este valor para acotar la sumatoria sin perder devista que la igualdad es ahora una desigualdad.

4.4. ELECCIÓN DE LA OPERACIÓN BÁSICA 77

4.4. Elección de la operación básicaLa elección de la operación básica para un algoritmo recursivo se debe

justi�car dando una demostración constructiva de que la cantidad de vecesque se ejecuta esta operación observa un modelo de crecimiento similar aldel total de operaciones conforme el tamaño del problema crece; es decir sedebe demostrar que el orden del total de operaciones que hace el algoritmoes igual al orden del total de operaciones básicas.

Podemos sintetizar el procedimiento en los siguientes pasos:

1. Se visualiza el árbol de llamadas recursivas del algoritmo, que obvia-mente estará en función del tamaño del problema, por lo tanto, pode-mos decir que hay un número de nodos g(n).

2. Se obtiene una cota máxima para la cantidad de operaciones que elalgoritmo hace en cada llamada recursiva.

3. Con la funcion g(n) y la cota obtenida en el paso anterior podemosobtener el orden del total de operaciones en términos de esos 2 datos.

4. Visualizar la cantidad de llamadas en las que se hacen operacionesbásicas y encontrar una cota para la cantidad de operaciones básicasque se efectúa en cada nodo. Expresarlo en términos de lag(n) obtenidaen el paso 1, y establecer el orden del total de operaciones básicas.

5. Si el orden del total de operaciones es igual al orden de operacionesbásicas, entonces la operación elegida es válida, en caso contrario, sedebe intentar con otra.

El siguiente par de ejemplos ilustran la elección de la operación básicajusti�cada mediante el proceso anterior.

Ejemplo 24 El Algoritmo 14 encuentra el elemento máximo y el mínimo deun 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 CAPÍTULO 4. ANÁLISIS DE ALGORITMOS RECURSIVOS

proc Maxmin(ini, fin,max, min) ≡comienzasi (ini = fin) entonces

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

otrocomienza

mitad ← [(ini + fin)/2];Maxmin(ini,mitad, max, min);Maxmin(mitad + 1, f in,max1, min1);si max1 > max entonces max ← max1; issi min1 < min entonces min ← min1; is

terminatermina.

Algoritmo 14: Búsqueda del máximo y el mínimo

c) comparaciones entre los máximos y los mínimos

d) operaciones involucradas en la obtención 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 análisis. Conside-raremos la operación c.

Demostramos queO(número de comparaciones) = O(total de operaciones).Dado que el arreglo es siempre de la forma2k, el árbol de llamadas recur-

sivas se puede representar por el árbol de la Figura 8, en donde cada nodoestá etiquetado con el tamaño de problema que recibe.

En el árbol hayg(n) nodos internos, y+

g(n) + 1 nodos externos por lo que hay2g(n) + 1 nodos en total

en cada llamada recursiva se hacen a lo más

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. ELECCIÓN DE LA OPERACIÓN BÁSICA 79

n

n2

n4

. .

n4

. .

n2

n4

. .

n4

. .

Figura 8: Árbol de llamadas recursivas para un problema de tamañon

La operación básica (o.b. en lo subsecuente) se efectúa sólo en los nodoscon tamaño 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 sehacen 2 o.b., entonces

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

dado que O(número de o.b.) = O(número total de operaciónes), las compa-raciones pueden ser elegidas como o.b.

Ejemplo 25 La elección de la operación básica para el algoritmo del factorialse justi�ca mediante el siguiente razonamiento.

Si llamamos �g(n)� al número de llamadas recursivas que hace el algo-ritmo para un problema de tamaño n tenemos que hacer en total c × g(n)operaciones, donde la constante c representa las operaciones hechas en cadallamada, por lo tanto el número total de llamadas recursivas y el número totalde operaciones son O(g(n)). En g(n)−1 llamadas se hacen multiplicaciones,por lo tanto el número de multiplicaciones esO(g(n)), y se puede considerarla operación para el análisis dado que:O(total de operaciones) = O(total demultiplicaciones).

Ejemplo 26 Muestre que la elección de la operación básica para el Algoritmo13 es correcta.

80 CAPÍTULO 4. ANÁLISIS DE ALGORITMOS RECURSIVOS

Para ver que esto es cierto, considérese el árbol de llamadas recursivasde la Figura 8, donde g(n) representa el total de nodos, lo que se obtienesumando los nodos internos h(n) más el total de nodos externos h(n) + 1. Sillamamos g(n) al número de llamadas recursivas, que dependen del tamañodel problema n, entonces se tiene

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

luego entonces se hacen c× g(n) operaciones, c es el número de operacioneshechas en cada llamada; hasta aquí podemos a�rmar que el número total deoperaciones es O(g(n)).

Observe que en cada nodo interno del árbol se hace una comparación, así

total de operaciones básicas= 1× h(n)

=g(n)− 1

2es O(g(n))

de lo anterior con�rmamos que la operación se puede usar para el análisis,pues

O(total de operaciones) = O(total de operaciones básicas)

4.5. EjerciciosEjercicio 4.1 Resuelva los siguientes sistemas recurrentes donde f(1) = 1y para n ≥ 2

f(n) = 8f(n

2) + n2 (4.1)

f(n) = 2f(n

2) + log n (4.2)

Ejercicio 4.2 Muestre que el número de funciones booleanas den variablesestá dado por la recurrencia:

f(1) = 4

f(n) = (f(n− 1))2

4.5. EJERCICIOS 81

Ejercicio 4.3 Resuélvanse las siguientes recurrencias. De una solución exac-ta.

f(1) = 2 (4.3)f(n) = 2f(n− 1) + 1

f(1) = 1 (4.4)f(n) = f(n− 1) +

n

2

Ejercicio 4.4 Muestre que la solución al sistema recurrente

f(1) = c

f(n) = af(n

b) + cn, para n = bk ∧ k > 0,

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 funciónde 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 quelas otras).

2. Evaluar una expresión aritmética en notación in�ja que se encuentraen un arreglo que contiene prioridades de aplicación para los elementosde la expresión (la prioridad de un operando es in�nita).

Ejercicio 4.6 Sea n una potencia de 2, y sean A y B dos matrices n ×n. El método de Strassen para obtener el producto C = AB, consiste enparticionar A y B en matrices componentes de n

2× n

2y multiplicarlas usando

las fórmulas mencionadas en el Ejercicio 1.1. Esto es, las fórmulas son usa-das recursivamente para multiplicar las matrices componentes reduciendo elproblema a multiplicar matrices de dimensión 2X2.

82 CAPÍTULO 4. ANÁLISIS DE ALGORITMOS RECURSIVOS

1. Implemente un algoritmo basado en este método y muestre que el nú-mero de operaciones básicas 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, soluciónde sistemas de ecuaciones lineales simultáneas, etc.)

Ejercicio 4.7 La altura de un árbol es el nivel máximo del árbol (o la distan-cia máxima entre la raíz y un nodo externo). Diseñe un algoritmo recursivopara calcular la altura de un árbol binario. ¾Cuál es la complejidad temporalde 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 únicamentelos 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 árbolbinario. Determine el orden del número de operaciones básicas que realiza sualgoritmo.

Ejercicio 4.9 Escriba una versión recursiva del Algoritmo 8 (vease el ejer-cicio 3.2).

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

Parte II

Técnicas de Diseño de Algoritmos

83

85

En este parte se estudiaran diversas técnicas de diseño de algoritmos.En cada capítulo se estudiará una técnica distinta empezando por ver quetipo de problemas se pueden atacar utilizando la técnica. Se estudia, además,el como hacer el análisis de algoritmos que utilicen dicha técnica así comoejemplos concretos donde podemos utilizar la técnica para su solución.

No se pretende realizar un estudio exhaustivo sino presentar las técnicasmas comunes. Dichas técnicas son:

Dividir para vencer.

Método Avido.

Búsqueda con retroceso.

Árboles de juego.

A continuación se presentan cada una de ellas con una breve introducciónDividir para vencerMétodo Avido.Búsqueda con retroceso.Árboles de jurgo.

86

Capítulo 5

Dividir para vencer

Esta técnica es muy utilizada en la solución de problemas. Esto se debe aque la idea básica de esta técnica es simple. Tenemos un problema complejoal cual dividimos en subproblemas mas pequeños a resolver. Para resolvercada subproblema seguimos el mismo procedimiento hasta que llegamos a unproblema que es trivial. Una vez resueltos los subproblemas los combinamospara dar solución al problema original.

5.1. Forma genérica

El Algoritmo 15 presenta la forma genérica de un algoritmo diseñadoutilizando la técnica de dividir para vencer.

El algoritmo recibe un problema p, el tamaño de este problema n asícomo una variable donde se guarda la solución s. El problema p es divididoen varios subproblemas que se guardan en el vector sp. Para resolver cadasubproblema el algoritmos se llama recursivamente donde el subproblemaserá a su vez dividido hasta que eventualmente lleguemos al caso donde lasolución es trivial. Una vez resueltos todos los subproblemas se combinantodas las soluciones encontradas (que se han guardado en el vectorssp) enla solución s.

Cuando el tamaño del problema es lo su�cientemente pequeño se calculade manera inmediata la solución.

87

88 CAPÍTULO 5. DIVIDIR PARA VENCER

proc DividirParaVencer (p,n,s) ≡comienzasi pequeño(p, n) entonces

CalculaSoluciónInmediata(p, n, s)otro

sp = Divide(p, n, s, t)sp es un arreglo de subproblemas

para i = 1 a número de subproblemas hazDividirParavencer(sp[i], t[i], ssp[i])t es un arreglo de tamaños de los subproblemasssp es un arreglo de soluciones del problema

zahCombina(ssp, s)

istermina.

Algoritmo 15: Dividir para Vencer

5.2. Forma de la Función Complejidad

La función complejidad para un problema de tamañon es un sistema deecuaciones recurrentes de la forma

f(m) = fCalculaSoluciónInmediata(m)

f(n) = fDivide(n) + fCombina(n) +k∑

i=1

f(t[i])

donde m es el valor para el cual la función problema pequeño es verdadero yk el número de subproblemas, es decir, el número de elementos desp.

Esta técnica es muy utilizada para resolver el problema de ordenar unarreglo de valores así como de búsqueda. A continuación veremos dos ejem-plos de como utilizar dividir para vencer para ordenar un arreglo. Es impor-tante destacar que pese a que la técnica utilizada es la misma en ambos casoslos algoritmos resultantes son diferentes.

5.3. MERGESORT ORDENAMIENTO POR INTERCALACIÓN 89

5.3. MergesortOrdenamiento por intercalación

Ejemplo 27 El ordenamiento por intercalamiento (mergesort), como se mues-tra en el algoritmo 16, utiliza la técnica de dividir para vencer de la siguientemanera. Para ordenar un arreglo este se divide en dos mitades, cada mitades ordenada y ambas mitades ya ordenadas se intercalan para dar la solución.

proc Mergesort(ini, fin) ≡comienzasi ini < fin entonces

mitad ← (ini+fin)2

Mergesort(ini,mitad)Mergesort(mitad + 1, f in)Intercala(ini,mitad, fin)

istermina.

Algoritmo 16:Mergesort

El algoritmo utiliza el hecho de que un arreglo de tamaño 1 ya esta orde-nado, en el caso base no se realiza ninguna operación. En el caso recursivoel algoritmo 17 es utilizado para combinar las dos mitades ordenadas en unarreglo ya ordenado.

Análisis TemporalTamaño del problema: n, el tamaño del arreglo.Operación básica: asignaciones entre elementos del arreglo.

Primero es necesario hacer el análisis del algoritmo que intercala, algo-ritmo 17. El algoritmo hace 2n operaciones. Esto lo podemos ver de manerainformal de la siguiente manera. Primero, el algoritmo copia todos los ele-mentos de el arreglo A al arreglo B intercalándolos en orden. Después, copialos elementos del arreglo B al A ya en orden. Debido a que el algoritmo deordenamiento no realiza comparaciones se tiene un solo caso.

Caso único:

90 CAPÍTULO 5. DIVIDIR PARA VENCER

proc Intercala(ini,mitad, fin) ≡comienza

ini1 ← iniini2 ← mitad + fink ← 1mientras (ini1 ≤ mitad) ∧ (ini2 ≤ fin) hazsi A[ini1] < A[ini2] entonces

B[k] ← A[ini1]ini1 ← ini1 + 1

otroB[k] ← A[ini]ini ← ini2 + 1

isk ← k + 1

zahsi ini > mitad entonces se acabo arreglo izquierdo

para j = ini2 a fin hazB[k] ← A[j]k ← k + 1

zahispara j ← ini a fin haz

A[j] ← B[j]termina.

Algoritmo 17: Intercala

5.3. MERGESORT ORDENAMIENTO POR INTERCALACIÓN 91

f(1) = 0

f(n) =

intercala︷︸︸︷2n +2f(

n

2)

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

f(n)− 2f(n

2) = 2n

de la siguiente forma

f(2k)− 2f(2k−1) = 2× 2k

2f(2k−1)− 22f(2k−2) = 22 × 2k−1

22f(2k−2)− 23f(2k−3) = 23 × 2k−2

...2k−2f(22)− 2k−1f(21) = 2k−1 × 22

2k−1f(21)− 21f(20) = 2k × 21

Sumando todas las ecuaciones tendremos que

f(2k) =k∑

i=1

2k+1 = k × 2k+1

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

f(n) = log(n)× n

es decirf(n) es O(n log n)

Análisis EspacialMemoria estática.

92 CAPÍTULO 5. DIVIDIR PARA VENCER

Observamos que en el algoritmo de intercala se necesitan den celdas paralos arreglos A y B. Dado que estas son variables globales es la única memoriaestática se necesita. Por lo tanto

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

Memoria dinámica.En el caso de la memoria dinámica debemos saber el número de llamadas

recursivas realizadas. En este caso la relación de recurrencia es

Fmd(1) = c

Fmd(n) = c + Fmd(n

2)

ya que después de cada llamada recursiva esta libera los recursos que hayautilizado. Por lo tanto de memoria dinámica la función 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.Solución propuesta:Cortar la recursividad en n = 16; utilizar insercióndirecta. El algoritmo 18 es el algoritmo de inserción directa el cual sepuede utilizar para aquellos casos donden ≤ 16.

El análisis para el algoritmo cambia ya que en el caso base se hacela inserción directa. Este algoritmo si varía de acuerdo a como se en-cuentren los datos en el arreglo. El análisis del algoritmo de insercióndirecta sería 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 INTERCALACIÓN 93

proc InserciónDirecta(ini, fin) ≡comienzapara j ← ini + 1 a fin haz

x ← A[j]i ← j − 1mientras x < A[i] ∧ i ≥ ini haz

A[i + 1] ← A[i]i ← i− 1

zahA[i + 1] ← x

zahtermina.

Algoritmo 18: Inserción 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

Ft(n) =n∑

j=2

(3 +

j∑i=0

2) =n∑

j=2

3 + 2(j − 1)

que es O(n2).

Para el algoritmo de mergesort lo que cambiaría sería el caso base:si (ini− fin + 1 < 16) entonces

InserciónDirecta(ini, fin)otro

. . .

Y por lo tanto

número de llamadas recursivas≈ Aprox. total de llamadas25

.

2. Utilización de un arreglo auxiliar (i.e copiado sistemático)solución propuesta: Usar ligas como sucede en el algoritmo 19.

94 CAPÍTULO 5. DIVIDIR PARA VENCER

proc Intercala2(l1, l2, lr) ≡comienza

k ← 0mientras l1 6= 0 ∧ l2 6= 0 hazsi A[l1] < A[l2] entonces

k ← l1;ligas[k] ← l1;l1 ← ligas[k];ligas[k] ← l2;k ← l2;l2 ← ligas[l2];

iszahsi l1 6= 0 entonces

ligas[k] ← l2;otro

ligas[k] ← l1;lr ← ligas[0];

istermina.

Algoritmo 19: Intercala con ligas

5.4. QUICKSORT 95

5.4. QuicksortEjemplo 28 Quicksort El algoritmo de ordenamiento rápido (quicksort),como se muestra en el algoritmo 20, utiliza también la técnica de dividir paravencer. En este caso la estrategia es tomar un elemento como pivote y poneren una parte a los elementos menores al pivote y en la otra a aquellos mayoresal pivote. Después se hacen llamadas recursivas para ordenar ambas partes.En este caso también se aprovecha el hecho de que un arreglo de tamaño 1esta ya ordenado.

proc Quicksort(ini, fin) ≡comienzasi ini < fin entonces

pivote ← Partición(ini, fin)Quicksort(ini, pivote− 1)Quicksort(pivote + 1, fin)

istermina.

Algoritmo 20: Quicksort

El algoritmo que parte el arreglo en dos partes (no iguales) esta de�nidoen el algoritmo 21. Este algoritmo parte el arreglo en dos partes utilizandoal primer elemento del arreglo como pivote.

Análisis Temporal

Tamaño del problema: Tamaño del arregloOperación básica: ComparacionesPara hacer el análisis temporal notamos que el algoritmo partición realiza

n comparaciones. De manera informal esto sucede por que el pivote se com-para contra todos los elementos del arreglo. Hacemos el análisis de quicksortcaso por caso.

Peor Caso: Ocurre cuando el pivote es el primer elementoEn este caso el arreglo se divide en dos partes, una de tamañon − 1 y

otra de tamaño 1. Como ya dijimos el arreglo de tamaño 1 ya esta ordenadoy supongamos que no necesitamos realizar ninguna operación. Por lo tanto

96 CAPÍTULO 5. DIVIDIR PARA VENCER

func Partición(ini, fin) ≡comienza

x ← A[ini];men ← ini− 1;may ← fin + 1;repiterepite 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;Partición← may;

termina.Algoritmo 21: Partición

tendremos

f(1) = 0

f(n) = f(1) + f(n− 1) + n︸︷︷︸partición

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

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

f(n) =n∑2

(i + 1) =n(n + 1)

2+ (n− 2)

que es O(n2).

Mejor caso:El pivote esta exactamente a la mitadEn este caso el arreglo se divide en dos partes del mismo tamaño. Si

suponemos que n = 2k cada parte tendrá un tamaño 2k − 1 (por que elpivote ya esta en orden). La �gura 9 muestra el árbol de llamadas recursivasque se realizan.

f(2k)

f(2k−1 − 1)

f(2k−2 − 1) f(2k−2 − 1)

f(2k−1 − 1)

f(2k−2) f(2k−2)

Figura 9: Árbol de Llamadas

En este caso expresamos la relación de recurrencias como una desigualdadde tal manera que

f(1) ≤ 0

f(n) ≤ 2f(n

2) + n + 1

es decir

f(n)− 2f(n

2) ≤ n + 1,

98 CAPÍTULO 5. DIVIDIR PARA VENCER

como asumimos n = 2k tendremos

f(2k)− 2f(2k−1) ≤ 2k + 1

2f(2k−1)− 22f(2k−2) ≤ 2k + 2

22f(2k−2)− 23f(2k−3) ≤ 2k + 22

...2k−2f(22)− 2k−2f(2) ≤ 2k + 2k−2

2k−1f(2)− 2kf(1) ≤ 2k + 2k−1

por lo tanto

f(2k) ≤ k2k +k−1∑i=0

2i ≤ k2k +2k−1

2− 1 ≤ n log n + n− 1

que es O(n log n).Caso medio: El pivote se distribuye uniformemente en todo el arreglo.Esto signi�ca 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

f(n) =2[f(0) + f(1) + f(2) + · · ·+ f(n− 1)] + n(n + 1)

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 ecuación 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 relación de recurrencia

f(1) = 0

f(n) =n + 1

nf(n− 1) + 2

Resolviendo la relación de recurrencia tendremosf(n)

n + 1− f(n− 1)

n=

2

n + 1f(n− 1)

n− f(n− 2)

n− 1=

2

nf(n− 2)

n + 1− f(n− 3)

n=

2

n− 1...

f(3)

4− f(2)

3=

2

4f(2)

4− f(1)

2=

2

3

por lo quef(n)

n + 1= 2

n+1∑i=3

1

i

despejando f(n) tenemos

f(n) = 2(n + 1)n+1∑i=3

1

i≤ 2(n + 1)

∫ n+1

3

dx

x

100 CAPÍTULO 5. DIVIDIR PARA VENCER

utilizando aproximación 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 versión iterativa del algoritmo.

proc QuicksortIterativo(ini, fin) ≡comienzaMetePila(ini, fin)mientras ¬PilaVacia() hazSacaPila(ini, fin)mientras (ini < fin) haz

pivote ← Partición(ini, fin);MetePila(pivote + 1, f in);fin ← pivote− 1;

zahzah

termina.Algoritmo 22: Quicksort Iterativo

Análisis Espacial

En el caso del análisis espacial, la memoria necesitada por el algoritmode quicksort, tenemos también varios casos.

Peor Caso: Se da cuando se tienen sistemáticamente problemas de tamaño0 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 tamaño 0 y(n-1) por resolver.

f(n) = c = O(1)

Para ahorrar memoria dinámica:si pivote− ini < fin− pivote entonces

MetePila(pivote + 1, fin)fin ← pivote− 1

otroMetePila(ini, pivote)ini ← pivote + 1

isIntroducir el código anterior en el mientras mas profundo.

5.5. EjerciciosEjercicio 5.1 Realice el análisis espacial para el peor caso de quicksort.

Ejercicio 5.2 Par más cercano. Dado un conjunto de puntos en el planocartesiano (x, y) el problema es encontrar aquellos dos puntos que se encuen-tran más cerca el uno del otro. Haga el análisis del algoritmo.

102 CAPÍTULO 5. DIVIDIR PARA VENCER

Ejercicio 5.3 Búsqueda en Arboles-B.Un árbol B de orden n es un árbolcuyo nodo está formado por a lo mas n− 1 elementos con n hijos. Los hijosestán ordenados de tal forma que los elementos a la izquierda son menoresy a la derecha son mayores. Escriba un algoritmo para hacer búsquedas enarboles B de orden n. Haga el análisis del algoritmo.

J Q

B C K L R S

Figura 5.1: Arbol-B de orden 3

Ejercicio 5.4 Diseñe un algoritmo para encontrar el mínimo y máximo deun arreglo utilizando divide y vencerás. Haga el análisis del algoritmo.

Ejercicio 5.5 Elabore un algoritmo para encontrar una moneda falsa en unarreglo de n monedas. Haga el análisis de dicho algoritmo. Asuma que conocela función falsa que regresa verdadero si la moneda es falsa y es de ordenconstante.

Ejercicio 5.6 Dado un árbol binario de búsqueda como el que se ve en laFigura 5.2 escriba un algoritmo para hacer búsquedas en él. Haga el análisisde dicho algoritmo. Diga si el orden del algoritmo domina asintóticamente alog2 n (el orden de búsqueda para un árbol binario de búsqueda).

5.5. EJERCICIOS 103

7

5

2

10

11 14

Figura 5.2: Árbol Binario de Búsqueda

104 CAPÍTULO 5. DIVIDIR PARA VENCER

Capítulo 6

Método Ávido

El método ávido es un método que se utiliza para encontrar la soluciónóptima a un problema. La manera de lograrlo es tomar un elemento a lavez e irlo agregando a la solución siempre que y cuando el hacerlo mantengala solución óptima encontrada hasta ese momento. Esto se puede ver en elalgoritmo 23.

proc Avido(A, n, sol) ≡comienza

sol ← vaciamientras ¬SolCompleta(sol) haz

elem ← seleccion(A)si EsViable(sol, elem) entonces

sol ← sol ∪ elemA ← A− elem

iszah

termina.Algoritmo 23:Método Ávido

6.1. Problemas TipoReciben 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 CAPÍTULO 6. MÉTODO ÁVIDO

subconjuntos es llamado una solución factible o viable. Se requiere encontraruna solución factible que maximice o minimice una función objetivo. Estasolución es llamada la solución óptima.

En la mayoría de los casos es necesario probar que la estrategia de solu-ción adoptada conduce a una solución óptima. Esta técnica se utiliza pararesolver una gran cantidad de problemas de optimización. En cada uno deellos identi�camos la función objetivo y se demuestra que la estrategia nosconduce a la solución óptima.

6.2. Almacenamiento en CintasEjemplo 29 El problema del almacenamiento óptimo con cintas es el sigui-ente. Se tienen n programas en una cinta de longitud L, cada programa itiene una longitud li, 1 ≤ i ≤ n. Claramente

n∑i=0

li ≤ L.

Asumimos que cada vez que se desea leer un programa, la cinta se lee desdeel comienzo. Es decir, que si los programas se encuentran almacenados en elorden I =< i1, i2, . . . , in > el tiempo necesario para recuperar el programa kes

tk ∝k∑

j=1

lij .

El tiempo promedio esperado de lectura (TPEL) es entonces

TPEL =1

n

n∑

k=1

k∑j=1

lij =1

n

n∑

k=1

(n− k + 1)lik

Función objetivo

Encuentra un orden para almacenar los programas de tal manera que elTPEL 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 ← ProgramaMasPequeño(l);Ord[i] ← p;i ← i + 1;

zahtermina.

Algoritmo 24: AOC

Estrategia

El algoritmo 24 utiliza la estrategia de tomar al programa que tenga lamenor longitud e ir la agregando a la solución los programas de tal maneraque la solución se mantenga óptima, es decir en orden ascendente.

Teorema 13 EL algoritmo AOC encuentra el ordenamiento que minimizaTPEL. Si l1 ≤ l2 ≤ l3 ≤ · · · ≤ ln entonces el orden < 1, 2, 3, . . . , n >minimiza

n∑

k=1

k∑j=1

lj

sobre todas las permutaciones de programas.

Demostración 9 Sea I =< i1, i2, . . . , in > una permutación del conjuntode índices {1, 2, 3, . . . , n}. Entonces sea D(I) óptima de tal forma que

D(I) =n∑

k=1

(n− k + 1)lij .

Deben existir en I un par de índices a, b tales que a < b y lia > lib .

108 CAPÍTULO 6. MÉTODO ÁVIDO

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

D(I ′) =n∑

k=1

(n− k + 1)lij + (n− a + 1)lib + (n− b + 1)lia

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

contradicción

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

6.3. Problema de la mochilaEjemplo 30 Problema de la mochila se plantea de la siguiente forma. Setienen n objetos y una mochila. Cada objeto tiene un peso pi y un valorvi∀1 ≤ i ≤ n. La mochila tiene una capacidad M . El problema consiste enseleccionar los objetos o (fracciones de ellos) tales que

n∑i=1

xivi

tenga un valor máximo cumpliendo 0 ≤ xi ≤ 1 yn∑

i=1

xipi ≤ M, vi > 0, pi > 0, 1 ≤ i ≤ n

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∑

xivi

∑pivi

(1

2,1

3,1

4) 24 16.5

(5

18, 1, 0) 31.6 20

(0,2

3, 1) 31.6 20

y en particular

(24

18,25

15,15

10) = (

4

3,5

3,3

2)

tomando los objetos por mayor unidad de peso

= (0, 1,1

2)

= 32.5

EstrategiaTomar los objetos de mayor valor por unidad de peso. El algoritmo 25

muestra el algoritmo para resolver el problema de la mochila utilizando elmétodo ávido.

Teorema 14 Si vi

pi

≥ v2

p2

≥ . . .vn

pn

el algoritmo Mochila genera la soluciónóptima.

Sea x = (x1, x2, . . . , xn) la solución generada por el algoritmo. Sea j elprimer índice tal que xj 6= 1 ⇒ xi = 1∀1 ≤ i < j, y 0 ≤ xj ≤ 1 conxi = 0∀j < i ≤ n.

Supongo que existe una solución ó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 CAPÍTULO 6. MÉTODO ÁVIDO

proc Mochila(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] ← 1otro

x[k] ← (M − peso)

p[k];

ispeso ← peso + x[k]× p[k];valor ← valor + v[k]× x[k];i ← i + 1;

zahtermina.

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 también implica que ∃l tal que l > k yyl 6= 0. Construimos ahora una Y ′ tal que Y y Y ′ son idénticas excepto enlos índices k y l. Sustituimos y′k = yk +

ε

pk

y y′l = yl − ε

pl

con lo cual

n∑i=1

y′ipi =n∑

i=1

yipi

Note que

y′kpk = (yk +ε

pk

)pk = yk + ε

y

y′lpl = (yl +ε

pl

)pl = yl − ε

Si hacemos y′k tan grande como podamos tendremos dos posibilidades:

1. y′k = xk

2. y′k < xk en cuyo caso existe l′ tal que l′ > k y y′l 6= 0 y podemos hacerel razonamiento superior hasta hacer y′k = xk.

Pero, ¾qué pasa con la suma de valores? Para ellas tendremosn∑

i=1

y′ipi ≥n∑

i=1

yipi

Por que

y′kvk = ykvk +ε

pk

vk

y′lvl = ylvl − ε

pl

vl

112 CAPÍTULO 6. MÉTODO ÁVIDO

yvk

pk

>vl

pl

Es decir que podemos hacerY ′ idéntico a X hasta k y mantenerlo óptimo.Es claro que podemos seguir este razonamiento parak + 1, k + 2 . . . , n. X esóptimo.

Construiremos una solución Z en la cual vamos a hacer crecer yk hastaxk y decrecer yk+1, ..., yn. Tendremos por lo tanto:

n∑i=1

vixi =n∑

i=1

viyi + (yk −Xk)vkpk

xk

−n∑

i=k+1

(yi − xi)vipi

pi

≤n∑

i=1

viyi + [(yk − xk)pk −∑

(yi − xi)pi]vk

pk

!i) >! y es optima

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

x es optima

6.4. Intercalación óptima de archivosEjemplo 31 Sabemos que intercalar 2 archivos ordenados de longitud n ym respectivamente cuesta O(n + m). El problema de intercalación óptima escuando se desea mezclar n archivos ordenados.

Para n archivos hay varias maneras de hacer la intercalación: Se puedeproceder por pares de archivos, ordenándolos de acuerdo a tu tamaño, inter-calando elementos de todos a la vez, etc. Lo primero que debemos tratar esver como hacer el intercalamiento.

6.4.1. ProblemaDeterminar la manera óptima de intercalar los registros de losn archivos

ordenados.

6.4. INTERCALACIÓN ÓPTIMA DE ARCHIVOS 113

6.4.2. EstrategiaTomar cada vez los dos archivos mas pequeños. Este problema puede

representarse como un árbol binario en el que las hojas son los archivosiniciales y los nodos internos las intercalaciones, la Figura 10 muestra unejemplo. Si F1 esta a una distancia de 3 los registros de Fi se movieron tresveces. Si di es la distancia del nodo Fi a la raíz y li es la longitud del archivoFi entonces el número total de movimientos es

n∑i=1

lidi

que es la longitud del camino externo ponderada.

y3

y2

y1

x1 x2 x3 x4

y3

y1

x1 x2

y2

x3 x4

Figura 10: Problema de intercalación óptima visto como árbol

Un árbol de intercalación óptimo corresponde a un árbol binario conlongitud de camino externo ponderado mínimo. El algoritmo 26 muestra unalgoritmo ávido de intercalamiento óptimo.

Teorema 15 Si L inicialmente contienen ≥ 1 nodos con longitud (l1, l2, l3, . . . , ln)el algoritmo IOA genera un árbol de intercalación óptimo de dos en dos paran archivos con esas longitudes.

Demostración 10 Suponemos que existe T un árbol de intercalamiento óp-timo.

114 CAPÍTULO 6. MÉTODO ÁVIDO

proc IOA(L, n) ≡comienzapara i = 1 a n− 1 haz

nodo ← Creanodo();Izq(nodo) ← Menor(L); menor elimina elDer(nodo) ← Menor(L); nodo de vueltaLong(nodo) ← Long(Izq(nodo) + Long(Der(nodo));Inserta(L, nodo);

zahtermina.

Algoritmo 26: Algoritmo de Intercalación Ávido

Sea P un nodo interno de distancia máxima a la raíz como el que semuestra en la �gura

Observemos que el algoritmo genera en la primera iteración

lr lm

<-P l1 + l2

l1 l2

Si intercambiamos l1 y l2 con lr y ln, la longitud de camino externo pon-derado del árbol resultante T ′′ es

LCEP(T ) ≥ LCEP(T ′′).

Además:

6.4. INTERCALACIÓN ÓPTIMA DE ARCHIVOS 115

Si LCEP(T ) = LCEP(T ′′) entonces l1, l2, lr, ln están en el mismo nivel.

Si LCEP(T ) > LCEP(T ′′) estaban en diferentes niveles. ½Contradic-ción!

6.4.3. Generalización a arboles de grado k

Notemos quen mod (k − 1) = 1

Por lo que a lo mas se tienen que agrupark−2 archivos comodines de longitud0.

6.4.4. Aplicación : Código de Hu�manSi en lugar de longitudes tenemos frecuencias

25

35

15

5 10

20

60

30 30

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

116 CAPÍTULO 6. MÉTODO ÁVIDO

6.5. Arboles Generadores mínimosEjemplo 32 Un árbol generador mínimo se de�ne así. Sea G =< V, A >un grafo conectado no dirigido. Un subgrafo T =< V, A′ > de G es un árbolgenerador de G si T es un árbol (A′ ⊂ A y T no tiene ciclos). Si cada arcoa tiene un costo c(a) entonces el costo del árbol T será

c(T ) =∑

a∈A′c(a)

El problema es encontrar un árbol generador de costo mínimo.

6.5.1. ProblemaEncontrar un árbol generador de costo mínimo.

G07162534 E071625345

B07162534

2

D8?9>:=;<5ÄÄ

ÄÄÄÄ

ÄÄC07162534

6

????????

G07162534

3 A071625347

ÄÄÄÄÄÄÄÄB07162534

6

????

????

F071625343

D8?9>:=;<5

B071625342

A071625343

G07162534

C07162534

3

F071625343B071625342

D8?9>:=;<5ÄÄ

ÄÄÄÄ

ÄÄ

E07162534

2A071625343

Figura 11: Grá�ca y su árbol generador de costo mínimo

6.5.2. EstrategiaExisten dos estrategias básicas

Tomar el arco de menos costo que una un vértice conectado con unono conectado.

Toman el menor arco que no forme ciclo.

El algoritmo de Kruskal que se muestra en el algoritmo 27 utiliza lasegunda estrategia para encontrar un árbol generador de costo mínimo.

6.5. ARBOLES GENERADORES MÍNIMOS 117

proc Kruskal(G,A, n) ≡comienza

A ← vacio;para i = 1 a n− 1 haz

arco ← Menor(G);si ¬FormaCiclo(arco, A) entonces

A ← A ∪ arco;is

zahtermina.

Algoritmo 27: Kruskal

Teorema 16 El algoritmo de Kruskal genera un árbol generador de costomínimo para un grafo conectado no dirigidoG.

Demostración 11 Usamos las siguientes suposiciones:

Suponemos que existe T un árbol generador de costo mínimo.

Sea a el arco de menor costo considerado en Tk (el árbol generado porel algoritmo de Kruskal) que no esta en T.

Observamos que si agregamos el arco a a T tenemos un ciclo único. Enese ciclo único, hay un arco a′ que esta en T y que no esta en Tk (sino Tk

tendría un ciclo).Observamos que c(a) ≤ c(a′). Si construimos un árbol T ′ cambiamos a′

por a.

c(T ′) = c(T ) + c(a)− c(a′)

c(T ′) ≤ c(T )

El árbol obtenido sigue siendo generador y óptimoc(T ′) ≤ c(T ). Podemosseguir este razonamiento hasta que T ′ = Tk. Tk es óptimo.

118 CAPÍTULO 6. MÉTODO ÁVIDO

Capítulo 7

Búsqueda con retroceso(Backtrack)

Esta técnica se utiliza en algoritmos de búsqueda. Los algoritmos dise-ñados en base a esta técnica pueden realizar una búsqueda exhaustiva deun espacio grande de búsqueda (del orden n! o aún cn). Para ser efectivanormalmente deben de utilizarse heurísticas que permitan reducir el espaciode búsqueda tanto como sea posible. El principio es sencillo, tratar todas lassoluciones posibles para un problema.

7.1. Problemas TipoLa solución se expresa como una tupla

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

y debe satisfacer una función objetivo

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

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

119

120 CAPÍTULO 7. BÚSQUEDA CON RETROCESO (BACKTRACK)

7.2. Método de SoluciónExisten dos formas adicionales de buscar soluciones a este tipo de pro-

blemas:

1. Método ávido.

2. Explorar todo el espacio de soluciones.

En el caso del método ávido solo encontramos una solución si existe unaestrategia que nos permita usar el método ávido. Cosa que no siempre sucede.Explorar todo el espacio de soluciones por otro lado puede resultar demasiadocostoso y por tanto nunca encontrar una solución.

El método de búsqueda con retroceso construye las tuplas elemento porelemento y en cada paso evalúa la tupla parcial para decidir si puede llagara ser una solución. En caso de no ser así la tupla parcial es eliminada. Si latupla parcial es x1, x2, x3, . . . , xk se eliminan mk+1 × mk+2 × . . . mn tuplaspor explorar.

Sobre una tupla existen dos tipos de restricciones.

Restricciones explicitas Determinan los valores de los componentes de latupla.

Restricciones implícitas Determinan si una tupla es o no una solución.Dicen como se relacionan los elementos de la tupla entre ellos.

El espacio de soluciones en el conjunto de tuplas de�nido por las restric-ciones explicitas. Este espacio se puede representar por un árbol como semuestra en la �gura 12. En la raíz tenemos a la solución vacía. En cada nivelelegimos 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 posiblex2 y así sucesivamente.

En el árbol que representa el espacio de soluciones cada nodo representaun estado del problema. Llamaremosestados solución a aquellos cuyo caminodesde la raíz hasta el nodo de�ne una tupla en el estado de soluciones. Unestado solución es un estado respuesta si la tupla de�nida por el caminodesde la raíz hasta el nodo satisface las condiciones implícitas. Al árbol querepresenta el espacio de soluciones lo llamaremosárbol de espacio de estados.

Un nodo vivo en la generación del árbol de es un nodo que aun no sedescarta. 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. MÉTODO DE SOLUCIÓN 121

Sol = φx1 ∈ S1x2 ∈ S2x3 ∈ S3

Figura 12: Espacio de soluciones

se tiene que generar sistemáticamente el árbol de espacio de estados a partirde la raíz.

Hay esencialmente dos maneras de generar el árbol de espacio de estadosa partir de la raíz:

a) Tan pronto como un hijo S del e-nodo R es generado, S se convierteen el nodo e-nodo. R volverá a ser el n-nodo una vez que el subárbolcon raíz en S sea explorado (búsqueda en profundidad).

b) El n-nodo deja de serlo hasta que se convierte en un nodo muerto(búsqueda por nivel).

En ambos casos se utilizan funciones de corte para �matar� nodos y asíevitar la construcción completa del árbol de espacio de estados:

A la generación del árbol de espacio de estados a profundidad confunciones de corte se le llama backtracking o búsqueda con retroceso.

A la generación del árbol de espacio de estados de acuerdo a la segundatécnica se le llama branch & boundo (rami�cación y acotamiento).

El Algoritmo genérico para la generación del árbol espacio de estados porBacktrack se muestra en el algoritmo 28.

122 CAPÍTULO 7. BÚSQUEDA CON RETROCESO (BACKTRACK)

proc Backtrack(n) ≡comienza

nivel ← 1;mientras nivel > 0 hazsi ∃xk ∈ T (x1, x2, . . . , xi) ∧

Bi(x1, x2, . . . , xi) entoncessi (x1, x2, . . . , xk)

es un camino al estado respuestaentonces

imprime(x1, x2, . . . , xk);nivel ← nivel + 1;

isotro

nivel ← nivel − 1;is

zahtermina.

Algoritmo 28: Backtrack

Sea x1, x2, . . . , xk un camino desde la raíz hasta un nodo en el árbol deespacio de estados, T (x1, x2, . . . , xi) es una función que regresa el conjuntode todos los posibles valores para xi+1 tales que (x1, x2, . . . , xi+1) es tambiénun camino a un estado del problema.Bi(x1, x2, . . . , xi) es una función tal queBi es falsa si (x1, x2, . . . , xi) no puede ser extendido para alcanzar un estadorespuesta.

El Algoritmo genérico para la generación del árbol espacio de estados porBacktrack 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 enun tablero de ajedrez de n × n de manera que no se ataquen mutuamen-te. La solución se puede expresar como la tupla de posiciones de las reinas(q1, q2, . . . , qn). Si cada posición es representada como (r, c) (renglón, colum-

7.3. N REINAS 123

proc RBacktrack(n) ≡comienzapara cada xk ∈ T (x1, x2, . . . , xi) hazsi Bk(x1, x2, . . . , xk) entonces

si (x1, x2, . . . , xk)es un camino al estado respuestaentonces

imprime(x1, x2, . . . , xk);isRBacktrack(nivel + 1);

iszah

termina.Algoritmo 29: Backtrack Recursivo

na) tendremos un total de (n2

n

)

posibles soluciones.Pero si notamos que cada reina debe estar en un renglón diferente (las

reinas atacan cualquier pieza en su mismo renglón) entonces la solución sepuede expresar como (c1, c2, c3, . . . , cn) donde ci es la columna en la que secoloca a la reina en el renglón i. Lo cual reduce nuestro espacio de solucionesa solo n! (por que dos reinas no pueden estar en la misma columna).

7.3.1. Restricciones explicitasAl de�nir 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 implícitasLa restricción implícita, las tuplas que son solución, son aquellas donde

las reinas no se atacan. Ya nos aseguramos que las reinas no estén en el mismo

124 CAPÍTULO 7. BÚSQUEDA CON RETROCESO (BACKTRACK)

renglón ni en la misma columna. Solo falta asegurarse de que las reinas debenestar en diferente diagonal. Eso lo logramos veri�cando que

|cj − ci| 6= |j − i|.

El algoritmo coloca (algoritmo 30) se encarga de veri�car que las restric-ciones explicitas e implícitas se cumplan. El algoritmo checa que la últimareina en colocarse (la xi+1) cumpla con las restricciones. Este algoritmo es laimplementación de la función B para el problema de las n reinas.

func Coloca(reinas) ≡comienzapara i = 1 a reinas− 1 haz

si (x[i] = x[reina] ∨ |x[i]− x[reina]| = |i− reina|)entoncesColoca← falso;

iszahColoca← verdadero

termina.Algoritmo 30: Veri�ca que la reina se pueda colocar

Ya que tenemos un algoritmo para decidir si dado un estado es posiblellegar a un estado respuesta solo necesitamos producir los posibles valoresde 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.

c1 = 1234c2 = 1234

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 valoresde columnas para obtener el siguiente estado. El algoritmo 31 muestra elalgoritmo necesario para encontrar la solución paran reinas. En cada estadose generan todas las posibles columnas y se utiliza la funciónColoca paraveri�car si es posible alcanzar un estado respuesta.

proc Reinas(n) ≡comienza

reina ← 1x[reina] ← 0mientras reinas > 0 haz

x[reina] ← x[reina] + 1;mientras (x[reina] ≤ n) ∧ ¬Coloca(reina) haz

x[reina] ← x[reina] + 1zahsi (x[reina] ≤ n) entonces

si (reina = n) entoncesimprime(x);

otroreina ← reina + 1;x[reina] ← 0;

isotro

reina ← reina− 1;is

zahtermina.

Algoritmo 31: Solución a las n Reinas

7.4. Suma de SubconjuntosEjemplo 34 Se tiene un conjunto de enteros V y se desea encontrar todoslos subconjuntos tales que la suma de los elementos sea igual a un enteroM .

Por ejemplo, para el conjunto

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

126 CAPÍTULO 7. BÚSQUEDA CON RETROCESO (BACKTRACK)

tendremos las soluciones siguientes:

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

Este problema se puede formular de dos maneras distintas, aunque enambos casos tendremos al conjunto representado como un vector

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

7.4.1. Formulación 1Podemos representar la solución con

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

donde xi en (x1, x2, x3, . . . , xk) signi�ca que vxiesta 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)

satisfagan∑

i=1

vxi= M.

7.4.2. RestriccionesPara esta formulación del problema tendremos que las restricciones que

tenemos son

7.4. SUMA DE SUBCONJUNTOS 127

Explicitas 1 ≤ xi ≤ n∀i yn∑

i=1

vxi= M.

Implícitas Ningún número puede aparecer dos veces en la tupla.

El algoritmo 32 resuelve el problema utilizando este planteamiento delproblema.

proc Subconjuntos(elem, vacum, resto) ≡comienza

x[elem] ← 1;si vacum + v[elem] = Mentonces

imprime(x);otro

si (vacum + v[elem] + v[elem + 1]) ≤ MentoncesSubconjuntos(elem + 1, vacum, resto− v[elem]);

isisx[elem] ← 0;si (vacum + v[elem]) ≤ M ∧ (vacum + resto ≥ v[elem])entoncesSubconjuntos(elem + 1, vacum, resto− v[elem]);

istermina.

Algoritmo 32: Subconjuntos para primer planteamiento

7.4.3. Formulación 2La solución será una tupla

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

y si xi = 1 signi�ca que vi esta en el subconjunto. Si xi = 0 signi�ca quevi no esta en el subconjunto. La tupla (x1, x2, x3, . . . , xn). Así las soluciones

128 CAPÍTULO 7. BÚSQUEDA CON RETROCESO (BACKTRACK)

para el ejemplo se expresan

S1 = (1, 1, 0, 1)

S2 = (0, 0, 1, 1)

que debe cumplirn∑

i=1

xivi = M.

7.4.4. RestriccionesPara esta formulación del problema tendremos que las restricciones que

tenemos sonExplicitas

xi =

{01

yn∑

i=1

vxi= M.

Implícitas En este caso no existe ninguna restricción implícita.El algoritmo 33 resuelve el problema utilizando este planteamiento del

problema.Considerando

k∑i=1

vixi +k∑

i=k+1

vi < M

k∑i=1

vixi + vk+1 > M

7.5. Coloreado de grá�casEjemplo 35 Sea G un grafo y m un número entero positivo de colores. Elproblema de coloreado de grá�cas consiste asignar a cada vértice enG uncolor de manera que ningún par de vértices adyacentes tengan el mismo color.(El problema de encontrar el número más pequeño para colorear una grá�ca esconocido como el problema de optimización dem-coloreabilidad,m es llamadoel número cromático de G)

7.5. COLOREADO DE GRÁFICAS 129

proc Subconjuntos(elem, vacum) ≡comienzapara i = 0 a 1 haz

x[elem] ← i;si vacum + v[elem]× i = Mentonces

imprime(x);otro

si vacum + v[elem]× i < MentoncesSubconjuntos(elem + 1, vacum + v[elem]× i);

isis

zahtermina.

Algoritmo 33: Subconjuntos para segundo planteamiento

7.5.1. SoluciónExpresamos a la solución como la tupla(x1, x2, x3, . . . , xn) con xi ∈ {1, . . . , m}

donde xi es color asignado al vértice i, por lo que vemos a V como un vector< v1, v2, . . . , vn > con |V | = n. La restricción se expresa como

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

El árbol de espacio de estados:

130 CAPÍTULO 7. BÚSQUEDA CON RETROCESO (BACKTRACK)

func SeColorea(nodo) ≡comienzapara vértice = 1 a nodo− 1 haz

si (G[vertice, nodo]) ∧ (x[vertice] = x[nodo])entoncesSeColorea← F ;

iszahSeColorea← V ;

termina.Algoritmo 34: SeColorea

proc m-coloreado(n,m) ≡comienza

nodo ← 1;x[nodo] ← 0;mientras nodo > 0 hazrepite

x[nodo] ← x[nodo] + 1;hasta x[nodo] > m ∨ sepuedecolorear(nodo);si (x[nodo] =< m) entonces

si (nodo = n)Imprime(x);

otronodo ← nodo + 1;x[nodo] ← 0;

isotro

nodo ← nodo− 1;is

zahtermina.

Algoritmo 35: m-coloreado

7.5. COLOREADO DE GRÁFICAS 131

proc RMColoreado(nodo, color,m) ≡comienzapara color = 1 a m haz

x[nodo] ← color;si sepuedecolorear(nodo)entoncessi (nodo = n) entonces

imprime(x);RMColoreado(nodo + 1);

isis

zahtermina.

Algoritmo 36: m-coloreado recursivo

132 CAPÍTULO 7. BÚSQUEDA CON RETROCESO (BACKTRACK)

Capítulo 8

Árboles de juego

Una variante de la técnica de backtrack son los árboles de juegos. Estosse utilizan para programar que la computadora juegue partidas de cosas quevan desde gato hasta ajedrez.

Las principales características son:

2 jugadores alternan las jugadas

el estado del juego se puede representar por una con�guración especí-�ca.

suponemos un número in�nito de con�guraciones.

el juego tiene reglas que aseguran su terminación.

A cada uno de estos juegos se le asocia un árbol de juego (árbol de espaciode estados) en donde la raíz es la con�guración de partido y los hijos de cadanodo son las posibilidades de tiro a partir de ese nodo. Las hojas del árbolde juego representan las con�guraciones en donde alguno de los coe�cientesya ganó o donde hay una situación de empate.

8.1. ProblemaEncontrar un camino hacia el triunfo del jugador que tiene el turno en la

raíz del árbol.

133

134 CAPÍTULO 8. ÁRBOLES DE JUEGO

8.2. SoluciónHacer la búsqueda con retroceso en el árbol de juego utilizando el método

MiniMax, y las funciones de corte dadas por la técnica poda alfa-beta.

8.3. Método Min-MaxA 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 posición en el tablero donde hay unmovimiento de la computadora, el valor será el máximo de los valoresde los nodos hijos. Es decir, se supone que la computadora hará elmovimiento más favorable para ella, o sea que produce el resultado conmayor valor.

Si el nodo corresponde a una posición del tablero donde hay un movi-miento del usuario, entonces el valor será el mínimo de los valores delos nodos hijos. Es decir, se presume que el usuario hará el movimientoque le cause más daño.

Si la raíz tiene un valork, la computadora tiene una estrategia ganadoraa partir de la con�guración inicial del juego. Si tiene un valor0, entoncesningún jugador tiene una estrategia ganadora. Si tiene un valor−k elusuario tiene una estrategia ganadora.

El algoritmo 37 es un algoritmo genérico para evaluar un árbol de juego.Recibe como parámetro el modo en que se evalua la función (Min o Max).

8.4. Funciones de UtilidadEs una función que permite evaluar la probabilidad de que la computadora

gane a partir de la con�guración de la raíz.

8.4. FUNCIONES DE UTILIDAD 135

proc Eval(Tab, Modo) ≡comienzasi hoja(T ) entonces

Eval ← utilidad(T );otro

si Modo = Max entoncesvalor ← −∞;

otrovalor ←∞;

ispara cada H ∈ hijos(T ) hazsi (Modo = Max)entonces

valor ← Max(Eval(H,Min), valor);otro

valor ← Min(Eval(H, Max), valor);is

zahEval ← valor;

istermina.

Algoritmo 37: Evalúa MiniMax

136 CAPÍTULO 8. ÁRBOLES DE JUEGO

8.5. Gato (n-en línea)Ejemplo 36 El juego de n-en línea se juega así. Dado un tablero de n × ncada jugador se turna poniendo un símbolo en el tablero (usualmente× y©). El jugador que logre poner n símbolos en línea primero gana. Al 3-enlínea tambien se le conoce como gato.

8.5.1. Poda alfa-betaLa poda alfa-beta trata de reducir el tamaño del árbol usando valores

�nales y tentativos para cada nodo. Estos se de�nen de la siguiente manera:

valor �nal resulta de la aplicación de la evaluación Min-Max.

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

8.5.2. ReglasSi todos los hijos de un nodo T ya se podaron o se exploraron entoncesvalor �nal(T)<-valor tentativo VfH

Si un nodo T tiene un valor vt y uno de los hijos de T , el nodo H tieneun valor �nal vfH .

i) T es un nodo Max y vt < vfH ⇒ vt → vfH .ii) T es un nodo Min y vt > vfH ⇒ vt → vfH .

Si un nodo T tiene un valor tentativo vfT y su descendiente, el nodo Htiene un valor tentativo vfH

i) T es un nodo Max vtT > vtH ⇒ se podan todos los hijos noconsiderados de H.

ii) T es un nodo Max vtT 6 vtH ⇒ se podan todos los hijos noconsiderados de H.

Capítulo 9

Complejidad de los algoritmosdiseñados con Backtrack.

Depende de:

1. La cantidad de trabajo realizada para solucionar el siguiente valor dela 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 solución parcial

nos lleva a un nodo supuesto.

4. La cantidad de soluciones parciales que satisfacen la función de evalua-ción 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 solución, un algoritmo debacktrack genera al menos O(n) estados.

En el peor de los casos un algoritmo de backtrack explora la totalidaddel árbol.

En los ejemplos anteriores:

reinas - O(p(n)n!)subconjuntos - O(2n)coloreado - O(p(n)mn)

137

138CAPÍTULO 9. COMPLEJIDADDE LOS ALGORITMOS DISEÑADOS CON BACKTRACK.

9.1. Plani�cación y AcotamientoGeneración del árbol de espacio de estados en donde el nodo en expansión

(e-nodo) deja de serlo sólo cuando se convierte en nodomuerto. El algoritmo38 muestra su forma general.

proc RamaAcota(raiz) ≡comienza

nodo ← raiz;Q ← Colavacia();Encola(Q,nodo);mientras ¬Escolavacia(Q) ∧ ¬HaySolución haz

nodo ← Desencola(a);si nodo es solución entonces

imprime(nodo);HaySolución← verdad;

otropara cada hijoHdenodo hazsi la solución parcial (incluyendo H)

conduce a un nodo respuesta entoncesEncola(Q,H)

iszah

iszah

termina.Algoritmo 38: Plani�cación y Acotamiento

9.1.1. Problema de la rami�cación y acotamientoEntre los problemas que podemos encotrar para este algoritmo tenemos

que hace búsquedas ciegas.Si se pudiera calcular la cantidad del trabajo necesaria para llegar a la

solución a partir de un nodo dado, se hace el cálculo para todos los nodosvivos y se toma el nodo con menor valor para continuar la búsqueda.

9.1. PLANIFICACIÓN Y ACOTAMIENTO 139

9.1.2. Búsqueda de menor costoLa cantidad de nodos que se debe generar para encontrar la solución.

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

Si estas funciones están disponibles entonces

Se genera el mínimo de nodos.

Se generan sólo nodos que conducen a un estado respuesta.

Problema: Esas funciones no son prácticas.

Solución: Estimar la cantidad de trabajo.

A cada nodo T se le asigna un costo con la siguiente función

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

donde

h(T ): Cantidad de trabajo necesaria para llegar de la raíz aT .

g(T ): Una estimación de la cantidad de trabajo necesaria para llegarde T a un nodo respuesta.

El algoritmo 39 muestra al algoritmo general utilizando estas funciones.

140CAPÍTULO 9. COMPLEJIDADDE LOS ALGORITMOS DISEÑADOS CON BACKTRACK.

proc BusquedaMenCosto(raiz) ≡comienza

nodo ← raiz;inserta(vivos, nodo);mientras ¬Novacio(vivos) ∧ ¬Haysolucion haz

nodo ← traeMenoryelimina(vivos);inserta(muertos, nodos);si nodoessolucion entonces

imprime(nodo);Haysolucion ← verdad;

otropara cada hijoHsucesordenodo haz

caux ← c(H);si Encuentra(vivas, H) ∧ Hnodo.costo > cauxentonces

H.costo ← caux;Esta ← v;

otrosi Encuentra(Muertos, H) ∧ H.nodo.costo > cauxentonces

H.costo ← caux;Eliminar(Muertos,H);Inserta(vivos, H);Esta ← v;

isissi ¬esta entonces

H.costo ← caux;isinserta(vivos,H);

zahis

zahtermina.

Algoritmo 39: Busqueda Menor Costo

Parte III

Problemas NP

141

Capítulo 10

Problemas Tratables e Intratables

Los problemas computacionales los podemos dividir en dos conjuntos

Tratables Problemas para los cuales existe un algoritmo de complejidadpolinomial.

Intratables Problemas para los que no se conoce ningún algoritmo de com-plejidad polinomial.

A los problemas tratables se les conoce también como problemasP (de or-den polinomial). Asimismo a los problemas no tratables se les llama tambiénNP (de orden no determinístico polinomial). Entre estos últimos podemosencontrar los siguientes ejemplos:

Agente Viajero.

Caminos Hamiltonianos. Encontrar un camino en un grafo que pasauna sola vez por cada nodo. O(n!).

Caminos Eulerianos. Encontrar un camino en un grafo que pasa unasola vez por cada arco.

10.1. Algoritmos No DeterministicosHasta el momento siempre hemos diseñado algoritmos determinísticos.

En un algoritmo determinístico, el resultado es único en el sentido de quecada instrucción tiene un resultado conocido dependiente del contexto. Pode-mos de�nir otra categoría, la de algoritmos no determinísticosdonde algunas

143

144 CAPÍTULO 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 función que regresa uno de los elementos de S. SiS={ Mercurio, Venus, Tierra } y P=Elige(S) entonces P=Mercurio oP=Venus o P=Tierra.

Éxito. Noti�ca una ejecución exitosa.

Fracaso. Noti�ca una ejecución no exitosa.

Algoritmos no determinístico.

Ejemplo 37 Búsqueda de un elemento x en un arreglo A. El algoritmo 40muestra un algoritmo de búsqueda de manera no determinística.

func BuscaND(A, x, indice) ≡comienza

i ← elige(1, ..., n);si A[i] = x entonces

indice ← i;Exito;

otroFracaso;

istermina.

Algoritmo 40: Búsqueda no Deterministica

10.2. InterpretacionesPodemos interpretar la instrucciónElige de las siguientes maneras:

1. Elige es mágica y siempre devuelve el valor que necesitamos.

2. Al llamar a elige, el programa se multiplica, después del llamado haytantas copias como valores pueden devolver el llamado. La ejecución dela instrucción Éxito detiene todas las copias del programa. La ejecuciónde la instrucción Fracaso detiene la copia del programa que la ejecuta.

10.2. INTERPRETACIONES 145

Cualquiera de las interpretaciones es equivalente. Pero no deben de utilizarsepara el diseño de algoritmos.

Ejemplo 38 Ordenamiento de un arreglo A con n elementos.

proc OrdenaND(A, n) ≡comienzapara i = 1 a n haz

B[i] ← elige(A);A ← A−B[i];

zahExito;

termina.Algoritmo 41: Ordena no deterministico. Elige mágica

El algoritmo 41 fué diseñado pensando en la primera interpretación. Perosi utilizamos la segunda interpretación el algoritmo regresará siempre exitolo cual es erroneo.

proc OrdenaND(A, n) ≡comienzapara i = 1 a n haz

B[i] ← elige(A);A ← A−B[i];

zahi ← 1;mientras i < n ∧ B[i] ≤ B[i + 1] haz

i ← i + 1;si i = n entonces

Exito;otro

Fracaso;termina.Algoritmo 42: Ordena no deterministico. Multiprocesos

El algoritmo 41 por otro lado regresa el resultado correcto independien-temente de la interpretación de Elige.

146 CAPÍTULO 10. PROBLEMAS TRATABLES E INTRATABLES

Ejemplo 39 Se tiene un conjunto de N enteros y se busca un subconjuntoen donde la suma de los elementos sea M . El problema de decisión de lossubconjuntos consiste en decidir si para un conjuntoA dado existe un sub-conjunto tal que los elementos sumenM . El algoritmo 43 muestra la soluciónpara este problema.

proc DecisionSubconjuntoND(A, n, M, res) ≡comienza

vacum ← 0;mientras vacum < M haz

val ← elige(A);A ← A− val;vacum ← vacum + val;

zahsi vacum = M entonces

res ← verdad;Exito;

otrores ← Falso;Fracaso;

istermina.

Algoritmo 43: Decisión 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 fraccionesde los objetos en la mochila. Aquí eso no es posible y tenemosn objetos:

con valor vi, 1 ≤ i ≤ n

con peso pi, 1 ≤ i ≤ n

La solución esta dado por la tupla

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

10.2. INTERPRETACIONES 147

sujeta an∑

i=1

xipi ≤ M

y maximizandon∑

i=1

xivi.

El problema de decisión de la mochila consiste en decidir si para un con-junto de objetos tenemos un subconjunto tal que la restricción de pesos secumpla y

n∑i=1

xivi = k.

proc DecisiónMochila(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];

zahsi (pacum ≤ M) ∧ (vacum ≥ K) entonces

res ← verdad;Exito;

otrores ← falso;Fracaso;

termina.Algoritmo 44: Problema de la mochila

Ejemplo 41 Sean x1, x2, . . . , xn variables booleanas, una literal es una va-riable o su negación. Una fórmula del cálculo Proposicional se forma con lite-rales y operadores ∧ (conjunción) y ∨ (disyunción). Una fórmula de cálculoproposicional está en forma normal conjuntiva (CNF) si se expresa como

C1 ∧ C2 ∧ · · · ∧ CR

148 CAPÍTULO 10. PROBLEMAS TRATABLES E INTRATABLES

donde Ci son fórmulas que constan de literales y operadores.El Problema de Satisfacibilidad consiste en determinar si una expresión

E(x1, x2, . . . , xn) en forma CNF es verdadera para una asignación de valoresde verdad a sus variables. E(x1) para x1 ∧ x1 no es satisfacible.

proc SatisfacibilidadNDcomienzapara i = 1 a n haz

x[i] ← elige({v, F});zahsi evalua(F, x) entonces

res ← verdad;Exito;

otrores ← falso;Fracaso;

istermina.

Algoritmo 45: Satisfacibilidad

De�nición 5 P es el conjunto de problemas para los cuales existe una solu-ción algorítmica deterministica de complejidad polinomial.

De�nición 6 NP es el conjunto de problemas para los que existe una solu-ción no determinística de complejidad polinomial.

Teorema 17 (Cook) Cualquier problema no determinísticamente polino-mial se reduce en tiempo polinomial al problema de la satisfacibilidad (SAT).Es decir

X ∈ NP ⇒ X ∝ SAT .

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

Es evidente que P ⊂ NP pero ¾NP ⊂ P?

De�nición 7 Una transformación polinomial de un lenguaje L1 ⊆ Σ∗1 a un

lenguaje L2 ⊆ Σ∗1 es una función f : Σ∗

1 → Σ∗2 que satisface las siguientes

dos condiciones:

10.2. INTERPRETACIONES 149

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

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

Escribiremos L1 ∝ L2 para signi�car 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 elelemento menor del segmento del arregloA[i . . . j].

proc Ordena(A, n)comienzapara i ← 1 a n haz

j ← Menor(i, n)− > O(nR)− > O(n(k + 1))Pintercambia(i, j)O(1)Ordenaalfaobtenermenor

zahtermina.

De�nición 8 Un problema es NP duro si satisfacibilidad se reduce a él

De�nición 9 Un problema es NP completo si es NP duro y está en NP

¾NP completo ⊂ NP Duros? SI¾NP Duros ⊂ NP completos? NOPor demostrar NP Duros* NPCompletosUsamos el problema del paro que consiste en decir si un programa se va

detener o no para una entrada espací�ca.P.D. Halt ∈ NPD i.e S ∝ HaltAsumimos que existe AHalt ∈ P que resuelve el problema de paro.Necesitamos construir un algoritmo AS−Halt ∈ P tal que genere un pro-

grama (y su entrada) que se detenga si la expresión es satisfacible y que nose detenga en el caso contrario.

Obviamente As da V para expresiones satisfactibles yF para expresionesno satisfacibles. ⇒ S ∝ Halt ⇒ Halt ⊂ NP Duros paro Halt ( NP NPDuros ( NP Completos

150 CAPÍTULO 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

repitehasta (Falso)

termina.

proc S.Halt(Exp, n)comienza

Escribe(B,Exp, n)termina.

10.3. Problema de decisión del ClanEl siguiente es otro ejemplo de reducibilidad:

Ejemplo 43 Problema de decisión del Clique (Clan):Dada una gra�ca G =< V, A > un clique es una subgra�ca completa. El

problema de decisión del clique consiste en decidir si una gra�caG tiene unclique de tamaño K.

P.D. Clique es NPC i.e clique ∈ NP y S ∝Clique1)P.D. S ∝ Clique

G07162534

C07162534

3

F071625343B071625342

D8?9>:=;<5ÄÄ

ÄÄÄÄ

ÄÄ

E07162534

2A071625343

Debemos construir As ∈ Pproponemos 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 formadasG de la siguiente manera

V = {(l, i)| la literal l esta en la cláusula Ci}A = {(l, i), (v, j)|i 6= j ∧ l 6= v}

P.D. La grá�ca construida con el algoritmo As−Clique de tamaño k si ysólo E es satisfacible.

⇐) E es satisfacible P.D. G tiene un clique de tamaño kSi E es satisfacible quiere decir que todas las cláusulas pueden ser verda-

deras simultaneamente i − e que al menos una literal es verdadera en cadacláusula para alguna asignación de valores de verdad a las variables.

Sea S=< l, i > | l es verdadera en la cláusula Ci y S contiene un vérticepara cada i ⇒ |S| = k y los vértices en S están conectados todos entre sí(por construcción⇒ los vértices en S y los arcos entre ellos forman un cliquéde tamaño k).

⇒) Hipotesis G tiene un cliqué de tamaño k.P.D. E es satisfacible.Sea S el conjunto de vértices del cliqué |S| = k y S contiene un vértice

por cláusula < l, i >, 1 ≤ i ≤ k.Si asignamos a l el valoe verdadero cuando sea una variable enx1, . . . , xn

y el valor falso cuando sea su negación ⇒ voy a tener una asignación devariables de verdad que hacen verdaderos TODAS las cláusulas⇒ E es sa-tisfacible.

Por lo tanto Cliqué esNPD.

10.4. Problema de la cobertura de nodosUn conjunto de vértices es una cobertura de una grá�caG si todos los

arcos de G inciden a un vértice de la cobertura.

152 CAPÍTULO 10. PROBLEMAS TRATABLES E INTRATABLES

G07162534 E07162534

B07162534

D8?9>:=;<ÄÄ

ÄÄÄÄ

ÄÄC07162534????????

G07162534

A07162534ÄÄÄÄÄÄÄÄB07162534

????

????

F07162534

D8?9>:=;<

B07162534

A07162534

Figura 14: Los vertices {A,B,C} son cobertura de la Grá�ca G

El problema de la cobertura de nodos consiste en determinar si una grá�caG tiene una cobertura de tamaño k.

P.D. Cob ∈ NPC i.e Cob es NPD y Cob ∈ NP.1) Cob es NPDuro i.e. S ∝ CobSi 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 algoritmoAClique−Cob.Sea G =< V, A > construimos G′ =< V ′, A′ > tal que V ′ = V y

A′=(i, j)|i, j ∈ V y(i, j)(Nopertenece)A.P.D. G tiene un Cliqué de tamaño k si y solo si G′ tiene una cobertura

de tamaño n− k.⇒) G tiene un Cliqué de tamaño k.P.D. G′ tiene una cobertura de tamaño n− k.Sea S el conjunto de vértices que forman el Cliqué en G |S| = k. Por

construcción los arcos en G′ unen un vértice en S con uno que no está en So dos vértices fuera de S ⇒ todos los arcos G′ inciden al menos a uno de losn− k vértices que no estan en S ⇒ G′ tiene una cobertura de tamaño n− k.

⇐) G′ tiene una cobertura de tamaño n− k.P.D. G tiene un Cliqué de tamaño k.Sea S el conjunto de vértices que forman la cobertura |S| = n− k. Todos

los arcos en G′ inciden a un vértice en S, es decir que entre los k arcosrestantes no hay ningún arco⇒ por construcción que en G esos arcos estancompletamente conectados⇒ G tiene un cliqué de tamaño k. ⇒ Cliqué ∝

10.4. PROBLEMA DE LA COBERTURA DE NODOS 153

Cob y como S ∝ Cliqué⇒ S ∝ Cob ⇒ Cob es NPDPara 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 queAL ∈ P .

Mostrar que se puede encontrar una instancia de L a partir de unainstancia de M en tiempo polimonial determinístico.

Mostrar que a partir de la respuesta dada porAL a la instancia de Lpermite obtener (en tiempo polinomial determinístico) la respuesta ala 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 resuelvaL.

Problema de desición del número cromático, consiste en decidir si unagrá�ca G tiene una coloración de tamaño 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 AS−Col ∈ P que transforma una instancia del problemade satisfacibilidad en una instancia del problema de decisión del númerocromático.

Consideramos que E ∈ CNF3 (cada cláusula tiene a lo más 3 literales).Suponemos también que hay n variables y que n > 3.

Dada una expresión E construimos la grá�ca G de la siguiente manera.

154 CAPÍTULO 10. PROBLEMAS TRATABLES E INTRATABLES

V = x1, x2, . . . , xn.Un vértice por variable booleana.∪ x1, x2, . . . , xn.Un vértice par variable booleana negada.∪ y1, y2, . . . , yn.Un vértice adecuado por variable booleana.∪ c1, c2, . . . , cp.Un vértice por cláusula.

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)|xino ∈ cj, 1 ≤ j ≤ k, i ≤ i ≤ n

∪ (cj, xi)|xino ∈ cj, 1 ≤ j ≤ k, i ≤ i ≤ n

P.D. E es satisfacible si y solo siG tiene una coloración de tamañon+1.⇒ Hipotesis E es satisfacible⇒ G tiene una coloración de tamaño n+1.Observe que los vértices yi forman un Cliqué de tamañon ⇒ 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 puedeser 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 estacoloreada con un color verdadero. La coloración así efectuada equivale a unaasignación de valores de verdad a las variables deE.

Cada cláusula contiene a lo más 3 literales y hay al menos n variablesn > 3. Cada Ci es adyacente almenos un par xi, xj, entonces Ci es adyacentea una variable coloreada conel color falso, entoncesCi se puede colorear conun color verdadero. Si E es satisfacible⇒ G tiene una coloración de tamañon + 1.

* Puesto que, como E es satisfacible, todas las cláusulas son satisfaciblespara laguna asignación de valores de verdad; si asignamos los colores demanera que l es coloreada con el color n + 1 si en la asignación l es falso yel color verdadero si l es verdadero, hay al menos una literal verdadera porcláusula coloreada con un color verdadero, ese mismo color es el que nos sirvepara colorear Ci.

10.5. PROBLEMA DE LA PLANEACIÓN 155

10.5. Problema de la planeaciónn trabajos requeriendo un tiempo ti para ejecutarse. m procesadores.Una planeación es una asignación de los trabajos a los procesadores. Pa-

ra cada trabajo wi, la planeación espací�ca, los intervalos de tiempo y losprocesadores en los cuales el trabajo va a ser procesado. Sifi es el tiempo determinación el trabajo wi, el tiempo promedio de terminación es:

tpt =1

n

n∑i=1

fi

Si asociamos a cada trabajo un costoCi, el tiempo promedio de termina-ción ponderado es:

tpt =1

n

n∑i=1

fiCi

Sea Ti el tiempo en el que el procesador pi termina su trabajo. El tiempode terminación de la planeación es:

tt = Max(Ti), 1 ≤ i ≤ n

Una planeación es no apropiativa cuando un trabajo se ejecuta desde elprincipio hasta el �n en el mismo procesador.

Una planeación es apropiativa cuando el trabajo no necesariamente seejecuta completamente en el mismo procesador.

P.D. El problema de decidir si un conjunto de trabajos tiene una planea-ción no apropiativa para m procesadores con un tiempo de terminaciónT esNPDuro (i.e S ∝ Plan)

Utilizaremos el problema de la partición: Dado un conjunto de númerosenteros y un número m decidir si es posible particionar el conjunto en msubconjuntos tal que la suma de los elementos de la partición sea igual.

Si m = 2A = {2, 7, 10, 25, 20}

El problema de decisión de la partición es NP Completo.P.D Partición ∝ Plan.- Suponemos que existe APlan ∈ P- Construir Aparticion ∈ PProponemos al siguiente algoritmo:

156 CAPÍTULO 10. PROBLEMAS TRATABLES E INTRATABLES

Dados A = {a1, a2, . . . , an} y k enteros positivosw = t1, t2, . . . , tn donde ti = ai.el número de procesadores, m = k y el tiempo de terminación es:

ti =1

m

n∑i=1

ti

10.6. Generación de código óptimoCuando las expresiones aritméticas tienen expresiones comunes se utiliza

un grafo acíclico dirigido para representarlas. Cada nodo interno contieneun operador y un grado de salida diferente de cero. Si asumimos operadoresbinarios, cada nodo tiene un grado de salida 2.

+

a +

b *

c

Figura 15: a + b + (a× c)

Una hoja es un nodo con grado de salida cero. Un nodo es un nivel 1 sisus nodos hijos son ambas hojas. Un nodo compartido es un nodo con másde un padre. Un gad hoja si todos sus nodos compartidos son nodos hoja. Ungad de nivel 1 es aquel en el cual todos sus nodos compartidos son de nivel1.

a) El problema de generar el código objeto óptimo para gads de nivel 1es NP Duros aún cuando la máquina tenga un sólo registro.

10.7. PROBLEMAS NP COMPUTABLES Y NO DECIDIBLES 157

*

+

a b

+

c

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

b) Determinar el número r de registros necesariso para evaluar un gad denivel 1 si almacenara en memorias es NP Duros.

LOAD A1R1

ADD R1BR1

STORE T1R1

ADD R1C1R1

STORE T2R1

LOAD T1R1

MULT R1T2R1

LOAD aR1

ADD R1bR1ADD R1cR1

MULT R1T2R1

10.7. Problemas NP Computables y No decidi-bles

Suponer que tenemos tiempo y memoria in�nitos y vamos a considerarproblemas con una cantidad �nita de instancias.

Un problema es no computable si no existe un algoritmo que sea capazde dar una respuesta a cualquier instancia del problema.

El problema del tapizado (a dominió). Dado un conjunto de cartas , cadauna in�nita, si es posible tapizar cualquier área �nita con ellas.

158 CAPÍTULO 10. PROBLEMAS TRATABLES E INTRATABLES

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