Table Of ContentProblemas y Algoritmos
8
3
4 7 6
2
9 1
5
9 7 7 7 9 6 6
Por Luis E. Vargas Azcona
Algunas imagenes por Roberto L(cid:243)pez
2
Acuerdo de Licencia
Esta obra estÆ bajo una licencia Atribuci(cid:243)n-No comercial-Licenciamiento
Rec(cid:237)proco 2.5 MØxico de Creative Commons.
Eres libre de:
copiar, distribuir y comunicar pœblicamente la obra
hacer obras derivadas
Bajo las condiciones siguientes:
Atribuci(cid:243)n. Debes reconocer la autor(cid:237)a de la obra en los tØrminos
especi(cid:28)cados por el propio autor o licenciante.
No comercial. No puedes utilizar esta obra para (cid:28)nes comerciales.
Licenciamiento Rec(cid:237)proco. Si alteras, transformas o creas una obra
a partir de esta obra, solo podrÆs distribuir la obra resultante bajo una
licencia igual a Østa.
Al reutilizar o distribuir la obra, tiene que dejar bien claro los tØrminos
de la licencia de esta obra.
Alguna de estas condiciones puede no aplicarse si se obtiene el permiso
del titular de los derechos de autor.
Nada en esta licencia menoscaba o restringe los derechos morales del
autor.
Los derechos derivados de usos leg(cid:237)timos u otras limitaciones reconocidas
por ley no se ven afectados por lo anterior.
EstoessolamenteunresumenfÆcilmentelegibledeltextolegaldelalicen-
cia.Paraverunacopiadeestalicencia,visitehttp://creativecommons.org/licenses/by-
nc-sa/2.5/mx/ o envie una carta a Creative Commons, 171 Second Street,
Suite 300, San Francisco, California 94105, USA.
3
4
Prefacio
El prop(cid:243)sito general de este libro, es el de introducir al lector en la res-
oluci(cid:243)n de problemas de programaci(cid:243)n as(cid:237) como en el diseæo de algoritmos.
Si bien se presentan algoritmos, el objetivo no es saturar el conocimiento
del lector con una gran cantidad de algoritmos sino mostar sus fundamentos,
mostrar tambiØn maneras inteligentes de usarlos para resolver problemas, y
sobre todo, lograr que el lector sea capaz de diseæar sus propios algoritmos.
Muchos libros de algoritmos se limitan a explicar algoritmos sin deten-
erse en su fundamento matemÆtico y sin decir las aplicaciones que tiene en
soluci(cid:243)n de problemas.
Algunos otros si explican el fundamento de los algoritmos, pero resultan
inadecuados para estudiantes con poco conocimiento matemÆtico ya que sue-
len dar por hecho que el lector ya sabe elementos de teor(cid:237)a de conjuntos y
matemÆticas discretas.
Este libro estÆ dirigido a estudiantes con gusto de programar y resolver
problemas pero que todav(cid:237)a no adquieren las bases matemÆticas necesarias
para poder leer libros de algoritmos con su(cid:28)ciente fundamento matemÆtico;
por lo que se pretende, no solamente explicar los algoritmos, sino tambiØn
darle al lector las herramientas necesarias para entender, analizar y diseæar.
Por ello, una gran cantidad de pÆginas se dedican a establecer las bases
matemÆticas que sirven como soporte para la resoluci(cid:243)n de problemas de
programaci(cid:243)n y tambiØn muchas pÆginas se dedican a explicar de d(cid:243)nde
pueden surgir las ideas para diseæar cada algoritmo.
EstelibrotambiØnpuedeserleidocomounensayoenelcualdoymipunto
de vista acerca de lo que es el estudio de los algoritmos, y c(cid:243)mo los algoritmos
y las matemÆticas discretas se entrelazan de tal manera que un problema de
algoritmos nos lleva a las matemÆticas discretas y a su vez problemas de
matemÆticas discretas nos llevan de regreso a los algoritmos a tal grado que
se vuelven imposibles de separar.
5
6
Los temas tratados aqu(cid:237) son indispensables para comprender el gran cam-
po de estudio de la soluci(cid:243)n de problemas mediante el uso de las com-
putadoras, constituyen los fundamentos de una cantidad interminable de
conocimientos y tØcnicas que estan en constante desarrollo por la investi-
gaci(cid:243)n en las ciencias de la computaci(cid:243)n.
Otra peculiaridad es que a lo largo del libro se muestran implementa-
ciones en C++ que no usan memoria dinÆmica ni estructuras, esto es por los
siguientes motivos:
A veces al tener el pseudoc(cid:243)digo de un algoritmo, no resulta claro c(cid:243)mo
implementarlo sin escribir demasiado. Por ello es preferible mostrar al-
gunas implementaciones de ejemplo para que el lector conozca al menos
una implementaci(cid:243)n corta de cada algoritmo.
Muchos elementos del lenguaje C++ son muy conocidos e incluso estan
presentes en otros lenguajes con una sintaxis casi idØntica a la de C++,
por ello, si se utilizan pocos elementos del lenguaje, es posible que un
lector que no estØ familiarizado con este lenguaje pueda igualmente
entender los c(cid:243)digos.
No estÆ por demÆs decir que este libro fue escrito pensando en par-
ticipantes de un concurso llamado olimpiada de informÆtica, en ese
concurso los participantes tienen tiempo limitado para implementar y
depurar sus programas; las implementaciones son mas fÆciles de depu-
rar con memoria estÆtica.
Al Estudiante
Puede parecer extraæo encontrar un libro de algoritmos con estas carac-
ter(cid:237)sticas, ya que dedica muchas pÆginas a los fundamentos matemÆticos y
omite varias cosas que varios libros de algoritmos orientados a licenciatura
no dejar(cid:237)an pasar por alto, como lo son quicksort, shellsort, listas circulares,
listas doblemente ligadas y tablas de dispersi(cid:243)n entre otras cosas.
El motivo de esto es simple: este libro no pretende ser una referencia
ni mucho menos un repaso de los temas de licenciatura; pretende aportar
las herramientas bÆsicas para aplicar la programaci(cid:243)n en la resoluci(cid:243)n de
problemas.
Por esto mismo puede llegar a ser un recurso valioso ya que permite abor-
darlaprogramaci(cid:243)ndesdeunpuntodevistamascreativoymenosrepetitivo,
y al mismo tiempo el enfoque a resolver nuevos problemas es la base de la
inovaci(cid:243)n.
7
Estelibroestahechoparaleersecasicomosifueraunanovela,uncap(cid:237)tulo
tras otro, y si se decide saltarse uno o mas cap(cid:237)tulos se corre el riesgo de que
mas adelante no se pueda seguir bien. La diferencia con una novela es la gran
cantidad de problemas de ejemplo, los cuales conviene intentar resolver antes
de leer la soluci(cid:243)n.
Al Instructor
La teor(cid:237)a necesaria para leer este libro de principio a (cid:28)n es muy poca,
incluso un alumno de preparator(cid:237)a la deber(cid:237)a de saber. Sin embargo, muchos
problemas que se mencionan, por su di(cid:28)cultad, estan lejos de ser adecuados
para cualquier alumno de preparatoria e incluso pueden darle di(cid:28)cultades a
graduados de la universidad; pero resultan bastante adecuados para aquellos
que buscan algo mas interesante que problemas de rutina o para quienes se
preparan para concursos de programaci(cid:243)n.
El libro estÆ escrito de la manera en la que me gustar(cid:237)a presentar los
temas si fuera yo el instructor.
Es decir, procura motivar todos los conceptos antes de abordarlos for-
malmente, intenta nunca dejar huecos, en la teor(cid:237)a; y sobre todo, buscar
aplicaciones creativas a cada tema que se aborda evitando decir muy rÆpido
la soluci(cid:243)n y dando tiempo para especular.
Para resolver un problema, es necesario plantearse un diÆlogo consigo
mismodepreguntasyrespuestas.DichodiÆlogotambiØnsedebedepresentar
entre alumno e instructor y en muchas partes del libro se intenta plasmar el
diÆlogo abordando los razonamientos que podr(cid:237)an llevar al lector a resolver
cada uno de los ejemplos.
Al Ol(cid:237)mpico
Este libro lo escrib(cid:237) pensando principalmente en los ol(cid:237)mpicos, por lo
que todo lo que se menciona aqu(cid:237) tiene aplicaci(cid:243)n directa o indirecta con la
olimpiada de informÆtica.
La olimpiada esta centrada en resolver problemas mediante la progra-
maci(cid:243)n y el diseæo de algoritmos; para ello se requieren bases matemÆticas
s(cid:243)lidas y un conocimiento profundo(aunque no necesariamente amplio) de
los algoritmos.
Es por eso que este libro dedica muchas pÆginas a dejar claras las bases
matemÆticas y a explorar las propiedades de algoritmos; no s(cid:243)lo en intro-
ducirlos.
8
Los ejemplos se deben de intentar resolver por cuenta propia para apren-
der de los propios errores e ir desarrollando poco a poco un mØtodo propio
para resolver problemas. Si de pronto no logras resolver un ejemplo, puedes
empezar a leer la soluci(cid:243)n para darte una idea y continuar por cuenta propia.
˝ndice general
I Recursi(cid:243)n 15
1. Inducci(cid:243)n MatemÆtica 19
1.1. Ejemplos de Inducci(cid:243)n . . . . . . . . . . . . . . . . . . . . . . 20
1.2. Errores Comunes . . . . . . . . . . . . . . . . . . . . . . . . . 27
1.3. De(cid:28)nici(cid:243)n de Inducci(cid:243)n . . . . . . . . . . . . . . . . . . . . . . 28
1.4. Problemas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29
1.4.1. Sumas . . . . . . . . . . . . . . . . . . . . . . . . . . . 29
1.4.2. Tablero de Ajedrez . . . . . . . . . . . . . . . . . . . . 30
1.4.3. Chocolate . . . . . . . . . . . . . . . . . . . . . . . . . 31
1.5. Sugerencias . . . . . . . . . . . . . . . . . . . . . . . . . . . . 33
2. De(cid:28)nici(cid:243)n y Caracter(cid:237)sticas de la Recursi(cid:243)n 35
2.1. Factorial . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 35
2.2. Imprimir Nœmeros en Binario . . . . . . . . . . . . . . . . . . 38
2.3. Los Conejos de Fibonacci . . . . . . . . . . . . . . . . . . . . . 39
3. Recursi(cid:243)n con Memoria o Memorizaci(cid:243)n 43
3.1. Mejorando el Rendimiento de Fibonacci . . . . . . . . . . . . 43
3.2. Error Comœn en la Memorizaci(cid:243)n . . . . . . . . . . . . . . . . 45
3.3. Triangulo de Pascal . . . . . . . . . . . . . . . . . . . . . . . . 45
3.4. Teorema del Binomio . . . . . . . . . . . . . . . . . . . . . . . 48
4. Divide y VencerÆs 51
4.1. MÆximo en un Arreglo . . . . . . . . . . . . . . . . . . . . . . 52
4.2. Bœsqueda Binaria . . . . . . . . . . . . . . . . . . . . . . . . . 53
4.3. Torres de Hanoi . . . . . . . . . . . . . . . . . . . . . . . . . . 56
9
10 ˝NDICE GENERAL
5. Bœsqueda Exhaustiva 61
5.1. Cadenas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 61
5.2. Conjuntos y Subconjuntos . . . . . . . . . . . . . . . . . . . . 65
5.3. Permutaciones . . . . . . . . . . . . . . . . . . . . . . . . . . . 70
II AnÆlisis de Complejidad 75
6. TØcnicas BÆsicas de Conteo 79
6.1. Reglas BÆsicas de Conteo . . . . . . . . . . . . . . . . . . . . . 82
6.2. Conjuntos, Subconjuntos, Multiconjuntos . . . . . . . . . . . . 83
6.3. Permutaciones . . . . . . . . . . . . . . . . . . . . . . . . . . . 85
6.4. Combinaciones . . . . . . . . . . . . . . . . . . . . . . . . . . 88
6.5. Separadores . . . . . . . . . . . . . . . . . . . . . . . . . . . . 89
7. Funciones 91
7.1. Las Funciones como Reglas . . . . . . . . . . . . . . . . . . . . 91
7.2. El Concepto Formal de Funci(cid:243)n . . . . . . . . . . . . . . . . . 94
8. AnÆlisis de Complejidad 97
8.1. Un ejemplo no muy computacional . . . . . . . . . . . . . . . 98
8.2. Algunos Ejemplos de Complejidad en Programas . . . . . . . . 99
8.3. Funci(cid:243)n de Tiempo . . . . . . . . . . . . . . . . . . . . . . . . 101
8.4. La Necesidad del S(cid:237)mbolo O . . . . . . . . . . . . . . . . . . . 102
8.5. De(cid:28)nici(cid:243)n de la notaci(cid:243)n O-mayœscula . . . . . . . . . . . . . 105
8.6. Mœltiples Complejidades en Notaci(cid:243)n O-Mayœscula . . . . . . 108
8.7. CuÆndo Un Algoritmo es Factible y CuÆndo Buscar Otro . . . 108
9. Reglas para Medir la Complejidad 111
9.1. Regla de la Suma . . . . . . . . . . . . . . . . . . . . . . . . . 111
9.2. Producto por Constante . . . . . . . . . . . . . . . . . . . . . 114
9.3. Regla del Producto . . . . . . . . . . . . . . . . . . . . . . . . 114
9.4. Complejidad en Polinomios . . . . . . . . . . . . . . . . . . . . 115
9.5. Medir antes de implementar . . . . . . . . . . . . . . . . . . . 116
9.6. Bœsqueda de Cotas Mayores . . . . . . . . . . . . . . . . . . . 118
10.Complejidades Logar(cid:237)tmicas 121
10.1.AnÆlisis de la Bœsqueda Binaria . . . . . . . . . . . . . . . . . 121
10.2.Bases de logaritmos . . . . . . . . . . . . . . . . . . . . . . . . 123
10.3.Complejidades O(NlogN) . . . . . . . . . . . . . . . . . . . . 124
Description:Problemas y Algoritmos. 4. 7. 2. 6. 9. 5. 1. 8. 3. 9777966. Por Luis E. Vargas Azcona. Algunas imagenes por Roberto López