0% encontró este documento útil (0 votos)
151 vistas

Algoritmos

Este documento presenta un capítulo introductorio sobre algoritmos. Explica que los algoritmos son conjuntos ordenados de pasos que resuelven problemas y se encuentran en muchas áreas como programación, matemáticas y cocina. Da ejemplos de algoritmos como una receta de tortilla y cómo programar un auto para conducir. Finalmente, define los algoritmos informáticos como pasos precisos y bien definidos para ser interpretados por una computadora.

Cargado por

Arenita Mejilla
Derechos de autor
© Attribution Non-Commercial (BY-NC)
Formatos disponibles
Descarga como PDF, TXT o lee en línea desde Scribd
0% encontró este documento útil (0 votos)
151 vistas

Algoritmos

Este documento presenta un capítulo introductorio sobre algoritmos. Explica que los algoritmos son conjuntos ordenados de pasos que resuelven problemas y se encuentran en muchas áreas como programación, matemáticas y cocina. Da ejemplos de algoritmos como una receta de tortilla y cómo programar un auto para conducir. Finalmente, define los algoritmos informáticos como pasos precisos y bien definidos para ser interpretados por una computadora.

Cargado por

Arenita Mejilla
Derechos de autor
© Attribution Non-Commercial (BY-NC)
Formatos disponibles
Descarga como PDF, TXT o lee en línea desde Scribd
Está en la página 1/ 43

El Mundo de los Algoritmos

Rafael Angel Garc Leiva a July 9, 2006

Prlogo o
Hablar sobre la dicultad de encontrar referencias bibliogrcas en castellano. a

Chapter 1

El Arte de Programar
La mayor de las ciudades de hoy en d funcionan gracias a los ordenadores. a a Sea cual sea el lugar a donde vayamos siempre encontraremos un ordenador cerca. Son ya tan comunes que ni siquiera nos damos cuenta de que estn ah a , pero basta con detenemos un momento y jamos con atencin para verlos, puede o incluso que los encontremos en los lugares ms insospechados. En la ocina tena emos ordenadores que nos ayudan a hacer nuestro trabajo; en casa tenemos un ordenador como centro de ocio, para juegos, msica y video, o miniordenadores u empotrados dentro de los ms variados electrodomsticos, como la televisin, el a e o equipo de alta delidad, e incluso en el microondas; en el supermercado de la esquina hay unos cuantos ordenadores ms, las cajas registradoras, los equipos a de inventario; en nuestro coche est el famoso ordenador de abordo, que viga ila que todo funciona correctamente; y as un largo etctera. Y tambin estn e e a aquellos ordenadores que llevamos todo el d de un lado a otro con nosotros, a como el telfono mvil, la agenda electrnica, o el reloj. Hemos llegado a una e o o situacin de dependencia tal que nos resulta muy dif concebir el mundo sin o cil la existencia de los ordenadores1 . Lo que nunca hacemos, a menos que uno sea un profesional que trabaja en el mundo de la informtica, es pararnos a reexionar sobre cmo funcionanan a o todos estos ordenadores. Nos han dicho muchas veces que los ordenadores son en realidad mquinas muy tontas, que para funcionar correctamente necesitan a de un conjunto de instrucciones que les digan con todo lujo de detalles qu es lo e que tienen que hacer en cada momento, y cmo lo tienen que hacer. Tambin o e sabemos que estos conjuntos de instrucciones se llaman programas, y que los programas se escriben utilizando los llamados lenguajes de programacin, que o son muchos y muy variados. Seguramente nos suenen nombres como Visual Basic, Java o C++. Pero en realidad sabemos muy poco sobre la forma y contenido de estos programas, lo cual es perfectamente comprensible, porque a priori parece un tema irrelevante y smamente aburrido. A quin se le ocuru e rir estudiar en su tiempo libre el programa que controla un aparato de aire a
1 Otra cuestin muy distinta es si realmente en todos los casos el ordenador nos hace la o vida ms fcil, pero ste es un tema del que no vamos a hablar en este libro. a a e

CHAPTER 1. EL ARTE DE PROGRAMAR

acondicionado? Sin embargo, los programas no son tan aburridos como parece. En el corazn de los programas se encuentran los algoritmos. La mayor de las o a veces, estos algoritmos son simples sucesiones de pasos triviales que conducen a la solucin de un problema. Por ejemplo, si la temperatura de la habitacin ha o o superado los 25o cent grados, entonces enciende el compresor del aire acondicionado. Pero otras veces, los alogitmos que implementan los programas de ordenador son verdaderas obras de arte del intelecto humano. Quin sabe, a lo e mejor el funcionamiento de nuestro aparato de aire acondicionado est basado a en una interesant sima teor matemtica de lgica difusa, donde las cosas no a a o son slo ciertas o falsas, sino que pueden ser medio ciertas o tres cuartos falsas. o En este libro vamos a ver algunas de esas joyas de la programacin que hay o escondidas dentro de los ordenadores. Veremos cmo problemas aparentemente o my simples requieren de algoritmos muy complejos para su solucin, o de alo goritmos que en la prctica resultan intiles porque requieren cientos de aos a u n de clculo. Tambin estudiaremos ejemplos del caso contrario, es decir, cmo a e o problemas que en un principio parec intratables son resueltos de manera muy an simple, generalmente gracias a la ayuda de alguna idea brillante. Aprenderemos cmo comparar algoritmos, en base al tiempo que tardan en resolver un o problema, y a la cantidad de memoria que necesitan para ello, y veremos que pueden existir enormes diferencias entre dos algoritmos que resuelven un mismo problema. Por utimo estudiaremos las tcnicas ms comunes de resolucin de e a o problemas de las que se valen los programadores para hacer su trabajo. Todo ello mezclado con algunas notas histricas, ancdotas, preguntas sin respuesta o e conocida, y sobre todo, con numerosos problemas propuestos para que el lector pueda divertirse creando sus propios algoritmos.

1.1

Pero, qu es un algoritmo? e

Hasta ahora he asumido que el lector tiene al menos una idea intuitiva de lo que es un algoritmo, y tambin que tiene unos conocimientos m e nimos sobre el funcionamiento de los ordenadores (qu es un programa de ordenador, cul es la e a diferencia entre hardware y software, etctera). Pero para poder continuar con e nuestro viaje por el maravilloso mundo de los algoritmos, y para poder apreciar mejor la belleza del paisaje que se nos ofrece, tenemos que denir de manera ms precisa qu entendemos por algoritmo y aclarar algunos conceptos bsicos. a e a La Real Academia de la Lengua dene la palabra algoritmo como conjunto ordenado y nito de operaciones que permite hallar la solucin de un problema. o Aunque quizs no seamos conscientes de ello, es muy normal que nos ayudemos a de algoritmos en nuestra vida contidiana, y no slo cuando utilizamos ordeo nadores o realizamos clculos algebricos. Por ejemplo, cuando compramos una a a estanter barata de las de mntela usted mismo, junto con las tablas de madera a o encontramos un folleto de instrucciones con un algoritmo que nos indica cmo o montarla; cuando nos subimos en nuestro coche seguimos un algoritmo preciso que nos indica cmo conducir (introducir la llave, girarla a la posicin de cono o tacto, volverla a girar hasta la posicin de arranque, soltar la llave cuando el o

CHAPTER 1. EL ARTE DE PROGRAMAR

motor arranque, pisar el embrague, introducir la marcha primera, etc); o cuando invitamos a unos amigos a cenar a casa y queremos sorprenderlos con un men u especial, consultamos un libro de recetas de cocina, que en denitiva no es otra cosa que un libro lleno de algoritmos culinarios. Veamos uno de estos ejemplos con ms detalle. Imaginemos que queremos a hacer una tortilla de patatas pero, como nos ha pasado a todos en algn mou mento de nuestra vida, no sabemos cmo se hace. As que cojemos nuestro o libro de recetas de concina para hijos recin emancipados, y buscamos la receta e correspondiente a la tortilla. Seguramente el libro encontraremos algo parecido a: Trocear las patatas en taquitos de medio cent metro cuadrado, y freirlas en una sartn con aceite abundante y no muy caliente. Al e poco rato, aadir la cebolla y dejar que se fr junto con las patatas. n a En un cuenco batimos los huevos, le echamos sal, y aadimos las n patatas y cebolla ya fritas, mezclndolo todo bien. Dejamos un poco a de aceite en la sarten y hechamos la mezcla. Esperamos a que se cuaje un poco, le damos la vuelta, y la dejamos a fuego lento hasta que termine de cuajar. Evidentemente el prrafo anterior, aunque resulta fcil de entender para cualquier a a ser humano, es totalmente incomprensible para un ordenador. Podr amos reescribir la receta de manera algo ms formal y precisa, intentando darle apariencia a de programa de ordenador (vase el cuadro titulado Algorimo 1), pero aun as e seguir siendo un galimat ininteligible para las mquinas. De hecho, aun a as a contando con instrucciones tan precisas de cmo se hace una tortilla de patatas, o es normal que a cada uno de nosotros nos salgan tortillas completamente diferentes (yo personalmente, aun no consigo entender qu hace mi mujer para que e a ella le salgan las tortillas mucho ms ricas que a mi). El problema es que nuea stro algoritmo Tortilla de Patatas contiene todav muchos elementos que, o a bien tienen interpretaciones subjetivas (a qu temperatura se entiende que el e aceite no est muy caliente?), o bien estn descritos de manera demasiado vaga a a (qu se entiende por cuajar?), y por tanto, no son directamente interpretables e por un ordenador. Las recetas, tal y como nos las encontramos en los libros de concina, no entrar dentro de lo que en informtica se conoce como procedan a imientos computacionalmente bien denidos, y por tanto, no son directamente interpretables por los ordenadores. Los algoritmos utilizados en informtica a tienen que ser bastante ms precisos que nuestro ejemplo de la tortilla, y basase a en pasitos ms pequeos. a n Un algoritmo para ordenador est compuesto de un conjunto de pasos muy a simples y muy bien denidos. Ejemplos t picos de posibles pasos son: sumar dos nmeros dados, comparar si un nmero es mayor que otro, comprobar si u u la tercerla letra de la palabra ejemplo es una e, etctera. Estos pasos e suelen venir agrupados en bloques que se pueden repetir varias veces, tambin e existen pasos en los que es posible tomar decisiones, llamadas a grupos de pasos comunes, etc. Adems, para que el algoritmo est completo, es fundamental a e

CHAPTER 1. EL ARTE DE PROGRAMAR Algorithm 1 Tortilla de Patatas 1 Cortar patatas en tacos 2 Calentar aceite en sartn e 3 A~adir patatas a sartn n e 4 A~adir cebolla a sartn n e 5 Freir patatas y cebolla 6 Batir huevos en cuenco 7 A~adir patatas y cebolla al cuenco n 8 Quitar aceite sartn e 9 Hechar la mezcla de cuenco a sartn e 10 Cuajar un poco y dar la vuelta 11 Terminar de cuajar

indicar cuales son los valores de entrada del mismo, y cuales son los resultados o valores de salida. Por ejemplo, un algoritmo podr tener como entrada un a conjunto de diez nmeros (17, 1, 5, 13, 15, 9, 21, 2, 4, 8), y como salida devolver u el mismo conjunto de nmeros pero ordenados de mayor a menor (21, 17, 15, u 13, 9, 8, 5, 4, 2, 1). Pero no se preocupe el lector si por ahora no entiende del todo cmo son o los algoritmos que utilizan los ordenadores, ya que todas estas cuestiones irn a quedando ms claras a lo largo de este libro. a

1.2

Un poco de historia

Antes de entrar a fondo en materia es conveniente dedicar algo de tiempo a revisar los or genes de los algoritmos, cmo ha ido evolucionando el concepto de o algoritmo a lo largo de la historia, y sobre todo, quienes han sido los art ces de todas estas ideas tan maravillosas. Euclides de Alejandr (325 adC, 265 adC) fue el ms importante de los a a matemticos de la antigedad, sin embargo, se sabe muy poco de su vida, exa u cepto que ense en Alejandr y en Egipto. Euclides debi de haber estudiado no a, o en la Academia de Platn en Atenas, donde aprendi la geometr de Eudoxus o o a y Theaetetus, con los que estaba muy familiarizado. Su trabajo ms conocido a es un tratado en matemticas titulado Los Elementos. El tratado es un coma pendio del conocimento matemtico de la poca, que se convirti en el centro a e o de la enseanza de las matemticas durante ms de 2000 aos. La durabilidad n a a n de los Elementos hacen de Euclides el profesor de matemticas l a der indiscutible de la antigedad, y quizs de todos los tiempos. Seguramente los resultados que u a encontramos en Los Elementos no fueron demostrados por primera vez por Euclides, pero la organizacin del material y la exposicin son con toda seguridad o o suyas. Desde que fue escrito y hasta la fecha, Los Elementos han constituido una continua e importante inuencia, consituyendo una fuente primaria para el razonamiento geomtrico, teoremas y mtodos. A veces se dice que, junto con e e

CHAPTER 1. EL ARTE DE PROGRAMAR

Figura 1.1: Imgen de Al-Khwarizmi en un sello sovitico a e la Biblia, los Elementos puden ser el libro de texto ms traducido, publicado y a estudiado del mundo occidental. Los Elementos se dividen en 13 libros. Los libros de uno a seis tratan de la geometr del plano; los libros de siete a nueve tratan de la teor de nmeros; a a u el libro diez trata de la teor de los nmeros irracionales; y los libros de once a u a trece tratan de la geometr en tres dimensiones. En particular nos aqu nos a interesa el libro nmero siete, una introduccin auto-contenida de la teor de u o a nmeros, porque contiene el famoso algoritmo de Euclides, un mtodo muy asu e tuto para calcular el mximo comn divisor de dos nmeros (vase la Seccin a u u e o 1.3), y que est considerado como el primer alroritmo de la historia de la hua manidad. La palabra algoritmo proviene del nombre del matemtico persa del siglo a IX Abu Abdullah Muhammad bin Musa al-Khwarizm (vase Figura 1.1). Ale Khwarizmi fue el matemtico ms inuyente de su tiempo, y su legado incluye a a algunos conceptos que hoy d resultan bsicos en lgebra. En realidad se conoce a a a muy poco sobre la vida de Al-Khwarizmi, se sabe que trabaj en la Casa de o la Sabidur de Bagdad, y que su trabajo consist fundamentalmente en la a a traduccin de manuscritros cient o cos griegos, aunque tambin hizo importantes e contribuciones en lgebra, geometr y astronom a a a. Sin duda, el trabajo ms importante y conocido de Al-Khwarizmi es su a tratado sobre lgebra al-jabr wal-muqabal. Este tratado es el primer libro de a la historia dnde se estudia en profundidad y de manera sistemtica el lgebra, o a a y por tanto, se habla de Al-Khwarizmi como fundador de esta rama de la matemtica (de hecho, el t a tulo del tratado al-jabr ha dado origen a la propia palabra lgebra). El tratado sobre lgebra de Al-Khwarizmi tambin es impora a e tante porque describe el sistema posicional hind de nmeracin, basado en los u u o guarismos decimales 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, y que ahora conocemos comunmente como nmeros arbigos. Aunque no seamos consciente de ello, el sistema u a posicional es fundamental en lgebra, y si no, trate el lector de multiplicar 728 a por 293 utilizando el sistema de numeracin romano (es decir DCCXXVIII por o

CHAPTER 1. EL ARTE DE PROGRAMAR

Figure 1.2: Ada Lovelace CCXCIII). En el tratado tambin se introduce el uso del cero como contenedor e de lugar en la notacin basada en posiciones, otra idea fundamental para el o desarrollo actual del lgebra, que nos permite distinguir entre, por ejemplo, las a cantidades 202, 220 y 22. De echo, hay autores que opinan que la invenccin o del cero fue ms importante que la invencin de la propia rueda. a o Originalmente la palabra algoritmo se refer unicamente al conjunto de a reglas necesarias para realizar aritmtica utilizando los nmeros arbigos. Fue e u a en el sigo XVIII cuando el concepto evolucion para incluir a todo procedimiento o bien denido para resolver un problema dado, o realizar una tarea concreta. El primer ejemplo de algoritmo escrito espec camente para un ordenador fue realizado por Augusta Ada King (vase la Figura 1.2), Condesa de Lovelace, e en 1842. El ordenador en cuestin era el Ingenio Anal o tico de Charles Babbage, concebido en 1834. El Ingenio Anal tico de Babbage era una computadora mecnica programable, de caracter a sticas muy similares a los ordenadores electrnicos modernos: dispon de un sistema de entrada de datos basado en o a tarjetas perforadas, una memoria con capacidad para almacenar 1000 nmeros u de 50 d gitos, una unidad capaz de realizar las cuatro operaciones aritmticas e bsicas, y una impresora. a Ada Lovelace tradujo para Babbage el memorndum que el matemtico Luigi a a Menabrea hab escrito sobre el Ingenio Anal a tico. Junto a la traduccin, Ada o aadi un conjunto de notas en las que describia en detalle un procedimiento n o para calcular nmeros de Bernoulli2 utilizando la mquina, y que ha sido reconou a cido por los historiadores como el primer programa de ordenador. En realidad el Ingenio Anal tico no era una mquina tangible, sino que se trataba de un cona junto de diseos que Babbage fue perfeccionando a lo largo de su vida. Dado n que Babbage nunca lleg a construir su ingenio anal o tico, el algoritmo de Ada Lovelace no se lleg a implementar. A pesar de ello, para muchos (incluido el o autor de este libro) Ada Lovelace es considerada como la primera programadora
2 Secuencia de n meros racionales con importantes implicaciones en teoria de n meros y u u anlisis matemtico. a a

CHAPTER 1. EL ARTE DE PROGRAMAR

Figure 1.3: Alan Turing de ordenadores de la historia. Ada Lovelace tambin es conocida, aparte de e por ser la unica hija leg tima del poeta Lord Byron, por haber dado nombre al lenguaje de programacin Ada3 . o La falta de rigor matemtico en la denicin algoritmo como procedimento a o bien denido cre muchas dicultades a los matemticos y lgicos del siglo XIX o a o y principios del XX. Este problema fue en gran medida resuelto gracias a la descripcin formal de algoritmo proporcionada por lo que hoy se conoce con el o nombre de Mquina de Turing, un modelo abstracto de computadora formulado a por el matemtico britnico Alan Mathision Turing en 1936. a a Turing hizo importantes contribuciones en matemticas, lgica y criptoanlisis. a o a Durante la segunda guerra mundial trabaj para los aliados descifrando los o mensajes del ejrcito alemn, y en concreto, descifrado el cdigo secreto de la e a o famosa mquina Enigma. Una vez nalizada la guerra trabaj en el desarrollo a o de software para uno de los primeros ordenadores de la histororia, el Mark I de Manchester, adems de que dise su propia computadora, llamada ACE, a no que no lleg a construirse. Turing tambin es conocido por sus ideas en el rea o e a de la inteligencia articial, donde proporcion un experimento conocido con el o nombre de Test de Turing que nos permite determinar si una mquina es o no a inteligente. Pero sin lugar a dudas, el trabajo ms inuyente de Turing es su a contribucin a los fundamentos de la informtica: actualmente las mquinas o a a de Turing constituyen una parte fundamental en el estudio de la teor de la a computacin. o Turing fue un homosexual durante una poca donde la homosualidad era ilee gal. En 1952 fue condenado por actitudes indecentes al admitir que hab mana tenido relaciones sexuales con un hombre en Manchester. La condena tambin e
3 Ada es un lenguaje de propsito general que fue desarrollado por el departamento de deo fensa norteamericano en un intento de contener la torre de babel de lenguajes de programacin o en la que se hab convertido los proyectos informticos (en 1983 se estimaba que hab del an a a orden de 450 lenguajes de programacin diferentes en uso en el departamento). o

CHAPTER 1. EL ARTE DE PROGRAMAR

le impuso que siguiera una terapia hormonal para corregir su homosexualidad. Dos aos despus, en Junio de 1954, Alan Turing fue encontrado muerto en su n e casa al haber ingerido una manzana impregnada con cianuro. Si fue un suicidio, o un accidente (Turing disponia de un laboratorio de fotograf en el que a utilizaba habitualmente cianuro), es algo que todav no est resuelto. a a Dede el ao 1966 la asociacin internacional de informtica ACM (Associn o a ation for Computing Machinery) concede anualmente el premio Turing, que es otorgado a aquellos investigadores que hayan destacado por sus contribuciones tcnicas a la comunidad informtica. Estos premios estan considerados como e a los equivalentes en informatica a los premios Nobel.

1.3

El algoritmo de Euclides

Por n ha llegado el momento de ver nuestros primeros algoritmos. En concreto vamos a estudiar dos ejemplos de algoritmos, que aunque son totalmente diferentes, resuelven exactamente el mismo problema: calculan el mximo comn a u divisor de dos nmeros dados. El primero de ellos est basado en un mtodo u a e ms bien ingenuo para el clculo del mximo comn divisor; el segundo se basa a a a u en una idea muy original que nos simplicar enormemente la tarea. Estos dos a algoritmos nos van a permitir introducir algunos conceptos importantes sobre algor tmica y la programacin de ordenadores, y tambin nos van a ayudar a o e denir la notacin que vamos a utilizar a lo largo de este libro para la descripcin o o de los algoritmos. Antes de empezar a estudiar en detalle estos algoritmos, me gustar asegua rarme de que todos mis lectores tienen los conocimientos necesarios para entender lo que vamos a hacer. Para ello, aquellos lectores que no tengan experiencia previa en la programacin de ordenadores, y que no conozcan ningn lenguaje de o u programacin, deber leer primero el Apendice 12 donde se proporciona una o an introduccin a la programacin lo sucientemente detallada para entender los o o contenidos de este libro. Aquellos lectores que tengan cierta experiencia previa en el manejo de ordenadores, y que conozcan algn lenguaje de programacin, u o pueden continuar leyendo directamente, aunque tambin se les recomienda que e hechen un vistazo rpido al Apndice 12, con la idea de familizarizarse con la a e notacin en pseudocdigo que vamos a utilizar en el libro. o o Vamos a la tarea. Recordemos que el mximo comn divisor de dos nmeros a u u enteros positivos a y b, escrito como MCD(a, b), es el mayor de los divisores comunes de a y de b, es decir, el mayor de aquellos nmeros que dividen a la u vez a ambos. Por ejemplo MCD(5, 3) = 1, MCD(15, 9) = 3, y MCD(60, 15) = 5. El clculo del mximo comn divisor resulta muy util a la hora de simplicar a a u facciones, por ejemplo la fraccin 60 podr o 15 amos simplicarla a 12x5 = 12 . 3x5 3 En el Algoritmo 2 podemos encontrar el primer mtodo para el clculo del e a mximo comn divisor. El algoritmo recibe como parmetros de entrada dos a u a nmeros, a y b, y como resultado nos muestra en pantalla el MCD(a, b). Para u ello, el algoritmo se basa en un procedimiento muy simple: primero calcula cual es el menor de los nmeros a y b, a continuacin recorre todos los nmeros que u o u

CHAPTER 1. EL ARTE DE PROGRAMAR Algorithm 2 Clculo del MCD a funcin MCD(a, b) o min := mnimo(a, b); para x := 1 hasta min hacer si (mdulo(a, x) = 0 ) & (mdulo(b, x) = 0) entonces o o mcd := x finsi finpara escribir(mcd)

10

van desde 1 hasta el menor de a y b, y para cada uno de ellos comprueba si dividen a la vez a ambos. Para comprobar si un nmero x divide a otro y, lo que u hacemos es utilizar la funcin mdulo, que nos devuelve el resto de la divisin o o o enterea entre x e y (por ejemplo mdulo(7, 2) = 1, o mdulo(6, 2) = 0, en o o cuyo caso 2 es un divisor de 6 pero no de 7). Al nal del bucle para, tendremos en la variable mcd el mayor de los nmeros que han dividido a la vez a a y b, es u decir, su mximo comn divisor. a u Existen muchas formas de mejorar el algoritmo anterior. Por ejemplo, no har falta comprobar cuales son los divisores de a y b desde 1 hasta m a nimo de a y b, bastar con comprobar desde 1 hasta la raiz cuadrada del m a nimo (piense el lector por qu). e Otra manera ms renada de calcular el MCD ser mediante la factorizacin a a o de los nmeros a y b. Recordemos que cualquier nmero entero puede ser u u descompuesto de manera unica mediante el producto de nmeros primos. Por u ejemplo: 6 = 2 3, 15 = 3 5, y 60 = 22 3 5. En general cualquer nmero n u puede ser factorizado como: n = pf1 pf1 . . . pf1 1 1 1 donde pi son nmeros primos, y f i el nmero de veces que aparecen diu u chos nmeros. Una vez factorizados ambos nmeros tan slo tendr u u o amos que quedamos con los factores primos comunes, elevados a la m nima potencia. As MCD(6, 60) = 2 * 3 = 6. Sin embargo, descomponer un nmero en sus facu tores primos no es una tarea fcil, como veremos ms adelante cuando tratemos a a el tema de la criptograf a. En lugar de factorizar ambos nmeros, vamos a utilizar otro mtodo, conou e cido como algoritmo de Euclides, que nos permite calcular el mximo comn a u divisor de una manera fcil, elegante, y rpida. El algoritmo de Euclides se basa a a en la siguiente propiedad: si a y b son dos nmeros enteros cualesquiera, entonces MCD(a, b) u = MCD(a-b, b). Podr amos hacer unos cuantos ejemplos a mano para convencernos a nosotros mismos de que esta propiedad es cierta, y aquellos lectores que sean ms hbiles a a

CHAPTER 1. EL ARTE DE PROGRAMAR

11

Figure 1.4: Regla divisora con las matemticas, podr incluso intentar dar una demostracin formal. a an o Pero en realidad no hace falta complicarse tanto la vida. Slo tenemos que o pensar un poco qu es lo que realmente signica esta propiedad para darnos e cuenta de que la idea es trivial (y como toda idea trivial que se precie, tuvieron que pasar muchos aos hasta que alguien se percat de ella). n o Imaginemos que tenemos dos barras de acero de longitudes a y b respectivamente, y que queremos medirlas utilizando para ello una pequea regla de n madera. Si la regla de madera nos da un nmero entero de medidas en una de u las barras es porque la regla es un divisor de dicha barra. Si despus de medir e nos sobra un poquito de barra, es porque la regla no es un divisor. De entre todas las reglas que miden a ambas barras a y b nos quedamos con la que tenga una longitud mayor, que ser precisamente el mximo comn divisor (vase la a a u e Figura 1.4). Ahora bien, si encontramos una regla que divide a la barra b, para ver si tambin divide a la barra a bastar con comprobar que divide a aquella parte e a de la barra a que sobresale de la barra b (es decir b-a), ya que la otra parte ya ha sido medida. Si ahora cortamos lo que sobresale de la barra a, podr amos repetir de nuevo el proceso pero utizando la barra cortada b-a y la barra b. Se tratar de resolver el mismo problema pero invertidos los papeles de las barras. a Basndonos en esta idea, podemos escribir el siguiente Algoritmo de Euclides a (vase el Algoritmo 3). La idea consiste en ir cortando alternativamente de la e barra ms larga la parte que sobresale de la barra ms pequea, hasta que a a n ambas barras tengan exactamente la misma logitud, que ser el mximo comn a a u divisor. El algoritmo puede ser mejorado todav un poco ms, utilizando para ello a a la funcin mdulo que hemos visto ms arriba, pero esta mejora se la dejo o o a propuesta al lector como ejercicio.

1.4

Ciencia, arte o ingenier a

Prcticamente desde que aparecieron las primeras computadoras electrnicas, y a o con ellas los primeros programadores, ha habido un debate sobre si la programacin de ordenadores es una ciencia, un arte o un proceso de ingenier El o a. problema radica en que no existe ningn mtodo formal para disear algoritu e n mos, es decir, no existe ningn algoritmo que nos permita escribir algoritmos, u

CHAPTER 1. EL ARTE DE PROGRAMAR

12

Figure 1.5: Interpretacin geomtrica del algoritmo de Euclides o e

Algorithm 3 Algoritmo de Euclides funcin MCD Euclides(a, b) o mientras a != b hacer si a < b entonces a := a - b sino b := b - a finsi finmientras escribir(a)

CHAPTER 1. EL ARTE DE PROGRAMAR

13

y por tanto, los programadores han de ingenirselas con cada nuevo problema a que tienen que resolver. Tan slo disponemos de un conjunto de tcnicas geno e erales y de buenas prcticas, que iremos viendo a lo largo de este libro, y que a nos pueden servir como base para disear nuestros propios algoritmos. Pero n al nal, el diseador de algoritmos ha de basarse ms en su experiencia y su n a intuicin que en ningn mtodo formal. o u e En la seccin 1.2 mencionamos los premios Turing, que la asociacin ACM o o concede cada ao, en honor al matemtico Alan Turing, a aquellos investigadores n a que hayan destacado por sus contribuciones tcnicas a la comunidad informtica. e a En el ao 1974 el premio Turing fue concedio al profesor Donald E. Knuth, de n la Universidad de Stanford (EEUU), por sus contribuciones en el anlisis de a algoritmos y en el diseo de lenguajes de programacin, y en particular por sus n o famosa serie de libros El Arte de Programar Ordenadores. En 1968 el profesor Knuth public el primero de una serie de libros con o el nimo de recopilar todo el conocimiento disponible sobre el arte de proa gramar ordenadores. El primer volumen estaba dedicado a los algoritmos ms a fundamentales; el segundo volumen, publicado en 1969, trataba de los algoritmos seminumricos; y el tercer volumen, publicado en 1973, sobre algoritmos e de ordenacin y bsqueda. El cuarto volumen, aun no publicado, tratar sobre o u a algoritmos combinatorios, y nalmente, el quinto volumen, que se espera para el ao 2010, hablar de los algoritmos sintcticos4 . Para hacerse una idea de la imn a a portancia de la serie de libros publicada por el profesor Knuth, basta mencionar que en el ao 1999, la revista American Scientist, los incluy en una lista con n o las doce mejores monograf de la ciencia del siglo XX, junto con t as tulos como la relatividad de Einstein, la mecnica cuntica de Dirac, o los fundamentos de a a la matemtica de Russell y Whitehead. a Durante la entrega de la medalla Turing, el profesor Knuth hizo una ardiente defensa de la idea de que la programacin es, ante todo, un arte. El profesor o nos enseaba sobre la necesidad de buscar la belleza en la programacin: n o Preparar un programa, es como escribir poes o componer msica; a u como Adrei Ershov dijo una vez, la programacin puede darnos satiso faccin emocional e intelectual a la vez, porque es un verdadero logro o dominar la complejidad y establecer un sistema de reglas consistentes. Adems, cuando leemos los programas que otros han escrito, a podemos reconocer algunos de ellos un genuino trabajo art stico [...] Algunos programas son elegantes, otros son esquisitos, y otros son brillantes. Creo que es posible escribir programas excelentes, programas nobles, y programas realmente magn cos. Finalmente, el profesor Knuth concluye su disertacin diciendo: o Hemos visto que la programacin de ordenadores es un arte, o porque aplica el conocimiento acumulado al mundo, porque requiere
4 Aunque quizs el profesor nos sorprenda con dos vol mentes ms: volumen 6, sobre la a u a teor de los lenguajes libres de contexto, y el volumen 7, sobre tcnicas para compiladores. a e

CHAPTER 1. EL ARTE DE PROGRAMAR habilidad e ingenuidad, y sobre todo porque produce objetos bellos. Un programador que inconscientemente se ve a s mismo como un artista se divertir con lo que hace, y lo har mucho mejor. a a

14

Mi opinin personal es que la programacin de ordenadores es una mezcla de o o todo, de ciencia, de arte y de ingenier y que estas diferentes visiones se coma, plementan entre s El programador de hoy d ha de conocer y manejar cor. a rectamente estas tres facetas. Ha de conocer los mtodos de ingenier de la e a programacin si quiere ser capaz de gestionar la complejidad de los grandes o proyectos. Adems, el programador ha de estar familiarizado con los fundaa mentos tericos y cient o cos de la programacin de ordenadores. Y sobre todo, o el programador ha de buscar la belleza de los algoritmos que escribe.

1.5

Algoritmos y lenguajes de programacin o

No me gustar nalizar este cap a tulo si escribir unas palabras sobre los lenguajes de programacin. Sabemos que para que un ordenador pueda ejecutar un o algoritmo primero tenemos que traducirlo a alguno de los muchos lenguajes de programacin de ordenadores que existen. Los ordenadores de hoy en d no son o a capaces de procesar directamente el lenguaje pseudocdigo que vamos a utilizar o en este libro para escribir los algoritmos. El problema es que el pseudocdigo o aqu utilizado, aunque es lo sucientemente claro y conciso para los humanos, contiene demasiadas ambigedades que son insuperables por los ordenadores. u De ah que necesitamos primero traducir nuestro pseudocdigo a algn lenguaje o u de programacin formal antes de poder ver nuestros algoritmos funcionando en o un ordenador. Existen numeros lenguajes de programacin, que se basan a su vez en paradigo mas. Por ejemplo, tenemos la programacin estructurada con los lenguajes Paso cal y C, la programacin orientada a objetos con Java o C++, la programacin o o lgica con Prolog, la programacin funcional con LISP, etc. Pero no vamos a eno o trar a estudiar los detalles de cada uno de estos paradigmas y lenguajes, porque esto nos llevar demasiado tiempo. Tampoco voy a proporcionar la traduccin a o del pseudocdigo de los ejemplos a alguno de estos lenguajes de programacin; o o en primer lugar porque para ello primero tendr que elegir uno de lenguajes a existentes (C, Pascal, Java, etc.), y elija el que elija, seguro que el 80% de mis lectores se enfadar por la eleccin (existen unas terribles guerras de religin a o o en cuanto cual es el mejor lenguaje de programacin que existe); en segundo o lugar porque pienso que el pseudocdigo que he utilizado en los ejemplos es lo o sucientemente claro para que los lectores no tengan dicultad para traducirlo ellos mismos a su lenguaje favorito. Tan slo hacer una pequea advertencia a los lectores, y es que tengan en o n cuenta que segn que problema queramos resolver, es mejor utilizar un lenguaje u que otro. Es decir, que a pesar de que disponemos de lenguajes que por su versatilidad son conocidos como lenguajes de propsito general, algunas cosas o sn ms fciles de hacer en algunos lenguajes que en otros. Luego no es buena o a a idea conocer un unico lenguaje.

CHAPTER 1. EL ARTE DE PROGRAMAR

15

1.6

Para divertirse ms ... a

Existen muchos, y muy buenos, libros sobre algor tmica y sobre la programacin o de ordenadores. En esta seccin slo voy a comentar algunos de ellos, para que el o o lector los tenga como referencia por si quiere profundizar ms sobre la materia. a Un excelente recopilacin del conocimiento actual sobre los algoritmos es el o libro Introduction to Algorithms, de Thomas H. Cormen et al. (editorial MIT Press), pero no tiene traduccin al castellano. o Tambin en ingls, y mucho ms accesible que el anterior, tenemos el lie e a bro Algorithmics, the Spirit of Computing, de David Harel y Yishai Feldman (editorial Addison Wesley). De dibulgacin y en castellano podemos encontrar el libro De Euclides a o Java, de Ricardo Pea Mar (editorial Nivola). n Importancia del cero No bromeaba cuando armaba que el concepto de cero es una de las ideas ms a importantes de la historia de la humanidad. Para saber ms sobre el gnesis a e de la idea de cero, y sobre sus implicaciones, recomiendo la lectura del libro La Biograf de una Idea Peligrosa, de Charles Seife (de Ediciones Ellago). a Charles Babage Charles Babbage s que intent construir otra mquina ms simple que su In o a a genio Anal tico, denominada Ingenio de Diferencias, pero desgraciadamente el proyecto acab en el ms absoluto fracaso. Son muchos los historiadores que o a opinan que Chales Babagge fue un adelantado a su tiempo, ya que con la tecnolog disponible en la poca Victoriana no era posible construir semejante a e artilugio. Sin embargo, la reciente construccin con xito en el Museo de la o e Ciencia de Londres de uno de los ingenios calculadores diseados por Babbage n ha demostrado que la historia ha juzgado errneamente al precursor de la como putacin automtica. Los ingenieros del museo demostraron que las mquinas o a a de Babbage no conten errores lgicos o de diseo graves, y tcnicamente eran an o n e viables para lo que los artesanos del siglo XIX pod fabricar. El fracaso del an proyecto fue debido ms a un problema de gestin del mismo que a problemas a o tcnicos o de concepto. e Para saber ms sobre la computadora mecnica de Charles Babbage rea a comiendo la lectura del art culo de Doron D. Swade en la revista Investigacin o y Ciencia (Abril 1993). En otra l nea est el libro de Willian Gibson, The Dierence Engine, una a novela de ccin que narra como hubiera sido la evolucin de la humanidad si o o Charles Babbage hubiese conseguido nalizar su computadora, adelantando el inicio de la era de la informacin un siglo. o

CHAPTER 1. EL ARTE DE PROGRAMAR Alan Turing

16

Sobre Alan Turing hay muchos libros escritos. Le recomiendo al lector que adems de leer alguna biograf de Turing, tambin intente buscar informacin a a e o sobre los siguientes apasionantes temas: la mquina universal de Turing, el a cdigo enigma y el test de Turing. o Donald Knuth La trilog de libros El Arte de Programar Ordenadores de Donald Knuth, ha a sido publicada en castellano por la editoriral Revert. e La disertacin del profesor Knuth durante la recepcin de premio Turing o o titulada Computer Programming as an Art fue publicada por la revista Communications of the ACM (volumen 17, nmero 12, Diciembre de 1974). u

Chapter 2

Algunos Ejemplos
Antes de pasar directamente a revisar cuales son las principales tcnicas de e resolucin de problemas utilizadas en algor o tmica, vamos a ver unos ejemplos de algoritmos, con la idea de allanar el camino y familizarizarnos con el tema.

2.1

Complejidad Algor tmica

Como hemos visto, los algoritmos juegan un papel muy importante en el mundo de la informtica. Resulta de vital importancia contar con buenos algoritmos, a que soluciones los problemas de manera rpida, y que a la vez consuman pocos a recursos, como memoria. Pinsese por ejemplo en el caso de los buscadores de ine formacin en internet, aquel buscador que posea el mejor algoritmo de bsqueda, o u que sea capaz de proporcionar informacin relevante para el usuario, ser el que o a consiga mayor cuota de mercado (un mercado muy lucrativo, por cierto). O por ejemplo en el area de la seguridad informtica y la criptograf donde es a a, fundamental contar con algoritmos de encriptacin que sean indescifrables, al o menos desde un punto de vista prctico. O en el caso de las bases de datos, tan a comunes en bancos, departamentos de contabilidad, administraciones y muchos otros lugares, donde es necesario contar con algoritmos de bsqueda que nos u proporcionen la informacin que necesitamos en un tiempo razonable. La alo gor tmica es la rama de la informtica encargada de buscar y analizar algoritmos a ecientes que solucionen problemas comunes (qu entendemos por algoritmo ee ciente es algo que veremos en detalle ms adelante). a Ejemplos con algoritmos de ordenacin o 2.- Complejidad Algor tmica Antes de empezar a estudiar las diferentes tcnicas de solucin de problee o mas, deber amos hacer una pequea revisin de las herramientas matemticas n o a que nos permiten estudiar los diferentes algoritmos. Primero, revisaremos las deniciones y trminos matemticos que vamos a usar en el resto del libro. Al e a disponer de este vocabulario matemtico podremos ser ms precisos y formular a a los problemas de manera ms fcil. Despus, revisaremos las tcnicas existentes a a e e 17

CHAPTER 2. ALGUNOS EJEMPLOS

18

para analizar el tiempo de ejecucin de un algoritmo. En el resto del libro, deo spus de cada algoritmo proporcionaremos un anlisis de su tiempo de ejecucin e a o y una prueba de su correcteness. Notacin Asinttica o o Denotamos porel conjunto de los nmeros naturales (tales como 1, 2, 3, u etctera). En complejidad algor e tmica estamos interesados en funciones de N en N, tales como n2, 2n y n3-2n+5. Decimos que un algoritmo es O(g(n)), pronunciado orden de g(n), si f crece como g o ms lento. a Analyzing an algorithm has come to mean predicting the resources that the algoritm requires. Occasionally, resource such as memory, communications bandwidth, or computer hardware are of primary concern, but most often it is computational time that we want to measure. Generally, by analyzing several candidate algorithms for a problem, a most ecient one can be easily identied. Such analysis may indicate more than one viable candidate, but several inferior algorithms are usually discarded in the process. Asymptotic Notation In addition to correctness another important characteristic of a useful algorithm is its time and memory consumption. Time and memory are both valuable resources and there are important dierences (even when both are abundant) in how we can use them. How can you measure resource consumption? One way is to create a function that describes the usage in terms of some characteristic of the input. One commonly used characteristic of an input dataset is the its size. For example, suppose an algorithm takes as input an array of n integers. We can describe the time this algorithm takes as a function f written in terms of n. For example, we might write: f(n) = n2 + 3n + 14 where the value of f(n) is some unit of time (in this discussion the main focus will be on time, but we could do the same for memory consumption). Rarely are the units of time actually in seconds, because that would depend on the machine itself, the system its running, and its load. Instead, the units of time typically used are in terms of the number of some fundamental operation performed. For example, some fundamental operations we might care about are: the number of additions or multiplications needed; the number of element comparisons; the number of memory-location swaps performed; or the raw number of machine instructions executed. In general we might just refer to these fundamental operations performed as steps taken. Is this a good approach to determine an algorithms resource consumption? Yes and no. When two dierent algorithms are similar in time consumption a precise function might help to determine which algorithm is faster under given conditions. But in many cases it is either dicult or impossible to calculate an analytical description of the exact number of operations needed, especially when the algorithm performs operations conditionally on the values of its input. Instead, what really is important is not the precise time required to complete the function, but rather the degree that resource consumption changes depending on its inputs. Concretely, consider these two functions, representing the computation time required for each size of input dataset: f(n) = n3 - 12n2 + 20n + 110 g(n) = n3 + n2 + 5n + 5 They look quite dierent, but how do they behave? Lets look at a few plots of the

CHAPTER 2. ALGUNOS EJEMPLOS

19

function (f(n) is in red, g(n) in blue): Plot of f and g, in range 0 to 5 Plot of f and g, in range 0 to 15 Plot of f and g, in range 0 to 100 Plot of f and g, in range 0 to 1000 In the rst, very-limited plot the curves appear somewhat dierent. In the second plot they start going in sort of the same way, in the third there is only a very small dierence, and at last they are virtually identical. In fact, they approach n3, the dominant term. As n gets larger, the other terms become much less signicant in comparison to n3. As you can see, modifying a polynomialtime algorithms low-order coecients doesnt help much. What really matters is the highest-order coecient. This is why weve adopted a notation for this kind of analysis. We say that: f(n) = n3 - 12n2 + 20n + 110 = O(n3) We ignore the low-order terms. We can say that: This gives us a way to more easily compare algorithms with each other. Running an insertion sort on n elements takes steps on the order of O(n2). Merge sort sorts in O(nlogn) steps. Therefore, once the input dataset is large enough, merge sort is faster than insertion sort. In general, we write f(n) = O(g(n)) That is, f(n) = O(g(n)) holds if and only if there exists some constants c and n0 such that for all n > n0 f(n) is positive and less than or equal to cg(n). Note that the equal sign used in this notation describes a relationship between f(n) and g(n) instead of reecting a true equality. In light of this, some dene Big-O in terms of a set, stating that: when Big-O notation is only an upper bound; both these two are both true: n3 = O(n4) n4 = O(n4) If we use the equal sign as an equality we can get very strange results, such as: n3 = n4 which is obviously nonsense. This is why the set-denition is handy. You can avoid these things by thinking of the equal sign as a one-way equality, i.e: n3 = O(n4) does not imply O(n4) = n3 Always keep the O on the right hand side. Big Omega Sometimes, we want more than an upper bound on the behavior of a certain function. Big Omega provides a lower bound. In general, we say that f(n) = ?(g(n)) when I.e. f(n) = O(g(n)) if and only if there exist constants c and n0 such that for all n>n0 f(n) is positive and greater than or equal to cg(n). So, for example, we can say that n2 - 2n = ?(n2) - (c=1/2, n0=4) or n2 - 2n = ?(n) - (c=1, n0=3), but it is false to claim that n2 - 2n = ?(n3). Big Theta When a given function is both O(g(n)) and ?(g(n)), we say it is ?(g(n)), and we have a tight bound on the function. From Papa It is importan, however, to identify the source of our satisfaction: It is the rate of growth O(n2). In the course of this book we shall regard such polynomial rates of growth as acceptable time requirements, as a sign that the problem has been solved statisfactorily. In contrast, exponential rates such as 2n, even worse, n! Will be a cause of concern. If they persists, and algorithm after algorithm we devise fails to solve the problem in polynomial time, we generally consider this as evidence that the problem in hand is perhaps intractable, not amenable to a proactically ecient solution. This dichotomy between polynomial and nonpolynomial time bounds, and the identication of polynomial algorithms with the intuitive notion of practically feasible com-

CHAPTER 2. ALGUNOS EJEMPLOS

20

putation, is not uncontroversial. There are ecient computation that are ot polynomial, and polynomial computations that are not ecent in practice. [In fact, there is an important problem that provides examples for both kind of exceptions: Linear programming. A widely used classical algorithm for this basic problem, the simplex method, is know to be exponential in the worst case, but has consistently superb performance in practice; in fact, its expected performace is probably polynomial. In contrast, the rst polynomial algorithm discovered for this problem, the ellipsoid algorithm, appears to be impractically slow. But the storiy of linear programming may in fact be a subtle argument for, not against, the methodology of complexity theory: It seems to indicate that problems that have practical algorithms are indeed polynomial-time solvable althogh the polynomial-time algorithm and the empirically good one may not necessarily coincide.] For example, an n80 algorithm would probably be of limited practical value, and an algorithm with an exponential growth rate such as 2(n/100) (or, more intriguing, a subexponential one such as n(log n) ) may be far more useful. There are, however, strong arguments in favor of the polynomial paradigm. First, it is a fact that any polynomial rate will be overcome eventually by any exponetial one, and so the latter is to be preferred for all but a nite set of instances of the problem but of course this nite set may contain all instances that are likely to come up in practice, or that can exist within the connes of our universe ... More to the point, experience with algorithms has shown that exrem rate of growth, such as n80 and 2(n/100), rarely come up in practice. Polynomial algorithms typically have small exponents and reasonable multiplicative constans, and exponential algorithms are usually impractical indeed. Another potential criticism of our point of view is that it only examines how the algorithm performs in the least favorable situations. The exponential worst-case performance of an algorithm may be due to a statistically insignicant furaction of the inputs, although the algorithm may perform satisfactorily on the average. Surely an analysis of the expected, as opposed to the worst-case, behavior of an algorithm would be more informative. Unfortunately, in practice we rarely know the input distribution of a problem that is, the probability with which each possible instance is likely to occur as an input to our algorithm and thus a truly informative average-case analysis is impossible. Besides, if we wish to solve just one particular instanc, and our algorithm prforms abysmally on it, knowing that w have stumbld upon a statistically insignicant exception is of litle help or consollation. It should not com as a surpris that our choic of polynomial algorithms as the mathmatical concpt that is supposd to capture the informal notion of practically cient computation is open to criticism for all sides. Any attempt, in any eld of mathematics, to capture an intuiive, reallife notion by a mathematical concept is bound to include certain undesirable spcecimens, while excluding others that arguable should be embraced. Ultimately, our argument of choice must be this: Adopting polynomial worst-case performance as our criterion of eciency results in an elegant and useful theory that says something meaningfull about practical computation, and whould be impossible without this simplication. Hablar tambin de los requerimientos de espacio. e

CHAPTER 2. ALGUNOS EJEMPLOS

21

Past experience in the eld seems to suggest that, as a rule, once a polynomial algorithm for a problem has been developed, the time requirements undergo a series of improvements that bring the probme in the real of realistic computation. The important step is to break the barrier of exponentiality to come up with the rst polynomial time algorithm. A central concep in algorithms is that of a reduction. A reduction is an algorithm that solves problem A by transforming any instance of A to an equivalent instance of a previously solved problem B.

2.2

Est usted seguro? a

Una de los principales problemas de la algor tmica es cmo estar seguros de que o un algoritmo es correcto. Es decir, cmo sabemos que un algoritmo va a dar la o respuesta correcta a los parmetros de entrada proporcionados. a

Chapter 3

Recursividad
Mtodos Iterativos y Mtodos Recursivos. Clculo de n! Series de Fibonacci. e e a

22

Chapter 4

Divide y Vencers a
Si el presidente de mi pa me llamase por telfono para pedirme consejo sos e bre como conquistar algn pa vecino, seguramente lo que le recomendar es u s a que tratase de dividir el ejrcito de nuestro rival, es decir, que aplicase la vieja e estrategia de Divide y Vencers. La mxima divide y vencers (del latin Dia a a vide et Impera) es atribuida a Maquiavelo, aunque es una tctica que se viene a utilizando desde muy antiguo. Por ejemplo, es de sobra conocido que el Csar e seguramente la ten en la mente cuando, uno por uno, ya sea en el campo de a batalla o por medios diplomticos, consigui que los jefes locales aceptaran la a o autoridad de Roma. La estrategia divide y vencers tambin ha sido utilizada a e con gran acierto por los administradores de los grandes imperios, incluyendo el imperio britnico, el cual jugaba a enfrentar una tribu contra otra para mana tener el control de sus colonias con un nmero m u nimo de fuerzas. El concepto de divide y vencers gan especial relevancia cuando la India entr a formar a o o parte del imperio britnico. Los britnicos utilizaron esta estrategia de mana a era efectiva para ganar control de un territorio muy extenso como es la India manteniendo su gente dividida con la religion, el idioma, las castas, etc. Los britnicos tomaron el control de pequeos estados principescos hindues en lugar a n de unir Inida en una unica nacin. o En pol tica y sociolog el mtodo divide y vencers es una estrategia de a, e a sobra conocida para ganar y mantener el poder mediante la divisin de grandes o concentraciones de poder en grupos que individualmente tienen menos poder que el que aplica la estrategia. Aunque en realidad, a menudo se reere a una estrategia donde los pequeos grupos de poder se previene que se enlacen y n se conviertan en ms poderosos, dado que es ms dicil romper estructuras de a a poder ya existentes. Pero volvamos a los algoritmos, que es lo que en realidad nos interesa, y veamos cmo podemos aplicar la estrategia divide y vencers para resolver muo a chos problemas. Muchos algoritmos utiles son recursivos en estructura: para resolver un problema, se llaman a s mismos recursivamente una o ms ve a ces para tratar con subproblemas relacionados. Estos algoritmos t picamente siguen un mtodo divide-y-vencers: parten el problema en subproblemas que e a 23

CHAPTER 4. DIVIDE Y VENCERAS

24

son similares al problema original pero ms pequeos en tamao, y resuelven el a n problema de manera recursiva, y despus combinan estas soluciones para crear e una solucin al problema original. o El paradigma de resolucin de problemas divide y vencers involucra tes o a pasos a cada nivel de la recursin: o Divide el problema en un nmero de subproblemas. u Conquista cada subproblema resolviendolo de manera recursiva. Si el tamao de los subproblemas es lo sucientemente pequeo, sin embargo, n n tan slo soluciona los problema de una manera directa. o Combina la solucin de los subproblemas en la solucin del problema origo o inal.

4.1 4.2

Merge Sort Multiplicacin? o

Multiplicacin divide y vencers o a

4.3

La Transformada de Fourier

Chapter 5

Fuerza Bruta
Una tcnica de resolucin de problemas para la que los ordenadores estn espee o a cialmente bien dotados es la conocida como fuerza bruta. Bsicamente la idea a cosiste en dado un problema, intentar de manera sistemtica todas las soluciones a posibles hasta dar con la solucin buscada. Un ejemplo de algoritmo basado en o fuerza bruta lo vimos en la seccin 1.3 al calcular el mximo comn divisor de o a u dos nmeros naturales a y b, para ello enumerbamos todos los enteros desde u a 1 hasta el m nimo de a y b, y comprobbamos si divid a ambos nmeros a a an u la vez. La fuerza bruta es un mtodo de resolucin de problemas muy ingnuo, e o e y que apriori puede parecernos que no deber tener mucho xito. El princia e pal inconveniente que tiene es su coste computacional, que es proporcional al nmero de soluciones candidatas a examinar, y que en el caso de muchos probu lemas prcticos, tiende a crecer de manera muy rpida cuando el tamao del a a n problema se incrementa. Sin embargo, si tenemos en cuenta la fantstica habila idad de clculo de los ordenadores de hoy d capaces de realizar millones de a a, operaciones por segundo, entenderemos que para el caso de aquellos problemas en los que no se conoce una solucin mejor, la fuerza bruta puede ser una buena o alternativa. Adems, la fuerza bruta tambin se suele aplicar en aquellos problea e mas cuyo tamao est limitado, o cuando existen tcnicas heur n a e sticas espec fcas del problema que pueden ser utilizadas para reducir el conjunto de soluciones candidatas a examinar a un tamao razonable. n

5.1

El problema de la mochila

El problema de la mochila.

5.2

Mquinas que juegan al ajedrez a

Seguramente muchos de los lectores saben jugar al ajedrez, y son conscientes de lo complicado que resulta dominar el juego. Aunque en realidad, si uno lo piensa un poco, no se trata de un juego tan dif cil. Las reglas pueden aprenderse en 25

CHAPTER 5. FUERZA BRUTA

26

varios minutos de prctica; y la estrategia a seguir es muy clara: en cada posicin a o hacer aquella jugada que maximice las posibilidades de que ganemos y minimice las posibilidades de que gane nuestro rival. Para ello lo unico que tenemos que hacer es revisar todos los movimientos posibles a nuestro alcance, y para cada uno de ellos todas las posibles respuestas del bando contrario, y para cada una de las posibles respuestas miramos todas nuestras posibles respuestas, y as sucesivamente hasta completar unas diez o doce jugadas por adelantado. Esta tcnica de juego, basada en la fuerza bruta, deber garantizarnos la victoria. e a La pregunta es: cuantas posiciones tendr amos que analizar? Al empezar la partida, las blancas tienen a su disposicin un total de 20 movimientos distintos, o podemos adelantar cada uno de los peones una o dos casillas, junto con los cuatro movimientos posibles de los caballos. Para cada uno de los 20 movimientos de las blancas, las negras pueden a su vez responder con otros 20 movimientos, lo que hace un total de 400 diferentes posiciones posibles. En la siguiente jugada, las blancas pueden optar entre 5362 posiciones diferentes, y las negras, en su respuesta por 71842. En la tercera jugada ya hablamos de ms de 800.000 a posiciones para las blancas, y ms de 9 millones para las negras. Se estima que a un Gran Maestro de ajedrez puede examinar y evaluar del orden de 3 posiciones por segundo, y por tanto, calcular y evaluar todas las posibles posiciones para los tres primeros movimientos del juego, requerir nada menos que 100 d a as. Evidentemente, a pesar de ser una estrategia correcta desde un punto de vista terico, desde un punto de vista prctico resulta totalmente irrealizable, y de ah o a que los humanos tengamos que utilizar estrategias alternativas. Bsicamente lo a que hacemos cuando jugamos es descartar la mayor de las posibles jugadas, a utilizando para ello nuestro conocimiento del juego. Un Gran Maestro del ajedrez no suele considerar ms de 3 4 posibles alternativas en cada posicin. Sin a o o embargo, los ordenadores son mquinas de calcular por excelencia, y quizs esta a a estrategia para jugar al ajedrez puede que est dentro de sus posibilidades de e clculo. Por ejemplo, la mquina Deep Blue diseada por IBM en 1997 para jua a n gar contra el campen del Mundo Garry Kasparov, pod examinar y evaluar del o a orden de 200 millones de posiciones por segundo. Esta mquina tardar menos a a de un segundo en evaluar las tres primeros movimientos del juego. Es la fuerza bruta una tcnica viable para jugar al ajedrez? A esta pregunta intentaremos e responder en esta seccin. o

5.2.1

Arboles de Juego

Los principales programas de ajedrez funcionan median la bsqueda de un rbol u a de movimientos y contramovimientos. El programa empieza con la posicin aco tual y genera todos los movimientos, todas las respuestas legales a esos movimientos, y as sucesivamente hasta que una profundidad jada es alcanzada. A cada nodo hoja, se aplica una funcin de evaluacin la cual le asigna un valor numrico o o e a cada posicin. Estas puntuaciones son retroasignada mediante un proceso llao mado minimax, el cual simplemente asume que cada bando escoger aquella a l de juego que le es ms favorable en cada momento. Si un valor positivo na a es bueno para las blancas, simplemente escogemos aquel movimiento con mayor

CHAPTER 5. FUERZA BRUTA

27

valor, y las negras escogeran aquella jugada con menor valor. Estos conceptos estn ilustrados en la Figura ?. a La funcin de evaluacin empleada es simplemente una combinacin de equio o o librio de material y varios otros trminos que representan factores posicionales. e Los trminos posicionales son pequeas cantidades pero son importantes dado e n que el equilibrio de material rararmente cambia en el juego del ajedrez en torneos. El problema de este mtodo basado en la fuerza bruta es que el tamao e n del rbol explota combinacionalmente. El factor de ramicacin o nmero a o u de movimientos legales posibles en una posicin t o pica des de 35. Para poder juegar a nivel de maestro de ajedrez es necesario utilizar una profundidad de 8 jugadas, lo que implica un rbol de 35**8 nodos nales. a Fortunately, there is a better way. Alpha-beta pruning is a technique which always gives the same answer as brute-force searching without looking at so many nodes of the tree. Intuitively, alpha-beta pruning works by ignoring subtrees which it knows cannot be reached by best play (on the part of both sides). This reduces the eective branching factor from 35 to about 6, which makes strong play possible. The idea of alpha-beta pruning is illustrated in Figure 14.4. Assume that all child nodes are searched in the order of left to right in the gure. On the left side of the tree (the rst subtree searched), we have minimaxed and found a score of +4 at depth one. Now, start to analyze the next subtree. The children report back scores of +5, -1, . The pruning happens after the score of -1 is returned: since we are taking the minimum of the scores +5, -1, , we immediately have a bound on the scores of this subtree-we know the score will be no larger than -1. Since we are taking the maximum at the next level up (the root of the tree) and we already have a line of play better than -1 (namely, the +4 subtree), we need not explore this second subtree any further. Pruning occurs, as denoted by the dashed branch of the second subtree. The process continues through the rest of the subtrees. The amount of work saved in this small tree was insignicant but alphabeta becomes very important for large trees. From the nature of the pruning method, one sees that the tree is not evolved evenly downward. Instead, the algorithm pursues one branch all the way to the bottom, gets a score to beat (the alpha-beta bounds), and then sweeps across the tree sideways. How well the pruning works depends crucially on move ordering. If the best line of play is searched rst, then all other branches will prune rapidly. Actually, what we have discussed so far is not full alpha-beta pruning, but merely pruning without deep cutos. Full alpha-beta pruning shows up only in trees of depth four or greater. A thorough discussion of alpha-beta with some interesting historical comments can be found in Knuth and Moore [Knuth:75a].

CHAPTER 5. FUERZA BRUTA

28

5.2.2 5.2.3

Evaluacin de Posiciones o El Juego del Go

El juego del Go es de una naturaleza diferente al del Ajedrez.

5.3

El Viajante

Vamos a ver ahora un problema clsico en la teor de algoritmos, que ha sido a a con diferencia, el problema ms dif de resolver, y por ahora, el mayor de los a cil fracasos. Adems, este problema ha supuesto una de las principales motivaa ciones para el desarrollo de la teor de la complejidad computacional. a Descripcin del problema .... y su versin equivalente como problema de o o decisin o Evidentemente, el problema puede ser resuelto mediante la enumeracin de o todas las posibles soluciones, calculando el coste de cada una, y seleccionando la mejor entre ellas. Este procedimiento requerir un tiempo proporcional a n! a (existen 1 (n-1)! Rutas a considerar), que no es un tiempo polinomial. Ntese o 2 que este algoritmo se comporta muy bien en cuanto a requerimientos de espacio: slo require un espacio proporcional a n, ya que slo necesitamos recordar la pero o mutacin que estamos analizando en este momento, y la mejor ruta encontrada o hasta el momento. No se conoce ninguna solucin al problema del viajante en tiempo polio nomial. Podemos mejorar el n! Tiempo un poco mediante el mtodo de la e programacin dinmica (aunque a costa de utilizar unos requerimientos de eso a pacio exponenciales). Existen algoritmos eur sticos que se comportan bien, y encuentran rutas que no estan lejos de la ruta optima cuando se le proporcionan instancias t picas. Pero, si insistimos en algoritmos que garanticen el valor ptimo, el estado del arte slo ofrece respuestas exponenciales. Y esto no es o o debido a una falta de inters, ya que el problema del viajante es probablemente e uno de los algoritmos que ms se han estudiado. a Nos sentimos tentados a suponer que hay un impedimento fundamental, un l nea divisoria dramtica entre el problema del viajante y otros problemas a similares. Podr amos suponer que no hay solucin en tiempo polinmico para o o el problema del viajante. Esta armacin es una de las muchas maneras de o formular la famosa armacin de P != NP, el ms importante de los problemas o a en informtica terica. a o Decir algo sobre los problemas del milenio y la fundacin Clay o

5.4

Criptograf a

brute-force attack

CHAPTER 5. FUERZA BRUTA

29

5.5

Para divertirse ms a

Existen dos tipos de problemas relacionados con el ajedrez 1.- Cuantas piezas de un tipo dado pueden colocarse en un mismo tablero sin que se ataquen? Problema de las 8 reinas. 2.- Cual es el m nimo nmero de piezas necesarias para ocupar o atacar u cada cuadrado del tablero? 3.- El problema de la vuelta del caballo

Chapter 6

Mtodos Aleatorios e
Clculo de Pi. a

30

Chapter 7

Otros Mtodos e
Programacin Dinmica: Fibonacci Greedy Algorithms Hill Climbing: Network o a ow (mapa de carreteras?)

31

Chapter 8

Algunos Problemas Clsicos a


Torres de Hanoi

32

Chapter 9

Programacin Concurrente o
Los Filsofos Comensales o

33

Chapter 10

Imitando a la Naturaleza
Mtodos aleatorios? Aloritmos Genticos. Redes Neuronales. Hormigas. Enfrie e amiento Estad stico

34

Chapter 11

Ep logo
11.1 Algoritmos y patentes

Patentabilidad de los algoritmos

35

Chapter 12

Apndice 1: Introduccin a e o la Programacin o


Introduccin a la programacin o o Operador de asignacin := o Sentencias Condicionales si condicin entonces o sentencias finsi Operadores relacionales <, >, =, <=, >=, != Operadorres lgicos o & | ! Bucles mientras finmientras para inicializacin hasta finalizacin hacer o o sentencias finpara Funciones

36

Chapter 13

Apndice 3: Solucin a los e o Ejercicios

37

Chapter 14

Notas
Notas varias Tcnicas de resolucin de problemas e o Listado de tcnicas de resolucin de problemas existentes, y seccines en las que e o o son cubiertas: recursividad fuerza bruta divide y vencers a backtraking greedy algorithms programacin dinmica o a programacin lineal o El Arte de Programar Un poco de historia Se podr extender un poco ms el tema de la multiplicacin de nmeros a a o u romanos, y hablar del algoritmo que ten los romanos para ello. an Hablar de Granada (una de las seis universidades en las que he estudiado) de aquello de que quien divide por cero en Junio dividir por cero en Septiembre. a De que debe haber algo fundamentalmente erroneo en la idea de cero. Ver algun truquito de cosas raras que pasan cuando uno divide por cero. Hablar de los problemas que tienen los ordenadores para dividir por cero? Pseudocdigo Utilizado o Pendiente: Estudiar similitud con Logo. para i de 1 hasta 100 repetir n para si condicin entonces sino n si o mientras condicin repetir n mientras o leer variable escribir variable | texto 38

CHAPTER 14. NOTAS

39

(wikipedia algorithms) For a solvable problem, there are four dierent levels an algorithmic solution to the problem could be done: 1.the obvious way; 2.the methodical way; 3.the clever way; and 4.the miraculous way. On the rst and most basic level, the obvious solution might try to exhaustively search for the answer. Intuitively, the obvious solution is the one that comes easily if youre familiar with a programming language and the basic problem solving techniques. The second level is the methodical level and is the heart of this book: after understanding the material presented here you should be able to methodically turn most obvious algorithms into better performing algorithms. The third level, the clever level, requires more understanding of the elements involved in the problem and their properties or even a reformulation of the algorithm (e.g., numerical algorithms exploit mathematical properties that are not obvious). A clever algorithm may be hard to understand by being non-obvious that it is correct, or it may be hard to understand that it actually runs faster than what it would seem to require. The fourth and nal level of an algorithmic solution is the miraculous level: this is reserved for the rare cases where a breakthrough results in a highly non-intuitive solution. Naturally, all of these four levels are relative, and some clever algorithms are covered in this book as well, in addition to the methodical techniques. Mquinas de Turing a The Turing machine is a formal method for expressing arbitrary algorithms. Ser interesante comentar algo sobre la universalidad de los algoritmos. a Es decir, que no necesitamos necesariamente un ordenador para poder implementarlos, quizs nos baste con unas cajas de cerillas y unas bolitas, a una mesa de billar, o unos clavos y unas gmas elsticas. Quizs en el o a a apartado en el que se hable de mquinas de Turing. a Cita: homines dum docent discunt que signica la gente aprende cuando ensea (Seneca, Epistulae Morales, 7.8). n

14.1

Otros Posibles Temas

Temas de los que se podr hablar en el libro: a Criptograf a El cubo de Rubik Mquinas de Turing a Torres Quevedo Laberintos: Altoritmos para escapar de un laberinto. Laberintos conexos. Mitolog a. Los top 10 de los algorithmos

CHAPTER 14. NOTAS Morphognesis e numerical recipes Dijkstraa

40

14.2

Ejemplos

nmeros perfectos u cuadrados mgico a

14.3

A Investigar

Ariadnes thread

Chapter 15

Bibliograf a

Bibliograf a Libros Algorithmics: The Spirit of Computing David Harel Addison-Wesley, Reading, Mass., 1987 A History of Algorithms: From the Pebble to the Microchip E. Barbin et al. Springer Wikibook? Turing Omnibus The Art of Computer Programming Donald Knuth Introduction to Algorithms Thomas H. Cormen et al MIT Press and McGraw Hill The Design and Analysis of Computer Algorithms Alfred V. Aho AddisonWesley Algorithms Robert Sedgewick Addison-Wesley Algorithms + Data Structures = Programs Niklaus Wirth Prentice Hall Algoritmos de ordenacin o http://www.algoritmia.net/articles.php?id=31 http://dir.yahoo.com/Science/Computer Science/Algorithm Backtracking http://www.algoritmia.net/articles.php?id=33 Divide y Vencers a http://www.algoritmia.net/articles.php?id=34 Bibliograf Recomendada a Revisar texto En este apartado ... Adems de las referencias bibliogrcas escritas, tambin se ha incluido un a a e numeroso conjunto de referencias a documentos en internet. Sin embargo, dada la volatilidad de los contenidos en internet, donde documentos aparecen y desaparecen, y las direcciones cambian, las referencias no son del todo ables. Para intentar solucionar este problema, junto a las direcciones en internet o URL, se ha inclu suciente informacin para que, con la ayuda de un buscador en do o internet, el lector pueda buscar la nueva localizacin del documento. o 41

CHAPTER 15. BIBLIOGRAF IA

42

Cap tulo 1.- El Arte de Programar The MacTutor History of Mathematics archive Created by John J OConnor and Edmund F Robertson http://www-history.mcs.st-andrews.ac.uk/ School of Mathematics and Statistics University of St Andrews Scotland En castellano la wikipedia. Edicin impresa: o Euclides Elementos (3 volmenes) Biblioteca Clsica Gredos Editorial Greu a dos Edicin en Internet, en ingls con comentarios y programas de muestra: o e D. E. Joyce Dept. Math. & Comp. Sci. Clark University http://aleph0.clarku.edu/djoyce/java/elements/e Traducida al castellano por Jaume Domenech Larraz en http://www.euclides.org/

También podría gustarte