Universidad Mayor de San Andr´se     Facultad de Ciencias Puras y Naturales             Carrera de Inform´tica            ...
ii
PrefacioMotivaci´n        o    Los conceptos presentados se estudian en muchas de las materias delpregrado de la carrera d...
ivtratos y la forma de aplicar en Java. Aunque este concepto fue introducidoinicialmente en el lenguaje Eifel, actualmente...
vContenido del CD    El CD adjunto contiene los programas presentados en el texto. Hay queaclarar que todos han sido codifi...
vi
´                                           Indice generalPrefacio                                                        ...
viii                                                      ´                                                          INDIC...
´INDICE GENERAL                                                                                            ix4. Codificaci´...
x                                                                             ´                                           ...
´INDICE GENERAL                                                                                           xi9. Geometr´ co...
xii   ´      INDICE GENERAL
Cap´                                                       ıtulo 1                        Algor´                          ...
2                                            1. ALGOR´                                                     ITMICA ELEMENTA...
1.4. EFICIENCIA                                                            3escogemos alguno.    El segundo llamado m´todo...
4                                               1. ALGOR´                                                        ITMICA EL...
´                ´1.5. QUE CONSIDERAR Y QUE CONTAR                                           5              Figura 1.1: Or...
6                                             1. ALGOR´                                                      ITMICA ELEMEN...
´                ´1.5. QUE CONSIDERAR Y QUE CONTAR                                             7    Si el vector estuviera...
8                                            1. ALGOR´                                                     ITMICA ELEMENTA...
´                ´1.5. QUE CONSIDERAR Y QUE CONTAR                                          9    Arreglo(int opcion, int n...
10                                            1. ALGOR´                                                      ITMICA ELEMEN...
Cap´                                                       ıtulo 2                        An´lisis de algoritmos          ...
12                                                         ´                                                      2. ANALI...
´       ´2.3. NOTACION ASINTOTICA CONDICIONAL                                       132.3.     Notaci´n asint´tica condici...
14                                                      ´                                                   2. ANALISIS DE...
´2.6. ANALISIS DE LAS ESTRUCTURAS DE CONTROL                             152.6.3.    Llamadas recursivas   El an´lisis rec...
16                                                  ´                                               2. ANALISIS DE ALGORIT...
´2.6. ANALISIS DE LAS ESTRUCTURAS DE CONTROL                                   17        t[j+1]=t[j]        j=j-1     t[j+...
18                                                 ´                                              2. ANALISIS DE ALGORITMO...
´2.7. SOLUCION DE RECURRENCIAS                                             19traria c en la ecuaci´n 2.7.2 tenemos:       ...
20                                                    ´                                                 2. ANALISIS DE ALG...
´2.7. SOLUCION DE RECURRENCIAS                                           21reemplazando tenemos:                         T...
22                                                      ´                                                   2. ANALISIS DE...
´2.7. SOLUCION DE RECURRENCIAS                                              23  1.                                        ...
24                                                                ´                                                       ...
´2.7. SOLUCION DE RECURRENCIAS                                                25entonces la soluci´n general es           ...
26                                                   ´                                                2. ANALISIS DE ALGOR...
2.8. EJERCICIOS RESUELTOS                                                272.8.    Ejercicios resueltos  1. ¿Cu´nto tiempo...
28                                                                    ´                                                   ...
2.8. EJERCICIOS RESUELTOS                                                29  4. Resolver utilizando el teorema master     ...
30                                                           ´                                                        2. A...
2.8. EJERCICIOS RESUELTOS                                                       31     De aqu´ vemos que para un t´rmino i...
845 e bd01
845 e bd01
845 e bd01
845 e bd01
845 e bd01
845 e bd01
845 e bd01
845 e bd01
845 e bd01
845 e bd01
845 e bd01
845 e bd01
845 e bd01
845 e bd01
845 e bd01
845 e bd01
845 e bd01
845 e bd01
845 e bd01
845 e bd01
845 e bd01
845 e bd01
845 e bd01
845 e bd01
845 e bd01
845 e bd01
845 e bd01
845 e bd01
845 e bd01
845 e bd01
845 e bd01
845 e bd01
845 e bd01
845 e bd01
845 e bd01
845 e bd01
845 e bd01
845 e bd01
845 e bd01
845 e bd01
845 e bd01
845 e bd01
845 e bd01
845 e bd01
845 e bd01
845 e bd01
845 e bd01
845 e bd01
845 e bd01
845 e bd01
845 e bd01
845 e bd01
845 e bd01
845 e bd01
845 e bd01
845 e bd01
845 e bd01
845 e bd01
845 e bd01
845 e bd01
845 e bd01
845 e bd01
845 e bd01
845 e bd01
845 e bd01
845 e bd01
845 e bd01
845 e bd01
845 e bd01
845 e bd01
845 e bd01
845 e bd01
845 e bd01
845 e bd01
845 e bd01
845 e bd01
845 e bd01
845 e bd01
845 e bd01
845 e bd01
845 e bd01
845 e bd01
845 e bd01
845 e bd01
845 e bd01
845 e bd01
845 e bd01
845 e bd01
845 e bd01
845 e bd01
845 e bd01
845 e bd01
845 e bd01
845 e bd01
845 e bd01
845 e bd01
845 e bd01
845 e bd01
845 e bd01
845 e bd01
845 e bd01
845 e bd01
845 e bd01
845 e bd01
845 e bd01
845 e bd01
845 e bd01
845 e bd01
845 e bd01
845 e bd01
845 e bd01
845 e bd01
845 e bd01
845 e bd01
845 e bd01
845 e bd01
845 e bd01
845 e bd01
845 e bd01
845 e bd01
845 e bd01
845 e bd01
845 e bd01
845 e bd01
845 e bd01
845 e bd01
845 e bd01
845 e bd01
845 e bd01
845 e bd01
845 e bd01
845 e bd01
845 e bd01
845 e bd01
845 e bd01
845 e bd01
845 e bd01
845 e bd01
845 e bd01
845 e bd01
845 e bd01
845 e bd01
845 e bd01
845 e bd01
845 e bd01
845 e bd01
845 e bd01
845 e bd01
845 e bd01
845 e bd01
845 e bd01
845 e bd01
845 e bd01
845 e bd01
845 e bd01
845 e bd01
845 e bd01
845 e bd01
845 e bd01
845 e bd01
845 e bd01
845 e bd01
845 e bd01
845 e bd01
845 e bd01
845 e bd01
845 e bd01
845 e bd01
845 e bd01
845 e bd01
845 e bd01
845 e bd01
845 e bd01
845 e bd01
845 e bd01
845 e bd01
845 e bd01
845 e bd01
845 e bd01
845 e bd01
845 e bd01
845 e bd01
845 e bd01
845 e bd01
845 e bd01
845 e bd01
845 e bd01
845 e bd01
845 e bd01
845 e bd01
845 e bd01
845 e bd01
845 e bd01
845 e bd01
845 e bd01
845 e bd01
845 e bd01
Upcoming SlideShare
Loading in …5
×

845 e bd01

1,666 views
1,583 views

Published on

0 Comments
0 Likes
Statistics
Notes
  • Be the first to comment

  • Be the first to like this

No Downloads
Views
Total views
1,666
On SlideShare
0
From Embeds
0
Number of Embeds
5
Actions
Shares
0
Downloads
19
Comments
0
Likes
0
Embeds 0
No embeds

No notes for slide

845 e bd01

  1. 1. Universidad Mayor de San Andr´se Facultad de Ciencias Puras y Naturales Carrera de Inform´tica aFundamentos de la Programaci´n o Jorge Humberto Ter´n Pomier a <teranj@acm.org> La Paz - Bolivia, Diciembre 2006
  2. 2. ii
  3. 3. PrefacioMotivaci´n o Los conceptos presentados se estudian en muchas de las materias delpregrado de la carrera de inform´tica, con el rigor necesario. Sin embargo, aen mi experiencia docente he podido ver que hay muchos estudiantes quecarecen de elementos pr´cticos con los que puedan aplicar directamente los aconceptos aprendidos y lo que se pretende es cubrir este vac´ıo. El presente texto trata de introducir los conceptos de programaci´n, a oestudiantes de pregrado con un enfoque nuevo. Para una adecuada compresi´n de la tem´tica presentada en el libro, el o alector debr´ tener alguna experiencia en el desarrollo de programas. El libro ano pretende ense˜ar a codificar programas, sino a resolver problemas. nContenido Se presentan en el cap´ ıtulo 1, los conceptos de algor´ ıtmica elemental conel prop´sito de introducir a los estudiantes, al concepto de la eficiencia de los oprogramas. El cap´ ıtulo dos introduce los conceptos de an´lisis de algoritmos con una aserie de ejercicios aplicados. Se incluyen algunos laboratorios que tienen elprop´sito de que, los estudiantes asimilen estos conceptos en forma experi- omental. El cap´ ıtulo tres introduce el concepto de la teor´ de n´meros, introdu- ıa uciendo las librer´ de Java. Se muestran ejemplos de n´meros grandes y ıas uaplicaciones en la criptograf´ ıa. El cap´ ıtulo 4 trata de la escritura de programas con miras a la prueba delc´digo. En este cap´ o ıtulo se introduce un concepto que es el dise˜o por con- n iii
  4. 4. ivtratos y la forma de aplicar en Java. Aunque este concepto fue introducidoinicialmente en el lenguaje Eifel, actualmente tiene mucho inter´s en el de- esarrollo de aplicaciones. El texto no trata de trabajar en conceptos de l´gica oformal en su totalidad, lo que propone es una introducci´n a estos conceptos opara facilitar la prueba del c´digo en forma din´mica. o a El cap´ ıtulo 5 complementa el cap´ ıtulo 4 con conceptos de clasificaci´n y ob´squeda . Se introducen laboratorios y las bibliotecas Java para clasificar. u El cap´ıtulo 6 est´ orientado a explicar como se encara la programaci´n a ode problemas de combinatoria b´sica. a El cap´ ıtulo 7 explica como utilizar las librer´ del lenguaje Java y como ıasresolver problemas con pilas, listas enlazadas, conjuntos, ´rboles y colas de aprioridad. EL cap´ ıtulo 8 introduce al estudiante a los problemas de retroceso (bac-tracking) con problemas t´ ıpicos, como recorrido de grafos y permutaciones. El cap´ ıtulo 9 introduce a la geometr´ computacional. Muestra como cons- ıatruir una librer´ de rutinas b´sicas para desarrollar aplicaciones relacionadas ıa aa la geometr´ y muestra las librer´ Java as´ como las posibilidades que se ıa ıas ıtienen con las mismas. El lenguaje que se escogi´ fue el Java, primero porque la formaci´n o oest´ orientada a la programaci´n orientada a objetos. Segundo porque el a olenguaje es de amplia utilizaci´n en las empresas y en la educaci´n. o o Los enunciados orientados a la programaci´n fueron tomados de los con- ocursos de programaci´n, fueron traducidos al espa˜ol manteniendo los datos o nde entrada y salida en ingl´s. Esto se hizo para permitir a los interesados eresolver los problemas y poder validar sus respuestas con el Juez en L´ ıneade Valladolid, en su p´gina web http://acm.uva.es. Estos ejercicios llevan aadelante el n´mero de problema del Juez en L´ u ınea de Valladolid.Aplicaci´n en el aula o Esta tem´tica puede aplicarse en el transcurso de un semestre en clases ate´ricas, pr´cticas y de laboratorio. o a Los laboratorios proponen ejercicios que tienen la finalidad de evaluarexperimentalmente la ejecuci´n de los algoritmos. Esto permite que los estu- odiantes obtengan una vivencia de los resultados te´ricos. o Se puede aplicar en una clase de teor´ de dos per´ ıa ıodos y una segundaclase que ser´ de ejercicios o laboratorio. ıa
  5. 5. vContenido del CD El CD adjunto contiene los programas presentados en el texto. Hay queaclarar que todos han sido codificados utilizando el compilador Java 1.5 deSun Microsystems. El cap´ ıtulo 4 relacionado a JML fue codificado con laversi´n 1.4, dado que a la fecha de la redacci´n de la obra no estaba disponible o ouna versi´n de JML que funcionara con la versi´n 1.5. o oAgradecimientos Quiero agradecer a mi esposa, a mis hijos por los aportes realizados yfinalmente al Dr. Miguel Angel Revilla por dejarme reproducir ejercicios delJuez en L´ınea. Lic. Jorge Ter´n Pomier, M.Sc. a
  6. 6. vi
  7. 7. ´ Indice generalPrefacio III1. Algor´ıtmica elemental 1 1.1. Introducci´n . . . . . . . . . . . . . o . . . . . . . . . . . . . . . 1 1.2. Algoritmo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1 1.3. Problemas e instancias . . . . . . . . . . . . . . . . . . . . . . 2 1.4. Eficiencia . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2 1.5. Qu´ considerar y qu´ contar . . . . e e . . . . . . . . . . . . . . . 4 1.5.1. Operaciones elementales . . . . . . . . . . . . . . . . . 6 1.5.2. An´lisis del mejor caso, caso a medio y peor caso . . . . 6 1.5.3. Ejercicios . . . . . . . . . . . . . . . . . . . . . . . . . 7 1.5.4. Laboratorio . . . . . . . . . . . . . . . . . . . . . . . . 72. An´lisis de algoritmos a 11 2.1. Introducci´n . . . . . . . . . . . . . . o . . . . . . . . . . . . . . 11 2.2. Notaci´n orden de . . . . . . . . . . o . . . . . . . . . . . . . . 11 2.2.1. Propiedades de O grande de n . . . . . . . . . . . . . . 12 2.3. Notaci´n asint´tica condicional . . . o o . . . . . . . . . . . . . . 13 2.4. Notaci´n omega . . . . . . . . . . . . o . . . . . . . . . . . . . . 13 2.5. Notaci´n teta . . . . . . . . . . . . . o . . . . . . . . . . . . . . 13 2.6. An´lisis de las estructuras de control a . . . . . . . . . . . . . . 14 2.6.1. Secuenciales . . . . . . . . . . . . . . . . . . . . . . . . 14 2.6.2. Ciclos For . . . . . . . . . . . . . . . . . . . . . . . . . 14 2.6.3. Llamadas recursivas . . . . . . . . . . . . . . . . . . . 15 2.6.4. Ciclos while y repeat . . . . . . . . . . . . . . . . . . . 15 2.6.5. An´lisis del caso medio . . . . a . . . . . . . . . . . . . . 16 2.6.6. An´lisis amortizado . . . . . . a . . . . . . . . . . . . . . 17 2.7. Soluci´n de recurrencias . . . . . . . o . . . . . . . . . . . . . . 18 vii
  8. 8. viii ´ INDICE GENERAL 2.7.1. M´todo por substituci´n . . . . . . . . . e o . . . . . . . . 18 2.7.2. Cambio de variables . . . . . . . . . . . . . . . . . . . 19 2.7.3. Ejercicios . . . . . . . . . . . . . . . . . . . . . . . . . 20 2.7.4. M´todo iterativo . . . . . . . . . . . . . e . . . . . . . . 20 2.7.5. Ejercicios . . . . . . . . . . . . . . . . . . . . . . . . . 22 2.7.6. Teorema master . . . . . . . . . . . . . . . . . . . . . . 22 2.7.7. Soluci´n general de recurrencias lineales o . . . . . . . . 23 2.8. Ejercicios resueltos . . . . . . . . . . . . . . . . . . . . . . . . 27 2.9. Ejercicios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 32 2.10. Nota sobre el c´lculo integral . . . . . . . . . . a . . . . . . . . 343. Teor´ de n´ meros ıa u 35 3.1. Introducci´n . . . . . . . . . . . . . . . . . . . . . o . . . . . . . 35 3.2. Variables del lenguaje Java . . . . . . . . . . . . . . . . . . . . 35 3.3. C´lculo del m´ximo com´n divisor . . . . . . . . a a u . . . . . . . 37 3.3.1. Divisibilidad . . . . . . . . . . . . . . . . . . . . . . . . 38 3.3.2. Algoritmos extendido de Euclides . . . . . . . . . . . . 41 3.4. M´ ınimo com´n m´ltiplo . . . . . . . . . . . . . . u u . . . . . . . 43 3.5. Aritm´tica modular . . . . . . . . . . . . . . . . . e . . . . . . . 43 3.5.1. Propiedades . . . . . . . . . . . . . . . . . . . . . . . . 44 3.5.2. Congruencias . . . . . . . . . . . . . . . . . . . . . . . 45 3.5.3. Inverso multiplicativo . . . . . . . . . . . . . . . . . . . 45 3.5.4. Soluci´n de ecuaciones . . . . . . . . . . . o . . . . . . . 45 3.6. N´meros primos . . . . . . . . . . . . . . . . . . . u . . . . . . . 47 3.6.1. Generaci´n de primos . . . . . . . . . . . . o . . . . . . . 47 3.6.2. Factorizaci´n . . . . . . . . . . . . . . . . o . . . . . . . 49 3.6.3. Prueba de la primalidad . . . . . . . . . . . . . . . . . 51 3.6.4. Teorema de Fermat . . . . . . . . . . . . . . . . . . . . 51 3.6.5. Prueba de Miller - Rabin . . . . . . . . . . . . . . . . . 52 3.6.6. Otras pruebas de primalidad . . . . . . . . . . . . . . . 52 3.7. Bibliotecas de Java . . . . . . . . . . . . . . . . . . . . . . . . 53 3.7.1. Ejemplo . . . . . . . . . . . . . . . . . . . . . . . . . . 54 3.8. Ejercicios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 57 3.8.1. Problema 136 - N´meros Feos . . . . . . . u . . . . . . . 57 3.8.2. Problema 10042 - N´meros De Smith . . . u . . . . . . . 58 3.8.3. Problema 10104 - El problema de Euclides . . . . . . . 59 3.8.4. Problema 10139 - Factovisors . . . . . . . . . . . . . . 59 3.8.5. Problema 106 - Fermat vs. Pit´goras . . . a . . . . . . . 60
  9. 9. ´INDICE GENERAL ix4. Codificaci´n con miras a la prueba o 61 4.1. Introducci´n . . . . . . . . . . . . . . . o . . . . . . . . . . . . . 61 4.2. Algunos errores de programaci´n . . . o . . . . . . . . . . . . . 62 4.3. Especificaci´n de programas . . . . . . o . . . . . . . . . . . . . 66 4.3.1. ¿Por qu´ especificar? . . . . . . e . . . . . . . . . . . . . 68 4.3.2. ¿Qu´ especificar? . . . . . . . . e . . . . . . . . . . . . . 69 4.3.3. ¿C´mo especificar? . . . . . . . o . . . . . . . . . . . . . 70 4.3.4. Invariantes . . . . . . . . . . . . . . . . . . . . . . . . . 71 4.3.5. Ejercicios propuestos . . . . . . . . . . . . . . . . . . . 74 4.4. Aplicaciones de las invariantes . . . . . . . . . . . . . . . . . . 75 4.4.1. Principio de correctitud . . . . . . . . . . . . . . . . . 84 4.5. Dise˜o por contratos . . . . . . . . . . n . . . . . . . . . . . . . 85 4.5.1. Especificaci´n de contratos . . . o . . . . . . . . . . . . . 88 4.5.2. Invariantes . . . . . . . . . . . . . . . . . . . . . . . . . 90 4.6. Prueba est´tica . . . . . . . . . . . . . a . . . . . . . . . . . . . 91 4.7. Prueba din´mica . . . . . . . . . . . . a . . . . . . . . . . . . . 92 4.7.1. Afirmaciones . . . . . . . . . . . . . . . . . . . . . . . 92 4.8. Programaci´n bajo contratos con JML o . . . . . . . . . . . . . 95 4.8.1. Especificaci´n de invariantes . . o . . . . . . . . . . . . . 97 4.8.2. Cuantificadores . . . . . . . . . . . . . . . . . . . . . . 98 4.8.3. Ejercicios . . . . . . . . . . . . . . . . . . . . . . . . . 995. Aplicaciones de b´ squeda y clasificaci´n u o 101 5.1. Introducci´n . . . . . . . . . . . . . . . . . . . . . o . . . . . . . 101 5.2. Algoritmos de b´squeda . . . . . . . . . . . . . . u . . . . . . . 101 5.2.1. Prueba exhaustiva . . . . . . . . . . . . . . . . . . . . 105 5.2.2. Representaci´n gr´fica de la b´squeda . . o a u . . . . . . . 107 5.3. Clasificaci´n . . . . . . . . . . . . . . . . . . . . . o . . . . . . . 111 5.3.1. Clasificaci´n en Java . . . . . . . . . . . . o . . . . . . . 113 5.3.2. Algoritmos de clasificaci´n . . . . . . . . . o . . . . . . . 117 5.3.3. Laboratorio . . . . . . . . . . . . . . . . . . . . . . . . 127 5.3.4. Ejercicios . . . . . . . . . . . . . . . . . . . . . . . . . 127 5.3.5. Ejemplo de aplicaci´n . . . . . . . . . . . o . . . . . . . 127 5.4. Ejercicios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 131 5.4.1. Problema 10107 - Hallar la mediana . . . . . . . . . . . 131 5.4.2. Problema 10295 - C´lculo de salario . . . . a . . . . . . . 132 5.4.3. Problema 331 - Contando los intercambios . . . . . . . 134 5.4.4. Problema 499 - Hallar la frecuencia . . . . . . . . . . . 135
  10. 10. x ´ INDICE GENERAL6. Combinatoria b´sica a 137 6.1. Introducci´n . . . . . . . . . . . . . . . . . . . . . . . o . . . . . 137 6.2. T´cnicas b´sicas para contar . . . . . . . . . . . . . . e a . . . . . 137 6.3. Coeficientes binomiales . . . . . . . . . . . . . . . . . . . . . . 139 6.4. Algunas secuencias conocidas . . . . . . . . . . . . . . . . . . 141 6.4.1. N´meros de Fibonacci . . . . . . . . . . . . . u . . . . . 141 6.4.2. N´meros Catalanes . . . . . . . . . . . . . . . u . . . . . 142 6.4.3. N´mero Eulerianos . . . . . . . . . . . . . . . u . . . . . 143 6.4.4. N´meros de Stirling . . . . . . . . . . . . . . . u . . . . . 146 6.4.5. Particiones enteras . . . . . . . . . . . . . . . . . . . . 146 6.5. Ejercicios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 149 6.5.1. Problema 357 - Formas de combinar monedas . . . . . 149 6.5.2. Problema 369 - Combinaciones . . . . . . . . . . . . . 150 6.5.3. Problema 10338 - Mal educados . . . . . . . . . . . . . 151 6.5.4. Problema 10183 - Secuencia de Fibonacci . . . . . . . . 1527. Estructuras de datos elementales 153 7.1. Introducci´n . . . . . . . . . . . o . . . . . . . . . . . . . . . . . 153 7.2. Pilas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 153 7.3. Listas enlazadas . . . . . . . . . . . . . . . . . . . . . . . . . . 157 7.4. Conjuntos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 160 7.5. Clases map . . . . . . . . . . . . . . . . . . . . . . . . . . . . 162 7.6. Clases para ´rboles . . . . . . . a . . . . . . . . . . . . . . . . . 164 7.7. Clases para colas de prioridad . . . . . . . . . . . . . . . . . . 166 7.8. Ejercicios para laboratorio . . . . . . . . . . . . . . . . . . . . 1688. Backtracking 171 8.1. Introducci´n . . . . . . . . . . . . . . . . o . . . . . . . . . . . . 171 8.2. Recorrido de grafos . . . . . . . . . . . . . . . . . . . . . . . . 171 8.3. Constuir todos los subconjuntos . . . . . . . . . . . . . . . . . 175 8.4. Construir todas las permutaciones . . . . . . . . . . . . . . . . 179 8.5. Ejercicios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 182 8.5.1. Prolema 195 - Anagramas . . . . . . . . . . . . . . . . 182 8.5.2. Prolema 574 - Sum It Up . . . . . . . . . . . . . . . . 183 8.5.3. Problema 524 - Anillos de primos . . . . . . . . . . . . 185 8.5.4. Problema 216 - Hacer la l´ ınea . . . . . . . . . . . . . . 186
  11. 11. ´INDICE GENERAL xi9. Geometr´ computacional ıa 189 9.1. Introducci´n . . . . . . . . . . . . . . . . . . . o . . . . . . . . . 189 9.2. Geometr´ . . . . . . . . . . . . . . . . . . . . ıa . . . . . . . . . 190 9.3. Librer´ de Java . . . . . . . . . . . . . . . . ıas . . . . . . . . . 196 9.4. Cercos convexos . . . . . . . . . . . . . . . . . . . . . . . . . . 198 9.5. Clase Java para pol´ıgonos . . . . . . . . . . . . . . . . . . . . 205 9.6. C´lculo del per´ a ımetro y ´rea del pol´ a ıgo-no. . . . . . . . . . . . 207 9.7. Ejercicios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 211 9.7.1. Problema 378 - L´ ıneas que intersectan . . . . . . . . . 211 9.7.2. Problema 273 - Juego de Palos . . . . . . . . . . . . . 212 9.7.3. Problema 218 - Erradicaci´n de moscas o . . . . . . . . . 214 9.7.4. Problema 476 - Puntos en rect´ngulos a . . . . . . . . . 216A. Fundamentos matem´ticos a 219 A.1. Recordatorio de logaritmos . . . . . . . . . . . . . . . . . . . . 219 A.2. Recordatorio de series . . . . . . . . . . . . . . . . . . . . . . 220 A.2.1. Series simples . . . . . . . . . . . . . . . . . . . . . . . 220 A.2.2. Serie aritm´tica . . . . . . . . . e . . . . . . . . . . . . . 220 A.2.3. Serie geom´trica . . . . . . . . . e . . . . . . . . . . . . . 220 A.2.4. Propiedades de la sumatorias . . . . . . . . . . . . . . 221 A.2.5. Series importantes . . . . . . . . . . . . . . . . . . . . 221 A.3. Combinatoria b´sica . . . . . . . . . . a . . . . . . . . . . . . . 222 A.3.1. F´rmulas importantes . . . . . o . . . . . . . . . . . . . 222 A.4. Probabilidad elemental . . . . . . . . . . . . . . . . . . . . . . 223 A.5. T´cnicas de demostraci´n . . . . . . . e o . . . . . . . . . . . . . 224 A.5.1. Demostraci´n por contradicci´n o o . . . . . . . . . . . . . 224 A.5.2. Demostraci´n por inducci´n . . o o . . . . . . . . . . . . . 224
  12. 12. xii ´ INDICE GENERAL
  13. 13. Cap´ ıtulo 1 Algor´ ıtmica elemental1.1. Introducci´n o En este cap´ıtulo empezamos el estudio de los algoritmos. Empezaremosdefiniendo algunos t´rminos tales como algoritmo, problema, instancia, efi- eciencia e investigaremos m´todos para probar la eficiencia de los mismos. e Existen m´todos formales para realizar pruebas rigurosas sobre la correc- eci´n de los programas ´sta tem´tica est´ fuera del alcance del texto pero o e a aser´ mencionada m´s adelante solo como referencia. a a1.2. Algoritmo Definimos como algoritmo a un conjunto de pasos necesarios para re-solver un problema ya sea manualmente o por m´todos mecanizados que, eson los m´s usuales en la actualidad. El concepto de algoritmos fue definido ainicialmente por el matem´tico Persa Al-Khowˆrizmˆ en el siglo diecinueve. a a ı La ejecuci´n de un algoritmo no debe incluir procedimientos intuitivos o oque requieran creatividad. Por ejemplo, una receta de cocina puede denomi-narse un algoritmo si contiene las instrucciones precisas para preparar algo,siempre y cuando no tenga detalles tales como sal al gusto, o cocinar hastaque est´ suave, que son apreciaciones subjetivas del que prepara la receta. e Debemos indicar que los algoritmos deben cumplir un requisito funda-mental y es que todo algoritmo debe terminar en un n´mero finito de pasos. uSi consideramos el sistema operativo veremos que no es un algoritmo porqueno termina nunca, dado que est´ en un ciclo infinito. a 1
  14. 14. 2 1. ALGOR´ ITMICA ELEMENTAL Podemos citar algunos ejemplos de algoritmos conocidos, el m´todo de emultiplicar que aprendimos en la escuela, el algoritmo para verificar si unn´mero es primo y muchos otros. u1.3. Problemas e instancias Si pensamos los procedimientos para multiplicar n´meros que conocemos uveremos que hay varias formas de resolver el problema de multiplicaci´n. oTenemos los m´todos que aprendimos en la escuela, m´todos por divisi´n y e e omultiplicaci´n por 2 denominado multiplicaci´n a la rusa y otros. ¿Cu´l de o o a´stas posibles soluciones hay que implementar? Esta decisi´n corresponde ae oun ´rea muy desarrollada en el campo de la inform´tica denominada an´lisis a a ade algoritmos. Una instancia particular ser´ por ejemplo multiplicar el n´mero 123 por ıa uel 4567 pero un algoritmo debe ser capaz de funcionar correctamente no soloen una instancia del m´todo sino m´s bien en todas las instancias posibles. e a Para demostrar que un algoritmo es incorrecto, es suficiente demostrarque es incorrecto para una instancia . As´ como es dif´ probar que un ı ıcilteorema es correcto tambi´n es dif´ probar que un algoritmo es correcto. e ıcil Existen limitaciones propias de las computadoras que ponen restriccio-nes a los algoritmos. Estas pueden ser debido al tama˜o de los n´meros, n uespacio de memoria o almacenamiento. En el an´lisis de los algoritmos, se atrata de analizarlos en forma abstracta inicialmente, pero en el transcursodel texto tambi´n tocaremos aspectos espec´ e ıficos sobre la implementaci´n y ola eficiencia de los mismos.1.4. Eficiencia Cuando tenemos que resolver un problema pueden existir muchos algo-ritmos disponibles. Obviamente quisi´ramos escoger el mejor. De aqu´ nos e ıviene la pregunta ¿Cu´l es mejor? a Si tenemos un problema sencillo con algunas pocas instancias escogemos,lo m´s f´cil y nos despreocupados de la eficiencia. a a Para analizar ´sto tenemos dos m´todos. El m´todo emp´rico tambi´n e e e ı ellamado a posteriori, consiste en programar todos los m´todos y probarlos econ diferentes instancias y con la ayuda de la computadora analizamos y
  15. 15. 1.4. EFICIENCIA 3escogemos alguno. El segundo llamado m´todo apriori es el an´lisis te´rico del algoritmo, e a oque con la ayuda de las matem´ticas podemos determinar la cantidad de los arecursos requeridos por cada algoritmo en base del tama˜o de las instancias nconsideradas. El tama˜o de una instancia normalmente est´ definida por el n´mero de n a ubits, en el caso de un grafo por el n´mero de nodos y v´rtices, o en otros u epor el n´mero de elementos a procesar. La ventaja del m´todo te´rico es que u e ono depende de la computadora, lenguaje de programaci´n o implementaci´n o oparticular. En el tratamiento del tema utilizaremos en algunos casos un m´todo eh´ıbrido donde se determinar´ la eficiencia en forma te´rica y se hallar´n los a o avalores num´ricos en forma experimental. e Retornando a la pregunta debemos indicar que la eficiencia se mide entiempo. Para esto diremos que un programa toma un tiempo del orden t(n)para una instancia de tama˜o n. M´s adelante trataremos un t´rmino m´s n a e ariguroso que es la notaci´n asint´tica. o o Si tratamos el tiempo en segundos uno podr´ pensar si tengo una m´qui- ıa ana m´s r´pida el tiempo ser´ menor. ¿C´mo es que este m´todo te´rico llega a a a o e oa ser efectivo? Consideremos que el algoritmo toma un tiempo en segundos t1 (n) parauna m´quina en particular y t2 (n) para otra. Para un n´mero n suficiente- a umente grande podemos hallar unas constantes a y b tales que at(n) = bt(n)esto nos dice que cualquier ejecuci´n del algoritmo est´ acotado por una o afunci´n t(n) y existen unas constantes positivas de proporcionalidad que nos odan el tiempo. Esto indica que si cambiamos de equipo podemos ejecutar elalgoritmo 10 o 100 veces m´s r´pido y que este incremento est´ dado solo a a apor una constante de proporcionalidad. La notaci´n asint´tica dice que un algoritmo toma un tiempo del orden o ode, en funci´n del tama˜o de la instancia . Existen algoritmos que ocurren o nmuy frecuentemente y ameritan tener un nombre que a su vez se denominantasas de crecimiento. Se denominan algoritmos: Constantes los que cuyo tiempo de proceso no depende del tama˜o de n la instancia. Lineales a los que toman tiempos proporcionales a n.
  16. 16. 4 1. ALGOR´ ITMICA ELEMENTAL Cuadr´ticos a los que toman tiempos proporcionales a n2 . a C´bicos a los que toman tiempos proporcionales a n3 . u Polinomiales o exponenciales a los que toman tiempos proporcionales a n3 , nk . Logar´ ıtmicos los proporcionales a log n. Exponenciales los que toman tiempos proporcionales a 2n .A´n cuando es deseable siempre un algoritmo m´s eficiente desde el punto u ade vista te´rico podemos en muchos casos escoger en la implementaci´n otro, o odado que las constantes ocultas pueden ser muy grandes y no llegar a ser taneficientes para las instancias que deseamos procesar. La figura 1.1 representalas ordenes magnitud de los algoritmos.1.5. Qu´ considerar y qu´ contar e e Consideremos por ejemplo que queremos hallar el m´ximo de tres n´meros a ua, b, c. Para resolver ´sto escribimos el siguiente c´digo: e omaximo=0maximo=Max(a,b)maximo=Max(c,maximo)Max (a,b) if a > b return a else return b Se puede ver que se requieren exactamente dos comparaciones para deter-minar el valor m´ximo de a, b, c. Si escribi´ramos Max(Max(a,b),c) tambi´n a e ese realizar´ dos comparaciones. Este mismo algoritmo lo podemos escribir ıancomo sigue:maximo=0if (a > b)
  17. 17. ´ ´1.5. QUE CONSIDERAR Y QUE CONTAR 5 Figura 1.1: Ordenes de magnitud de algoritmos if(a > c) maximo = a else maximo = celse if b > c maximo = b else maximo = c Vemos que a´n cuando hemos codificado m´s comparaciones en la ejecu- u aci´n solo se ejecutan dos como el caso anterior. Se hace necesario establecer o
  18. 18. 6 1. ALGOR´ ITMICA ELEMENTALque es lo que debemos considerar en los programas, ´sto hace necesario defi- enir, lo que se entiende por operaciones elementales.1.5.1. Operaciones elementales Es una operaci´n cuyo tiempo de ejecuci´n est´ acotado por una constante o o aque solo depende de una implementaci´n particular como ser la m´quina, el o alenguaje de programaci´n, etc. o En el ejemplo que realizamos estaremos interesados en medir el n´mero de ucomparaciones necesarias para hallar el m´ximo. El resto de las operaciones alas consideramos operaciones elementales. En el caso de la suma de elementos de un vector lo que deseamos medires la cantidad de sumas realizadas para resolver el problema y las operacio-nes de comparaci´n necesarias para implementar una soluci´n, se consideran o ooperaciones elementales.1.5.2. An´lisis del mejor caso, caso medio y peor caso a El tiempo que toma un algoritmo puede variar considerablemente en fun-ci´n de diferentes instancias de un mismo tama˜o. Para comprender esto o nmejor consideremos el ejemplo del programa de clasificaci´n por inserci´n. o oinserci´n(t) ofor i=1 to n x= t[i] j=i-1 while j > 0 and x<t[j] t[j+1]=t[j] j=j-1 t[j+1]=x Consideremos un conjunto A en el cual queremos procesar el algorit-mo de ordenar. Para ordenar A utilizar´ ıamos inserci´n(A). Si la instancia oA est´ previamente ordenada en forma ascendente podemos probar que el atiempo de proceso es el ´ptimo porque solo inserta valores en el vector y no orealiza intercambios. En el caso de que el vector estuviera ordenado en orden descendente porcada elemento hay que recorrer todo el vector intercambiando los valores.Este claramente es el peor comportamiento que podemos tener.
  19. 19. ´ ´1.5. QUE CONSIDERAR Y QUE CONTAR 7 Si el vector estuviera ordenado en forma ascendente no realizar´ ning´n ıa uintercambio y este es el mejor caso en el que se puede estar. Sin embargo si el vector estuviera desordenado en forma aleatoria el com-portamiento se considera del caso medio. Cuando el tiempo de respuesta de un problema es cr´ ıtico normalmenteanalizamos el peor caso que es mucho m´s f´cil de analizar que el caso medio. a aPor lo tanto un an´lisis util de un algoritmo requiere un conocimiento a priori a ´de las instancias que vamos a procesar.1.5.3. Ejercicios 1. Si deseamos verificar que un n´mero es primo, explique si lo que se u desea contar para hallar la eficiencia del algoritmo es: a) el n´mero de u d´ ıgitos b) el n´mero de divisiones que se deben realizar. u 2. Indique que es lo que deber´ıamos contar en el caso de escribir un al- goritmo para multiplicar dos n´meros a fin de hallar el n´mero de u u operaciones requeridas para completar el algoritmo. 3. Suponiendo que el tiempo de proceso de una instancia es un mili segun- dos. ¿En qu´ porcentaje se incrementa el tiempo de proceso al doblar el e tama˜o de la instancia ? si el algoritmo es a) exponencial, b) logar´ n ıtmi- co, c) cuadr´tico? a1.5.4. Laboratorio Se quiere analizar el comportamiento del algoritmo de ordenar por elm´todo de inserci´n en forma experimental. Para esto seguiremos los si- e oguientes pasos: 1. Codificar el algoritmo. 2. Crear una instancia ordenada en forma ascendente. 3. Tomar el tiempo de proceso para diferentes tama˜os de instancias. n 4. Repetir el proceso para una instancia ordenada en forma descendente. 5. Luego para una instancia generada aleatoriamente. 6. Tabular los datos.
  20. 20. 8 1. ALGOR´ ITMICA ELEMENTAL 7. Interpretar los resultados.Para realizar ´ste experimento construimos el siguiente programa Java: eimport java.util.*;public class Isort { /** * Rutina Principal para la prueba experimental del * programa de ordenar por el m´todo de inserci´n e o * * @param args * 0 crear las instancias en forma descendente * 1 crear las instancias en forma ascendente * 2 crear las instancias en forma aleatoria */ public static void main(String[] args) { int opcion = Integer.parseInt(args[0]); int instanciaMaxima = 1000000; long tiempoInicio, tiempoFin, tiempoTotal; for (int i = 10; i < instanciaMaxima; i = i * 10) { Arreglo arreglo = new Arreglo(opcion, i); tiempoInicio = System.currentTimeMillis(); arreglo.Ordena(); tiempoFin = System.currentTimeMillis(); tiempoTotal = tiempoFin - tiempoInicio; System.out.println("Tama~o de la instancia " + i n + " Tiempo de proceso " + tiempoTotal); } }}class Arreglo { int[] t = new int[100000]; Random generador = new Random(); int n;
  21. 21. ´ ´1.5. QUE CONSIDERAR Y QUE CONTAR 9 Arreglo(int opcion, int n) { this.n = n; for (int i = 0; i < n; i++) { switch (opcion) { case 0: t[i] = i; break; case 1: t[i] = 10000 - i; break; case 2: t[i] = generador.nextInt(10000); } } } void Ordena() { int x, j; for (int i = 1; i < n; i++) { x = t[i]; j = i - 1; while ((j > 0) && (x < t[j])) { t[j + 1] = t[j]; j = j - 1; t[j + 1] = x; } } return; }} El resultado de los tiempos de ejecuci´n, en mili segundos, obtenidos en ola prueba del programa se ven en el cuadro 1.1. Como se ve el peor caso es cuando la instancia que creamos est´ ordenada aen forma descendente. El caso medio se da cuando el vector est´ ordenado aaleatoriamente. En diferentes ejecuciones del programa veremos que el tiempode proceso que se obtiene en el caso medio var´ Esto se debe a que los datos ıa.
  22. 22. 10 1. ALGOR´ ITMICA ELEMENTAL Tama˜o n Ordenada Ordenada instancia Instancia Ascendente Descendente Aleatoria 10 0 0 0 100 0 0 0 1000 0 20 10 10000 0 1722 861 100000 10 237622 110229 Cuadro 1.1: Tiempo de ejecuci´n en milisegundos oque se generan no est´n en el mismo orden. Situaci´n que no se da en las a ootras instancias generadas. Una buena aplicaci´n de ´ste c´digo se da en los o e ocasos en que los conjuntos de datos a los que vamos aplicar el m´todo, est´n e acasi totalmente ordenados.
  23. 23. Cap´ ıtulo 2 An´lisis de algoritmos a2.1. Introducci´n o Para el an´lisis de los algoritmos es muy importante determinar la eficien- acia de los mismos. Esto se logra a trav´s del c´lculo del tiempo de proceso o e acomplejidad . Como no existen mecanismos normalizados para el c´lculo de aestos tiempos, solo nos referimos al tiempo tomado por el algoritmo multi-plicado por una constante. A esto denominamos notaci´n asint´tica. Existen o otres conceptos, la notaci´n omega, la notaci´n teta y la notaci´n O grande o o osimbolizadas por Ω, θ y O respectivamente. En el texto se enfocar´ al an´li- a asis del tiempo de proceso con la notaci´n O. Se recomienda la bibliograf´ o ıa[McC01] y [EH96]2.2. Notaci´n orden de o La notaci´n orden de nos permite especificar la magnitud m´xima de o auna expresi´n. Sea por ejemplo una funci´n t(n) = 5n2 y podemos pensar o oque n es como el tama˜o de una instancia de un algoritmo dado. Ahora nsupongamos que esta funci´n representa la cantidad de recursos que gasta el oalgoritmo, ya sea el tiempo de proceso, almacenamiento de memoria u otros.Las constantes solo representan valores de una implementaci´n dada y no otienen que ver con el tama˜o de la instancia. n En este caso decimos que esta funci´n t(n) es del orden n2 dado que osolo est´ acotado por una constante. Esto se denomina O grande de t(n) y amatem´ticamente lo representamos como O(n2 ). a 11
  24. 24. 12 ´ 2. ANALISIS DE ALGORITMOS2.2.1. Propiedades de O grande de n Para aclarar lo que representa O grande de n describamos sus propieda-des: 1. Regla del valor m´ximo. Dadas dos funciones f (n) y g(n) que pertene- a cen a los n´meros reales positivos incluyendo el cero u O(f (n) + g(n) = max(f (n), g(n)) por ejemplo si se tiene la funci´n t(n) = 5n3 + log n − n aplicando o la regla del valor m´ximo tenemos que O(t(n)) = max(5n3 , log n, −n) a 3 cuyo valor es O(n ). 2. Igualdad de logaritmos. En la notaci´n O la expresi´n o o O(loga n) = O(logb n) que, claramente es incorrecto en las matem´ticas, pero es correcta en a la notaci´n O. o Esto se demuestra aplicando la propiedad de los logaritmos para el cambio de base loga n = logb n/logb a. Notamos que el denominador es una constante y como en la notaci´n O no se escriben las constantes o queda demostrado. 3. Propiedad reflexiva. La notaci´n O es reflexiva dado que: o f (n) O(f (n)) 4. Propiedad transitiva. Sif (n) O(g(n))yg(n) O(h(n))entoncesf (n) O(h(n)). 5. Propiedades de l´ ımites. f (n) + a) si l´ n→∞ ım g(n) ⇒ f (n) O(g(n)) y g(n) O(f (n)) f (n) b) si l´ n→∞ ım g(n) = 0 ⇒ f (n) O(g(n)) pero g(n)¬ O(f (n)) c) si l´ n→∞ f (n) = +∞ ⇒ ım g(n) f (n)¬ O(g(n)) pero g(n) O(f (n))
  25. 25. ´ ´2.3. NOTACION ASINTOTICA CONDICIONAL 132.3. Notaci´n asint´tica condicional o o Muchos algoritmos son m´s f´ciles de analizar si restringimos nuestra a aatenci´n a instancias que cumplen alguna condici´n tales como ser una po- o otencia de 2, ser de un tama˜o determinado. Consideremos por ejemplo, un nalgoritmo cuyo resultado para n = 1 es t(n) = 1 y para otros valores to-ma nt(n − 1). Este algoritmo se expresa como una soluci´n recursiva que se oescribe como sigue: 1 si n = 1, T (n) = nT (n − 1) en otros casos.en las secciones siguientes estudiamos como resolver ´stas ecuaciones deno- eminadas recurrencias.2.4. Notaci´n omega o La notaci´n omega que la representamos por Ω se utiliza para representar ola cota inferior de un algoritmo. Por ejemplo el algoritmo de ordenamientopor inserci´n demora O(n2 ) en el peor caso sin embargo la cota inferior para olos programas de clasificaci´n que trabajan unicamente por comparaciones o ´es Ω(n log n) por lo tanto podemos decir que no existen algoritmos de clasi-ficaci´n que en su peor caso sean mejores que Ω(n log n). o Sea t(n) Ω(f (n)) si existe una constante real y positiva d tal que la re-laci´n t(n) ≥ df (n) sea cierta para una cantidad infinita de valores de n, si obuscamos que la relaci´n se cumpla para un n´mero finito de valores de n, o uentonces f (n) es el l´ ımite inferior del algoritmo.2.5. Notaci´n teta o Cuando analizamos un algoritmo estar´ ıamos muy satisfechos si nuestroalgoritmo estuviera acotado simult´neamente por Ω y O. Por esta raz´n se a ointroduce la notaci´n θ. Decimos que un algoritmo es en θ(f (n)) o que f (n) oes de orden exacto si: θ(f (n)) = O(f (n)) ∩ Ω(f (n))
  26. 26. 14 ´ 2. ANALISIS DE ALGORITMOSEsta notaci´n se utiliza muy poco y como podr´ apreciar tiene un mayor o agrado de dificultad. Comunmente se utiliza la notaci´n O y para mostrar la orelaci´n contra el mejor algoritmo posible usamos la notaci´n Ω. o o2.6. An´lisis de las estructuras de control a2.6.1. Secuenciales Sean p1 y p2 dos fragmentos de un algoritmo y sean t1 y t2 los tiempos quetoman cada uno respectivamente. La regla de secuencias indica que el tiempode ejecuci´n de la secuencia p1 ; p2 toma un tiempo t1 + t2 . Por la regla del ovalor m´ximo el tiempo es (max(O(t1 ), O(t2 )). Este an´lisis considera que a ap1 y p2 son independientes. Esto es que, el proceso p2 no depende de losresultados de p1 .2.6.2. Ciclos For Consideremos el programa siguiente for i = 1 to m p(i)En este programa no confundamos m con n que es el tama˜o de una instancia. nSi p(i) toma un tiempo constante t y no depende de i entonces este tiempose repetir´ m veces y denotamos esto como: a m m t=t 1 = tm = O(m) i=1 i=1En un caso mas general donde t(i) no es constante y depende de i deber´ ıamoscalcular el resultado de la siguiente sumatoria: m t(i) i=1
  27. 27. ´2.6. ANALISIS DE LAS ESTRUCTURAS DE CONTROL 152.6.3. Llamadas recursivas El an´lisis recursivo de un algoritmo es normalmente casi directo y una asimple inspecci´n normalmente nos da una ecuaci´n de recurrencia que re- o opresenta el comportamiento del mismo. Consideremos el problema de buscarun elemento t en un arreglo a recursivamente busca (n) if n =0 return -1 else if a[n]= t return n else return busca(n-1)En este algoritmo podemos ver que para los casos en que n es 0 el tiempoque toma es una constante, cuando encuentra el valor tambi´n el tiempo es euna constante. En los otros casos depende del valor n − 1. Esto podemosrepresentar por una funci´n recurrente de la siguiente forma: o   −1 si n = 0, T (n) = 0 si a[n] = t, T (n − 1) + h(n) en otros casos. El valor de h(n) es el n´mero de operaciones elementales requeridas en cada urecursi´n. Podemos resolver esta recurrencia y demostrar que la soluci´n es o oO(n).2.6.4. Ciclos while y repeat Los ciclos while y repeat son mucho m´s dif´ a ıciles de analizar porque noexiste una forma de saber cuantas veces se va a ejecutar. Para terminar unciclo hay que probar alguna condici´n que nos dar´ un valor de termina- o aci´n.Consideremos el c´digo siguiente : o o ejemplo(n) i=0 while n>1 if par(n) n=n/2
  28. 28. 16 ´ 2. ANALISIS DE ALGORITMOS i=i+1 else n=3n/2 i=i+1 return iEn este ejemplo no podemos decidir a simple vista cuantas veces se ejecutala instrucci´n i = i + 1 se ve que cada vez que n es una potencia de 2 se opasar´ por la parte par(n) y cuya cantidad de veces ser´ el log2 n. ¿Qu´ po- a a edemos decir cuando es impar?. ¿El algoritmo termina?. Estas interroganteslas dejamos para el an´lisis del lector. a En muchos casos ser´ necesario aplicar la teor´ de probabilidades para a ıapoder determinar las veces que una instrucci´n se ejecuta. Si podemos deducir ouna recurrencia a partir del algoritmo podemos hallar f´cilmente su O(n). a ejemplo(n) i=0 while n>1 n=n/2 i=i+1 return i En este ejercicio vemos que los valores que toma n son n, n/2, n/4... porlo tanto podemos escribir esta recurrencia como 1 si n < 2, T (n) = T (n/2) + 1 en otros casos. y luego de resolverla podemos indicar que el resultado es O(log n). Losm´todos para resolver recurrencias se explicar´n m´s adelante. e a a2.6.5. An´lisis del caso medio a Consideremos el algoritmo de ordenar por el m´todo de inserci´n e oinserci´n(t) ofor i=1 to n x= t[i] j=i-1 while j > 0 and x<t[j]
  29. 29. ´2.6. ANALISIS DE LAS ESTRUCTURAS DE CONTROL 17 t[j+1]=t[j] j=j-1 t[j+1]=xDe este algoritmo podemos ver que en el mejor caso, vale decir cuando losdatos vienen ordenados en forma ascendente, el tiempo es lineal y el peorcaso es de orden cuadr´tico que se da en el caso inverso.¿Cu´l es el com- a aportamiento en el caso promedio? Para resolver esta interrogante se hacenecesario conocer a priori la funci´n de distribuci´n de probabilidad de las o oinstancias que, el algoritmo debe resolver. La conclusi´n del an´lisis del caso o amedio depende de esta suposici´n.o Supongamos que todas las permutaciones posibles de las instancias pue-den ocurrir con la misma probabilidad para determinar el resultado en prome-dio debemos sumar el tiempo que, toma ordenar cada uno de las n! posiblesinstancias. Definamos el rango parcial de T [i] como la posici´n que, ocupar´ o ıaen el arreglo si estuviera ordenado. Supongamos que 1 ≤ i ≥ n y estamosingresando en ciclo while, T [i − 1] contiene los mismos elementos que antes,dado que T [i] todav´ no se ha insertado. Este rango parcial estar´ entre 1 y ıa ai y lo llamaremos k. La cantidad de veces que los elementos del vector se desplazar´n es i − ak + 1 porque los elementos hasta i − 1 ya est´n ordenados. Como tenemos i aelementos la probabilidad que i ocurra es 1/i de aqu´ calculamos el tiempo ıque toma el ciclo while i 1 i+1 ci = (i − k + 1) = i k=1 2como tenemos n elementos en el ciclo principal debemos sumar los tiemposde las instrucciones interiores dando n n n n i+1 i 1 n2 + 3n ci = = + = i=1 i=1 2 i=1 2 i=1 2 42.6.6. An´lisis amortizado a El an´lisis del peor caso es muchas veces muy pesimista. Supongamos que atenemos un programa con un vector que almacena valores y queremos en-contrar el valor m´ınimo. Si el vector est´ ordenado devolver el primero toma aun tiempo constante. Supongamos que enviamos a esta rutina un n´mero u
  30. 30. 18 ´ 2. ANALISIS DE ALGORITMOSy si existe devuelve el valor m´ ınimo y si no existe inserta el valor y luegodevuelve el valor m´ ınimo. ¿Cu´nto tiempo toma el algoritmo? En el peor acaso toma el tiempo de insertar y de buscar, sin embargo muchas veces so-lamente tomar´ el tiempo de buscar. Para entender el tiempo amortizado de aeste algoritmo podemos pensar que, en cada b´squeda ahorramos un poco upara gastarlo cuando tengamos que realizar un inserci´n. Esto nos muestra oclaramente que el tiempo amortizado depende de la probabilidad de que ten-gamos inserciones y cual la probabilidad de que tengamos solo b´squedas. uLa esperanza matem´tica es una buena medida para estos an´lisis. a a2.7. Soluci´n de recurrencias o Como ya vimos los algoritmos se pueden representar en forma de ecua-ciones recurrentes aqu´ explicaremos tres m´todos de soluci´n, substituci´n ı e o oo adivinaci´n, iterativos y un m´tdo general para casos especiales. o e2.7.1. M´todo por substituci´n e o El m´todo de substituci´n que bien puede llamarse m´todo por adivi- e o enaci´n se basa en adivinar de que forma es la soluci´n, luego aplicamos la o ohip´tesis inductiva para valores menores y demostrando que ´sto se cum- o eple, decimos que nuestra suposici´n es correcta. Consideremos el siguiente oejemplo: 1 n = 1, T (n) = (2.7.1) 2T (n/2) + n otros casos.La recurrencia 2.7.1 puede escribirse como la ecuaci´n o 2T (n/2) + n (2.7.2)Primero buscamos una soluci´n y suponemos que el tiempo asint´tico O(n) o ode esta ecuaci´n es O(n log n). Debemos probar que ´sta es una funci´n para o e ola cual todos los valores de T (n) son menores con lo cual se demuestra quees una cota superior. Suponiendo que esta soluci´n es aplicable a n/2 para una constante arbi- o
  31. 31. ´2.7. SOLUCION DE RECURRENCIAS 19traria c en la ecuaci´n 2.7.2 tenemos: o n n T (n) ≤ 2c( log ) + n 2 2 n = cn log + n 2 = cn log n − cn log 2 + n = cn log n − cn + n ≤ n log n para c ≥ 1Con lo cual estar´ probada nuestra suposici´n. Como ver´ en algunas con- ıa o adiciones es dif´ de probar esta recursi´n. Por ejemplo, consideremos que ıcil oT (1) = 1 reemplazando nuestra hip´tesis se tiene T (1) = c1 log 1 que da oT (1) = c0 y para cualquier valor de c vemos que no es posible probar nues-tra suposici´n por lo que, es usual imponer algunas restricciones tales como oprobar desde T (2). Realizar suposiciones acertadas es muy complicado, por lo que se hacenecesario realizar diferentes pruebas con valores m´ximos y m´ a ınimos parahallar la soluci´n. Lo que estamos realizando es una hip´tesis inductiva y en o omuchas ocasiones podemos agregar m´s constantes por ejemplo, T (n) ≤ cn− ab, el restar algunas constantes de los t´rminos de menor orden es considerada epor muchos como una soluci´n intuitiva. o Este m´todo es un problema, la cota superior probada no garantiza que eexiste otra cota superior que sea menor a la probada. Consideremos porejemplo que se hubiese elegido n2 como una cota superior tambi´n se hubiera e 2probado cierta porque O(n log(n)) ∈ O(n ).2.7.2. Cambio de variables En muchos casos las soluciones tienen formas que no hemos visto antespor lo que no podemos plantear la soluci´n. Consideremos la ecuaci´n: o o √ T (n) = 2T ( n) + log nPodemos simplificar esta ecuaci´n reemplazando n por 2m que nos da o m T (2m ) = 2T (2 2 ) + log 2m m T (2m ) = 2T (2 2 ) + m
  32. 32. 20 ´ 2. ANALISIS DE ALGORITMOSahora reemplacemos T (2m ) por S(m) m S(m) = 2S( )+m 2Esta soluci´n ya la conocemos y sabemos que es O(n log n) entonces reem- oplazando en esta respuesta las substituciones que hemos realizado T (n) = T (2m ) = S(m) = O(m log m) = O(log n log log n).2.7.3. Ejercicios 1. Muestre que la soluci´n de T (n) = T (n/2) + 1 es O(log n) o 2. Muestre que la soluci´n de T (n) = T (n/2 + 17) + 1 es O(log n) o √ 3. Resuelva la recurrencia T (n) = T ( n) + 1 realizando cambio de varia- bles2.7.4. M´todo iterativo e El m´todo iterativo es mucho mejor porque no requiere adivinanzas que, epueden hacernos suponer verdaderos resultados err´neos. Pero a cambio se orequiere un poco m´s de ´lgebra. Consideremos la siguiente recursi´n: a a o 1 n = 1, T (n) = T ( n ) + 1 otros casos. 2para resolver ´sta vamos comenzar en T (n) y vamos a desarrollar la misma e n n T (n) = T ( ) + 1 reemplazando n por 2 2 n = T( ) + 2 4 n = T( ) + 3 8 hasta hallar la forma general n = T( k) + k 2cuando n = 1 termina y por lo tanto T (1) toma la forma de: n T (1) = 1 = k 2
  33. 33. ´2.7. SOLUCION DE RECURRENCIAS 21reemplazando tenemos: T (n) = 1 + k = 1 + log nde aqu´ sabemos que el tiempo asint´tico de esta recursi´n es O(log n). Re- ı o osolvamos con este m´todo la ecuaci´n 2.7.1 e o 1 n = 1, T (n) = 2T ( n ) + n otros casos. 2desarrollando la recursi´n tenemos o n T (n) = 2T ( ) + n 2 n n = 2(2T ( ) + ) + n 4 2 n n = 4T ( ) + 2 + n 4 2 n = 4T ( ) + 2n 4 n n = 4(2T ( ) + ) + 2n 8 4 n = 8T ( ) + 3n termina cuando 8 = 2k T (1) + knEste algoritmo termina cuando llegamos a T (1); donde toma el valor de 1cuando n/2k = 1. Despejando el valor de k tenemos k = log n reemplazando: T (n) = 2k + kn = n + n log n = O(n log n)Ejemplo:Dar las cotas superiores para T(n) en las siguiente recurrencia. Asumiendoque T(n) es constante para n ≤ 1. T (n) = T (n − 1) + nSoluci´n: oDesarrollando la recursi´n tenemos: o T (n) = T (n − 2) + (n − 1) + n = T (n − 3) + (n − 2) + (n − 1) + n
  34. 34. 22 ´ 2. ANALISIS DE ALGORITMOSque toma la forma de n i i=1resolviendo tenemos n(n + 1) 2 2por lo que la cota superior es O(n )2.7.5. Ejercicios 1. Resolver T (n) = 3T (n/2) + n. 2. Resolver T (n) = T (n/3) + T (2n/3) + n. 3. Resolver T (n) = T (n − a) + T (a) + n2.7.6. Teorema master Existen muchas recursiones que tienen la forma n T (n) = aT ( ) + f (n) (2.7.3) bLa ecuaci´n 2.7.3 es un caso t´ o ıpico de soluciones que aplican la t´cnica divide ey vencer´s donde a representa el n´mero de llamadas recursivas T (n/b) el a utama˜o de las llamadas y f (n) el trabajo realizado en cada recursi´n. Esta n oecuaci´n nos da las siguientes soluciones: o   si f (n) = nlogb a− , ≥ 0 ⇒ O(nlogb a ),   si f (n) = nlogb a   ⇒ O(nlogb a log n),   si f (n) = nlogb a+ , ≥ 0 ⇒ O(f (n)),    para polinomios donde  T (n) = (2.7.4)  f (n) = cnk se simplifica   si a > bk   ⇒ O(nlogb a ),   si a = bk   ⇒ O(nk log n),  si a < bk ⇒ O(nk ) La demostraci´n del teorema se puede consultar en la bibliograf´ [GB96] o ıacitada al final del texto. Resuelva los siguientes ejercicios utilizando el teorema master:
  35. 35. ´2.7. SOLUCION DE RECURRENCIAS 23 1. n T (n) = 2T ( ) + n 2 En este caso vea que a = 2, b = 2, k = 1 y f (n) = nk aplicando el teorema estamos en el caso a = bk por lo que la soluciones es T (n) = O(nk log n) = O(n log n) 2. T (n) = 9T (n/3) + n Veamos a = 9, b = 3, k = 1 por lo que a ≥ bk entonces la soluci´n es o log3 9 n = O(n2) 3. T (n) = T (2n/3) + 1 Veamos a = 1, b = 2/3, k = 0 por lo que a = bk entonces la soluci´n es o O(nk log n) = O(log n)Ejercicios Resolver utilizando el teorema master. 1. T (n) = 4T (n/2) + n. 2. T (n) = 4T (n/2) + n2 . 3. T (n) = 4T (n/2) + n3 .2.7.7. Soluci´n general de recurrencias lineales o Las recurrencias de la forma a0 tn + a1 tn−1 + .... + ak tn−k = f (n) (2.7.5)se denominan: ecuaci´n l´ o ıneal, homog´nea y de coeficientes constantes. Cuan- edo f (n) es 0 se denomina homog´nea y en otros casos no homog´nea. Una e ebuena descripci´n de como resolver estas recurrencias pueden ver en los libros ode Grimaldi [Gri77] y Knuth [RLG94]
  36. 36. 24 ´ 2. ANALISIS DE ALGORITMOSSoluci´n de recurrencias homog´neas o e La soluci´n de una ecuaci´n t(n) puede representarse como la combinacion o olineal de funciones por ejemplo c1 f (n) + c2 g(n).Consideremos la expresi´n o p(x) = a0 xk + a1 xk−1 + .... + ak = 0La soluci´n trivial es cuando x = 0 no es de inter´s. Esta ecuaci´n se denomi- o e ona ecuaci´n caracter´ o ıstica o polinomio caracter´ ıstico. Recordando el ´lgebra, aun polinomio de orden k tiene exactamente k ra´ ıces y puede factorizarsecomo k p(x) = (x − ri ) i=1donde ri son las soluciones de p(x) = 0. Cualquier ri es una soluci´n a ´ste o epolinomio por lo que tambi´n son una soluci´n a t(n) porque cualquier com- e obinacion lineal tambien conforma una soluci´n, por lo que podemos concluir oque k n t(n) = (ci ri ) i=1las soluciones se dan para cualquier constante que se escoja, siempre que lasra´ sean distintas. ıcesEjemplo Consideremos la secuencia de Fibonacci: n si n = 0, n = 1, f (n) = f (n − 1) + f (n − 2) otros casos.reescribimos esta ecuaci´n para satisfacer la ecuaci´n 2.7.5 o o f (n) − f (n − 1) − f (n − 2) = 0Esta ecuaci´n tiene un polinomio caracter´ o ıstico x2 − x − 1 = 0que tiene como soluci´n las ra´ o ıces √ √ 1+ 5 1− 5 r1 = y r2 = 2 2
  37. 37. ´2.7. SOLUCION DE RECURRENCIAS 25entonces la soluci´n general es o n n f (n) = c1 r1 + c2 r2ahora utilizando las condiciones iniciales podemos hallar las constantes c1 , c2 c1 + c2 = 0 r1 c 1 + r2 c 2 = 1resolviendo obtenemos 1 1 c1 = √ y c2 = − √ 5 5reemplazando en la ecuaci´n obtenemos o √ √ 1 1+ 5 n 1− 5 n f (n) = √ [( ) −( ) ] 5 2 2Solucici´n de recurrencias no homog´neas o e La recurrencias de la forma a0 tn + a1 tn−1 + .... + ak tn−k = bn p(n) (2.7.6) b es una constante p(n) es un polinomio en n de grado d.Consideremos la recurrencia siguiente: t(n) − 2t(n − 1) = 3n (2.7.7)en este caso b = 3 y p(n) = 1 es un polinomio de grado 0, para resolvereste problema primero lo convertimos a un problema familiar, la recurrenciahomog´nea. Multiplicamos por tres la ecuaci´n 2.7.7 e o 3t(n) − 6t(n − 1) = 3n+1 (2.7.8)ahora cambiemos n − 1 por n 3t(n − 1) − 6t(n − 1) = 3n (2.7.9)
  38. 38. 26 ´ 2. ANALISIS DE ALGORITMOSrestando 2.7.7 de 2.7.8 tenemos una ecuaci´n homog´nea o e t(n) − 5t(n − 2) + 6t(n − 2) = 0 (2.7.10)el polinomio caracter´ ıstico es x2 − 5x + 6 = (x − 2)(x − 3)por lo que, las soluciones son de la forma t(n) = c1 2n + c2 3nSin embargo no es cierto que cualquier constante arbitraria producir´ la asoluci´n correcta porque la ecuaci´n 2.7.7 no es la misma que la 2.7.10. o oPodemos resolver la ecuaci´n original en base de t(0) y t(1). La funci´n o ooriginal implica que t1 = 2t0 + 3 por lo que, las ecuaciones a resolver son: c1 + c2 = t(0) 2c1 + 3c2 = 2t(0) + 3de donde obtenemos c1 = t(0) − 3 y c2 = 3. Resolviendo esto tenemos t(n) = (t(0) − 3)2n + 3n+1que es independiente de la soluci´n inicial t(n) O(3n ) o
  39. 39. 2.8. EJERCICIOS RESUELTOS 272.8. Ejercicios resueltos 1. ¿Cu´nto tiempo toma el siguiente algoritmo? a l=0 for i=1 to n for j=1 to n^2 for k=1 to n^3 l=l+1 Soluci´n: o Recordando que los ciclos for son las sumas de los tiempos individuales de los procedimientos interiores podemos escribir n n2 n3 T (n) = ( ( 1)) i=1 j=1 k=1 n n2 = ( n3 ) i=1 j=1 n 3 2 =n n i=1 = n n n = n6 3 2 2. ¿Cu´nto tiempo toma el siguiente algoritmo? a l=0 for i=1 to n for j=1 to i for k=1 to j l=l+1 Soluci´n: o
  40. 40. 28 ´ 2. ANALISIS DE ALGORITMOS En este caso no todas las sumas son hasta n n i j T (n) = ( ( 1)) i=1 j=1 k=1 n i = ( j) i=1 j=1 n i+1 = i i=1 2 n i2 i = ( + ) i=1 2 2 n n i2 i = + i=1 2 i=1 2 n(n + 1)(2n + 1) n + 1 = + 12 2 2 (n + n)(2n + 1) n + 1 = + 12 2 2n3 + 3n2 + n n + 1 = + 12 2 3 = O(n ) 3. Resolver utilizando el teorema master procedure DC(n) if n < = 1 DC(n/2) for j=1 to n^3 x[j]=0 Soluci´n o Del an´lisis vemos que a 1 n = 1, T (n) = 3 T (n/2) + n otros casos. De donde tenemos a = 1, b = 2, k = 3 lo que nos lleva al caso 1 < 23 dando como soluci´n O(nk ) = O(n3 ). o
  41. 41. 2.8. EJERCICIOS RESUELTOS 29 4. Resolver utilizando el teorema master procedure DC(n) if n < = 1 for i=1 to 8 DC(n/2) for j=1 to n^3 x[j]=0 Soluci´n o Del an´lisis vemos que hay la parte de algoritmo que divide el problema a DC(n/2) se procesa 8 veces lo que cambia el problema anterior a 1 n = 1, T (n) = 8T (n/2) + n3 otros casos. De donde tenemos a = 8, b = 2, k = 3 lo que nos lleva al caso 8 = 23 dando como soluci´n O(nk log n) = O(n3 log n). o 5. Dar las cotas superiores para T(n) en las siguientes recurrencias. Asu- miendo que T(n) es constante para n ≤ 1. n T (n) = 2T ( ) + n3 2 Soluci´n: o Desarrollando la recursi´n tenemos: o n T (n) = 2T ( ) + n3 2 n n = 2(2T ( ) + ( )3 ) + n3 4 2 n n3 = 4T ( ) + 2( ) + n3 4 2 n n n3 = 4(2T ( ) + ( )3 ) + 2( ) + n3 8 4 2 n n 3 n3 = 8T ( ) + 4( ) + 2( ) + n3 8 4 2 De aqu´ vemos que para un t´rmino i toma la forma ı e i−1 i n n T (n) = 2 T ( i ) + 2k ( k )3 2 k=0 2
  42. 42. 30 ´ 2. ANALISIS DE ALGORITMOS n T(1) se da cuando 2i = 1 entonces i = log(n) reemplazando tenemos: i−1 1 2 T (n) = n + n3 ( ) k=1 2k i−1 1 = n + n3 ( ) k=1 4k i−1 1 1 − ( 1 )i−1 4 ( )= 1 k=1 4k 1− 4 4 1 = (1 − i−1 ) 3 4 4 1 1 = − 3 3 4i−2 4 1 1 = − 3 3 22i−2 4 1 1 = − 2 log(n)−2 3 32 4 1 4 = − 3 3 n2 4 1 4 T (n) = n + n3 ( − ) 3 3 n2 4 4 = n + n3 − n) 3 3 por lo que, la cota superior es O(n3 ) 6. Dar las cotas superiores para T(n) en las siguientes recurrencias. Asu- miendo que T(n) es constante para n ≤ 2. n √ T (n) = 2T ( ) + n 4 Soluci´n: o Desarrollando la recursi´n tenemos: o n n √ T (n) = 2(2T ( )+ )+ n 42 4 n n √ = 4T ( )+2 + n 42 4
  43. 43. 2.8. EJERCICIOS RESUELTOS 31 De aqu´ vemos que para un t´rmino i toma la forma ı e i−1 n i n T (n) = 2 T ( i ) + 2k ( ) 4 k=1 4k n t(1) se da cuando 4i = 1 entonces i = log4 (n) adem´s notamos que a i i 2 4 = (2 ) reemplazando tenemos: i−1 i n √ = 2 T (1) + 2k + n k=1 4k i−1 n √ n = + n+ 2k 2 k=1 2k2 i−1 n √ √ = + n+ n 2 k=1 n √ √ = + n + (i − 1) n 2 n √ √ = + n + (log4 (n) − 1) n 2 n √ √ √ = + n + log4 (n) n − n 2 √ por lo que la cota superior es O(log(n) n). 7. Dar las cotas superiores para T(n) asumiendo que T(n) es constante para n ≤ 2. √ T (n) = 2T ( n) + 1 Soluci´n: o Desarrollando la recursi´n tenemos: o 1 T (n) = 2T (n 2 ) + 1 1 2 = 4T (n( 2 ) ) + 2 + 1 1 3 = 8T (n( 2 ) ) + 4 + 2 + 1 que toma la forma de k=i−1 1 i ( 2 )i T (n) = 2 T (n )+ 2k k=0 1 i ( 2 )i = 2 T (n ) + 2i − i

×