SlideShare una empresa de Scribd logo
1 de 240
Descargar para leer sin conexión
Universidad Mayor de San Andr´se
     Facultad de Ciencias Puras y Naturales
             Carrera de Inform´tica
                              a




Fundamentos de la Programaci´n
                            o
     Jorge Humberto Ter´n Pomier
                       a
              <teranj@acm.org>




        La Paz - Bolivia, Diciembre 2006
ii
Prefacio

Motivaci´n
        o
    Los conceptos presentados se estudian en muchas de las materias del
pregrado de la carrera de inform´tica, con el rigor necesario. Sin embargo,
                                  a
en mi experiencia docente he podido ver que hay muchos estudiantes que
carecen de elementos pr´cticos con los que puedan aplicar directamente los
                        a
conceptos aprendidos y lo que se pretende es cubrir este vac´ıo.
    El presente texto trata de introducir los conceptos de programaci´n, a
                                                                       o
estudiantes de pregrado con un enfoque nuevo.
    Para una adecuada compresi´n de la tem´tica presentada en el libro, el
                                 o            a
lector debr´ tener alguna experiencia en el desarrollo de programas. El libro
           a
no pretende ense˜ar a codificar programas, sino a resolver problemas.
                 n


Contenido
    Se presentan en el cap´  ıtulo 1, los conceptos de algor´
                                                            ıtmica elemental con
el prop´sito de introducir a los estudiantes, al concepto de la eficiencia de los
        o
programas.
    El cap´
          ıtulo dos introduce los conceptos de an´lisis de algoritmos con una
                                                     a
serie de ejercicios aplicados. Se incluyen algunos laboratorios que tienen el
prop´sito de que, los estudiantes asimilen estos conceptos en forma experi-
     o
mental.
    El cap´
          ıtulo tres introduce el concepto de la teor´ de n´meros, introdu-
                                                         ıa      u
ciendo las librer´ de Java. Se muestran ejemplos de n´meros grandes y
                  ıas                                          u
aplicaciones en la criptograf´  ıa.
    El cap´
          ıtulo 4 trata de la escritura de programas con miras a la prueba del
c´digo. En este cap´
 o                    ıtulo se introduce un concepto que es el dise˜o por con-
                                                                     n

                                      iii
iv


tratos y la forma de aplicar en Java. Aunque este concepto fue introducido
inicialmente en el lenguaje Eifel, actualmente tiene mucho inter´s en el de-
                                                                       e
sarrollo de aplicaciones. El texto no trata de trabajar en conceptos de l´gica
                                                                            o
formal en su totalidad, lo que propone es una introducci´n a estos conceptos
                                                              o
para 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
                                                                             o
b´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                                                      o
de problemas de combinatoria b´sica. a
     El cap´
           ıtulo 7 explica como utilizar las librer´ del lenguaje Java y como
                                                      ıas
resolver problemas con pilas, listas enlazadas, conjuntos, ´rboles y colas de
                                                                 a
prioridad.
     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-
                                            ıa
truir una librer´ de rutinas b´sicas para desarrollar aplicaciones relacionadas
                  ıa             a
a 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                                           o
est´ orientada a la programaci´n orientada a objetos. Segundo porque el
    a                                o
lenguaje 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-
                                                    o
cursos de programaci´n, fueron traducidos al espa˜ol manteniendo los datos
                         o                               n
de entrada y salida en ingl´s. Esto se hizo para permitir a los interesados
                               e
resolver los problemas y poder validar sus respuestas con el Juez en L´      ınea
de Valladolid, en su p´gina web http://acm.uva.es. Estos ejercicios llevan
                           a
adelante 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
              a
te´ricas, pr´cticas y de laboratorio.
  o         a
    Los laboratorios proponen ejercicios que tienen la finalidad de evaluar
experimentalmente la ejecuci´n de los algoritmos. Esto permite que los estu-
                              o
diantes obtengan una vivencia de los resultados te´ricos.
                                                  o
    Se puede aplicar en una clase de teor´ de dos per´
                                            ıa         ıodos y una segunda
clase que ser´ de ejercicios o laboratorio.
              ıa
v


Contenido del CD
    El CD adjunto contiene los programas presentados en el texto. Hay que
aclarar que todos han sido codificados utilizando el compilador Java 1.5 de
Sun Microsystems. El cap´    ıtulo 4 relacionado a JML fue codificado con la
versi´n 1.4, dado que a la fecha de la redacci´n de la obra no estaba disponible
     o                                        o
una versi´n de JML que funcionara con la versi´n 1.5.
          o                                       o


Agradecimientos
   Quiero agradecer a mi esposa, a mis hijos por los aportes realizados y
finalmente al Dr. Miguel Angel Revilla por dejarme reproducir ejercicios del
Juez en L´ınea.
   Lic. Jorge Ter´n Pomier, M.Sc.
                 a
vi
´
                                           Indice general

Prefacio                                                                                                   III


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

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

3. 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
´
INDICE GENERAL                                                                                            ix


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

5. 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
x                                                                             ´
                                                                              INDICE GENERAL


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

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

8. 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
´
INDICE GENERAL                                                                                           xi


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

A. 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
xii   ´
      INDICE GENERAL
Cap´
                                                       ıtulo 1

                        Algor´
                             ıtmica elemental

1.1.     Introducci´n
                   o
     En este cap´ıtulo empezamos el estudio de los algoritmos. Empezaremos
definiendo algunos t´rminos tales como algoritmo, problema, instancia, efi-
                       e
ciencia e investigaremos m´todos para probar la eficiencia de los mismos.
                            e
     Existen m´todos formales para realizar pruebas rigurosas sobre la correc-
               e
ci´n de los programas ´sta tem´tica est´ fuera del alcance del texto pero
  o                      e      a         a
ser´ mencionada m´s adelante solo como referencia.
    a                a


1.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,
                                                    e
son los m´s usuales en la actualidad. El concepto de algoritmos fue definido
          a
inicialmente 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
              o
que 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 hasta
que 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.
                                                        u
Si consideramos el sistema operativo veremos que no es un algoritmo porque
no termina nunca, dado que est´ en un ciclo infinito.
                                a

                                      1
2                                            1. ALGOR´
                                                     ITMICA ELEMENTAL



   Podemos citar algunos ejemplos de algoritmos conocidos, el m´todo de
                                                                 e
multiplicar que aprendimos en la escuela, el algoritmo para verificar si un
n´mero es primo y muchos otros.
 u


1.3.     Problemas e instancias
    Si pensamos los procedimientos para multiplicar n´meros que conocemos
                                                     u
veremos que hay varias formas de resolver el problema de multiplicaci´n. o
Tenemos los m´todos que aprendimos en la escuela, m´todos por divisi´n y
                e                                      e               o
multiplicaci´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 a
e                                                           o
un ´rea muy desarrollada en el campo de la inform´tica denominada an´lisis
    a                                              a                  a
de algoritmos.
    Una instancia particular ser´ por ejemplo multiplicar el n´mero 123 por
                                ıa                             u
el 4567 pero un algoritmo debe ser capaz de funcionar correctamente no solo
en 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 demostrar
que es incorrecto para una instancia . As´ como es dif´ probar que un
                                           ı              ıcil
teorema 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          u
espacio de memoria o almacenamiento. En el an´lisis de los algoritmos, se
                                                  a
trata de analizarlos en forma abstracta inicialmente, pero en el transcurso
del texto tambi´n tocaremos aspectos espec´
                 e                          ıficos sobre la implementaci´n y
                                                                       o
la 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          ı          e
llamado a posteriori, consiste en programar todos los m´todos y probarlos
                                                         e
con diferentes instancias y con la ayuda de la computadora analizamos y
1.4. EFICIENCIA                                                            3


escogemos alguno.
    El segundo llamado m´todo apriori es el an´lisis te´rico del algoritmo,
                           e                      a       o
que con la ayuda de las matem´ticas podemos determinar la cantidad de los
                                a
recursos requeridos por cada algoritmo en base del tama˜o de las instancias
                                                           n
consideradas.
    El tama˜o de una instancia normalmente est´ definida por el n´mero de
             n                                    a                 u
bits, en el caso de un grafo por el n´mero de nodos y v´rtices, o en otros
                                       u                    e
por el n´mero de elementos a procesar. La ventaja del m´todo te´rico es que
          u                                               e      o
no depende de la computadora, lenguaje de programaci´n o implementaci´n
                                                         o                o
particular.
    En el tratamiento del tema utilizaremos en algunos casos un m´todo e
h´ıbrido donde se determinar´ la eficiencia en forma te´rica y se hallar´n los
                              a                        o               a
valores num´ricos en forma experimental.
             e
    Retornando a la pregunta debemos indicar que la eficiencia se mide en
tiempo. 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         a
riguroso que es la notaci´n asint´tica.
                         o        o
    Si tratamos el tiempo en segundos uno podr´ pensar si tengo una m´qui-
                                                ıa                      a
na m´s r´pida el tiempo ser´ menor. ¿C´mo es que este m´todo te´rico llega
      a a                    a           o                  e      o
a ser efectivo?
    Consideremos que el algoritmo toma un tiempo en segundos t1 (n) para
una m´quina en particular y t2 (n) para otra. Para un n´mero n suficiente-
        a                                                  u
mente 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                     a
funci´n t(n) y existen unas constantes positivas de proporcionalidad que nos
      o
dan el tiempo. Esto indica que si cambiamos de equipo podemos ejecutar el
algoritmo 10 o 100 veces m´s r´pido y que este incremento est´ dado solo
                             a a                                 a
por una constante de proporcionalidad.
    La notaci´n asint´tica dice que un algoritmo toma un tiempo del orden
               o      o
de, en funci´n del tama˜o de la instancia . Existen algoritmos que ocurren
             o          n
muy frecuentemente y ameritan tener un nombre que a su vez se denominan
tasas 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.
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                                              a
de vista te´rico podemos en muchos casos escoger en la implementaci´n otro,
           o                                                        o
dado que las constantes ocultas pueden ser muy grandes y no llegar a ser tan
eficientes para las instancias que deseamos procesar. La figura 1.1 representa
las 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         u
a, b, c. Para resolver ´sto escribimos el siguiente c´digo:
                       e                             o

maximo=0
maximo=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                           e
se realizar´ dos comparaciones. Este mismo algoritmo lo podemos escribir
           ıan
como sigue:

maximo=0
if (a > b)
´                ´
1.5. QUE CONSIDERAR Y QUE CONTAR                                           5




              Figura 1.1: Ordenes de magnitud de algoritmos

 if(a > c)
   maximo =   a
 else
   maximo =   c
else
   if b > c
     maximo   = b
   else
     maximo   = c


    Vemos que a´n cuando hemos codificado m´s comparaciones en la ejecu-
                 u                             a
ci´n solo se ejecutan dos como el caso anterior. Se hace necesario establecer
  o
6                                             1. ALGOR´
                                                      ITMICA ELEMENTAL



que es lo que debemos considerar en los programas, ´sto hace necesario defi-
                                                     e
nir, 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     a
que solo depende de una implementaci´n particular como ser la m´quina, el
                                       o                           a
lenguaje de programaci´n, etc.
                        o
    En el ejemplo que realizamos estaremos interesados en medir el n´mero de
                                                                    u
comparaciones necesarias para hallar el m´ximo. El resto de las operaciones
                                          a
las consideramos operaciones elementales.
    En el caso de la suma de elementos de un vector lo que deseamos medir
es 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                                        o
operaciones 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                                             n
mejor consideremos el ejemplo del programa de clasificaci´n por inserci´n.
                                                        o             o
inserci´n(t)
       o
for 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
                                                       o
A est´ previamente ordenada en forma ascendente podemos probar que el
      a
tiempo de proceso es el ´ptimo porque solo inserta valores en el vector y no
                         o
realiza intercambios.
    En el caso de que el vector estuviera ordenado en orden descendente por
cada elemento hay que recorrer todo el vector intercambiando los valores.
Este claramente es el peor comportamiento que podemos tener.
´                ´
1.5. QUE CONSIDERAR Y QUE CONTAR                                             7


    Si el vector estuviera ordenado en forma ascendente no realizar´ ning´n
                                                                     ıa     u
intercambio 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 normalmente
analizamos el peor caso que es mucho m´s f´cil de analizar que el caso medio.
                                          a a
Por 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?
                 a

1.5.4.    Laboratorio
    Se quiere analizar el comportamiento del algoritmo de ordenar por el
m´todo de inserci´n en forma experimental. Para esto seguiremos los si-
  e               o
guientes 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.
8                                            1. ALGOR´
                                                     ITMICA ELEMENTAL



    7. Interpretar los resultados.

Para realizar ´ste experimento construimos el siguiente programa Java:
              e

import 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;
´                ´
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
                                           o
la prueba del programa se ven en el cuadro 1.1.
    Como se ve el peor caso es cuando la instancia que creamos est´ ordenada
                                                                  a
en forma descendente. El caso medio se da cuando el vector est´ ordenado
                                                                  a
aleatoriamente. En diferentes ejecuciones del programa veremos que el tiempo
de proceso que se obtiene en el caso medio var´ Esto se debe a que los datos
                                               ıa.
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
                                          o

que se generan no est´n en el mismo orden. Situaci´n que no se da en las
                      a                              o
otras instancias generadas. Una buena aplicaci´n de ´ste c´digo se da en los
                                               o     e    o
casos en que los conjuntos de datos a los que vamos aplicar el m´todo, est´n
                                                                e         a
casi totalmente ordenados.
Cap´
                                                       ıtulo 2

                        An´lisis de algoritmos
                          a

2.1.      Introducci´n
                    o
    Para el an´lisis de los algoritmos es muy importante determinar la eficien-
              a
cia de los mismos. Esto se logra a trav´s del c´lculo del tiempo de proceso o
                                          e      a
complejidad . Como no existen mecanismos normalizados para el c´lculo de
                                                                     a
estos tiempos, solo nos referimos al tiempo tomado por el algoritmo multi-
plicado por una constante. A esto denominamos notaci´n asint´tica. Existen
                                                        o       o
tres conceptos, la notaci´n omega, la notaci´n teta y la notaci´n O grande
                           o                   o                 o
simbolizadas por Ω, θ y O respectivamente. En el texto se enfocar´ al an´li-
                                                                   a       a
sis 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                                                  a
una expresi´n. Sea por ejemplo una funci´n t(n) = 5n2 y podemos pensar
            o                               o
que n es como el tama˜o de una instancia de un algoritmo dado. Ahora
                         n
supongamos que esta funci´n representa la cantidad de recursos que gasta el
                           o
algoritmo, ya sea el tiempo de proceso, almacenamiento de memoria u otros.
Las constantes solo representan valores de una implementaci´n dada y no
                                                             o
tienen 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
                                          o
solo est´ acotado por una constante. Esto se denomina O grande de t(n) y
        a
matem´ticamente lo representamos como O(n2 ).
       a

                                      11
12                                                         ´
                                                      2. ANALISIS DE ALGORITMOS



2.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))
´       ´
2.3. NOTACION ASINTOTICA CONDICIONAL                                       13


2.3.     Notaci´n asint´tica condicional
               o       o
    Muchos algoritmos son m´s f´ciles de analizar si restringimos nuestra
                              a a
atenci´n a instancias que cumplen alguna condici´n tales como ser una po-
      o                                         o
tencia de 2, ser de un tama˜o determinado. Consideremos por ejemplo, un
                            n
algoritmo 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
                                                       o
escribe como sigue:

                              1          si n = 1,
                   T (n) =
                              nT (n − 1) en otros casos.

en las secciones siguientes estudiamos como resolver ´stas ecuaciones deno-
                                                     e
minadas recurrencias.


2.4.     Notaci´n omega
               o
    La notaci´n omega que la representamos por Ω se utiliza para representar
              o
la cota inferior de un algoritmo. Por ejemplo el algoritmo de ordenamiento
por inserci´n demora O(n2 ) en el peor caso sin embargo la cota inferior para
           o
los 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
    o
buscamos que la relaci´n se cumpla para un n´mero finito de valores de n,
                        o                         u
entonces f (n) es el l´
                      ımite inferior del algoritmo.


2.5.     Notaci´n teta
               o
    Cuando analizamos un algoritmo estar´ ıamos muy satisfechos si nuestro
algoritmo estuviera acotado simult´neamente por Ω y O. Por esta raz´n se
                                  a                                   o
introduce la notaci´n θ. Decimos que un algoritmo es en θ(f (n)) o que f (n)
                   o
es de orden exacto si:

                        θ(f (n)) = O(f (n)) ∩ Ω(f (n))
14                                                      ´
                                                   2. ANALISIS DE ALGORITMOS



Esta notaci´n se utiliza muy poco y como podr´ apreciar tiene un mayor
            o                                    a
grado de dificultad. Comunmente se utiliza la notaci´n O y para mostrar la
                                                     o
relaci´n contra el mejor algoritmo posible usamos la notaci´n Ω.
      o                                                    o



2.6.      An´lisis de las estructuras de control
            a
2.6.1.     Secuenciales
   Sean p1 y p2 dos fragmentos de un algoritmo y sean t1 y t2 los tiempos que
toman cada uno respectivamente. La regla de secuencias indica que el tiempo
de ejecuci´n de la secuencia p1 ; p2 toma un tiempo t1 + t2 . Por la regla del
          o
valor m´ximo el tiempo es (max(O(t1 ), O(t2 )). Este an´lisis considera que
        a                                                a
p1 y p2 son independientes. Esto es que, el proceso p2 no depende de los
resultados 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.
                                                      n
Si p(i) toma un tiempo constante t y no depende de i entonces este tiempo
se repetir´ m veces y denotamos esto como:
          a

                         m          m
                              t=t         1 = tm = O(m)
                        i=1         i=1


En un caso mas general donde t(i) no es constante y depende de i deber´
                                                                      ıamos
calcular el resultado de la siguiente sumatoria:

                                        m
                                            t(i)
                                     i=1
´
2.6. ANALISIS DE LAS ESTRUCTURAS DE CONTROL                             15


2.6.3.    Llamadas recursivas
   El an´lisis recursivo de un algoritmo es normalmente casi directo y una
         a
simple inspecci´n normalmente nos da una ecuaci´n de recurrencia que re-
                o                                o
presenta el comportamiento del mismo. Consideremos el problema de buscar
un 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 tiempo
que toma es una constante, cuando encuentra el valor tambi´n el tiempo es
                                                             e
una constante. En los otros casos depende del valor n − 1. Esto podemos
representar 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
                        u
recursi´n. Podemos resolver esta recurrencia y demostrar que la soluci´n es
       o                                                              o
O(n).

2.6.4.    Ciclos while y repeat
    Los ciclos while y repeat son mucho m´s dif´
                                          a    ıciles de analizar porque no
existe una forma de saber cuantas veces se va a ejecutar. Para terminar un
ciclo hay que probar alguna condici´n que nos dar´ un valor de termina-
                                    o               a
ci´n.Consideremos el c´digo siguiente :
  o                     o

    ejemplo(n)
       i=0
       while n>1
          if par(n)
             n=n/2
16                                                  ´
                                               2. ANALISIS DE ALGORITMOS



               i=i+1
            else
              n=3n/2
              i=i+1
      return i
En este ejemplo no podemos decidir a simple vista cuantas veces se ejecuta
la instrucci´n i = i + 1 se ve que cada vez que n es una potencia de 2 se
            o
pasar´ por la parte par(n) y cuya cantidad de veces ser´ el log2 n. ¿Qu´ po-
      a                                                  a              e
demos decir cuando es impar?. ¿El algoritmo termina?. Estas interrogantes
las dejamos para el an´lisis del lector.
                      a
    En muchos casos ser´ necesario aplicar la teor´ de probabilidades para
                        a                           ıa
poder determinar las veces que una instrucci´n se ejecuta. Si podemos deducir
                                            o
una 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... por
lo 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). Los
m´todos para resolver recurrencias se explicar´n m´s adelante.
 e                                            a   a

2.6.5.     An´lisis del caso medio
             a
     Consideremos el algoritmo de ordenar por el m´todo de inserci´n
                                                  e               o
inserci´n(t)
       o
for i=1 to n
    x= t[i]
    j=i-1
    while j > 0 and x<t[j]
´
2.6. ANALISIS DE LAS ESTRUCTURAS DE CONTROL                                   17


        t[j+1]=t[j]
        j=j-1
     t[j+1]=x
De este algoritmo podemos ver que en el mejor caso, vale decir cuando los
datos vienen ordenados en forma ascendente, el tiempo es lineal y el peor
caso es de orden cuadr´tico que se da en el caso inverso.¿Cu´l es el com-
                         a                                      a
portamiento en el caso promedio? Para resolver esta interrogante se hace
necesario conocer a priori la funci´n de distribuci´n de probabilidad de las
                                    o               o
instancias que, el algoritmo debe resolver. La conclusi´n del an´lisis del caso
                                                       o        a
medio 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! posibles
instancias. Definamos el rango parcial de T [i] como la posici´n que, ocupar´
                                                             o               ıa
en el arreglo si estuviera ordenado. Supongamos que 1 ≤ i ≥ n y estamos
ingresando 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                                            a
i y lo llamaremos k.
    La cantidad de veces que los elementos del vector se desplazar´n es i −
                                                                     a
k + 1 porque los elementos hasta i − 1 ya est´n ordenados. Como tenemos i
                                                a
elementos 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
                                                                 2

como tenemos n elementos en el ciclo principal debemos sumar los tiempos
de 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      4

2.6.6.    An´lisis amortizado
            a
   El an´lisis del peor caso es muchas veces muy pesimista. Supongamos que
         a
tenemos 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
                                          a
un tiempo constante. Supongamos que enviamos a esta rutina un n´mero    u
18                                                 ´
                                              2. ANALISIS DE ALGORITMOS



y si existe devuelve el valor m´
                               ınimo y si no existe inserta el valor y luego
devuelve el valor m´ ınimo. ¿Cu´nto tiempo toma el algoritmo? En el peor
                               a
caso 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
               a
este algoritmo podemos pensar que, en cada b´squeda ahorramos un poco
                                               u
para gastarlo cuando tengamos que realizar un inserci´n. Esto nos muestra
                                                      o
claramente que el tiempo amortizado depende de la probabilidad de que ten-
gamos inserciones y cual la probabilidad de que tengamos solo b´squedas.
                                                                   u
La esperanza matem´tica es una buena medida para estos an´lisis.
                      a                                      a



2.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            o
o adivinaci´n, iterativos y un m´tdo general para casos especiales.
           o                    e


2.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                             e
naci´n se basa en adivinar de que forma es la soluci´n, luego aplicamos la
     o                                              o
hip´tesis inductiva para valores menores y demostrando que ´sto se cum-
   o                                                          e
ple, decimos que nuestra suposici´n es correcta. Consideremos el siguiente
                                 o
ejemplo:
                             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                                  o
de esta ecuaci´n es O(n log n). Debemos probar que ´sta es una funci´n para
              o                                     e               o
la cual todos los valores de T (n) son menores con lo cual se demuestra que
es una cota superior.
    Suponiendo que esta soluci´n es aplicable a n/2 para una constante arbi-
                                o
´
2.7. SOLUCION DE RECURRENCIAS                                             19


traria 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 ≥ 1

Con lo cual estar´ probada nuestra suposici´n. Como ver´ en algunas con-
                    ıa                         o            a
diciones es dif´ de probar esta recursi´n. Por ejemplo, consideremos que
                ıcil                       o
T (1) = 1 reemplazando nuestra hip´tesis se tiene T (1) = c1 log 1 que da
                                        o
T (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
              o
probar desde T (2).
    Realizar suposiciones acertadas es muy complicado, por lo que se hace
necesario realizar diferentes pruebas con valores m´ximos y m´
                                                     a            ınimos para
hallar la soluci´n. Lo que estamos realizando es una hip´tesis inductiva y en
                 o                                       o
muchas ocasiones podemos agregar m´s constantes por ejemplo, T (n) ≤ cn−
                                        a
b, el restar algunas constantes de los t´rminos de menor orden es considerada
                                        e
por muchos como una soluci´n intuitiva.
                              o
    Este m´todo es un problema, la cota superior probada no garantiza que
            e
existe otra cota superior que sea menor a la probada. Consideremos por
ejemplo que se hubiese elegido n2 como una cota superior tambi´n se hubiera
                                                                e
                                            2
probado 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 antes
por lo que no podemos plantear la soluci´n. Consideremos la ecuaci´n:
                                        o                         o
                                     √
                         T (n) = 2T ( n) + log n

Podemos 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
20                                                    ´
                                                 2. ANALISIS DE ALGORITMOS



ahora reemplacemos T (2m ) por S(m)
                                           m
                              S(m) = 2S(     )+m
                                           2
Esta soluci´n ya la conocemos y sabemos que es O(n log n) entonces reem-
           o
plazando 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-
        bles

2.7.4.      M´todo iterativo
             e
   El m´todo iterativo es mucho mejor porque no requiere adivinanzas que,
        e
pueden hacernos suponer verdaderos resultados err´neos. Pero a cambio se
                                                  o
requiere un poco m´s de ´lgebra. Consideremos la siguiente recursi´n:
                  a      a                                        o
                                 1           n = 1,
                       T (n) =
                                 T ( n ) + 1 otros casos.
                                     2

para 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
                                         2
cuando n = 1 termina y por lo tanto T (1) toma la forma de:
                                           n
                             T (1) = 1 = k
                                          2
´
2.7. SOLUCION DE RECURRENCIAS                                           21


reemplazando tenemos:
                         T (n) = 1 + k = 1 + log n
de aqu´ sabemos que el tiempo asint´tico de esta recursi´n es O(log n). Re-
      ı                             o                   o
solvamos con este m´todo la ecuaci´n 2.7.1
                   e              o
                                1            n = 1,
                   T (n) =
                                2T ( n ) + n otros casos.
                                     2

desarrollando 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) + kn
Este algoritmo termina cuando llegamos a T (1); donde toma el valor de 1
cuando 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. Asumiendo
que T(n) es constante para n ≤ 1.
                             T (n) = T (n − 1) + n
Soluci´n:
      o
Desarrollando la recursi´n tenemos:
                        o
                 T (n) = T (n − 2) + (n − 1) + n
                       = T (n − 3) + (n − 2) + (n − 1) + n
22                                                      ´
                                                   2. ANALISIS DE ALGORITMOS



que toma la forma de
                                         n
                                               i
                                         i=1

resolviendo tenemos
                                  n(n + 1)
                                     2
                                  2
por 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) + n

2.7.6.      Teorema master
     Existen muchas recursiones que tienen la forma
                                         n
                             T (n) = aT ( ) + f (n)                     (2.7.3)
                                         b
La ecuaci´n 2.7.3 es un caso t´
          o                   ıpico de soluciones que aplican la t´cnica divide
                                                                  e
y vencer´s donde a representa el n´mero de llamadas recursivas T (n/b) el
         a                            u
tama˜o de las llamadas y f (n) el trabajo realizado en cada recursi´n. Esta
     n                                                                o
ecuaci´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                                                     ıa
citada al final del texto.
    Resuelva los siguientes ejercicios utilizando el teorema master:
´
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-
                                     e
do f (n) es 0 se denomina homog´nea y en otros casos no homog´nea. Una
                                 e                                e
buena descripci´n de como resolver estas recurrencias pueden ver en los libros
                o
de Grimaldi [Gri77] y Knuth [RLG94]
24                                                                ´
                                                             2. ANALISIS DE ALGORITMOS



Soluci´n de recurrencias homog´neas
      o                       e
    La soluci´n de una ecuaci´n t(n) puede representarse como la combinacion
             o               o
lineal de funciones por ejemplo c1 f (n) + c2 g(n).Consideremos la expresi´n
                                                                          o

                     p(x) = a0 xk + a1 xk−1 + .... + ak = 0

La soluci´n trivial es cuando x = 0 no es de inter´s. Esta ecuaci´n se denomi-
         o                                         e             o
na ecuaci´n caracter´
         o            ıstica o polinomio caracter´
                                                 ıstico. Recordando el ´lgebra,
                                                                       a
un polinomio de orden k tiene exactamente k ra´       ıces y puede factorizarse
como
                                         k
                               p(x) =            (x − ri )
                                         i=1

donde ri son las soluciones de p(x) = 0. Cualquier ri es una soluci´n a ´ste
                                                                   o    e
polinomio por lo que tambi´n son una soluci´n a t(n) porque cualquier com-
                           e               o
binacion lineal tambien conforma una soluci´n, por lo que podemos concluir
                                           o
que
                                             k
                                                       n
                                t(n) =            (ci ri )
                                         i=1
las soluciones se dan para cualquier constante que se escoja, siempre que las
ra´ sean distintas.
  ıces

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

Esta ecuaci´n tiene un polinomio caracter´
           o                             ıstico

                                x2 − x − 1 = 0

que tiene como soluci´n las ra´
                     o        ıces
                                  √           √
                             1+ 5          1− 5
                       r1 =         y r2 =
                                 2           2
´
2.7. SOLUCION DE RECURRENCIAS                                                25


entonces la soluci´n general es
                  o
                                          n       n
                              f (n) = c1 r1 + c2 r2

ahora utilizando las condiciones iniciales podemos hallar las constantes c1 , c2

                                        c1 + c2 = 0
                                  r1 c 1 + r2 c 2 = 1

resolviendo obtenemos
                                   1          1
                             c1 = √ y c2 = − √
                                    5          5
reemplazando en la ecuaci´n obtenemos
                          o
                                   √          √
                            1 1+ 5 n       1− 5 n
                   f (n) = √ [(       ) −(      ) ]
                             5    2          2

Solucici´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 resolver
este problema primero lo convertimos a un problema familiar, la recurrencia
homog´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)
26                                                   ´
                                                2. ANALISIS DE ALGORITMOS



restando 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 3n

Sin embargo no es cierto que cualquier constante arbitraria producir´ la  a
soluci´n correcta porque la ecuaci´n 2.7.7 no es la misma que la 2.7.10.
      o                             o
Podemos resolver la ecuaci´n original en base de t(0) y t(1). La funci´n
                             o                                               o
original implica que t1 = 2t0 + 3 por lo que, las ecuaciones a resolver son:

                              c1 + c2 = t(0)
                            2c1 + 3c2 = 2t(0) + 3

de donde obtenemos c1 = t(0) − 3 y c2 = 3. Resolviendo esto tenemos

                         t(n) = (t(0) − 3)2n + 3n+1

que es independiente de la soluci´n inicial t(n) O(3n )
                                 o
2.8. EJERCICIOS RESUELTOS                                                27


2.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
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
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
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
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
32                                                         ´
                                                      2. ANALISIS DE ALGORITMOS


                  1 i
       cuando n( 2 ) = 2 estamos en T(2) que es constante
                                  1
                                 ( )i log(n) = log(2) = 1
                                  2
                                        2i = log(n)
                    T (n) = log(n)T (2) + log(n) − 1 = 2 log(n) − 1
       la cota superior es O(log n)


2.9.       Ejercicios
     1. Resolver las siguientes recurrencias utilizando el teorema master, ve-
        rificar con el m´todo de substituci´n y desarrollando la recurrencia.
                        e                   o
        Asuma que T(1)=1.

         a) T (n) = 2T ( n ) + log(n)
                         2
         b) T (n) = 3T ( n ) + log(n)
                         3
         c) T (n) = 4T ( n ) + log(n)
                         4
         d ) T (n) = 2T ( n ) + n2
                          2
         e) T (n) = 2T ( n ) + n3
                         2
         f ) T (n) = 2T ( n ) + n4
                          2
                               √
         g) T (n) = (n)T ( n) + n

     2. Hallar el O(n) del siguiente programa de b´squeda binaria.
                                                  u

       int l,u,m;
       l=0; u=n-1;
       while(l<u) {
          m=(l+u)/2
          if (a[mid]< x)
            l=m+1
          else
          if (a[mid]> x)
              l=m-1
          else
2.9. EJERCICIOS                                                           33


         return ("hallado")
         }
         return ("no existe">)

  3. Hallar el O(n) del siguiente programa para hallar el m´ximo com´n
                                                               a           u
     divisor. Sugerencia escribir el tama˜o de la instancia en cada iteraci´n
                                         n                                 o
     y aproximar a una serie arm´nica.
                                   o

     mcd(m,n) {
        while (n> 0){
           resto=m%n
           m=n
           n=resto
          }
          return (m)
      }

  4. Hallar el O(n) del siguiente programa de exponenciaci´n.
                                                          o

     pot(x,n) {
     if (n=0)
        return 1
     if (n==1)
        return x
     if (par(n))
        return (pot(x*x,n/2))
     else
        return (pot(x*x,n/2)*x)
     }

  5. Realizar una prueba experimental para comprobar las cotas superiores
     de los programas anteriormente propuestos.
  6. Codificar el programa de b´squeda binaria en forma recursiva y hallar
                              u
     el O(n)
  7. Se tienen dos programas A y B cuyo tiempo de ejecuci´n es 150 log(n)
                                                         o
                         2
     milisegundos y 150n respectivamente. Indique que programa es mejor
     para n < 100,n < 1, 000, n > 10, 000
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

Más contenido relacionado

La actualidad más candente

Portafolio de evidencias unidad 4 cesar adrian barrios alarcon
Portafolio de evidencias unidad 4 cesar adrian barrios alarconPortafolio de evidencias unidad 4 cesar adrian barrios alarcon
Portafolio de evidencias unidad 4 cesar adrian barrios alarconCesar Mcfly
 
Portafolio calculo diferencial 2 a
Portafolio calculo diferencial 2 aPortafolio calculo diferencial 2 a
Portafolio calculo diferencial 2 aCarlos Alcivar
 
Aprendizaje
AprendizajeAprendizaje
Aprendizajecua cua
 
Tarea02programacion
Tarea02programacionTarea02programacion
Tarea02programacionivan dario
 

La actualidad más candente (6)

Portafolio de evidencias unidad 4 cesar adrian barrios alarcon
Portafolio de evidencias unidad 4 cesar adrian barrios alarconPortafolio de evidencias unidad 4 cesar adrian barrios alarcon
Portafolio de evidencias unidad 4 cesar adrian barrios alarcon
 
Portafolio calculo diferencial 2 a
Portafolio calculo diferencial 2 aPortafolio calculo diferencial 2 a
Portafolio calculo diferencial 2 a
 
Aprendizaje
AprendizajeAprendizaje
Aprendizaje
 
Fasts tone capture y movie maker
Fasts tone capture y movie makerFasts tone capture y movie maker
Fasts tone capture y movie maker
 
Tarea02programacion
Tarea02programacionTarea02programacion
Tarea02programacion
 
Las getchar
Las getcharLas getchar
Las getchar
 

Destacado

Educación virtual vs educacion presencial
 Educación virtual vs educacion presencial Educación virtual vs educacion presencial
Educación virtual vs educacion presencialfloresnegras
 
Decaleg de bones_practiques_tic belen polo
Decaleg de bones_practiques_tic belen poloDecaleg de bones_practiques_tic belen polo
Decaleg de bones_practiques_tic belen polomfpfilosofia
 
Educacion virtual vs educacion presencial
Educacion virtual vs educacion presencialEducacion virtual vs educacion presencial
Educacion virtual vs educacion presencialfloresnegras
 
Discriminación de-las-mujeres-inteligencia
Discriminación de-las-mujeres-inteligenciaDiscriminación de-las-mujeres-inteligencia
Discriminación de-las-mujeres-inteligenciamfpfilosofia
 
Las revoluciones francesas
Las revoluciones francesasLas revoluciones francesas
Las revoluciones francesasbpcGCE
 
Las revoluciones francesas
Las revoluciones francesasLas revoluciones francesas
Las revoluciones francesasbpcGCE
 
Oración subordinada sustantiva ii
Oración subordinada sustantiva iiOración subordinada sustantiva ii
Oración subordinada sustantiva iiAtramgo
 
Recuperación 4º
Recuperación 4ºRecuperación 4º
Recuperación 4ºAtramgo
 
Plan de auditoríadistribucion
Plan de auditoríadistribucionPlan de auditoríadistribucion
Plan de auditoríadistribucioncostosyauditorias
 
Ventureka Pitch
Ventureka PitchVentureka Pitch
Ventureka PitchJokerESP
 
Arley procedimiento para el diseño de un sistema de costos de calidad
Arley procedimiento  para el diseño de un sistema de costos  de calidadArley procedimiento  para el diseño de un sistema de costos  de calidad
Arley procedimiento para el diseño de un sistema de costos de calidadcostosyauditorias
 

Destacado (20)

Manual analisis-de-algoritmos
Manual analisis-de-algoritmosManual analisis-de-algoritmos
Manual analisis-de-algoritmos
 
Ergonomia
ErgonomiaErgonomia
Ergonomia
 
Educación virtual vs educacion presencial
 Educación virtual vs educacion presencial Educación virtual vs educacion presencial
Educación virtual vs educacion presencial
 
Decaleg de bones_practiques_tic belen polo
Decaleg de bones_practiques_tic belen poloDecaleg de bones_practiques_tic belen polo
Decaleg de bones_practiques_tic belen polo
 
Que es un ensayo
Que es un ensayoQue es un ensayo
Que es un ensayo
 
Deysi costo de calidad
Deysi costo de calidadDeysi costo de calidad
Deysi costo de calidad
 
Ejer
EjerEjer
Ejer
 
Calendario de actividades
Calendario de actividadesCalendario de actividades
Calendario de actividades
 
Educacion virtual vs educacion presencial
Educacion virtual vs educacion presencialEducacion virtual vs educacion presencial
Educacion virtual vs educacion presencial
 
Discriminación de-las-mujeres-inteligencia
Discriminación de-las-mujeres-inteligenciaDiscriminación de-las-mujeres-inteligencia
Discriminación de-las-mujeres-inteligencia
 
Las revoluciones francesas
Las revoluciones francesasLas revoluciones francesas
Las revoluciones francesas
 
Las revoluciones francesas
Las revoluciones francesasLas revoluciones francesas
Las revoluciones francesas
 
Oración subordinada sustantiva ii
Oración subordinada sustantiva iiOración subordinada sustantiva ii
Oración subordinada sustantiva ii
 
Recuperación 4º
Recuperación 4ºRecuperación 4º
Recuperación 4º
 
Plan de auditoríadistribucion
Plan de auditoríadistribucionPlan de auditoríadistribucion
Plan de auditoríadistribucion
 
Ventureka Pitch
Ventureka PitchVentureka Pitch
Ventureka Pitch
 
Arley procedimiento para el diseño de un sistema de costos de calidad
Arley procedimiento  para el diseño de un sistema de costos  de calidadArley procedimiento  para el diseño de un sistema de costos  de calidad
Arley procedimiento para el diseño de un sistema de costos de calidad
 
Cómputo
CómputoCómputo
Cómputo
 
Conten 2
Conten 2Conten 2
Conten 2
 
Procedimiento sistema de cc
Procedimiento sistema de ccProcedimiento sistema de cc
Procedimiento sistema de cc
 

Similar a 845 e bd01 (20)

Propuesta Pedagógica
Propuesta PedagógicaPropuesta Pedagógica
Propuesta Pedagógica
 
Fp pf-2012-2
Fp pf-2012-2Fp pf-2012-2
Fp pf-2012-2
 
Propuesta s.i
Propuesta s.iPropuesta s.i
Propuesta s.i
 
Trabajo de computacion
Trabajo de computacionTrabajo de computacion
Trabajo de computacion
 
Trabajo de computación
Trabajo de computaciónTrabajo de computación
Trabajo de computación
 
Proyecto
ProyectoProyecto
Proyecto
 
Java
JavaJava
Java
 
Ejercicios java
Ejercicios javaEjercicios java
Ejercicios java
 
Java
JavaJava
Java
 
Ejercicios
EjerciciosEjercicios
Ejercicios
 
Java
JavaJava
Java
 
Java
JavaJava
Java
 
Ejercicios de-programacion-en-java
Ejercicios de-programacion-en-javaEjercicios de-programacion-en-java
Ejercicios de-programacion-en-java
 
Ejercicios en java
Ejercicios en javaEjercicios en java
Ejercicios en java
 
Java
JavaJava
Java
 
Ejercicios de programacion en java
Ejercicios de programacion en javaEjercicios de programacion en java
Ejercicios de programacion en java
 
Ejercicios de-programacion-en-java
Ejercicios de-programacion-en-javaEjercicios de-programacion-en-java
Ejercicios de-programacion-en-java
 
Java pdf
Java pdfJava pdf
Java pdf
 
Portafolio programacion
Portafolio programacionPortafolio programacion
Portafolio programacion
 
Ejercicios de-programacion-en-java
Ejercicios de-programacion-en-javaEjercicios de-programacion-en-java
Ejercicios de-programacion-en-java
 

845 e bd01

  • 1. Universidad Mayor de San Andr´se Facultad de Ciencias Puras y Naturales Carrera de Inform´tica a Fundamentos de la Programaci´n o Jorge Humberto Ter´n Pomier a <teranj@acm.org> La Paz - Bolivia, Diciembre 2006
  • 2. ii
  • 3. Prefacio Motivaci´n o Los conceptos presentados se estudian en muchas de las materias del pregrado de la carrera de inform´tica, con el rigor necesario. Sin embargo, a en mi experiencia docente he podido ver que hay muchos estudiantes que carecen de elementos pr´cticos con los que puedan aplicar directamente los a conceptos aprendidos y lo que se pretende es cubrir este vac´ıo. El presente texto trata de introducir los conceptos de programaci´n, a o estudiantes de pregrado con un enfoque nuevo. Para una adecuada compresi´n de la tem´tica presentada en el libro, el o a lector debr´ tener alguna experiencia en el desarrollo de programas. El libro a no pretende ense˜ar a codificar programas, sino a resolver problemas. n Contenido Se presentan en el cap´ ıtulo 1, los conceptos de algor´ ıtmica elemental con el prop´sito de introducir a los estudiantes, al concepto de la eficiencia de los o programas. El cap´ ıtulo dos introduce los conceptos de an´lisis de algoritmos con una a serie de ejercicios aplicados. Se incluyen algunos laboratorios que tienen el prop´sito de que, los estudiantes asimilen estos conceptos en forma experi- o mental. El cap´ ıtulo tres introduce el concepto de la teor´ de n´meros, introdu- ıa u ciendo las librer´ de Java. Se muestran ejemplos de n´meros grandes y ıas u aplicaciones en la criptograf´ ıa. El cap´ ıtulo 4 trata de la escritura de programas con miras a la prueba del c´digo. En este cap´ o ıtulo se introduce un concepto que es el dise˜o por con- n iii
  • 4. iv tratos y la forma de aplicar en Java. Aunque este concepto fue introducido inicialmente en el lenguaje Eifel, actualmente tiene mucho inter´s en el de- e sarrollo de aplicaciones. El texto no trata de trabajar en conceptos de l´gica o formal en su totalidad, lo que propone es una introducci´n a estos conceptos o para 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 o b´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 o de problemas de combinatoria b´sica. a El cap´ ıtulo 7 explica como utilizar las librer´ del lenguaje Java y como ıas resolver problemas con pilas, listas enlazadas, conjuntos, ´rboles y colas de a prioridad. 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- ıa truir una librer´ de rutinas b´sicas para desarrollar aplicaciones relacionadas ıa a a 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 o est´ orientada a la programaci´n orientada a objetos. Segundo porque el a o lenguaje 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- o cursos de programaci´n, fueron traducidos al espa˜ol manteniendo los datos o n de entrada y salida en ingl´s. Esto se hizo para permitir a los interesados e resolver los problemas y poder validar sus respuestas con el Juez en L´ ınea de Valladolid, en su p´gina web http://acm.uva.es. Estos ejercicios llevan a adelante 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 a te´ricas, pr´cticas y de laboratorio. o a Los laboratorios proponen ejercicios que tienen la finalidad de evaluar experimentalmente la ejecuci´n de los algoritmos. Esto permite que los estu- o diantes obtengan una vivencia de los resultados te´ricos. o Se puede aplicar en una clase de teor´ de dos per´ ıa ıodos y una segunda clase que ser´ de ejercicios o laboratorio. ıa
  • 5. v Contenido del CD El CD adjunto contiene los programas presentados en el texto. Hay que aclarar que todos han sido codificados utilizando el compilador Java 1.5 de Sun Microsystems. El cap´ ıtulo 4 relacionado a JML fue codificado con la versi´n 1.4, dado que a la fecha de la redacci´n de la obra no estaba disponible o o una versi´n de JML que funcionara con la versi´n 1.5. o o Agradecimientos Quiero agradecer a mi esposa, a mis hijos por los aportes realizados y finalmente al Dr. Miguel Angel Revilla por dejarme reproducir ejercicios del Juez en L´ınea. Lic. Jorge Ter´n Pomier, M.Sc. a
  • 6. vi
  • 7. ´ Indice general Prefacio III 1. 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 . . . . . . . . . . . . . . . . . . . . . . . . 7 2. 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. 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 . . . . . . . . 34 3. 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. ´ INDICE GENERAL ix 4. 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 . . . . . . . . . . . . . . . . . . . . . . . . . 99 5. 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. x ´ INDICE GENERAL 6. 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 . . . . . . . . 152 7. 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 . . . . . . . . . . . . . . . . . . . . 168 8. 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. ´ INDICE GENERAL xi 9. 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 . . . . . . . . . 216 A. 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. xii ´ INDICE GENERAL
  • 13. Cap´ ıtulo 1 Algor´ ıtmica elemental 1.1. Introducci´n o En este cap´ıtulo empezamos el estudio de los algoritmos. Empezaremos definiendo algunos t´rminos tales como algoritmo, problema, instancia, efi- e ciencia e investigaremos m´todos para probar la eficiencia de los mismos. e Existen m´todos formales para realizar pruebas rigurosas sobre la correc- e ci´n de los programas ´sta tem´tica est´ fuera del alcance del texto pero o e a a ser´ mencionada m´s adelante solo como referencia. a a 1.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, e son los m´s usuales en la actualidad. El concepto de algoritmos fue definido a inicialmente 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 o que 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 hasta que 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. u Si consideramos el sistema operativo veremos que no es un algoritmo porque no termina nunca, dado que est´ en un ciclo infinito. a 1
  • 14. 2 1. ALGOR´ ITMICA ELEMENTAL Podemos citar algunos ejemplos de algoritmos conocidos, el m´todo de e multiplicar que aprendimos en la escuela, el algoritmo para verificar si un n´mero es primo y muchos otros. u 1.3. Problemas e instancias Si pensamos los procedimientos para multiplicar n´meros que conocemos u veremos que hay varias formas de resolver el problema de multiplicaci´n. o Tenemos los m´todos que aprendimos en la escuela, m´todos por divisi´n y e e o multiplicaci´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 a e o un ´rea muy desarrollada en el campo de la inform´tica denominada an´lisis a a a de algoritmos. Una instancia particular ser´ por ejemplo multiplicar el n´mero 123 por ıa u el 4567 pero un algoritmo debe ser capaz de funcionar correctamente no solo en 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 demostrar que es incorrecto para una instancia . As´ como es dif´ probar que un ı ıcil teorema 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 u espacio de memoria o almacenamiento. En el an´lisis de los algoritmos, se a trata de analizarlos en forma abstracta inicialmente, pero en el transcurso del texto tambi´n tocaremos aspectos espec´ e ıficos sobre la implementaci´n y o la 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 ı e llamado a posteriori, consiste en programar todos los m´todos y probarlos e con diferentes instancias y con la ayuda de la computadora analizamos y
  • 15. 1.4. EFICIENCIA 3 escogemos alguno. El segundo llamado m´todo apriori es el an´lisis te´rico del algoritmo, e a o que con la ayuda de las matem´ticas podemos determinar la cantidad de los a recursos requeridos por cada algoritmo en base del tama˜o de las instancias n consideradas. El tama˜o de una instancia normalmente est´ definida por el n´mero de n a u bits, en el caso de un grafo por el n´mero de nodos y v´rtices, o en otros u e por el n´mero de elementos a procesar. La ventaja del m´todo te´rico es que u e o no depende de la computadora, lenguaje de programaci´n o implementaci´n o o particular. En el tratamiento del tema utilizaremos en algunos casos un m´todo e h´ıbrido donde se determinar´ la eficiencia en forma te´rica y se hallar´n los a o a valores num´ricos en forma experimental. e Retornando a la pregunta debemos indicar que la eficiencia se mide en tiempo. 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 a riguroso que es la notaci´n asint´tica. o o Si tratamos el tiempo en segundos uno podr´ pensar si tengo una m´qui- ıa a na m´s r´pida el tiempo ser´ menor. ¿C´mo es que este m´todo te´rico llega a a a o e o a ser efectivo? Consideremos que el algoritmo toma un tiempo en segundos t1 (n) para una m´quina en particular y t2 (n) para otra. Para un n´mero n suficiente- a u mente 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 a funci´n t(n) y existen unas constantes positivas de proporcionalidad que nos o dan el tiempo. Esto indica que si cambiamos de equipo podemos ejecutar el algoritmo 10 o 100 veces m´s r´pido y que este incremento est´ dado solo a a a por una constante de proporcionalidad. La notaci´n asint´tica dice que un algoritmo toma un tiempo del orden o o de, en funci´n del tama˜o de la instancia . Existen algoritmos que ocurren o n muy frecuentemente y ameritan tener un nombre que a su vez se denominan tasas 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. 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 a de vista te´rico podemos en muchos casos escoger en la implementaci´n otro, o o dado que las constantes ocultas pueden ser muy grandes y no llegar a ser tan eficientes para las instancias que deseamos procesar. La figura 1.1 representa las 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 u a, b, c. Para resolver ´sto escribimos el siguiente c´digo: e o maximo=0 maximo=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 e se realizar´ dos comparaciones. Este mismo algoritmo lo podemos escribir ıan como sigue: maximo=0 if (a > b)
  • 17. ´ ´ 1.5. QUE CONSIDERAR Y QUE CONTAR 5 Figura 1.1: Ordenes de magnitud de algoritmos if(a > c) maximo = a else maximo = c else if b > c maximo = b else maximo = c Vemos que a´n cuando hemos codificado m´s comparaciones en la ejecu- u a ci´n solo se ejecutan dos como el caso anterior. Se hace necesario establecer o
  • 18. 6 1. ALGOR´ ITMICA ELEMENTAL que es lo que debemos considerar en los programas, ´sto hace necesario defi- e nir, 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 a que solo depende de una implementaci´n particular como ser la m´quina, el o a lenguaje de programaci´n, etc. o En el ejemplo que realizamos estaremos interesados en medir el n´mero de u comparaciones necesarias para hallar el m´ximo. El resto de las operaciones a las consideramos operaciones elementales. En el caso de la suma de elementos de un vector lo que deseamos medir es 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 o operaciones 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 n mejor consideremos el ejemplo del programa de clasificaci´n por inserci´n. o o inserci´n(t) o for 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 o A est´ previamente ordenada en forma ascendente podemos probar que el a tiempo de proceso es el ´ptimo porque solo inserta valores en el vector y no o realiza intercambios. En el caso de que el vector estuviera ordenado en orden descendente por cada elemento hay que recorrer todo el vector intercambiando los valores. Este claramente es el peor comportamiento que podemos tener.
  • 19. ´ ´ 1.5. QUE CONSIDERAR Y QUE CONTAR 7 Si el vector estuviera ordenado en forma ascendente no realizar´ ning´n ıa u intercambio 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 normalmente analizamos el peor caso que es mucho m´s f´cil de analizar que el caso medio. a a Por 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? a 1.5.4. Laboratorio Se quiere analizar el comportamiento del algoritmo de ordenar por el m´todo de inserci´n en forma experimental. Para esto seguiremos los si- e o guientes 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. 8 1. ALGOR´ ITMICA ELEMENTAL 7. Interpretar los resultados. Para realizar ´ste experimento construimos el siguiente programa Java: e import 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. ´ ´ 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 o la prueba del programa se ven en el cuadro 1.1. Como se ve el peor caso es cuando la instancia que creamos est´ ordenada a en forma descendente. El caso medio se da cuando el vector est´ ordenado a aleatoriamente. En diferentes ejecuciones del programa veremos que el tiempo de proceso que se obtiene en el caso medio var´ Esto se debe a que los datos ıa.
  • 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 o que se generan no est´n en el mismo orden. Situaci´n que no se da en las a o otras instancias generadas. Una buena aplicaci´n de ´ste c´digo se da en los o e o casos en que los conjuntos de datos a los que vamos aplicar el m´todo, est´n e a casi totalmente ordenados.
  • 23. Cap´ ıtulo 2 An´lisis de algoritmos a 2.1. Introducci´n o Para el an´lisis de los algoritmos es muy importante determinar la eficien- a cia de los mismos. Esto se logra a trav´s del c´lculo del tiempo de proceso o e a complejidad . Como no existen mecanismos normalizados para el c´lculo de a estos tiempos, solo nos referimos al tiempo tomado por el algoritmo multi- plicado por una constante. A esto denominamos notaci´n asint´tica. Existen o o tres conceptos, la notaci´n omega, la notaci´n teta y la notaci´n O grande o o o simbolizadas por Ω, θ y O respectivamente. En el texto se enfocar´ al an´li- a a sis 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 a una expresi´n. Sea por ejemplo una funci´n t(n) = 5n2 y podemos pensar o o que n es como el tama˜o de una instancia de un algoritmo dado. Ahora n supongamos que esta funci´n representa la cantidad de recursos que gasta el o algoritmo, ya sea el tiempo de proceso, almacenamiento de memoria u otros. Las constantes solo representan valores de una implementaci´n dada y no o tienen 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 o solo est´ acotado por una constante. Esto se denomina O grande de t(n) y a matem´ticamente lo representamos como O(n2 ). a 11
  • 24. 12 ´ 2. ANALISIS DE ALGORITMOS 2.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. ´ ´ 2.3. NOTACION ASINTOTICA CONDICIONAL 13 2.3. Notaci´n asint´tica condicional o o Muchos algoritmos son m´s f´ciles de analizar si restringimos nuestra a a atenci´n a instancias que cumplen alguna condici´n tales como ser una po- o o tencia de 2, ser de un tama˜o determinado. Consideremos por ejemplo, un n algoritmo 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 o escribe como sigue: 1 si n = 1, T (n) = nT (n − 1) en otros casos. en las secciones siguientes estudiamos como resolver ´stas ecuaciones deno- e minadas recurrencias. 2.4. Notaci´n omega o La notaci´n omega que la representamos por Ω se utiliza para representar o la cota inferior de un algoritmo. Por ejemplo el algoritmo de ordenamiento por inserci´n demora O(n2 ) en el peor caso sin embargo la cota inferior para o los 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 o buscamos que la relaci´n se cumpla para un n´mero finito de valores de n, o u entonces f (n) es el l´ ımite inferior del algoritmo. 2.5. Notaci´n teta o Cuando analizamos un algoritmo estar´ ıamos muy satisfechos si nuestro algoritmo estuviera acotado simult´neamente por Ω y O. Por esta raz´n se a o introduce la notaci´n θ. Decimos que un algoritmo es en θ(f (n)) o que f (n) o es de orden exacto si: θ(f (n)) = O(f (n)) ∩ Ω(f (n))
  • 26. 14 ´ 2. ANALISIS DE ALGORITMOS Esta notaci´n se utiliza muy poco y como podr´ apreciar tiene un mayor o a grado de dificultad. Comunmente se utiliza la notaci´n O y para mostrar la o relaci´n contra el mejor algoritmo posible usamos la notaci´n Ω. o o 2.6. An´lisis de las estructuras de control a 2.6.1. Secuenciales Sean p1 y p2 dos fragmentos de un algoritmo y sean t1 y t2 los tiempos que toman cada uno respectivamente. La regla de secuencias indica que el tiempo de ejecuci´n de la secuencia p1 ; p2 toma un tiempo t1 + t2 . Por la regla del o valor m´ximo el tiempo es (max(O(t1 ), O(t2 )). Este an´lisis considera que a a p1 y p2 son independientes. Esto es que, el proceso p2 no depende de los resultados 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. n Si p(i) toma un tiempo constante t y no depende de i entonces este tiempo se repetir´ m veces y denotamos esto como: a m m t=t 1 = tm = O(m) i=1 i=1 En un caso mas general donde t(i) no es constante y depende de i deber´ ıamos calcular el resultado de la siguiente sumatoria: m t(i) i=1
  • 27. ´ 2.6. ANALISIS DE LAS ESTRUCTURAS DE CONTROL 15 2.6.3. Llamadas recursivas El an´lisis recursivo de un algoritmo es normalmente casi directo y una a simple inspecci´n normalmente nos da una ecuaci´n de recurrencia que re- o o presenta el comportamiento del mismo. Consideremos el problema de buscar un 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 tiempo que toma es una constante, cuando encuentra el valor tambi´n el tiempo es e una constante. En los otros casos depende del valor n − 1. Esto podemos representar 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 u recursi´n. Podemos resolver esta recurrencia y demostrar que la soluci´n es o o O(n). 2.6.4. Ciclos while y repeat Los ciclos while y repeat son mucho m´s dif´ a ıciles de analizar porque no existe una forma de saber cuantas veces se va a ejecutar. Para terminar un ciclo hay que probar alguna condici´n que nos dar´ un valor de termina- o a ci´n.Consideremos el c´digo siguiente : o o ejemplo(n) i=0 while n>1 if par(n) n=n/2
  • 28. 16 ´ 2. ANALISIS DE ALGORITMOS i=i+1 else n=3n/2 i=i+1 return i En este ejemplo no podemos decidir a simple vista cuantas veces se ejecuta la instrucci´n i = i + 1 se ve que cada vez que n es una potencia de 2 se o pasar´ por la parte par(n) y cuya cantidad de veces ser´ el log2 n. ¿Qu´ po- a a e demos decir cuando es impar?. ¿El algoritmo termina?. Estas interrogantes las dejamos para el an´lisis del lector. a En muchos casos ser´ necesario aplicar la teor´ de probabilidades para a ıa poder determinar las veces que una instrucci´n se ejecuta. Si podemos deducir o una 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... por lo 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). Los m´todos para resolver recurrencias se explicar´n m´s adelante. e a a 2.6.5. An´lisis del caso medio a Consideremos el algoritmo de ordenar por el m´todo de inserci´n e o inserci´n(t) o for i=1 to n x= t[i] j=i-1 while j > 0 and x<t[j]
  • 29. ´ 2.6. ANALISIS DE LAS ESTRUCTURAS DE CONTROL 17 t[j+1]=t[j] j=j-1 t[j+1]=x De este algoritmo podemos ver que en el mejor caso, vale decir cuando los datos vienen ordenados en forma ascendente, el tiempo es lineal y el peor caso es de orden cuadr´tico que se da en el caso inverso.¿Cu´l es el com- a a portamiento en el caso promedio? Para resolver esta interrogante se hace necesario conocer a priori la funci´n de distribuci´n de probabilidad de las o o instancias que, el algoritmo debe resolver. La conclusi´n del an´lisis del caso o a medio 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! posibles instancias. Definamos el rango parcial de T [i] como la posici´n que, ocupar´ o ıa en el arreglo si estuviera ordenado. Supongamos que 1 ≤ i ≥ n y estamos ingresando 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 a i y lo llamaremos k. La cantidad de veces que los elementos del vector se desplazar´n es i − a k + 1 porque los elementos hasta i − 1 ya est´n ordenados. Como tenemos i a elementos 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 2 como tenemos n elementos en el ciclo principal debemos sumar los tiempos de 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 4 2.6.6. An´lisis amortizado a El an´lisis del peor caso es muchas veces muy pesimista. Supongamos que a tenemos 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 a un tiempo constante. Supongamos que enviamos a esta rutina un n´mero u
  • 30. 18 ´ 2. ANALISIS DE ALGORITMOS y si existe devuelve el valor m´ ınimo y si no existe inserta el valor y luego devuelve el valor m´ ınimo. ¿Cu´nto tiempo toma el algoritmo? En el peor a caso 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 a este algoritmo podemos pensar que, en cada b´squeda ahorramos un poco u para gastarlo cuando tengamos que realizar un inserci´n. Esto nos muestra o claramente que el tiempo amortizado depende de la probabilidad de que ten- gamos inserciones y cual la probabilidad de que tengamos solo b´squedas. u La esperanza matem´tica es una buena medida para estos an´lisis. a a 2.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 o o adivinaci´n, iterativos y un m´tdo general para casos especiales. o e 2.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 e naci´n se basa en adivinar de que forma es la soluci´n, luego aplicamos la o o hip´tesis inductiva para valores menores y demostrando que ´sto se cum- o e ple, decimos que nuestra suposici´n es correcta. Consideremos el siguiente o ejemplo: 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 o de esta ecuaci´n es O(n log n). Debemos probar que ´sta es una funci´n para o e o la cual todos los valores de T (n) son menores con lo cual se demuestra que es una cota superior. Suponiendo que esta soluci´n es aplicable a n/2 para una constante arbi- o
  • 31. ´ 2.7. SOLUCION DE RECURRENCIAS 19 traria 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 ≥ 1 Con lo cual estar´ probada nuestra suposici´n. Como ver´ en algunas con- ıa o a diciones es dif´ de probar esta recursi´n. Por ejemplo, consideremos que ıcil o T (1) = 1 reemplazando nuestra hip´tesis se tiene T (1) = c1 log 1 que da o T (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 o probar desde T (2). Realizar suposiciones acertadas es muy complicado, por lo que se hace necesario realizar diferentes pruebas con valores m´ximos y m´ a ınimos para hallar la soluci´n. Lo que estamos realizando es una hip´tesis inductiva y en o o muchas ocasiones podemos agregar m´s constantes por ejemplo, T (n) ≤ cn− a b, el restar algunas constantes de los t´rminos de menor orden es considerada e por muchos como una soluci´n intuitiva. o Este m´todo es un problema, la cota superior probada no garantiza que e existe otra cota superior que sea menor a la probada. Consideremos por ejemplo que se hubiese elegido n2 como una cota superior tambi´n se hubiera e 2 probado 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 antes por lo que no podemos plantear la soluci´n. Consideremos la ecuaci´n: o o √ T (n) = 2T ( n) + log n Podemos 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. 20 ´ 2. ANALISIS DE ALGORITMOS ahora reemplacemos T (2m ) por S(m) m S(m) = 2S( )+m 2 Esta soluci´n ya la conocemos y sabemos que es O(n log n) entonces reem- o plazando 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- bles 2.7.4. M´todo iterativo e El m´todo iterativo es mucho mejor porque no requiere adivinanzas que, e pueden hacernos suponer verdaderos resultados err´neos. Pero a cambio se o requiere un poco m´s de ´lgebra. Consideremos la siguiente recursi´n: a a o 1 n = 1, T (n) = T ( n ) + 1 otros casos. 2 para 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 2 cuando n = 1 termina y por lo tanto T (1) toma la forma de: n T (1) = 1 = k 2
  • 33. ´ 2.7. SOLUCION DE RECURRENCIAS 21 reemplazando tenemos: T (n) = 1 + k = 1 + log n de aqu´ sabemos que el tiempo asint´tico de esta recursi´n es O(log n). Re- ı o o solvamos con este m´todo la ecuaci´n 2.7.1 e o 1 n = 1, T (n) = 2T ( n ) + n otros casos. 2 desarrollando 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) + kn Este algoritmo termina cuando llegamos a T (1); donde toma el valor de 1 cuando 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. Asumiendo que T(n) es constante para n ≤ 1. T (n) = T (n − 1) + n Soluci´n: o Desarrollando la recursi´n tenemos: o T (n) = T (n − 2) + (n − 1) + n = T (n − 3) + (n − 2) + (n − 1) + n
  • 34. 22 ´ 2. ANALISIS DE ALGORITMOS que toma la forma de n i i=1 resolviendo tenemos n(n + 1) 2 2 por 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) + n 2.7.6. Teorema master Existen muchas recursiones que tienen la forma n T (n) = aT ( ) + f (n) (2.7.3) b La ecuaci´n 2.7.3 es un caso t´ o ıpico de soluciones que aplican la t´cnica divide e y vencer´s donde a representa el n´mero de llamadas recursivas T (n/b) el a u tama˜o de las llamadas y f (n) el trabajo realizado en cada recursi´n. Esta n o ecuaci´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 ıa citada al final del texto. Resuelva los siguientes ejercicios utilizando el teorema master:
  • 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- e do f (n) es 0 se denomina homog´nea y en otros casos no homog´nea. Una e e buena descripci´n de como resolver estas recurrencias pueden ver en los libros o de Grimaldi [Gri77] y Knuth [RLG94]
  • 36. 24 ´ 2. ANALISIS DE ALGORITMOS Soluci´n de recurrencias homog´neas o e La soluci´n de una ecuaci´n t(n) puede representarse como la combinacion o o lineal de funciones por ejemplo c1 f (n) + c2 g(n).Consideremos la expresi´n o p(x) = a0 xk + a1 xk−1 + .... + ak = 0 La soluci´n trivial es cuando x = 0 no es de inter´s. Esta ecuaci´n se denomi- o e o na ecuaci´n caracter´ o ıstica o polinomio caracter´ ıstico. Recordando el ´lgebra, a un polinomio de orden k tiene exactamente k ra´ ıces y puede factorizarse como k p(x) = (x − ri ) i=1 donde ri son las soluciones de p(x) = 0. Cualquier ri es una soluci´n a ´ste o e polinomio por lo que tambi´n son una soluci´n a t(n) porque cualquier com- e o binacion lineal tambien conforma una soluci´n, por lo que podemos concluir o que k n t(n) = (ci ri ) i=1 las soluciones se dan para cualquier constante que se escoja, siempre que las ra´ sean distintas. ıces Ejemplo 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) = 0 Esta ecuaci´n tiene un polinomio caracter´ o ıstico x2 − x − 1 = 0 que tiene como soluci´n las ra´ o ıces √ √ 1+ 5 1− 5 r1 = y r2 = 2 2
  • 37. ´ 2.7. SOLUCION DE RECURRENCIAS 25 entonces la soluci´n general es o n n f (n) = c1 r1 + c2 r2 ahora utilizando las condiciones iniciales podemos hallar las constantes c1 , c2 c1 + c2 = 0 r1 c 1 + r2 c 2 = 1 resolviendo obtenemos 1 1 c1 = √ y c2 = − √ 5 5 reemplazando en la ecuaci´n obtenemos o √ √ 1 1+ 5 n 1− 5 n f (n) = √ [( ) −( ) ] 5 2 2 Solucici´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 resolver este problema primero lo convertimos a un problema familiar, la recurrencia homog´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. 26 ´ 2. ANALISIS DE ALGORITMOS restando 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 3n Sin embargo no es cierto que cualquier constante arbitraria producir´ la a soluci´n correcta porque la ecuaci´n 2.7.7 no es la misma que la 2.7.10. o o Podemos resolver la ecuaci´n original en base de t(0) y t(1). La funci´n o o original implica que t1 = 2t0 + 3 por lo que, las ecuaciones a resolver son: c1 + c2 = t(0) 2c1 + 3c2 = 2t(0) + 3 de donde obtenemos c1 = t(0) − 3 y c2 = 3. Resolviendo esto tenemos t(n) = (t(0) − 3)2n + 3n+1 que es independiente de la soluci´n inicial t(n) O(3n ) o
  • 39. 2.8. EJERCICIOS RESUELTOS 27 2.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. 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. 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. 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. 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
  • 44. 32 ´ 2. ANALISIS DE ALGORITMOS 1 i cuando n( 2 ) = 2 estamos en T(2) que es constante 1 ( )i log(n) = log(2) = 1 2 2i = log(n) T (n) = log(n)T (2) + log(n) − 1 = 2 log(n) − 1 la cota superior es O(log n) 2.9. Ejercicios 1. Resolver las siguientes recurrencias utilizando el teorema master, ve- rificar con el m´todo de substituci´n y desarrollando la recurrencia. e o Asuma que T(1)=1. a) T (n) = 2T ( n ) + log(n) 2 b) T (n) = 3T ( n ) + log(n) 3 c) T (n) = 4T ( n ) + log(n) 4 d ) T (n) = 2T ( n ) + n2 2 e) T (n) = 2T ( n ) + n3 2 f ) T (n) = 2T ( n ) + n4 2 √ g) T (n) = (n)T ( n) + n 2. Hallar el O(n) del siguiente programa de b´squeda binaria. u int l,u,m; l=0; u=n-1; while(l<u) { m=(l+u)/2 if (a[mid]< x) l=m+1 else if (a[mid]> x) l=m-1 else
  • 45. 2.9. EJERCICIOS 33 return ("hallado") } return ("no existe">) 3. Hallar el O(n) del siguiente programa para hallar el m´ximo com´n a u divisor. Sugerencia escribir el tama˜o de la instancia en cada iteraci´n n o y aproximar a una serie arm´nica. o mcd(m,n) { while (n> 0){ resto=m%n m=n n=resto } return (m) } 4. Hallar el O(n) del siguiente programa de exponenciaci´n. o pot(x,n) { if (n=0) return 1 if (n==1) return x if (par(n)) return (pot(x*x,n/2)) else return (pot(x*x,n/2)*x) } 5. Realizar una prueba experimental para comprobar las cotas superiores de los programas anteriormente propuestos. 6. Codificar el programa de b´squeda binaria en forma recursiva y hallar u el O(n) 7. Se tienen dos programas A y B cuyo tiempo de ejecuci´n es 150 log(n) o 2 milisegundos y 150n respectivamente. Indique que programa es mejor para n < 100,n < 1, 000, n > 10, 000