You are on page 1of 43

El Mundo de los Algoritmos

Rafael Angel Garc a Leiva July 9, 2006

Pr ologo
Hablar sobre la dicultad de encontrar referencias bibliogr acas en castellano.

Chapter 1

El Arte de Programar
La mayor a de las ciudades de hoy en d a funcionan gracias a los ordenadores. 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 est an ah , pero basta con detenemos un momento y jamos con atenci on para verlos, puede incluso que los encontremos en los lugares m as insospechados. En la ocina tenemos ordenadores que nos ayudan a hacer nuestro trabajo; en casa tenemos un ordenador como centro de ocio, para juegos, m usica y video, o miniordenadores empotrados dentro de los m as variados electrodom esticos, como la televisi on, el equipo de alta delidad, e incluso en el microondas; en el supermercado de la esquina hay unos cuantos ordenadores m as, las cajas registradoras, los equipos de inventario; en nuestro coche est a el famoso ordenador de abordo, que vigila que todo funciona correctamente; y as un largo etc etera. Y tambi en est an aquellos ordenadores que llevamos todo el d a de un lado a otro con nosotros, como el tel efono m ovil, la agenda electr onica, o el reloj. Hemos llegado a una situaci on de dependencia tal que nos resulta muy dif cil concebir el mundo sin la existencia de los ordenadores1 . Lo que nunca hacemos, a menos que uno sea un profesional que trabaja en el mundo de la inform atica, es pararnos a reexionar sobre c omo funcionanan todos estos ordenadores. Nos han dicho muchas veces que los ordenadores son en realidad m aquinas muy tontas, que para funcionar correctamente necesitan de un conjunto de instrucciones que les digan con todo lujo de detalles qu e es lo que tienen que hacer en cada momento, y c omo lo tienen que hacer. Tambi en sabemos que estos conjuntos de instrucciones se llaman programas, y que los programas se escriben utilizando los llamados lenguajes de programaci on, que 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 s umamente aburrido. A qui en se le ocurrir a estudiar en su tiempo libre el programa que controla un aparato de aire
1 Otra cuesti on muy distinta es si realmente en todos los casos el ordenador nos hace la vida m as f acil, pero este es un tema del que no vamos a hablar en este libro.

CHAPTER 1. EL ARTE DE PROGRAMAR

acondicionado? Sin embargo, los programas no son tan aburridos como parece. En el coraz on de los programas se encuentran los algoritmos. La mayor a de las veces, estos algoritmos son simples sucesiones de pasos triviales que conducen a la soluci on de un problema. Por ejemplo, si la temperatura de la habitaci on ha 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. Qui en sabe, a lo mejor el funcionamiento de nuestro aparato de aire acondicionado est a basado en una interesant sima teor a matem atica de l ogica difusa, donde las cosas no son s olo ciertas o falsas, sino que pueden ser medio ciertas o tres cuartos falsas. En este libro vamos a ver algunas de esas joyas de la programaci on que hay escondidas dentro de los ordenadores. Veremos c omo problemas aparentemente my simples requieren de algoritmos muy complejos para su soluci on, o de algoritmos que en la pr actica resultan in utiles porque requieren cientos de a nos de c alculo. Tambi en estudiaremos ejemplos del caso contrario, es decir, c omo problemas que en un principio parec an intratables son resueltos de manera muy simple, generalmente gracias a la ayuda de alguna idea brillante. Aprenderemos c omo comparar algoritmos, en base al tiempo que tardan en resolver un 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 u timo estudiaremos las t ecnicas m as comunes de resoluci on de problemas de las que se valen los programadores para hacer su trabajo. Todo ello mezclado con algunas notas hist oricas, an ecdotas, preguntas sin respuesta conocida, y sobre todo, con numerosos problemas propuestos para que el lector pueda divertirse creando sus propios algoritmos.

1.1

Pero, qu e es un algoritmo?

Hasta ahora he asumido que el lector tiene al menos una idea intuitiva de lo que es un algoritmo, y tambi en que tiene unos conocimientos m nimos sobre el funcionamiento de los ordenadores (qu e es un programa de ordenador, cu al es la diferencia entre hardware y software, etc etera). Pero para poder continuar con 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 m as precisa qu e entendemos por algoritmo y aclarar algunos conceptos b asicos. La Real Academia de la Lengua dene la palabra algoritmo como conjunto ordenado y nito de operaciones que permite hallar la soluci on de un problema. Aunque quiz as no seamos conscientes de ello, es muy normal que nos ayudemos de algoritmos en nuestra vida contidiana, y no s olo cuando utilizamos ordenadores o realizamos c alculos algebr aicos. Por ejemplo, cuando compramos una estanter a barata de las de m ontela usted mismo, junto con las tablas de madera encontramos un folleto de instrucciones con un algoritmo que nos indica c omo montarla; cuando nos subimos en nuestro coche seguimos un algoritmo preciso que nos indica c omo conducir (introducir la llave, girarla a la posici on de contacto, volverla a girar hasta la posici on de arranque, soltar la llave cuando el

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 m as detalle. Imaginemos que queremos hacer una tortilla de patatas pero, como nos ha pasado a todos en alg un momento de nuestra vida, no sabemos c omo se hace. As que cojemos nuestro libro de recetas de concina para hijos reci en emancipados, y buscamos la receta 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 sart en con aceite abundante y no muy caliente. Al poco rato, a nadir la cebolla y dejar que se fr a junto con las patatas. En un cuenco batimos los huevos, le echamos sal, y a nadimos las patatas y cebolla ya fritas, mezcl andolo todo bien. Dejamos un poco 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 p arrafo anterior, aunque resulta f acil de entender para cualquier ser humano, es totalmente incomprensible para un ordenador. Podr amos reescribir la receta de manera algo m as formal y precisa, intentando darle apariencia de programa de ordenador (v ease el cuadro titulado Algorimo 1), pero aun as seguir a siendo un galimat as ininteligible para las m aquinas. De hecho, aun contando con instrucciones tan precisas de c omo se hace una tortilla de patatas, es normal que a cada uno de nosotros nos salgan tortillas completamente diferentes (yo personalmente, aun no consigo entender qu e hace mi mujer para que a ella le salgan las tortillas mucho m as ricas que a mi). El problema es que nuestro algoritmo Tortilla de Patatas contiene todav a muchos elementos que, o bien tienen interpretaciones subjetivas (a qu e temperatura se entiende que el aceite no est a muy caliente?), o bien est an descritos de manera demasiado vaga (qu e se entiende por cuajar?), y por tanto, no son directamente interpretables por un ordenador. Las recetas, tal y como nos las encontramos en los libros de concina, no entrar an dentro de lo que en inform atica se conoce como procedimientos computacionalmente bien denidos, y por tanto, no son directamente interpretables por los ordenadores. Los algoritmos utilizados en inform atica tienen que ser bastante m as precisos que nuestro ejemplo de la tortilla, y basase en pasitos m as peque nos. Un algoritmo para ordenador est a compuesto de un conjunto de pasos muy simples y muy bien denidos. Ejemplos t picos de posibles pasos son: sumar dos n umeros dados, comparar si un n umero es mayor que otro, comprobar si la tercerla letra de la palabra ejemplo es una e, etc etera. Estos pasos suelen venir agrupados en bloques que se pueden repetir varias veces, tambi en existen pasos en los que es posible tomar decisiones, llamadas a grupos de pasos comunes, etc. Adem as, para que el algoritmo est e completo, es fundamental

CHAPTER 1. EL ARTE DE PROGRAMAR Algorithm 1 Tortilla de Patatas 1 Cortar patatas en tacos 2 Calentar aceite en sart en 3 A~ nadir patatas a sart en 4 A~ nadir cebolla a sart en 5 Freir patatas y cebolla 6 Batir huevos en cuenco 7 A~ nadir patatas y cebolla al cuenco 8 Quitar aceite sart en 9 Hechar la mezcla de cuenco a sart en 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 a tener como entrada un conjunto de diez n umeros (17, 1, 5, 13, 15, 9, 21, 2, 4, 8), y como salida devolver el mismo conjunto de n umeros pero ordenados de mayor a menor (21, 17, 15, 13, 9, 8, 5, 4, 2, 1). Pero no se preocupe el lector si por ahora no entiende del todo c omo son los algoritmos que utilizan los ordenadores, ya que todas estas cuestiones ir an quedando m as claras a lo largo de este libro.

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, c omo ha ido evolucionando el concepto de 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 a (325 adC, 265 adC) fue el m as importante de los matem aticos de la antig uedad, sin embargo, se sabe muy poco de su vida, excepto que ense n o en Alejandr a, y en Egipto. Euclides debi o de haber estudiado en la Academia de Plat on en Atenas, donde aprendi o la geometr a de Eudoxus y Theaetetus, con los que estaba muy familiarizado. Su trabajo m as conocido es un tratado en matem aticas titulado Los Elementos. El tratado es un compendio del conocimento matem atico de la epoca, que se convirti o en el centro de la ense nanza de las matem aticas durante m as de 2000 a nos. La durabilidad de los Elementos hacen de Euclides el profesor de matem aticas l der indiscutible de la antig uedad, y quiz as de todos los tiempos. Seguramente los resultados que encontramos en Los Elementos no fueron demostrados por primera vez por Euclides, pero la organizaci on del material y la exposici on son con toda seguridad 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 geom etrico, teoremas y m etodos. A veces se dice que, junto con

CHAPTER 1. EL ARTE DE PROGRAMAR

Figura 1.1: Im agen de Al-Khwarizmi en un sello sovi etico la Biblia, los Elementos puden ser el libro de texto m as traducido, publicado y estudiado del mundo occidental. Los Elementos se dividen en 13 libros. Los libros de uno a seis tratan de la geometr a del plano; los libros de siete a nueve tratan de la teor a de n umeros; el libro diez trata de la teor a de los n umeros irracionales; y los libros de once a trece tratan de la geometr a en tres dimensiones. En particular nos aqu nos interesa el libro n umero siete, una introducci on auto-contenida de la teor a de n umeros, porque contiene el famoso algoritmo de Euclides, un m etodo muy astuto para calcular el m aximo com un divisor de dos n umeros (v ease la Secci on 1.3), y que est a considerado como el primer alroritmo de la historia de la humanidad. La palabra algoritmo proviene del nombre del matem atico persa del siglo IX Abu Abdullah Muhammad bin Musa al-Khwarizm (v ease Figura 1.1). AlKhwarizmi fue el matem atico m as inuyente de su tiempo, y su legado incluye algunos conceptos que hoy d a resultan b asicos en algebra. En realidad se conoce muy poco sobre la vida de Al-Khwarizmi, se sabe que trabaj o en la Casa de la Sabidur a de Bagdad, y que su trabajo consist a fundamentalmente en la traducci on de manuscritros cient cos griegos, aunque tambi en hizo importantes contribuciones en algebra, geometr a y astronom a. Sin duda, el trabajo m as importante y conocido de Al-Khwarizmi es su tratado sobre algebra al-jabr wal-muqabal. Este tratado es el primer libro de la historia d onde se estudia en profundidad y de manera sistem atica el algebra, y por tanto, se habla de Al-Khwarizmi como fundador de esta rama de la matem atica (de hecho, el t tulo del tratado al-jabr ha dado origen a la propia palabra algebra). El tratado sobre algebra de Al-Khwarizmi tambi en es importante porque describe el sistema posicional hind u de n umeraci on, basado en los guarismos decimales 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, y que ahora conocemos comunmente como n umeros ar abigos. Aunque no seamos consciente de ello, el sistema posicional es fundamental en algebra, y si no, trate el lector de multiplicar 728 por 293 utilizando el sistema de numeraci on romano (es decir DCCXXVIII por

CHAPTER 1. EL ARTE DE PROGRAMAR

Figure 1.2: Ada Lovelace CCXCIII). En el tratado tambi en se introduce el uso del cero como contenedor de lugar en la notaci on basada en posiciones, otra idea fundamental para el desarrollo actual del algebra, que nos permite distinguir entre, por ejemplo, las cantidades 202, 220 y 22. De echo, hay autores que opinan que la invencci on del cero fue m as importante que la invenci on de la propia rueda. Originalmente la palabra algoritmo se refer a u nicamente al conjunto de reglas necesarias para realizar aritm etica utilizando los n umeros ar abigos. Fue en el sigo XVIII cuando el concepto evolucion o para incluir a todo procedimiento 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 (v ease la Figura 1.2), Condesa de Lovelace, en 1842. El ordenador en cuesti on era el Ingenio Anal tico de Charles Babbage, concebido en 1834. El Ingenio Anal tico de Babbage era una computadora mec anica programable, de caracter sticas muy similares a los ordenadores electr onicos modernos: dispon a de un sistema de entrada de datos basado en tarjetas perforadas, una memoria con capacidad para almacenar 1000 n umeros de 50 d gitos, una unidad capaz de realizar las cuatro operaciones aritm eticas b asicas, y una impresora. Ada Lovelace tradujo para Babbage el memor andum que el matem atico Luigi Menabrea hab a escrito sobre el Ingenio Anal tico. Junto a la traducci on, Ada a nadi o un conjunto de notas en las que describia en detalle un procedimiento para calcular n umeros de Bernoulli2 utilizando la m aquina, y que ha sido reconocido por los historiadores como el primer programa de ordenador. En realidad el Ingenio Anal tico no era una m aquina tangible, sino que se trataba de un conjunto de dise nos que Babbage fue perfeccionando a lo largo de su vida. Dado que Babbage nunca lleg o a construir su ingenio anal tico, el algoritmo de Ada Lovelace no se lleg o a implementar. A pesar de ello, para muchos (incluido el autor de este libro) Ada Lovelace es considerada como la primera programadora
2 Secuencia de n umeros racionales con importantes implicaciones en teoria de n umeros y an alisis matem atico.

CHAPTER 1. EL ARTE DE PROGRAMAR

Figure 1.3: Alan Turing de ordenadores de la historia. Ada Lovelace tambi en es conocida, aparte de por ser la u nica hija leg tima del poeta Lord Byron, por haber dado nombre al lenguaje de programaci on Ada3 . La falta de rigor matem atico en la denici on algoritmo como procedimento bien denido cre o muchas dicultades a los matem aticos y l ogicos del siglo XIX y principios del XX. Este problema fue en gran medida resuelto gracias a la descripci on formal de algoritmo proporcionada por lo que hoy se conoce con el nombre de M aquina de Turing, un modelo abstracto de computadora formulado por el matem atico brit anico Alan Mathision Turing en 1936. Turing hizo importantes contribuciones en matem aticas, l ogica y criptoan alisis. Durante la segunda guerra mundial trabaj o para los aliados descifrando los mensajes del ej ercito alem an, y en concreto, descifrado el c odigo secreto de la famosa m aquina Enigma. Una vez nalizada la guerra trabaj o en el desarrollo de software para uno de los primeros ordenadores de la histororia, el Mark I de Manchester, adem as de que dise n o su propia computadora, llamada ACE, que no lleg o a construirse. Turing tambi en es conocido por sus ideas en el area de la inteligencia articial, donde proporcion o un experimento conocido con el nombre de Test de Turing que nos permite determinar si una m aquina es o no inteligente. Pero sin lugar a dudas, el trabajo m as inuyente de Turing es su contribuci on a los fundamentos de la inform atica: actualmente las m aquinas de Turing constituyen una parte fundamental en el estudio de la teor a de la computaci on. Turing fue un homosexual durante una epoca donde la homosualidad era ilegal. En 1952 fue condenado por actitudes indecentes al admitir que hab a mantenido relaciones sexuales con un hombre en Manchester. La condena tambi en
3 Ada es un lenguaje de prop osito general que fue desarrollado por el departamento de defensa norteamericano en un intento de contener la torre de babel de lenguajes de programaci on en la que se hab an convertido los proyectos inform aticos (en 1983 se estimaba que hab a del orden de 450 lenguajes de programaci on diferentes en uso en el departamento).

CHAPTER 1. EL ARTE DE PROGRAMAR

le impuso que siguiera una terapia hormonal para corregir su homosexualidad. Dos a nos despu es, en Junio de 1954, Alan Turing fue encontrado muerto en su casa al haber ingerido una manzana impregnada con cianuro. Si fue un suicidio, o un accidente (Turing disponia de un laboratorio de fotograf a en el que utilizaba habitualmente cianuro), es algo que todav a no est a resuelto. Dede el a no 1966 la asociaci on internacional de inform atica ACM (Association for Computing Machinery ) concede anualmente el premio Turing, que es otorgado a aquellos investigadores que hayan destacado por sus contribuciones t ecnicas a la comunidad inform atica. Estos premios estan considerados como 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 m aximo com un divisor de dos n umeros dados. El primero de ellos est a basado en un m etodo m as bien ingenuo para el c alculo del m aximo com un divisor; el segundo se basa en una idea muy original que nos simplicar a enormemente la tarea. Estos dos algoritmos nos van a permitir introducir algunos conceptos importantes sobre algor tmica y la programaci on de ordenadores, y tambi en nos van a ayudar a denir la notaci on que vamos a utilizar a lo largo de este libro para la descripci on de los algoritmos. Antes de empezar a estudiar en detalle estos algoritmos, me gustar a asegurarme 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 programaci on de ordenadores, y que no conozcan ning un lenguaje de programaci on, deber an leer primero el Apendice 12 donde se proporciona una introducci on a la programaci on lo sucientemente detallada para entender los contenidos de este libro. Aquellos lectores que tengan cierta experiencia previa en el manejo de ordenadores, y que conozcan alg un lenguaje de programaci on, pueden continuar leyendo directamente, aunque tambi en se les recomienda que hechen un vistazo r apido al Ap endice 12, con la idea de familizarizarse con la notaci on en pseudoc odigo que vamos a utilizar en el libro. Vamos a la tarea. Recordemos que el m aximo com un divisor de dos n umeros 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 n umeros que dividen a la vez a ambos. Por ejemplo MCD(5, 3) = 1, MCD(15, 9) = 3, y MCD(60, 15) = 5. El c alculo del m aximo com un divisor resulta muy u til a la hora de simplicar x5 12 facciones, por ejemplo la fracci on 60 podr amos simplicarla a 12 15 3x5 = 3 . En el Algoritmo 2 podemos encontrar el primer m etodo para el c alculo del m aximo com un divisor. El algoritmo recibe como par ametros de entrada dos n umeros, a y b, y como resultado nos muestra en pantalla el MCD(a, b). Para ello, el algoritmo se basa en un procedimiento muy simple: primero calcula cual es el menor de los n umeros a y b, a continuaci on recorre todos los n umeros que

CHAPTER 1. EL ARTE DE PROGRAMAR Algorithm 2 C alculo del MCD funci on MCD(a, b) min := m nimo(a, b); para x := 1 hasta min hacer si (m odulo(a, x) = 0 ) & (m odulo(b, x) = 0) entonces 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 n umero x divide a otro y, lo que hacemos es utilizar la funci on m odulo, que nos devuelve el resto de la divisi on enterea entre x e y (por ejemplo m odulo(7, 2) = 1, o m odulo(6, 2) = 0, en 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 n umeros que han dividido a la vez a a y b, es decir, su m aximo com un divisor. Existen muchas formas de mejorar el algoritmo anterior. Por ejemplo, no har a falta comprobar cuales son los divisores de a y b desde 1 hasta m nimo de a y b, bastar a con comprobar desde 1 hasta la raiz cuadrada del m nimo (piense el lector por qu e). Otra manera m as renada de calcular el MCD ser a mediante la factorizaci on de los n umeros a y b. Recordemos que cualquier n umero entero puede ser descompuesto de manera u nica mediante el producto de n umeros primos. Por ejemplo: 6 = 2 3, 15 = 3 5, y 60 = 22 3 5. En general cualquer n umero n puede ser factorizado como:
f1 f1 1 n = pf 1 p1 . . . p1

donde pi son n umeros primos, y f i el n umero de veces que aparecen dichos n umeros. Una vez factorizados ambos n umeros tan s olo tendr 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 n umero en sus factores primos no es una tarea f acil, como veremos m as adelante cuando tratemos el tema de la criptograf a. En lugar de factorizar ambos n umeros, vamos a utilizar otro m etodo, conocido como algoritmo de Euclides, que nos permite calcular el m aximo com un divisor de una manera f acil, elegante, y r apida. El algoritmo de Euclides se basa en la siguiente propiedad: si a y b son dos n umeros enteros cualesquiera, entonces MCD(a, b) = 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 m as h abiles

CHAPTER 1. EL ARTE DE PROGRAMAR

11

Figure 1.4: Regla divisora con las matem aticas, podr an incluso intentar dar una demostraci on formal. Pero en realidad no hace falta complicarse tanto la vida. S olo tenemos que pensar un poco qu e es lo que realmente signica esta propiedad para darnos cuenta de que la idea es trivial (y como toda idea trivial que se precie, tuvieron que pasar muchos a nos hasta que alguien se percat o de ella). Imaginemos que tenemos dos barras de acero de longitudes a y b respectivamente, y que queremos medirlas utilizando para ello una peque na regla de madera. Si la regla de madera nos da un n umero entero de medidas en una de las barras es porque la regla es un divisor de dicha barra. Si despu es de medir 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 a precisamente el m aximo com un divisor (v ease la Figura 1.4). Ahora bien, si encontramos una regla que divide a la barra b, para ver si tambi en divide a la barra a bastar a con comprobar que divide a aquella parte 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 a de resolver el mismo problema pero invertidos los papeles de las barras. Bas andonos en esta idea, podemos escribir el siguiente Algoritmo de Euclides (v ease el Algoritmo 3). La idea consiste en ir cortando alternativamente de la barra m as larga la parte que sobresale de la barra m as peque na, hasta que ambas barras tengan exactamente la misma logitud, que ser a el m aximo com un divisor. El algoritmo puede ser mejorado todav a un poco m as, utilizando para ello la funci on m odulo que hemos visto m as arriba, pero esta mejora se la dejo propuesta al lector como ejercicio.

1.4

Ciencia, arte o ingenier a

Pr acticamente desde que aparecieron las primeras computadoras electr onicas, y con ellas los primeros programadores, ha habido un debate sobre si la programaci on de ordenadores es una ciencia, un arte o un proceso de ingenier a. El problema radica en que no existe ning un m etodo formal para dise nar algoritmos, es decir, no existe ning un algoritmo que nos permita escribir algoritmos,

CHAPTER 1. EL ARTE DE PROGRAMAR

12

Figure 1.5: Interpretaci on geom etrica del algoritmo de Euclides

Algorithm 3 Algoritmo de Euclides funci on MCD Euclides(a, b) 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 ingeni arselas con cada nuevo problema que tienen que resolver. Tan s olo disponemos de un conjunto de t ecnicas generales y de buenas pr acticas, que iremos viendo a lo largo de este libro, y que nos pueden servir como base para dise nar nuestros propios algoritmos. Pero al nal, el dise nador de algoritmos ha de basarse m as en su experiencia y su intuici on que en ning un m etodo formal. En la secci on 1.2 mencionamos los premios Turing, que la asociaci on ACM concede cada a no, en honor al matem atico Alan Turing, a aquellos investigadores que hayan destacado por sus contribuciones t ecnicas a la comunidad inform atica. En el a no 1974 el premio Turing fue concedio al profesor Donald E. Knuth, de la Universidad de Stanford (EEUU), por sus contribuciones en el an alisis de algoritmos y en el dise no de lenguajes de programaci on, y en particular por sus famosa serie de libros El Arte de Programar Ordenadores . En 1968 el profesor Knuth public o el primero de una serie de libros con el animo de recopilar todo el conocimiento disponible sobre el arte de programar ordenadores. El primer volumen estaba dedicado a los algoritmos m as fundamentales; el segundo volumen, publicado en 1969, trataba de los algoritmos seminum ericos; y el tercer volumen, publicado en 1973, sobre algoritmos de ordenaci on y b usqueda. El cuarto volumen, aun no publicado, tratar a sobre algoritmos combinatorios, y nalmente, el quinto volumen, que se espera para el a no 2010, hablar a de los algoritmos sint acticos4 . Para hacerse una idea de la importancia de la serie de libros publicada por el profesor Knuth, basta mencionar que en el a no 1999, la revista American Scientist, los incluy o en una lista con las doce mejores monograf as de la ciencia del siglo XX, junto con t tulos como la relatividad de Einstein, la mec anica cu antica de Dirac, o los fundamentos de la matem atica de Russell y Whitehead. Durante la entrega de la medalla Turing, el profesor Knuth hizo una ardiente defensa de la idea de que la programaci on es, ante todo, un arte. El profesor nos ense naba sobre la necesidad de buscar la belleza en la programaci on: Preparar un programa, es como escribir poes a o componer m usica; como Adrei Ershov dijo una vez, la programaci on puede darnos satisfacci on emocional e intelectual a la vez, porque es un verdadero logro dominar la complejidad y establecer un sistema de reglas consistentes. Adem as, cuando leemos los programas que otros han escrito, 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 disertaci on diciendo: Hemos visto que la programaci on de ordenadores es un arte, porque aplica el conocimiento acumulado al mundo, porque requiere
4 Aunque quiz as el profesor nos sorprenda con dos vol umentes m as: volumen 6, sobre la teor a de los lenguajes libres de contexto, y el volumen 7, sobre t ecnicas para compiladores.

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 a con lo que hace, y lo har a mucho mejor.

14

Mi opini on personal es que la programaci on de ordenadores es una mezcla de todo, de ciencia, de arte y de ingenier a, y que estas diferentes visiones se complementan entre s . El programador de hoy d a ha de conocer y manejar correctamente estas tres facetas. Ha de conocer los m etodos de ingenier a de la programaci on si quiere ser capaz de gestionar la complejidad de los grandes proyectos. Adem as, el programador ha de estar familiarizado con los fundamentos te oricos y cient cos de la programaci on de ordenadores. Y sobre todo, el programador ha de buscar la belleza de los algoritmos que escribe.

1.5

Algoritmos y lenguajes de programaci on

No me gustar a nalizar este cap tulo si escribir unas palabras sobre los lenguajes de programaci on. Sabemos que para que un ordenador pueda ejecutar un algoritmo primero tenemos que traducirlo a alguno de los muchos lenguajes de programaci on de ordenadores que existen. Los ordenadores de hoy en d a no son capaces de procesar directamente el lenguaje pseudoc odigo que vamos a utilizar en este libro para escribir los algoritmos. El problema es que el pseudoc odigo aqu utilizado, aunque es lo sucientemente claro y conciso para los humanos, contiene demasiadas ambig uedades que son insuperables por los ordenadores. De ah que necesitamos primero traducir nuestro pseudoc odigo a alg un lenguaje de programaci on formal antes de poder ver nuestros algoritmos funcionando en un ordenador. Existen numeros lenguajes de programaci on, que se basan a su vez en paradigmas. Por ejemplo, tenemos la programaci on estructurada con los lenguajes Pascal y C, la programaci on orientada a objetos con Java o C++, la programaci on l ogica con Prolog, la programaci on funcional con LISP, etc. Pero no vamos a entrar a estudiar los detalles de cada uno de estos paradigmas y lenguajes, porque esto nos llevar a demasiado tiempo. Tampoco voy a proporcionar la traducci on del pseudoc odigo de los ejemplos a alguno de estos lenguajes de programaci on; en primer lugar porque para ello primero tendr a que elegir uno de lenguajes existentes (C, Pascal, Java, etc.), y elija el que elija, seguro que el 80% de mis lectores se enfadar a por la elecci on (existen unas terribles guerras de religi on en cuanto cual es el mejor lenguaje de programaci on que existe); en segundo lugar porque pienso que el pseudoc odigo que he utilizado en los ejemplos es lo sucientemente claro para que los lectores no tengan dicultad para traducirlo ellos mismos a su lenguaje favorito. Tan s olo hacer una peque na advertencia a los lectores, y es que tengan en cuenta que seg un que problema queramos resolver, es mejor utilizar un lenguaje que otro. Es decir, que a pesar de que disponemos de lenguajes que por su versatilidad son conocidos como lenguajes de prop osito general, algunas cosas s on m as f aciles de hacer en algunos lenguajes que en otros. Luego no es buena idea conocer un u nico lenguaje.

CHAPTER 1. EL ARTE DE PROGRAMAR

15

1.6

Para divertirse m as ...

Existen muchos, y muy buenos, libros sobre algor tmica y sobre la programaci on de ordenadores. En esta secci on s olo voy a comentar algunos de ellos, para que el lector los tenga como referencia por si quiere profundizar m as sobre la materia. Un excelente recopilaci on del conocimiento actual sobre los algoritmos es el libro Introduction to Algorithms, de Thomas H. Cormen et al. (editorial MIT Press), pero no tiene traducci on al castellano. Tambi en en ingl es, y mucho m as accesible que el anterior, tenemos el libro Algorithmics, the Spirit of Computing, de David Harel y Yishai Feldman (editorial Addison Wesley). De dibulgaci on y en castellano podemos encontrar el libro De Euclides a Java, de Ricardo Pe na Mar (editorial Nivola). Importancia del cero No bromeaba cuando armaba que el concepto de cero es una de las ideas m as importantes de la historia de la humanidad. Para saber m as sobre el g enesis de la idea de cero, y sobre sus implicaciones, recomiendo la lectura del libro La Biograf a de una Idea Peligrosa, de Charles Seife (de Ediciones Ellago). Charles Babage Charles Babbage s que intent o construir otra m aquina m as simple que su Ingenio Anal tico, denominada Ingenio de Diferencias, pero desgraciadamente el proyecto acab o en el m as absoluto fracaso. Son muchos los historiadores que opinan que Chales Babagge fue un adelantado a su tiempo, ya que con la tecnolog a disponible en la epoca Victoriana no era posible construir semejante artilugio. Sin embargo, la reciente construcci on con exito en el Museo de la Ciencia de Londres de uno de los ingenios calculadores dise nados por Babbage ha demostrado que la historia ha juzgado err oneamente al precursor de la computaci on autom atica. Los ingenieros del museo demostraron que las m aquinas de Babbage no conten an errores l ogicos o de dise no graves, y t ecnicamente eran viables para lo que los artesanos del siglo XIX pod an fabricar. El fracaso del proyecto fue debido m as a un problema de gesti on del mismo que a problemas t ecnicos o de concepto. Para saber m as sobre la computadora mec anica de Charles Babbage recomiendo la lectura del art culo de Doron D. Swade en la revista Investigaci on y Ciencia (Abril 1993). En otra l nea est a el libro de Willian Gibson, The Dierence Engine, una novela de cci on que narra como hubiera sido la evoluci on de la humanidad si Charles Babbage hubiese conseguido nalizar su computadora, adelantando el inicio de la era de la informaci on un siglo.

CHAPTER 1. EL ARTE DE PROGRAMAR Alan Turing

16

Sobre Alan Turing hay muchos libros escritos. Le recomiendo al lector que adem as de leer alguna biograf a de Turing, tambi en intente buscar informaci on sobre los siguientes apasionantes temas: la m aquina universal de Turing, el c odigo enigma y el test de Turing. Donald Knuth La trilog a de libros El Arte de Programar Ordenadores de Donald Knuth, ha sido publicada en castellano por la editoriral Revert e. La disertaci on del profesor Knuth durante la recepci on de premio Turing titulada Computer Programming as an Art fue publicada por la revista Communications of the ACM (volumen 17, n umero 12, Diciembre de 1974).

Chapter 2

Algunos Ejemplos
Antes de pasar directamente a revisar cuales son las principales t ecnicas de resoluci on de problemas utilizadas en algor 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 inform atica. Resulta de vital importancia contar con buenos algoritmos, que soluciones los problemas de manera r apida, y que a la vez consuman pocos recursos, como memoria. Pi ensese por ejemplo en el caso de los buscadores de informaci on en internet, aquel buscador que posea el mejor algoritmo de b usqueda, que sea capaz de proporcionar informaci on relevante para el usuario, ser a el que consiga mayor cuota de mercado (un mercado muy lucrativo, por cierto). O por ejemplo en el area de la seguridad inform atica y la criptograf a, donde es fundamental contar con algoritmos de encriptaci on que sean indescifrables, al menos desde un punto de vista pr actico. O en el caso de las bases de datos, tan comunes en bancos, departamentos de contabilidad, administraciones y muchos otros lugares, donde es necesario contar con algoritmos de b usqueda que nos proporcionen la informaci on que necesitamos en un tiempo razonable. La algor tmica es la rama de la inform atica encargada de buscar y analizar algoritmos ecientes que solucionen problemas comunes (qu e entendemos por algoritmo eciente es algo que veremos en detalle m as adelante). Ejemplos con algoritmos de ordenaci on 2.- Complejidad Algor tmica Antes de empezar a estudiar las diferentes t ecnicas de soluci on de problemas, deber amos hacer una peque na revisi on de las herramientas matem aticas que nos permiten estudiar los diferentes algoritmos. Primero, revisaremos las deniciones y t erminos matem aticos que vamos a usar en el resto del libro. Al disponer de este vocabulario matem atico podremos ser m as precisos y formular los problemas de manera m as f acil. Despu es, revisaremos las t ecnicas existentes 17

CHAPTER 2. ALGUNOS EJEMPLOS

18

para analizar el tiempo de ejecuci on de un algoritmo. En el resto del libro, despu es de cada algoritmo proporcionaremos un an alisis de su tiempo de ejecuci on y una prueba de su correcteness. Notaci on Asint otica Denotamos porel conjunto de los n umeros naturales (tales como 1, 2, 3, etc etera). En complejidad algor 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 m as lento. 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 tambi en de los requerimientos de espacio.

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 a usted seguro?

Una de los principales problemas de la algor tmica es c omo estar seguros de que un algoritmo es correcto. Es decir, c omo sabemos que un algoritmo va a dar la respuesta correcta a los par ametros de entrada proporcionados.

Chapter 3

Recursividad
M etodos Iterativos y M etodos Recursivos. C alculo de n! Series de Fibonacci.

22

Chapter 4

Divide y Vencer as
Si el presidente de mi pa s me llamase por tel efono para pedirme consejo sobre como conquistar alg un pa s vecino, seguramente lo que le recomendar a es que tratase de dividir el ej ercito de nuestro rival, es decir, que aplicase la vieja estrategia de Divide y Vencer as. La m axima divide y vencer as (del latin Divide et Impera) es atribuida a Maquiavelo, aunque es una t actica que se viene utilizando desde muy antiguo. Por ejemplo, es de sobra conocido que el C esar seguramente la ten a en la mente cuando, uno por uno, ya sea en el campo de batalla o por medios diplom aticos, consigui o que los jefes locales aceptaran la autoridad de Roma. La estrategia divide y vencer as tambi en ha sido utilizada con gran acierto por los administradores de los grandes imperios, incluyendo el imperio brit anico, el cual jugaba a enfrentar una tribu contra otra para mantener el control de sus colonias con un n umero m nimo de fuerzas. El concepto de divide y vencer as gan o especial relevancia cuando la India entr o a formar parte del imperio brit anico. Los brit anicos utilizaron esta estrategia de manera 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 brit anicos tomaron el control de peque nos estados principescos hindues en lugar de unir Inida en una u nica naci on. En pol tica y sociolog a, el m etodo divide y vencer as es una estrategia de sobra conocida para ganar y mantener el poder mediante la divisi on de grandes 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 peque nos grupos de poder se previene que se enlacen y se conviertan en m as poderosos, dado que es m as dicil romper estructuras de poder ya existentes. Pero volvamos a los algoritmos, que es lo que en realidad nos interesa, y veamos c omo podemos aplicar la estrategia divide y vencer as para resolver muchos problemas. Muchos algoritmos u tiles son recursivos en estructura: para resolver un problema, se llaman a s mismos recursivamente una o m as veces para tratar con subproblemas relacionados. Estos algoritmos t picamente siguen un m etodo divide-y-vencer as: parten el problema en subproblemas que 23

CHAPTER 4. DIVIDE Y VENCERAS

24

son similares al problema original pero m as peque nos en tamao, y resuelven el problema de manera recursiva, y despu es combinan estas soluciones para crear una soluci on al problema original. El paradigma de resoluci on de problemas divide y vencer as involucra tes pasos a cada nivel de la recursi on: Divide el problema en un n umero de subproblemas. Conquista cada subproblema resolviendolo de manera recursiva. Si el tama no de los subproblemas es lo sucientemente peque no, sin embargo, tan s olo soluciona los problema de una manera directa. Combina la soluci on de los subproblemas en la soluci on del problema original.

4.1 4.2

Merge Sort Multiplicaci on?

Multiplicaci on divide y vencer as

4.3

La Transformada de Fourier

Chapter 5

Fuerza Bruta
Una t ecnica de resoluci on de problemas para la que los ordenadores est an especialmente bien dotados es la conocida como fuerza bruta. B asicamente la idea cosiste en dado un problema, intentar de manera sistem atica todas las soluciones posibles hasta dar con la soluci on buscada. Un ejemplo de algoritmo basado en fuerza bruta lo vimos en la secci on 1.3 al calcular el m aximo com un divisor de dos n umeros naturales a y b, para ello enumer abamos todos los enteros desde 1 hasta el m nimo de a y b, y comprob abamos si divid an a ambos n umeros a la vez. La fuerza bruta es un m etodo de resoluci on de problemas muy ing enuo, y que apriori puede parecernos que no deber a tener mucho exito. El principal inconveniente que tiene es su coste computacional, que es proporcional al n umero de soluciones candidatas a examinar, y que en el caso de muchos problemas pr acticos, tiende a crecer de manera muy r apida cuando el tama no del problema se incrementa. Sin embargo, si tenemos en cuenta la fant astica habilidad de c alculo de los ordenadores de hoy d a, capaces de realizar millones de operaciones por segundo, entenderemos que para el caso de aquellos problemas en los que no se conoce una soluci on mejor, la fuerza bruta puede ser una buena alternativa. Adem as, la fuerza bruta tambi en se suele aplicar en aquellos problemas cuyo tama no est a limitado, o cuando existen t ecnicas heur sticas espec fcas del problema que pueden ser utilizadas para reducir el conjunto de soluciones candidatas a examinar a un tama no razonable.

5.1

El problema de la mochila

El problema de la mochila.

5.2

M aquinas que juegan al ajedrez

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 pr actica; y la estrategia a seguir es muy clara: en cada posici on hacer aquella jugada que maximice las posibilidades de que ganemos y minimice las posibilidades de que gane nuestro rival. Para ello lo u nico 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 t ecnica de juego, basada en la fuerza bruta, deber a garantizarnos la victoria. La pregunta es: cuantas posiciones tendr amos que analizar? Al empezar la partida, las blancas tienen a su disposici on un total de 20 movimientos distintos, 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 m as de 800.000 posiciones para las blancas, y m as de 9 millones para las negras. Se estima que 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 a nada menos que 100 d as. Evidentemente, a pesar de ser una estrategia correcta desde un punto de vista te orico, desde un punto de vista pr actico resulta totalmente irrealizable, y de ah que los humanos tengamos que utilizar estrategias alternativas. B asicamente lo que hacemos cuando jugamos es descartar la mayor a de las posibles jugadas, utilizando para ello nuestro conocimiento del juego. Un Gran Maestro del ajedrez no suele considerar m as de 3 o 4 posibles alternativas en cada posici on. Sin embargo, los ordenadores son m aquinas de calcular por excelencia, y quiz as esta estrategia para jugar al ajedrez puede que est e dentro de sus posibilidades de c alculo. Por ejemplo, la m aquina Deep Blue dise nada por IBM en 1997 para jugar contra el campe on del Mundo Garry Kasparov, pod a examinar y evaluar del orden de 200 millones de posiciones por segundo. Esta m aquina tardar a menos de un segundo en evaluar las tres primeros movimientos del juego. Es la fuerza bruta una t ecnica viable para jugar al ajedrez? A esta pregunta intentaremos responder en esta secci on.

5.2.1

Arboles de Juego

Los principales programas de ajedrez funcionan median la b usqueda de un arbol de movimientos y contramovimientos. El programa empieza con la posici on actual 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 funci on de evaluaci on la cual le asigna un valor num erico a cada posici on. Estas puntuaciones son retroasignada mediante un proceso llamado minimax, el cual simplemente asume que cada bando escoger a aquella l na de juego que le es m as favorable en cada momento. Si un valor positivo 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 est an ilustrados en la Figura ?. La funci on de evaluaci on empleada es simplemente una combinaci on de equilibrio de material y varios otros t erminos que representan factores posicionales. Los t erminos posicionales son peque nas cantidades pero son importantes dado que el equilibrio de material rararmente cambia en el juego del ajedrez en torneos. El problema de este m etodo basado en la fuerza bruta es que el tama no del arbol explota combinacionalmente. El factor de ramicaci on o n umero de movimientos legales posibles en una posici on t 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 arbol de 35**8 nodos nales. 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

Evaluaci on de Posiciones 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 cl asico en la teor a de algoritmos, que ha sido con diferencia, el problema m as dif cil de resolver, y por ahora, el mayor de los fracasos. Adem as, este problema ha supuesto una de las principales motivaciones para el desarrollo de la teor a de la complejidad computacional. Descripci on del problema .... y su versi on equivalente como problema de decisi on Evidentemente, el problema puede ser resuelto mediante la enumeraci on de todas las posibles soluciones, calculando el coste de cada una, y seleccionando la mejor entre ellas. Este procedimiento requerir a un tiempo proporcional a n! (existen 1 (n-1)! Rutas a considerar), que no es un tiempo polinomial. N otese 2 que este algoritmo se comporta muy bien en cuanto a requerimientos de espacio: s olo require un espacio proporcional a n, ya que s olo necesitamos recordar la permutaci on que estamos analizando en este momento, y la mejor ruta encontrada hasta el momento. No se conoce ninguna soluci on al problema del viajante en tiempo polinomial. Podemos mejorar el n! Tiempo un poco mediante el m etodo de la programaci on din amica (aunque a costa de utilizar unos requerimientos de espacio 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 optimo, el estado del arte s olo ofrece respuestas exponenciales. Y esto no es debido a una falta de inter es, ya que el problema del viajante es probablemente uno de los algoritmos que m as se han estudiado. Nos sentimos tentados a suponer que hay un impedimento fundamental, un l nea divisoria dram atica entre el problema del viajante y otros problemas similares. Podr amos suponer que no hay soluci on en tiempo polin omico para el problema del viajante. Esta armaci on es una de las muchas maneras de formular la famosa armaci on de P != NP, el m as importante de los problemas en inform atica te orica. Decir algo sobre los problemas del milenio y la fundaci on Clay

5.4

Criptograf a

brute-force attack

CHAPTER 5. FUERZA BRUTA

29

5.5

Para divertirse m as

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 n umero de piezas necesarias para ocupar o atacar cada cuadrado del tablero? 3.- El problema de la vuelta del caballo

Chapter 6

M etodos Aleatorios
C alculo de Pi.

30

Chapter 7

Otros M etodos
Programaci on Din amica: Fibonacci Greedy Algorithms Hill Climbing: Network ow (mapa de carreteras?)

31

Chapter 8

Algunos Problemas Cl asicos


Torres de Hanoi

32

Chapter 9

Programaci on Concurrente
Los Fil osofos Comensales

33

Chapter 10

Imitando a la Naturaleza
M etodos aleatorios? Aloritmos Gen eticos. Redes Neuronales. Hormigas. Enfriamiento Estad stico

34

Chapter 11

Ep logo
11.1 Algoritmos y patentes

Patentabilidad de los algoritmos

35

Chapter 12

Ap endice 1: Introducci on a la Programaci on


Introducci on a la programaci on Operador de asignaci on := Sentencias Condicionales si condici on entonces sentencias finsi Operadores relacionales <, >, =, <=, >=, != Operadorres l ogicos & | ! Bucles mientras finmientras para inicializaci on hasta finalizaci on hacer sentencias finpara Funciones

36

Chapter 13

Ap endice 3: Soluci on a los Ejercicios

37

Chapter 14

Notas
Notas varias T ecnicas de resoluci on de problemas Listado de t ecnicas de resoluci on de problemas existentes, y secci ones en las que son cubiertas: recursividad fuerza bruta divide y vencer as backtraking greedy algorithms programaci on din amica programaci on lineal El Arte de Programar Un poco de historia Se podr a extender un poco m as el tema de la multiplicaci on de n umeros romanos, y hablar del algoritmo que ten an los romanos para ello. Hablar de Granada (una de las seis universidades en las que he estudiado) de aquello de que quien divide por cero en Junio dividir a por cero en Septiembre. 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? Pseudoc odigo Utilizado Pendiente: Estudiar similitud con Logo. para i de 1 hasta 100 repetir n para si condici on entonces sino n si mientras condici on repetir n mientras 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. M aquinas de Turing The Turing machine is a formal method for expressing arbitrary algorithms. Ser a interesante comentar algo sobre la universalidad de los algoritmos. Es decir, que no necesitamos necesariamente un ordenador para poder implementarlos, quiz as nos baste con unas cajas de cerillas y unas bolitas, una mesa de billar, o unos clavos y unas g omas el asticas. Quiz as en el apartado en el que se hable de m aquinas de Turing. Cita: homines dum docent discunt que signica la gente aprende cuando ense na (Seneca, Epistulae Morales, 7.8).

14.1

Otros Posibles Temas

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

CHAPTER 14. NOTAS Morphog enesis numerical recipes Dijkstraa

40

14.2

Ejemplos

n umeros perfectos cuadrados m agico

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 ordenaci on 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 Vencer as http://www.algoritmia.net/articles.php?id=34 Bibliograf a Recomendada Revisar texto En este apartado ... Adem as de las referencias bibliogr acas escritas, tambi en se ha incluido un 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 do suciente informaci on para que, con la ayuda de un buscador en internet, el lector pueda buscar la nueva localizaci on del documento. 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. Edici on impresa: Euclides Elementos (3 vol umenes) Biblioteca Cl asica Gredos Editorial Gredos Edici on en Internet, en ingl es con comentarios y programas de muestra: 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/

You might also like