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 PlainsContenido
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
118Contenido 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 ...
BERESERx 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 32610
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. 571Capitulo
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 intermedios4 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 resultarSecci6n 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 alSeccié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,
ho14 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