Está en la página 1de 581
FUNDAMENTOS DE ALGORITMIA G. Brassard / P. Bratley Départament d’informatique et de recherche opérationelle Université de Montréal Traducci6n: Rafael Garefa-Bermejo Facultad de Fisicas Universidad de Salamanca Revisién técnica: Narciso Marti Facultad de Mateméticas Universidad Complutense de Madrid Ricardo Pefia Escuela Superior de Informatica Universidad Complutense de Madrid Luis Joyanes Aguilar Facultad de Informatica Universidad Pontificia de Salamanca en Madrid PRENTICE HALL Madrid * México * Santafé de Bogoté * Buenos Aires ¢ Caracas * Lima * Montevideo San Juan * San José * Santiago * Sao Paulo * White Plains Contenido PROLOGO.... PROLOGO A LA EDICION EN ESPANOL 1, PRELIMINARES . 1.1 IntRopucciOn.. 1.2 {Qué ES UN ALGORITMO’ 1.3 NOTACION PARA LOS PROGRAMAS.. 14 Enteros, reales e intervalos 1.4.4 Funciones y relaciones 14.5 Cuantificadores ... 14.6 Sumas y producto: 14.7 Miscelanea.... . 1,5 TECNICA DE DEMOSTRACION 1: CONTRADICCION... 1.6 TECNICA DE DEMOSTRACION 2: INDUCCION MATEMATICA., 1.6.1 El principio de induccién matemitica. 1.6.2 Unasunto completamente distinto... 1.6.3 Induccién matematica generalizada 1.6.4 Inducci6n constructiva 1.7 RECORDATORIOS. 1.7.1 Limites. 1.7.2 Series sencillas 1.7.3 Combinatoria basica 1.74 Probabilidad elemental 1.8 PROBLEMAS.... 1.9 REEERENCIAS Y TEXTOS MAS AVANZADOS: viii Fundamentos de Algoritmia 2 ALGORITMIA ELEMENTAL BEBEEBBE 28 29 2.10 3 NOTACION ASINTOTICA. 31 3.2, 33 3A 35 3.6 3.7 38 4 ANALISIS DE ALGORITMOS.. al 42 43 INTRODUCCION PROBLEMAS Y EJEMPLARES ERICIENCIA DE LOS ALGORITMOS.. ANALISIS DE «CASO MEDIO» Y DE «CASO PEOR> ..... QUE ES UNA OPFRACION ELEMENTAL?... POR Qu HAY QUE BUSCAR LA EFICIENCIA 2.7.3 Multiplicacién de enteros muy grandes. 2.7.4 Célculo del maximo comin divisor. 2.7.5 Céilculo de la sucesién de Fibonacdi.. 2.7.6 Transformada de Fourier {CUANDO QUEDA ESPECIFICADO UN ALGORITWO?.. ‘PROBLEMAS .. [REFERENCIAS ¥ TEXTOS MAS AVANZADOS... INTRODUCCION. ‘UNA NOTACION PARA “EL ORDEN DE” OTRA NOTACION ASINTOTICA .. NOTACION ASINTOTICA CONDICIONAL NOTACION ASINTOTICA CON VARIOS PARAMETROS sesso OPERACIONES SOBRE NOTACION ASINTOTICA ‘PROBLEMAS REFERENCIAS Y TEXTOS MAS AVANZADOS INTRODUCCION... ANALISIS DE LAS ESTRUCTURAS DE CONTROL... 42.1. Secuencias 422 Bucles “para” (desde) 42.3 Llamadas recursivas. 42.4 Bucles “mientras” y “repetir” ‘Uso DB UN BAROMETR( & BRRRBBSVABRIAIGRSA RRERsee 8 eo m1 m2 112 14 16 118 Contenido ix 44° EJEMPLOS ADICIONALES .. sesanonseosnensosnnrnrenneuneynneommenangannett 120 4.5 ANALISIS DEL CASO MEDIO 126 4.6 ANALISIS AMORTIZADO. 127 4.7 RESOLUCION DE RECURRENCIA! 132 47.1 Suposiciones inteligentes. 132, 4.7.2 Recurrencias homogéneas 135 4.7.3. Recurrencias no homogéneas. 140 4.74 Cambios de variable. 148 4.7.5 Transformaciones de intervalo.. 156 4.7.6 Recurrencias asintéticas 157 48 PROBLEMAS 160 4.9 REFERENCIAS Y TEXTOS MAS AVANZADOS... 166 5 ESTRUCTURAS DE DATOS... 167 5.1 MATRICES (ARRAYS), PILAS Y COLA! 167 5.2 170 53 Listas. 171 54 GRAFOS 173 5.5 ARBOLES.. 175 5.6 TABLAS ASOCIATIVAS... 181 5.7 58 59 5.10 5.11 6 ALGORITMOS VORACES.... 211 6.1 DAR LA VUELTA (1) sree 21h 6.2 CARACTERISTICAS GENERALES DE LOS ALGORITMOS VORACES ... 213 6.3 GRAFOS: ARBOLES DE RECUBRIMIENTO MiNIMO ... BERESER x Fundamentos de Algoritmia 662 Planificacién con plazo fijo. 233 6.7 PROBLEMAS versssssssecssssseeuens 242, 6.8 REFERENCIAS Y TEXTOS MAS AVANZADOS...... 245 7 DIVIDE Y VENCERAS. se reoennenes — 247 7.1 INTRODUCCION: MULTIPLICACION DE ENTEROS MUY GRANDES .. 2a7 7.2 BL CASO GENERAL sssesesssssereerinasnscssenatsetens 251 7.3 BUSQUEDA BINARIA. 255 74 ORDENACION ... 257 74.1 Ordenaci6n por fusic . 258 74.2 Ordenacién répida (Quicksort). ersrsansanns . 260 7.5 BUSQUEDA DE LA MEDIANA... 266 7.6 MULTIPLICACION DE MATRICES 272 7.7 EXPONENCIACION.. 274 7.8 ENSAMBLANDO TODAS LA PIEZAS: INTRODUCCION A LA CRIPTOGRAFIA 279 7.9 PROBLEMAS.. 282, 7.10 REFERENCIAS Y TEXTOS MAS AVANZADOS.. 288 8 PROGRAMACION DINAMICA.. 21 8.1 Dos EJEMPLOS SENCILLOS.. 292 811 Calculo del coeficiente binomial... 292, 81.2 Elcampeonato mundial.... 293 8.2 DEVOLVER CAMBIO (2).. 295, 8.3 EL PRINCIPIO DE OPTIMALIDAD.. 298 8.4 EL PROBLEMA DE LA MOCHILA (2). 299 8.5 CAMINOS MINIMOS....... 301 8.6 MULTIPLICACION ENCADENADA DE MATRICES. 304 309 31L 312 8.10 REFERENCIAS Y TEXTOS MAS AVANZADOS 317 9 EXPLORACION DE GRAFOS..... 319 9.1 GRAFOS Y JUEGOS: INTRODUCCION.... 319 9.2 RECORRIDO DE ARBOLES. seanes 326 10 93 94 95 96 97 98 99 9.10 ALGORITMOS PROBABILISTAS 10.1 10.2 103 104 105 106 10.7 108 10.9 Contenido xi 9.2.1 Preacondicionamiento. RECORRIDO EN PROFUNDIDAD: GRAFOS NO DIRIGIDOS. 93.1 Puntos de articulacién. RECORRIDO EN PROFUNDIDAD: GRAFOS DIRIGIDOS, 9.4.1 Grafos aciclicos: ordenacién topolégica . RECORRIDO EN ANCHURA ‘VUELTA ATRAS.. 9.6.1 El problema de la mochila (3) 9.6.2 El problema de las ocho reinas 963 Elcaso general... RAMIFICACION Y PODA 97.1 El problema de la asignacié: 9.7.2 El problema de la mochila (4) 973 Consideraciones generales REFERENCIAS Y TEXTOS MAS AVANZADOS. INTRODUCCION. PROBABILISTA NO IMPLICA INCTERTO. ‘TIEMPO ESPERADO FRENTE A TIEMPO PROMED! ‘GENERACION DE NUMEROS PSEUDOALEATORICS... ALGORITMOS PROBABILISTAS NUMERICOS. 10.5.1 La aguja de Buffon. 10.5.2 Integracién numérica 10.5.3 Conteo probabilista. ALGoRtrMos DE MoNTE CARLO 10.6.1 Verificaci6n de la multiplicacién de matrice 10.6.2 Comprobacién de primalidad.... 10.6.3 ;Puede un nimero ser probablemente primo’ 10.6.4 Amplificacién de la ventaja estocistica...... ALGORIIMOs DE Las VEGAS.... 10.7.1 El problema de las ocho reinas, segunda parte. 10.7.2. Seieccién y ordenacién probabilistas 10.73 Tablas de dispersin universale 10.7.4 Factorizacién de enteros muy grandes. PROBLEMAS REFERENCIAS Y TEXTOS MAS AVANZADOS. 337, xii Fundamentos de Algoritmia TL ALGORITMOS PARALELOS. ..sssteesrremsnereerensertesrersnioene 12 ni H2 n3 na4 ILS 116 ns ns 11.10 1 COMPLEJIDAD COMPUTACIONAL... 12.1 12.2 123 124 12.5 UN MODELO PARA LA COMPUTACION PARALELA ..... TECNICAS BASICAS...w. meee 11.2.1 Cémputo con un rbol binario completo... 11.2.2 Duplicacién de punteros ‘TRABAJO Y EFICIENCIA... Dos RJEMPLOS DE TEORIA DE GRAFOS.. 114.1 Caminos minimos 11.42 Componentes conexos EVALUACION DE EXPRESIONES EN PARALELO. REDES DE ORDENACION EN PARALELO.... 11.6.1 El principio cero-uno... 116.2 Redes de fusién en paralelo. 11.6.3 Redes de ordenacién mejorada: ORDENACION EN PARALELO.. 17.1 Preliminare: 117.2 La idea clave. 11.7.4 Un esbozo de los detalles. INTRODUCCION: UN EJEMPLO SENCILLO... ARGUMENTOS DE LA TEORIA DE LA INFORMACION.. 12.2.1 La complejidad de la ordenacién..... 12.2.2 La complejidad, al rescate de la algoritmia ARGUMENTOS DEL ADVERSARIO... 12.3.1 Biasqueda del maximo en un vector. 12.3.2 Comprobacién de la conectividad de un grafo. 12.3.3 La mediana, segunda parte REDUCCIONES LINEALES. 12.4.1 Definiciones formales 12.4.2 Reducciones entre problemas matriciales .. 124.3 Reducciones entre problemas de caminos minimos. INTRODUCCION A LA NP-COMPLETITUD.......... Contenido xiii 12.5.1 12.5.2 125.3 1254 Algunas demostraciones de NP-completitud 12.5.5 Problemas NP-dificiles 1256 i 12.6 UN 200 DB CLASES DE COMPLEJIDAD 12.7 PROBLEMAS..... 12.8 REFERENCIAS Y TEXTOS MAS AVANZADOS..... 13 ALGORITMOS HEURISTICOS Y APROXIMADOS... 13.1 Aucorrrmos HEURISTICOS.. 13.14 Coloreado de un grafo. 13.2 ALGORITMOS APROXIMADOS. 13.2.1 El viajante métrico. 13.2.2 El problema de Ja mochila ( 13.23 Lienado de cajas 13.3 PROBLEMAS DE APROXIMACION CON DIFICUTAD NP... 133.1 Problemas de aproximacién con dificultad absoluta 13.3.2 Problemas de aproximacién con dificultad relativa.... 13.4 LO MISMO, PERO DISTINTO... 13.5 ENFOQUES DE APROXIMACION .... 13.5.1 Lienado de cajas, segunda part 1352 El problema de la mochila (6).. 13.6 PROBLEMAS sessesseon 13.7 REFERENCIAS Y TEXTOS MAS AVANZADOS REFERENCIAS... 555 NOTAS FINALES.... 569 {NDICE ANALITICO. 571 Capitulo Preliminares 1.1 INTRODUCCION En este libro hablaremos de algoritmos y de algoritmia. Este capitulo introduc- torio define en primer lugar lo que queremos decir con estas dos palabras. Ilus- traremos esta discusién formal mostrando varias formas de realizar una sencilla multiplicacién. También las tareas de todos los dias poseen profundidades ocul- tas. Ademas aprovecharemos la oportunidad para explicar por qué pensamos que el estudio de los algoritmos es a la vez util e interesante. A continuacién explicaremos la notacién que vamos a utilizar a lo largo de to- do el libro para describir algoritmos. El resto del capitulo consta en esencia de recordatorios de cosas que esperamos que el lector ya haya visto en otros luga- res. Después de una breve revisién de la notacién matematica estandar recorda- remos dos técnicas de demostracién ttiles: la demostracién por contradiccién y Ja demostracién por induccién matematica. A continuacién enumeramos algu- nos resultados acerca de limites, sumas de series, combinatoria elemental y pro- babilidad. Los lectores que ya estén familiarizados con estos temas deberian de leer las Secciones 1.2 y 1.3, y examinar brevemente el resto del capitulo, obviando aquel material que ya les resulte conocido. Es preciso prestar especial atencién a la Sec- cién 1.6.4. Aquellas personas que tengan olvidadas sus matemiticas basicas y sus cien- cias de la computacién, deberfan cuando menos leer los principales resultados que presentamos para refrescar su memoria. Nuestra presentacién es sucinta e informal y no pretende ocupar el puesto de cursos de andlisis elemental, de cAl- culo ni de programaci6n, La mayoria de los resultados que damos se necesitaran posteriormente en el libro; a la inversa, en los capitulos posteriores intentaremos no utilizar resultados que vayan mis alla de las bases que se han reunido en es- te capitulo. 2. Preliminares Capitulo 1 1.2 ZQUE ES UN ALGORITMO? Un algoritmo, nombre que proviene del matematico persa del siglo IX al- Khowéarizmi, es sencillamente un conjunto de reglas para efectuar algun cal- culo, bien sea a mano 0, mas frecuentemente, en una m4quina. En este libro nos preocupan fundamentalmente los algoritmos que van a ser utilizados en una computadora. Sin embargo, también podrian incluirse otros métodos sis- tematicos para calcular un resultado; los métodos que aprendimos en la es- cuela para sumar, multiplicar y dividir nimeros, son también algoritmos, por ejemplo. Muchos monaguillos ingleses, aburridos por platicas poco intere- santes, pasan el tiempo calculando la fecha de Pascua y empleando el algo- ritmo que se emplea en el Devocionario Anglicano. El algoritmo mas famoso de la historia procede de un tiempo anterior al de los antiguos griegos: se tra- ta del algoritmo de Euclides para calcular el maximo comin divisor de dos enteros. La ejecucién de un algoritmo no debe de implicar, normalmente, ninguna de- cisién subjetiva, ni tampoco debe de hacer preciso el uso de la intuicién ni de la creatividad. Por tanto se puede considerar que una receta de cocina es un algo- ritmo si describe precisamente la forma de preparar un cierto plato, proporcio- nandonos las cantidades exactas que deben de utilizarse y también instrucciones detalladas acerca del tiempo que debe de guisarse. Por otra parte, si se incluyen nociones vagas tales como «salpimentar a su gusto» o «guisese hasta que esté medio hecho» entonces no se podria llamar algoritmo. Una aparente excepcion a esta regla es que admitiremos como algoritmos unos procedimientos que efectdan elecciones aleatorias acerca de lo que hay que hacer en una situacién dada. El Capitulo 10 en concreto trata de estos algoritmos probabilistas. Lo importante aqui es que el término «aleatorio» no quiere decir ar- bitrario; por el contrario, utilizamos valores seleccionados de tal manera que la probabilidad de seleccionar cada uno de los valores es conocida y esta controla- da. Una instruccién tal como «seleccionar un ntimero entre 1 y 6» si no se da nin- gan detalle mas, no es admisible en un algoritmo. Sin embargo, seria aceptable decir «seleccionar un nimero entre 1 y 6 de tal manera que todos los valores ten- gan la misma probabilidad de ser seleccionados». En este caso, cuando se ejecu- te el algoritmo manualmente, quiz4 decidamos obedecer esta instruccién tirando un dado sin cargar; en una computadora, podriamos implementarlo utilizando un generador de numeros pseudoaleatorios. Cuando se utiliza un algoritmo para calcular la respuesta de un problema concreto, lo normal es suponer que las reglas nos darn, si se aplican correcta- mente, la respuesta correcta. Un conjunto de reglas que calcula que 23 veces 51 es 1.170 no suele ser es titil en una prdctica general. Sin embargo en algunas cir- cunstancias, estos algoritmos aproximados pueden resultar atiles. Si deseamos calcular la raiz cuadrada de 2, por ejemplo, ningun algoritmo nos podra dar una respuesta exacta en notaci6n decimal, por cuanto la representacién de v2 es infi- nitamente larga y no se repite. En este caso, nos conformaremos con que el al- Secei6n 1.2 4Qué es un algoritmo? 3 goritmo nos pueda dar una respuesta que sea tan precisa como nosotros decida- mos: 4 digitos de precision, o 10 digitos o los que queramos. Lo que es mas importante, como veremos en el Capitulo 12, es que hay pro- blemas para los cuales no se conocen algoritmos practicos. Para tales problemas, la utilizacién de uno de los algoritmos disponibles para encontrar la respuesta exacta requeriré en la mayoria de los casos un tiempo excesivo: por ejemplo, al- gunos siglos. Cuando esto sucede, nos vemos obligados, si es que necesitamos disponer de alguna clase de solucién al problema, a buscar un conjunto de re- glas que creamos que nos van a dar una buena aproximacién de la respuesta co- rrecta, y que podremos ejecutar en un tiempo razonable. Si podemos demostrar que la respuesta computada mediante este conjunto de reglas no es excesiva- mente errénea, tanto mejor. En algunas ocasiones ni siquiera esto es posible, y solamente podremos fiarnos de nuestra buena suerte. Este tipo de procedimien- to, basado fundamentalmente en el optimismo y frecuentemente con un apoyo te6rico minimo, se denomina un algoritmo heuristico o simplemente una heuristi- ca, Obsérvese una diferencia crucial entre los algoritmos aproximados y la heu- ristica: con los primeros podemos especificar el error que estamos dispuestos a aceptar; con la segunda no podemos controlar el error, pero quiz4 seamos capa- ces de estimar su magnitud. En los doce primeros capitulos de este libro, a no ser que el contexto indique claramente Jo contrario, suponemos que un algoritmo es un conjunto de reglas para calcular la respuesta correcta a algun problema. Por otro lado el Capitulo 13 trata en su totalidad de algoritmos aproximados y de heuristica. ' Ahora se puede definir la Algoritmia simplemente como el estudio de los al- goritmos. Cuando nos disponemos a resolver un problema, es posible que haya toda una gama de algoritmos disponibles. En este caso, es importante decidir cual de ellos hay que utilizar. Dependiendo de nuestras prioridades y de los If- mites del equipo que esté disponible para nosotros, quiz4 necesitemos seleccio- nar el algoritmo que requiera menos tiempo, 0 el que utilice menos espacio, 0 el que sea mas facil de programar y asi sucesivamente. La respuesta puede depen- der de muchos factores, tales como jos nimeros implicados, la forma en que se presenta el problema, 0 la velocidad y capacidad de almacenamiento del equipo de computacién disponible. Quizés suceda que ninguno de los algoritmos dis- ponibles sea totalmente adecuado, asi que tendremos que disefiar un algoritmo nuevo por nuestros propios medios. La Algoritmia es la ciencia que nos permi- te evaluar el efecto de estos diferentes factores externos sobre los algoritmos dis- ponibles, de tal modo que sea posible seleccionar el que ms se ajuste a nuestras circunstancias particulares; también es la ciencia que nos indica la forma de di- sefar un nuevo algoritmo para una tarea concreta. Consideremos la aritmética elemental como ejemplo. Supongamos que tene- mos que multiplicar dos enteros positivos utilizando nada mas que papel y 14- piz. Si nos han educado en Norteamérica, lo mas probable es que se multiplique sucesivamente el multiplicando por cada una de las cifras del multiplicador, to- madas de derecha a izquierda, y que se escriban estos resultados intermedios 4 Preliminares Capitulo 1 uno tras otro, desplazando cada linea un lugar a la izquierda, y que finalmente se sumen todas estas filas para obtener la respuesta. Por tanto para multiplicar 981 por 1.234 se construiré una disposicién de nimeros como la de Ia figura 1.1(a). Si, por otra parte, le han educado a uno en Inglaterra, es mas probable que trabajemos de izquierda a derecha, dando lugar a la distribucién que se muestra en la figura 1.1(b). 981 981 1234 _ 1234 3924 981 2043 1962 1962, 2943, 981 3924 1210554 1210554 (@) (b) Figura 1.1, Maltiplicacién (a) americana (b) inglesa Estos dos algoritmos para la multiplicacién son muy similares: son tan pare- cidos, de hecho, que nos referiremos a ellos como el algoritmo «clasico» de la multiplicacion, sin preocuparnos por cudl de ellos queremos decir. En la figura 1.2 se ilustra un tercer algoritmo distinto para hacer lo mismo. 981 1.234 1.234 490° 2.468 245 4,936 4.936 122 9.872 61 19.744- 19.744 30 39.488 15 78.976 78.976 7 157.952 157.952 3 315.904 315.904 1 631.808 631.808 1.210.554 Figura 1.2. Multiplicacién 4 la russe Se escriben el multiplicando y el multiplicador uno junto a otro. Se hacen dos columnas, una debajo de cada operando, repitiendo la regla siguiente hasta que el naimero de la columna izquierda sea un 1: se divide el ndmero de la columna de la izquierda por 2, ignorando los restos y se duplica el niimero de la colum- na de la derecha sumdndolo consigo mismo. A continuaci6n se tachan todas las filas en las cuales el ntimero de la columna izquierda sea par, y finalmente se su- Seccion 1.2 Qué es un algoritmo? 5 man los nimeros que quedan en la columna de la derecha. La figura ilustra la forma de multiplicar 981 por 1.234. La respuesta obtenida es: 1.234 + 4,936 + 19.744 + 78.976 + ... + 631.808 = 1.210.554. Este algoritmo, que algunas veces se llama multiplicacién a Ia russe se parece al que se emplea en el hardware de una computadora binaria. Tiene la ventaja de que no es preciso memorizar ninguna tabla de multiplicacién. Lo unico que hay que saber es sumar, y también dividir un mamero por dos. Aunque no es el al- goritmo que suele ensefiarse en la escuela, ofrece ciertamente un método alter- nativo de papel y lapiz para multiplicar dos enteros positivos. En las figuras 1.3 y 1.4 se ilustra otro algoritmo distinto para multiplicar dos enteros positivos. Una vez més, ilustraremos el método multiplicando 981 por 1.234. Para este algoritmo, sin embargo, es necesario que el multiplicando y el multiplicador tengan el mismo ndmero de cifras y ademés se necesita que este ntimero sea una potencia de dos, tal como 1, 2, 4, 8, 16, etc. Esto se arregla facil- mente afiadiendo ceros por la izquierda si es necesario: en nuestro ejemplo, afia- dimos nada més un cero a la izquierda del multiplicando, transformandolo en 0981, de tal manera que ambos operandos tengan cuatro cifras. Multiplicar Desplazar Resultado id 09 12 4 108-+ ++ ii) 09 34 2 306- + i iii) 81 12 2 972: iv) 81 34 0 2754 1210554 Figura 1.3. Multiplicacion de 0981 por 1.234 mediante divide y vencerds Ahora para multiplicar 0981 por 1.234 multiplicamos primero la mitad izquier- da del multiplicando por la mitad izquierda del multiplicador (12), y escribimos el resultado (108) desplazado hacia la izquierda tantas veces como cifras haya en el multiplicador: cuatro, en nuestro ejemplo. A continuacién multiplicamos la mi- tad izquierda del multiplicando (09) por la mitad derecha del multiplicador (34), y escribimos el resultado (306) desplazado hacia la izquierda tantas veces como la mitad de las cifras que haya en el multiplicador: dos, en este caso. En tercer lugar multiplicamos la mitad derecha del multiplicando (81) por la mitad izquierda del multiplicador (12), y escribimos el resultado (972) desplazado también hacia la iz- quierda tantas veces como la mitad de las cifras que haya en el multiplicador, y en cuarto lugar multiplicamos la mitad derecha del multiplicando (81) por la mitad derecha del multiplicador (34) y escribimos el resultado (2.754), sin desplazarlo en absoluto. Por ultimo sumamos los cuatro resultados intermedios segtin se mues- tra en la figura 1.3 para obtener la respuesta 1.210.554. 6 Preliminares Capitulo 1 “ Multiplicar —.- Desplazar Resultado i) 0 1 2 0. ii) 0 2 1 0 iii) 9 1 1 9% iv) 9 2 0 18 108 Figura 1.4 Multiplicacién de 09 por 12 mediante divide y vencerés Si se ha seguido el funcionamiento del algoritmo hasta el momento, se vera que hemos reducido la multiplicaci6n de dos nimeros de cuatro cifras a cuatro multi- plicaciones de nameros de dos cifras (09 x 12, 09 x 34, 81 x 12 y 81 x 34), junto con un cierto namero de desplazamientos y una suma final. El truco consiste en obser- , Var que cada una de estas multiplicaciones de nameros de dos cifras se puede efec- tuar exactamente de la misma manera salvo que cada multiplicaci6n de ntiimeros de dos cifras requiere cuatro multiplicaciones de nimeros de una cifra, algunos desplazamientos y una suma. Por ejemplo la figura 1.4 muestra como multiplicar 09 x 12. Calculamos 0 x 1 = 0, desplazado hacia la izquierda dos veces; 0 x 2 = 0, desplazado hacia la izquierda una vez; 9 x 1 = 9, desplazado a la izquierda una vez, y 9x 2 = 18, sin desplazar. Finalmente sumamos estos resultados intermedios para obtener la respuesta: 108. Utilizando estas ideas se podria operar de tal manera que Jas multiplicaciones solamente implicasen a operandos de una cifra. (Aunque he- mos descrito la figura 1.3 antes que la figura 1.4 esto solamente era para simplificar la presentacion. Por supuesto, tenemos que hacer primero las cuatro multiplicacio- nes de nameros de dos cifras, puesto que utilizamos los valores calculados asi cuando se hace la multiplicaci6n de los ntmeros de cuatro cifras.) Este algoritmo tan poco habitual es un ejemplo de la técnica denominada «di- vide y venceras», que estudiaremos en el Capitulo 7. Si le parece improbable que pueda ser mas r4pido que el algoritmo clasico, estar usted en lo cierto, Sin em- bargo, veremos en el Capitulo 7 que es posible reducir la multiplicaci6n de dos né- meros grandes a tres, y no cuatro, multiplicaciones de ntimeros cuyo tamafio es aproximadamente la mitad, junto con un cierto namero de desplazamientos y su- mas. (Si le estimulan los desafios, intente averiguar la forma de hacerlo.) Con esta mejora el algoritmo de multiplicacién por divide y vencer4s se ejecuta més depri- sa en una computadora que con los métodos anteriores siempre que los nameros que haya que multiplicar sean suficientemente grandes. (Se conocen métodos to- davia mas répidos para operandos muy grandes.) No es totalmente necesario que la longitud de los operandos sea una potencia de dos, ni tampoco que tengan la misma longitud. El problema 1.6 muestra un caso en el cual el algoritmo pueda ser util en la practica, aun cuando los algoritmos sean relativamente pequefios, e in- cluso cuando se utilizan cuatro multiplicaciones en lugar de tres. Lo importante de todos estos ejemplos es que, incluso en un aspecto tan sen- cillo como la aritmética elemental, pueden estar disponibles varios algoritmos Para que nosotros efectuemos las operaciones requeridas. Uno puede resultar Secci6n 1.3 Notacién para los programas 7 atractivo por su familiaridad, otro por la naturaleza elemental de los célculos in- termedios implicados y un tercero por su velocidad en una maquina. Al hacer un estudio més formal de las propiedades de los algoritmos (al utilizar la algo- ritmia, en otras palabras) podemos tomar una decisién sabia acerca de la técni- ca que se debe utilizar en cualquier situacién dada. Como veremos, una buena eleccién puede ahorrar a la vez tiempo y dinero; en algunos casos, puede ser la diferencia entre el éxito y el fracaso al resolver algtin problema grande y dificil. La meta de nuestro libro es ensefiar a tomar este tipo de decisiones. 1.3 NOTACION PARA LOS PROGRAMAS Es importante decidir la forma en que vamos a describir nuestros algoritmos. Si intentamos explicarlos en espafiol, descubriremos rapidamente que los lengua- jes naturales no estdn en absoluto adaptados para este tipo de cosas. Para evitar la confusién, en el futuro especificaremos nuestros algoritmos dando el corres- pondiente programa, Suponemos que el lector esta familiarizado con al menos un lenguaje de programaci6n bien estructurado, tal como Pascal. Sin embargo, no nos limitaremos estrictamente a ningtin lenguaje de programaci6n concreto: de esta manera, los aspectos esenciales de un algoritmo no resultarén oscureci- dos por detalles de programacién relativamente poco importantes, y realmente no importa cual sea el lenguaje bien estructurado que prefiera el lector. Hay algunos aspectos de nuestra notacién para los programas que merecen es- pecial atencién. Utilizaremos frases en espafiol en nuestros programas siempre que esto produzca sencillez y claridad. De manera similar, utilizaremos el len- guaje matemitico, tal como el del Algebra y de la teoria de conjuntos, siempre que sea necesario (incluyendo simbolos tales como = y L | que se presentan en la Sec- cién 1.4.7). Como consecuencia, una sola «instruccién» de nuestros programas puede tener que traducirse a varias instrucciones, quizé a un bucle mientras, si es que el algoritmo tiene que implementarse en un lenguaje de programacién con- vencional. Por tanto no se debe esperar ser capaces de ejecutar directamente los algoritmos que presentemos: siempre ser preciso hacer el esfuerzo necesario pa- ra transcribirlos a un lenguaje de programacién «real». Sin embargo, este enfoque es el que mas se ajusta a nuestro objetivo primordial, que es presentar de la forma més clara posible los conceptos basicos que subyacen a nuestros algoritmos. Para simplificar todavia mas nuestros programas, omitiremos casi siempre las declaraciones de magnitudes escalares (enteras, reales 0 booleanas). En aquellos casos en que sea importante, tal como en las funciones y procedimientos recur- sivos, todas las variables que se utilizan se toman implicitamente como variables locales, a no ser que el contexto indique claramente lo contrario. En este mismo ' espfritu de simplificacién se evita la proliferacién de instituciones begin y end que invaden a los programas escritos en Pascal: el rango de instrucciones tales como si, mientras 0 for, asi como otras declaraciones como procedimiento, fun- cién o registro se muestra sangrando las instrucciones en cuestiGn. La instruc- cién devolver marca la finalizacién dindmica de un procedimiento o de una fun- cién, y en este tiltimo caso proporciona ademiés el valor de la funcién. 8 Preliminares Capitulo 1 En los procedimientos y funciones no se declara el tipo de los parémetros, ni tampoco el tipo de los resultados proporcionados por una funcién, a no ser que tales declaraciones hagan que el algoritmo sea mas facil de entender. Los pardmetros escalares se pasan por valor, lo que significa que son tratados como variables locales dentro del procedimiente o la funcién, a no ser que se decla- ren como pardmetros var, en cuyo caso se pueden utilizar para proporcionar un valor al programa llamante. En contraste, los parémetros tipo matriz se pasan por referencia, lo cual significa que toda modificacién efectuada dentro del pro- cedimiento o funcién se verdn reflejados en la matriz que realmente se pase en Ja instruccién que haga la Iamada. Por ultimo, supondremos que el lector est4 familiarizado con los conceptos de recursividad, registro y puntero. Estos dos uiltimos se denotan exactamente como en Pascal, salvo por la omisién de begin y end en los records. En par- ticular, los punteros se denotan con el simbolo «T». Para finalizar esta seccién, véase un programa para multiplicar @ Ia russe. Aqui el simbolo «+» denota la divisién entera: cualquier posible resto se des- carta. Compérese este programa con la descripcién informal en espafiol del mis- mo algoritmo en la Seccién 1.2. ;Cudl prefiere usted? funcién rusa(m, n) resultado —~ 0 repetir si m es impar entonces resultado — resultado +n me m+2 nent+n hasta que m=1 devolver resultado 14 NOTACION MATEMATICA Esta seccién revisa la notacién matematica que utilizaremos a lo largo del libro. Nuestra revision es sucinta, por cuanto suponemos al lector familiarizado con la mayor parte de ella. Sin embargo, recomendamos leerla al menos de forma ré- pida porque presentamos la mayoria de los simbolos que se van a utilizar, y al- gunos de ellos (tales como [i.jl, V, 3, Ig, Lx, = y R®) no gozan de aceptacion universal. 1.4.1 Calculo proposicional Existen dos «valores de verdad», verdadero y falso. Una variable booleana (0 proposi- cional) solamente puede tomar uno de estos dos valores. Si p es una variable boo- leana, escribimos p es verdadero, o bien simplemente p , para indicar p = verdadero. Esto es generalizable a todas las expresiones arbitrarias cuyo valor sea booleano. Sean p y q dos variables booleanas. Su conjuncién pq, 0 p y q es verdadero si y s6- lo si p y q son verdaderos. Su disyuncién p v q, 0 p 0 q es verdadero si y sélo si al Seccién 1.4 Notacién matematica 9 menos uno de entre p 0 q es verdadero. (En particular, la disyuncién de p y q es ver- dadera cuando tanto p como q son verdaderos.) La negacién de p que se denota co- mo =p 0 «no p», es verdadero si y sdlo si p es falso. Si la verdad de p implica la de q escribiremos p =2q, que se lee si p entonces q. Si la verdad de p es equivalente a la de q, lo cual significa que son ambos o bien verdadero o bien falso, entonces es- cribimos p + 4. Podemos construir f6rmulas booleanas a partir de variables boo- leanas, constantes (verdadero y falso), conectivas (a, v, 7, >, +) y paréntesis de la forma evidente. 1.4.2 Teoria de conjuntos Aun cuando revisemos aqui los principales simbolos que se utilizan en la teoria de conjuntos, suponemos que el lector ya est4 familiarizado con la nocién de conjunto. Por tanto en Io que sigue no se proporciona una definicién formal. A todos los efectos practicos, resulta suficiente pensar que un conjunto es una co- leccin no ordenada de elementos distintos. Un conjunto se dice finito si contiene un mimero finito de elementos; en caso contrario el conjunto es infinito. Si X es un conjunto finito, |X|, la cardinalidad de X denota el ntimero de elementos que hay en X. Si X es un conjunto infinito podemos escribir que la cardinalidad de X es infinita. El conjunto vacfo, que se denota como g, es el conjunto tinico cuya cardinalidad es 0. La forma mas sencilla de denotar un conjunto es rodear la enumeracién de esos elementos entre llaves. Por ejemplo, {2,3,5,7}, denota el conjunto de name- tos primos de una sola cifra. Cuando no puede surgir ninguna ambigiiedad, se permite el uso de puntos suspensivos, tal como en «N= {0,1,2,3, ...} es el conjun- to de numeros naturales». Si X es un conjunto, x eX significa que x pertenece a X. Escribiremos que x ¢ X cuando x no pertenezca a X. La barra vertical «| » se lee en la forma «tal que» y se utiliza para definir un conjunto describiendo la propiedad que cumplen todos sus miembros. Por ejemplo, {n | 1 € N yn es impar} denota el conjunto de todos los miimeros naturales impares. Hay otras notaciones alternativas mas sencillas para el mismo conjunto que son {2 € N |n es impar] 0 incluso (2n + 1 | ne N}. Si X e Y son dos conjuntos, X < Y significa que todos los elemento de X perte- necen también a Y; y se lee «X es un subconjunto de Y». La notacién X c Y signifi- ca que X c Y y ademas que hay por lo menos un elemento de Y que no pertenece a X; se lee «X es un subconjunto propio de Y». Tenga en cuenta que algunos auto- res utilizan c para denotar lo que nosotros denotamos mediante c. Los conjuntos X e Y son iguales, lo cual se escribe X = Y, si y s6lo si contienen exactamente los mismos elementos. Esto es equivalente a decir que X c Y y que Yc X. Si X e Yson dos conjuntos, denotamos su uni6n mediante X UY=|z Iz e Xoze YI, su interseccién como X NY = {z | ze Xyze Y}, y su diferencia como X\W=(zlzeXperoze Y}. Obsérvese en particular que z « X 4 Y cuando z pertenece tanto a X comoa Y. 10 Préfiminares ° “ Capitulo 1 Representamos por (x, y) el par ordenado que consta de los elementos x e y en este orden. El producto cartesiano de X e Y es el conjunto de pares ordenados cu- yo primer componente es elemento de X y cuyo segundo componente es ele- mento de Y; esto es Xx Y = (x,y) | xe Xey € Y}. Las n-tuplas ordenadas para n> 2y el producto cartesiano de mas de dos conjuntos se definen de forma si- milar. Denotaremos X x X por Xy similarmente para X‘, i 2 3. 1.4.3 Enteros, reales e intervalos Denotaremos el conjunto de los nvimeros enteros por Z = {..., -2, -1, 0, 1, 2, ...J, ¥ el conjunto de mimeros naturales como N = (0, 1, 2, ...}, y el conjunto de los ente- tos positivos como N* = (1, 2, 3,...}. A veces ponemos de manifiesto que el 0 no esté incluido en N* haciendo alusién explicita al conjunto de los ntmeros ente- ros estrictamente positivos. En algunas ocasiones aludiremos a los niimeros na- turales con el nombre de enteros no negativos. Indicamos el conjunto de niimeros reales como R, y el conjunto de los niimeros reales positivos como R={xeR|x>0} En algunas ocasiones hacemos hincapié en que 0 no esté incluido en Rt alu- diendo explicitamente al conjunto de mimeros reales estrictamente positivos. conjunto de ntimeros reales no negativos se denota mediante R?° = { x ¢ R |x 20}. Un intervalo es un conjunto de ntimeros reales que yacen entre dos limites. Sean ay b dos nimeros reales tales que a < b. El intervalo abierto (a, b) se representa por: (xeRla1,0>1y mn = 12573] Estos ejemplos afirman que la bien conocida f6rmula para la suma de los n ptimeros enteros es siempre valida (véase la Seccion 1.7.2), que esta suma es también igual a un #? sélo para un valor entero positivo de n, y que 12.573 es un entero compuesto, respectivamente. Se puede utilizar una alternancia de los cuantificadores en una sola expresién. Por ejemplo: (ne N)GmeN)[m>n] dice que para todo ntimero natural existe otro ntimero natural mayor todavia. Cuan- do se utiliza la alternancia de cuantificadores, el orden en el cual se presentan los cuantificadores es importante. Por ejemplo, la afirmacién G me Nv ne N) [m># J es evidentemente falsa: significaria que existe un entero m que es mayor que todos los nimeros naturales (incluyendo el propio m). Siempre y cuando el conjunto X sea infinito, resulta util decir que no so- lamente existe un x « X tal que la propiedad de P (x) es cierta, sino que ade- mas existen infinitos de ellos. El cuantificador apropiado en este caso es 3. Por ejemplo, ( 4 n < N) [n es primo]. Obsérvese que 4 es més fuerte que J pe 10 mas débil que V. Otro cuantificador util, mds fuerte que 3 pero todavia mas débil que V, es ¥ , que se usa cuando una propiedad es valida en todos los ca- sos salvo posiblemente para un ntimero finito de excepciones. Por ejemplo, ( ne N) [sin es primo, entonces n es impar] significa que los numeros primos siempre son impares, salvo posiblemente por un nimero finito de excepciones, en este caso hay solamente una excepcidn: 2 es a la vez primo y par. Cuando estamos interesados en las propiedades de los nimeros naturales, existe una definicién equivalente para estos cuantificadores, y suele ser mejor pensar en ellos en consecuencia. Una propiedad P de los nimeros naturales es cierta con infinita frecuencia, si, independientemente de lo grande que sea m, existe un 7 2 m tal que P (n) es vAlido. De manera similar, la propiedad P es va- lida para todos los ntimeros naturales salvo posiblemente por un ntimero finito de excepciones si existe un natural m tal que P (n) es vdlido para todos los nti- Secci6n 1.4 Notaci6n matematica 13 meros naturales n = m. En este tltimo caso, diremos que «la propiedad P es cier- ta para todos los enteros suficientemente grandes». Formalmente: qa n&N) [P (n)] es equivalente a (Vm EN) (An 2m) [P (n)] mientras que (¥ EN) [P (n)] es equivalente a (a m EN) (V n= m) [P (n)] El principio de dualidad para los cuantificadores dice que «no es cierto que la propiedad P sea valida para todo x € X si y sélo si existe al menos un x € X pa- ra el cual la propiedad P no es valida». En otras palabras: =~(W x € X) [P (x)] es equivalente a (4 x € X) [> P ()] De manera similar: 7(a x € X) [P (x)] es equivalente a (V x € X) [+ P (x)] El principio de dualidad también es valido para v y ER 1.4.6 Sumas y productos Considérese una funcién f: N - R y un entero n 2 0. (Esto incluye f: N > N co- mo caso especial.) La suma de los valores tomados por f sobre los n primeros nu- meros positivos se denota mediante yy @= fA) + fQ+..+F (0) que se lee «la suma de los f (i) cuando i va desde 1 hasta a » Enel caso en que n = 0, la suma se define como 0. Esto se generaliza en la for- ma evidente para denotar una suma cuando i va desde m hasta n siempre y cuando m sn + 1. En algunas ocasiones resulta atil considerar sumas condicio- nales. Si P es una propiedad de los enteros, pf denota la suma de f (i) para todos los enteros i tal que sea valido P (i). Esta suma puede no estar bien definida si involucra a un nimero infinito de enteros, po- demos incluso utilizar una notacién mixta tal como S £00, ho 14 Preliminares Capitulo 1 que denota la suma de los valores tomados por f para aquellos enteros que se encuentran entre 1 y 7 para los cuales es valida la propiedad P. Si no hay tales enteros, la suma es 0. Por ejemplo, ‘a Li=1434+5+74+9=25. i ‘impar En la Seccién 1.7.2. se puede encontrar mas informaci6n acerca de las sumas. El producto de los valores tomados por f sobre los # primeros enteros positi- vos se denota mediante Il fO= fx f(2)% f(B) x... fle), lo cual se lee «el producto de los f (i) cuando i va desde 1 hasta 7». En el caso n= 0, se define el producto como 1. Esta notacién se generaliza en la misma for- ma que en la notacién del sumatorio. 1.4.7 Miscelanea Si b 1 y x son ntimeros reales estrictamente positivos, entonces log, x, que se lee «el logaritmo en base b de x», se define como el niimero real y tal que bY = x. Por ejemplo, log,, 1.000 = 3. Obsérvese que aun cuando b y x deben ser positives, no existe tal restriccién para y. Por ejemplo, log,, 0,001 = -3. Cuando la base b no esta especificada, interpretamos que se trata de e = 2,7182818..., la base de los llamados logaritmos naturales (algunos autores toman la base 10 cuando no se especifica y denotan el logaritmo natural como «In».) En Algoritmia, la base que se utiliza mds a menudo para los logaritmos es 2, y merece una notacién propia: «lg x» es la abre- viatura de «log, x.» Aun cuando supondremos que el lector est familiarizado con Jos logaritmos, recordemos las identidades logaritmicas mas importantes: Jog, (xy) = log, x + log, y, log, x” = ylog, x, log, x= tes, x log,a y por tiltimo x" = y* Recuérdese también que el «log log n» es el logaritmo del logaritmo de n, pe- To «log? n» es el cuadrado del logaritmo de n. Si x es un numero real, Lx representa el mayor entero que no es mayor que x, y se denomina el suelo de x. Por ejemplo, L3 1/2] = 3. Cuando x es positivo, Lx es el entero que se obtiene descartando la parte fraccionaria de x si es que exis- Seccion 1.5 Técnica de demostracién | 15 te. Sin embargo, cuando x es negativo y no es un entero en si x es mas pequefio que este valor por una unidad. Por ejemplo, |-3'/.) = -4. De manera similar, de- finimos el techo de x, que se denota como Lx], como el menor entero que no es menor que x. Obsérvese que x- 1 0 son enteros, m/n denota como siempre el resultado de divi- dir m por n, lo cual no es necesariamente un entero. Por ejemplo, 7/2 = 3'/.. De- notamos el cociente entero mediante el simbolo « + », por tanto 7 + 2 = 3. For- malmente, m +n ={m/n]. También utilizamos mod para denotar el operador «médulo» que se define como m mod n= m-nx (m+n) En otras palabras, m mod 7 es el resto cuando m es dividido por n. Si m es un entero positivo, denotamos el producto de los m primeros enteros positivos como m!, lo cual se lee factorial de m. Es natural definir 0! = 1. Ahora bien n! =n x (n - 1)! para todos los enteros positivos n. Una aproximacién util del factorial es la que da la formula de Stirling: n 1 = V2n n (n/e)", en donde e es la base de los logaritmos naturales. n Sin y rson enteros tales que 0

También podría gustarte