algoritmos computacionales - baase 3ra

706
Introducción al análisis y diseño Baase Van Gelder Tercera Edición www.FreeLibros.me

Upload: henrry-gomez-albernia

Post on 27-Nov-2015

639 views

Category:

Documents


162 download

TRANSCRIPT

  • Introduccin al anlisis y diseo

    Baase

    Van Gelder

    TerceraEdicin

    Vistenos en:www.pearsonedlatino.com

    Aprovechando la experiencia docente que renen ambos autores, los Profesores Sara Baase y Allen Van Gelder han hecho una revisin extensa de este best seller sobre diseo y anlisis de algoritmos para convertirlo en el libro ms actual y accesible que puede conseguirse. Esta edicin hace mayor hincapi en las tcnicas de diseo de algoritmos como divide y vencers y algoritmos codiciosos, e incluye temas y ejercicios nuevos. As, contina la tradicin de explicar los conceptos en forma de-tallada, exacta y una redaccin clara que hizo a este libro tan popular en ediciones anteriores.

    Hace hincapi en el desarrollo de algoritmos mediante un proceso paso por paso; no se limita a presentar simplemente el resultado final.

    Subraya la importancia del proceso de anlisis de algoritmos, reevaluando, modificando y tal vez rechazando continuamente los algoritmos hasta lograr una solucin satisfactoria.

    Ofrece un tratamiento amplio de la recursin con un repaso claro y altamente didctico de su funcionamiento y de las razones por las que es una valiosa tcnica de programacin.

    Emplea un pseudocdigo similar a Java; incluye un apndice con ejemplos en Java.

    Sara Baase es Profesora de Ciencias de la Computacin en la San Diego State University y ha esta-do enseando Ciencias de la Computacin durante 25 aos. La doctora Baase ha sido galardonada tres veces con el Outstanding Faculty Award de la San Diego State University Alumni Association y ha escrito varios libros de texto en las reas de algoritmos, lenguaje ensamblador y aspectos so-ciales y ticos de la computacin. Obtuvo su doctorado en la University of California, Berkeley.

    Allen Van Gelder es Profesor de Ciencias de la Computacin en la University of California at Santa Cruz, donde ha estado enseando Ciencias de la Computacin desde hace 12 aos. l recibi su grado de doctor en Ciencias de la Computacin de la Stanford University y ha sido galardonado con el Presidential Young Investigator Award.

    Puede consultar la informacin ms reciente acerca de los libros de Addison-Wesley visitndonos en la World Wide Web en www.awlonline.com/cs

    Introduccin al anlisis y diseo, Tercera edicinSara Baase, San Diego State University

    Allen Van Gelder, University of California at Santa Cruz

    La redaccin es lcida, organizada e invita a leer. Abdou Youssef, George Washington University

    La mejor introduccin a P y NP que he visto en cualquier libro de texto. Iliana Bjorling-Sachs, Lafayette College

    PUNTOS DESTACADOS

    Introduccin al anlisis y diseo

    BaaseVan Gelder

    TerceraEdicin

    www.FreeLibros.me

  • www.FreeLibros.me

  • www.FreeLibros.me

  • AlgoritmoscomputacionalesIntroduccin al anlisis y diseo

    TERCERA EDICIN

    Sara BaaseSan Diego State University

    Allen Van GelderUniversity of California at Santa Cruz

    TRADUCCIN:Roberto L. Escalona GarcaUniversidad Nacional Autnoma de Mxico

    REVISIN TCNICA:Sal de la O. TorresEscuela Superior de CmputoInstituto Politcnico Nacional

    www.FreeLibros.me

  • Versin en espaol de la obra titulada Computer Algorithms: Introduction to Design and Analysis, Third Edition, de Sara Baase y AllenVan Gelder, publicada originalmente en ingls por Addison-Wesley Longman, Inc., Reading Massachusetts, U.S.A.

    Esta edicin en espaol es la nica autorizada.

    Original English Language Title by Addison-Wesley Longman, Inc.Copyright 2000All rights reservedPublished by arrangement with the original publisher, Addison-Wesley Longman, Inc.,A Pearson Education CompanyISBN 0-201-61244-5

    Edicin en espaol:Editor: Guillermo Trujano Mendoza

    e-mail: [email protected] de desarrollo: Felipe de Jess Castro PrezSupervisor de produccin: Jos D. Hernndez Garduo

    Edicin en ingls:Acquisitions Editor: Maite Suarez-RivasAssistant Editor: Jason MirandaComposition/Art: Paul C. Anagnostopoulos, Windfall SoftwareCopy Editor: Joan FlahertyProofreader: Brooke AlbrightCover Illustration: Janetmarie ColbyCover Design: Lynne ReedManufacturing Coordinator: Timothy McDonald

    TERCERA EDICIN, 2002D.R. 2002 por Pearson Educacin de Mxico, S.A. de C.V.

    Calle 4 Nm. 25-2do. pisoFracc. Industrial Alce Blanco53370 Naucalpan de Jurez, Edo. de Mxicoe-mail: [email protected]

    Cmara Nacional de la Industria Editorial Mexicana Reg. Nm. 1031.

    Addison Wesley es una marca registrada de Pearson Educacin de Mxico, S.A. de C.V.

    Reservados todos los derechos. Ni la totalidad ni parte de esta publicacin pueden reproducirse, registrarse o transmitirse, por un sistemade recuperacin de informacin, en ninguna forma ni por ningn medio, sea electrnico, mecnico, fotoqumico, magntico o electroptico,por fotocopia, grabacin o cualquier otro, sin permiso previo por escrito del editor.

    El prstamo, alquiler o cualquier otra forma de cesin de uso de este ejemplar requerir tambin la autorizacin del editor o de sus repre-sentantes.

    ISBN 970-26-0142-8

    Impreso en Mxico. Printed in Mexico.

    1 2 3 4 5 6 7 8 9 0 - 04 03 02

    BAASE, SARA y GELDER ALLEN VAN Algoritmos computacionales.Introduccin al anlisis y diseo

    970-26-0142-8

    704Formato: 18.5 23.5 cm

    Mxico, 2002

    www.FreeLibros.me

  • Para Keith siempre partcipe de lo que hago S.B.

    Para mis padres, quienes fueron mis primeros maestros, y los ms importantes A.V.G.

    www.FreeLibros.me

  • Objetivo

    Este libro fue escrito para un curso completo sobre algoritmos; cuenta con suficiente material co-mo para adoptar diversas orientaciones.

    El objetivo del mismo incluye tres aspectos. Pretende ensear algoritmos que se aplicarn enla resolucin de problemas reales que se presentan a menudo en aplicaciones para computadora,ensear principios y tcnicas bsicos de complejidad computacional (comportamiento de peorcaso y caso promedio, consumo de espacio y cotas inferiores de la complejidad de un problema),e introducir las reas de los problemas NP-completos y los algoritmos paralelos.

    Otra de las metas del libro, no menos importante que ensear los temas que contiene, es de-sarrollar en el lector el hbito de siempre responder a un algoritmo nuevo con las preguntas: Qutan bueno es? Hay una manera mejor? Por ello, en lugar de presentar una serie de algoritmoscompletos, sacados de la manga, con su anlisis, el libro normalmente comenta primero un pro-blema, considera una o ms estrategias para resolverlo (como podra hacer el lector que enfrentael problema por primera vez) y luego comienza a desarrollar un algoritmo, lo analiza y lo modifi-ca o lo rechaza hasta obtener un resultado satisfactorio. (Los enfoques alternativos que finalmentese rechazan tambin se examinan en los ejercicios; para el lector es til saber por qu se les re-chaz.)

    Preguntas del tipo de Cmo puede hacerse esto de forma ms eficiente? Qu estructura dedatos sera til en este caso? En qu operaciones debemos concentrarnos para analizar este al-goritmo? Qu valor inicial debe asignarse a esta variable (o estructura de datos)?, aparecen amenudo en todo el texto. Por lo general damos la respuesta inmediatamente despus de la pregun-ta, pero sugerimos a los lectores hacer una pausa antes de continuar la lectura y tratar de idear supropia respuesta. El aprendizaje no es un proceso pasivo.

    Tenemos la esperanza de que los lectores tambin aprendan a visualizar cmo se comportaen la realidad un algoritmo con diversas entradas; es decir, Qu ramas sigue? Qu patrn decrecimiento y encogimiento siguen las pilas? Cmo afecta al comportamiento presentar las en-tradas en diferentes formas (por ejemplo, enumerando los vrtices o aristas de un grafo en distin-tos rdenes)? Tales preguntas se plantean en algunos de los ejercicios, pero no hacemos hincapien ellas en el texto porque requieren un estudio minucioso de los pormenores de un gran nmerode ejemplos.

    Casi todos los algoritmos que presentamos tienen utilidad prctica; decidimos no hacer hin-capi en los que tienen un buen comportamiento asinttico pero no se desempean bien con entra-das de tamao til (aunque s incluimos algunos por su importancia). Los algoritmos especficosse escogieron por diversas razones que incluyen la importancia del problema, la ilustracin de tc-

    Prefacio

    www.FreeLibros.me

  • nicas de anlisis, la ilustracin de tcnicas (como la bsqueda primero en profundidad) que danpie a numerosos algoritmos, y la ilustracin del desarrollo y mejoramiento de tcnicas y algorit-mos (como los programas Unin-Hallar).

    Requisitos previos

    El libro supone que el lector est familiarizado con estructuras de datos como listas ligadas, pilasy rboles, tambin asume que ha tenido contacto con la recursin. No obstante, incluimos un repa-so, con especificaciones, de las estructuras de datos estndar y de algunas especializadas. Tambinaadimos un repaso de la recursin que los estudiantes no debern tener problemas para entender.

    En el anlisis de algoritmos utilizamos propiedades sencillas de los logaritmos y algo declculo (diferenciacin para determinar el orden asinttico de una funcin e integracin para apro-ximar sumatorias), aunque prcticamente no se usa clculo ms all del captulo 4. Hemos vistoque muchos estudiantes se asustan al ver el primer logaritmo o signo de integral porque ha pasa-do un ao o ms desde su ltimo curso de clculo. Los lectores slo necesitarn unas cuantas pro-piedades de los logaritmos y unas cuantas integrales del primer semestre de clculo. En la seccin1.3 se repasan algunos de los temas necesarios de matemticas, y la seccin 1.5.4 ofrece una guaprctica.

    Tcnicas de diseo de algoritmos

    Varias tcnicas importantes de diseo de algoritmos vuelven a aparecer en muchos algoritmos.Ellas incluyen divide y vencers, mtodos codiciosos, bsqueda primero en profundidad (paragrafos) y programacin dinmica. Esta edicin hace ms hincapi que la segunda en las tcnicasde diseo de algoritmos. La programacin dinmica, igual que antes, tiene su propio captulo, yla bsqueda primero en profundidad se presenta con muchas aplicaciones en el captulo sobre re-corrido de grafos (captulo 7). Casi todos los captulos estn organizados por rea de aplicacin,no por tcnica de diseo, por lo que a continuacin presentaremos una lista de lugares en los queel lector hallar algoritmos que usan tcnicas de divide y vencers y codiciosas.

    La tcnica de dividir y vencer se describe en la seccin 4.3 y se usa en la Bsqueda Binaria(seccin 1.6), en casi todos los mtodos de ordenamiento (captulo 4), en la determinacin de me-dianas y en el problema de seleccin general (seccin 5.4), en los rboles de bsqueda binaria(seccin 6.4), en la evaluacin de polinomios (seccin 12.2), en la multiplicacin de matrices (sec-cin 12.3), en la Transformada Rpida de Fourier (seccin 12.4), en el coloreado aproximado degrafos (seccin 13.7) y, en una forma un poco distinta, en la computacin en paralelo en la sec-cin 14.5.

    Los algoritmos codiciosos se usan para hallar rboles abarcantes mnimos y caminos mscortos en el captulo 8, y en varios algoritmos de aproximacin para problemas de optimizacinNP-completos, como llenado de cajones, mochila, coloreado de grafos y vendedor viajero (van-se las secciones 13.4 a 13.8).

    Cambios respecto a la segunda edicin

    Esta edicin tiene tres captulos y muchos temas que son nuevos. En todo el libro se han vuelto aescribir numerosas secciones incorporando cambios extensos. Unos cuantos temas de la segundaedicin se han pasado a otros captulos donde, creemos, encajan mejor. Aadimos ms de 100ejercicios nuevos, muchas citas bibliogrficas y un apndice con ejemplos de Java. Los captulos2, 3 y 6 son prcticamente nuevos en su totalidad.

    vi Prefacio

    www.FreeLibros.me

  • El captulo 2 repasa los tipos de datos abstractos (TDA) e incluye especificaciones para va-rios TDA estndar. En todo el libro se hace hincapi en el papel de los tipos de datos abstractosen el diseo de algoritmos.

    El captulo 3 repasa la recursin y la induccin, haciendo hincapi en la conexin entre losdos y su utilidad en el diseo de programas y en la demostracin de que son correctos. En este ca-ptulo tambin se desarrollan los rboles de recursin, que proporcionan una representacin visuale intuitiva de las ecuaciones de recurrencia que surgen durante el anlisis de algoritmos recursi-vos. Las soluciones para patrones que se presentan a menudo se resumen con el fin de facilitar suuso en captulos posteriores.

    El captulo 6 aborda el hashing o dispersin, los rboles rojinegros para rboles binarios equi-librados, las colas de prioridad avanzadas y las relaciones de equivalencia dinmica (Unin-Ha-llar). Este ltimo tema se trataba en otro captulo en la segunda edicin.

    Reescribimos todos los algoritmos en un pseudocdigo basado en Java. No es necesario sa-ber Java; cualquiera que est familiarizado con C o C++ podr leer fcilmente los algoritmos. Elcaptulo 1 incluye una introduccin al pseudocdigo basado en Java.

    Hemos ampliado considerablemente la seccin que trata las herramientas matemticas parael anlisis de algoritmos en el captulo 1 con el fin de proporcionar un mejor repaso y una referen-cia de las matemticas que se usan en el libro. El tratamiento del orden asinttico de las funcionesde la seccin 1.5 se dise pensando en ayudar a los estudiantes a dominar mejor los conceptos ytcnicas relacionados con el orden asinttico. Aadimos reglas, en lenguaje informal, que resu-men los casos ms comunes (vase la seccin 1.5.4).

    El captulo 4 contiene una versin acelerada de Heapsort en la que el nmero de comparacio-nes de claves se recorta casi a la mitad. En el caso de Quicksort, usamos el algoritmo de particinde Hoare en el texto principal. El mtodo de Lomuto se introduce en un ejercicio. (En la segundaedicin se hizo al revs.)

    Hemos dividido el antiguo captulo sobre grafos en dos, y cambiamos el orden de algunos te-mas. El captulo 7 se concentra en los algoritmos de recorrido (en tiempo lineal). La presentacinde la bsqueda primero en profundidad se modific exhaustivamente destacando la estructura ge-neral de la tcnica y mostrando ms aplicaciones. Aadimos ordenamiento topolgico y anlisisde rutas crticas como aplicaciones, en vista de su valor intrnseco y su relacin con la programa-cin dinmica. Presentamos el algoritmo de Sharir, en vez del de Tarjan, para determinar compo-nentes conectados.

    El captulo 8 trata los algoritmos codiciosos para problemas de grafos. Las presentaciones delalgoritmo de Prim para rboles abarcantes mnimos y del algoritmo de Dijkstra para caminos mscortos se reescribieron tratando de hacer hincapi en el papel que desempean las colas de prio-ridad y de ilustrar la forma en que el uso de tipos de datos abstractos puede conducir al diseadora implementaciones eficientes. Se menciona la implementacin asintticamente ptima (m + nlog n), pero no se analiza a fondo. Trasladamos el algoritmo de Kruskal para rboles abarcantesmnimos a este captulo.

    La presentacin de la programacin dinmica (captulo 10) se modific sustancialmente a finde hacer hincapi en un enfoque general para hallar soluciones de programacin dinmica. Aa-dimos una nueva aplicacin, un problema de formateo de texto, para subrayar el punto de que notodas las aplicaciones requieren un arreglo bidimensional. Pasamos la aplicacin de cotejo apro-ximado de cadenas (que en la segunda edicin estaba en este captulo) al captulo sobre cotejo decadenas (seccin 11.5). Los ejercicios incluyen otras aplicaciones nuevas.

    Prefacio vii

    www.FreeLibros.me

  • Nuestra experiencia docente ha revelado reas especficas en que los estudiantes tuvieron di-ficultad para captar conceptos relacionados con P y NP (captulo 13), sobre todo algoritmos nodeterministas y transformaciones polinmicas. Reescribimos algunas definiciones y ejemplos pa-ra dejar ms claros los conceptos. Aadimos una seccin corta sobre algoritmos de aproximacinpara el problema del vendedor viajero y una seccin acerca de la computacin por ADN.

    A los profesores que usaron la segunda edicin seguramente les interesar saber que modifi-camos algunas convenciones y trminos (casi siempre para adecuarlos al uso comn). Los arreglosde ndices ahora principian en 0 en vez de 1 en muchos casos. (En otros, en los que la numera-cin a partir de 1 era ms clara, la dejamos as.) Ahora usamos el trmino profundidad en lugarde nivel para referirnos a la ubicacin vertical de un nodo dentro de un rbol. Usamos altura envez de profundidad para referirnos a la profundidad mxima de cualquier nodo de un rbol. En lasegunda edicin, un camino en un grafo se defina como lo que comnmente se conoce como ca-mino simple; en esta edicin usamos la definicin ms general de camino y definimos camino sim-ple aparte. Ahora un grafo dirigido puede contener una auto-arista.

    Ejercicios y programas

    Algunos ejercicios son un tanto abiertos. Por ejemplo, uno de ellos podra pedir una buena co-ta inferior para la complejidad de un problema, en lugar de pedir a los estudiantes demostrar queuna funcin dada es una cota inferior. Hicimos esto por dos razones. Una fue hacer ms realistael planteamiento de la pregunta; las soluciones se tienen que descubrir, no nada ms verificarse.La otra es que para algunos estudiantes podra ser difcil demostrar la mejor cota inferior conoci-da (o hallar el algoritmo ms eficiente para un problema), pero incluso en esos casos habr unagama de soluciones que podrn ofrecer para demostrar su dominio de las tcnicas estudiadas.

    Algunos temas y problemas interesantes se introducen nicamente en los ejercicios. Porejemplo, el problema del conjunto independiente mximo para un rbol es un ejercicio del ca-ptulo 3, el problema de la sumatoria de subsucesin mxima es un ejercicio del captulo 4, y elproblema de hallar un sumidero para un grafo es un ejercicio del captulo 7. Varios problemas NP-completos se introducen en ejercicios del captulo 13.

    Las capacidades, antecedentes y conocimientos matemticos de los estudiantes de diferentesuniversidades varan considerablemente, lo que dificulta decidir exactamente cules ejercicios de-ben marcarse (con un asterisco) como difciles. Marcamos los ejercicios que requieren matem-ticas ms all de las bsicas, los que requieren mucha creatividad y para los que se debe seguiruna cadena de razonamiento larga. Unos cuantos ejercicios tienen dos asteriscos. Algunos ejerci-cios con asterisco tienen sugerencias.

    Los algoritmos presentados en este libro no son programas; es decir, se han omitido muchosdetalles que no son importantes para el mtodo o para el anlisis. Claro que los estudiantes debensaber cmo implementar algoritmos eficientes en programas eficientes sin errores. Muchos profe-sores podran impartir este curso como curso terico puro, sin programacin. Para quienes deseanasignar proyectos de programacin, casi todos los captulos incluyen una lista de tareas de progra-macin: sugerencias breves que los profesores que decidan usarlas tal vez necesitarn ampliar.

    Cmo seleccionar temas para un curso

    Es evidente que la cantidad de material y la seleccin especfica de los temas a cubrir dependerndel curso especfico y de la poblacin de estudiantes. Presentaremos cuadros sinpticos de ejem-plo para dos cursos de licenciatura y uno de posgrado.

    viii Prefacio

    www.FreeLibros.me

  • Este programa corresponde aproximadamente al curso para cuarto ao (septimo u octavo se-mestre) que Sara Baase imparte en la San Diego State University durante un semestre de 15 se-manas con 3 horas por semana de clase.

    Captulo 1: Se deja como lectura todo el captulo, pero concentrndose en las secciones 1.4y 1.5 en clase.Captulo 2: Las secciones 2.1 a 2.4 se dejan como lectura.Captulo 3: Las secciones 3.1 a 3.4, 3.6 y 3.7 se dejan como lectura, cubrindose someramen-te en clase.Captulo 4: Secciones 4.1 a 4.9.Captulo 5: Secciones 5.1 a 5.2, 5.6 y parte de la 5.4.Captulo 7: Secciones 7.1 a 7.4 y 7.5 o bien 7.6, y 7.7.Captulo 8: Secciones 8.1 a 8.3, con breve mencin de la 8.4.Captulo 11: Secciones 11.1 a 11.4.Captulo 13: Secciones 13.1 a 13.5, 13.8 y 13.9.

    El programa que sigue es el curso de tercer ao que Allen Van Gelder imparte en la Univer-sity of California, Santa Cruz, en un trimestre de 10 semanas con 3.5 horas de clase por semana.

    Captulo 1: Secciones 1.3 y 1.5; las dems se dejan como lectura.Captulo 2: Secciones 2.1 a 2.3; las dems se dejan como lectura.Captulo 3: Se tocan todas las secciones; una buena parte se deja como lectura.Captulo 4: Secciones 4.1 a 4.9.Captulo 5: Posiblemente la seccin 5.4, slo el algoritmo en tiempo lineal promedio.Captulo 6: Secciones 6.4 a 6.6.Captulo 7: Secciones 7.1 a 7.6.Captulo 8: Todo el captulo.Captulo 9: Secciones 9.1 a 9.4.Captulo 10: Posiblemente las secciones 10.1 a 10.3, pero casi nunca alcanza el tiempo.

    Para el curso de primer ao de posgrado de la University of California, Santa Cruz (tambin10 semanas, 3.5 horas de clases), el material anterior se comprime y se cubren los temas adicio-nales siguientes:

    Captulo 5: Todo el captulo.Captulo 6: El resto del captulo, con hincapi en el anlisis amortizado.Captulo 10: Todo el captulo.Captulo 13: Secciones 13.1 a 13.3, y posiblemente la seccin 13.9.

    Las dependencias primarias entre los captulos se muestran en el diagrama siguiente con l-neas continuas; algunas dependencias secundarias de indican con lneas interrumpidas. Una de-pendencia secundaria implica que slo se necesitan unos cuantos temas del captulo anterior en elcaptulo posterior, o que slo las secciones ms avanzadas del captulo posterior requieren habervisto el anterior.

    Prefacio ix

    www.FreeLibros.me

  • Aunque es importante haber visto el material de los captulos 2 y 6, es posible que una bue-na parte de l ya se haya cubierto en un curso anterior. Algunas secciones del captulo 6 son im-portantes para las partes ms avanzadas del captulo 8.

    Nos gusta recordar a los lectores temas o tcnicas comunes, por lo que abundan las referen-cias a secciones anteriores; se puede hacer caso omiso de muchas de esas referencias si no se cu-brieron las secciones anteriores. Varios captulos tienen una seccin que trata cotas inferiores ypuede ser provechoso haber visto antes las ideas y ejemplos del captulo 5, pero el diagrama nomuestra esa dependencia porque muchos profesores no tratan las cotas inferiores.

    Hemos marcado (con un asterisco) las secciones que contienen matemticas ms complica-das o argumentos ms complejos o avanzados que la generalidad de las otras, pero slo en loscasos en que el material no es fundamental para el libro. Tambin marcamos una o dos seccionesque contienen digresiones opcionales. No marcamos unas cuantas secciones que consideramos in-dispensables para un curso en el que se usa el libro, aunque contienen muchas matemticas. Porejemplo, es importante cubrir al menos una parte del material de la seccin 1.5 sobre la tasa decrecimiento asinttico de las funciones y la seccin 3.7 sobre soluciones de ecuaciones de recu-rrencia.

    Agradecimientos

    Nos alegramos de tener esta oportunidad para agradecer a las personas que nos ayudaron muchoo poco en la preparacin de la tercera edicin de este libro.

    Sara Baase reconoce la influencia e inspiracin de Dick Karp, quien hizo tan interesante yhermoso el tema de la complejidad computacional en sus soberbias conferencias. Allen Van Gel-der hace patente su reconocimiento por las revelaciones que tuvo gracias a Bob Floyd, Don Knuth,Ernst Mayr, Vaughan Pratt y Jeff Ullman; todos ellos ensean ms de lo que est en el libro.Allen tambin quiere expresar su reconocimiento a sus colegas David Helmbold, por muchas con-versaciones acerca de la forma de presentar eficazmente los algoritmos y acerca de los puntos fi-nos de muchos de ellos, y Charlie McDowell por su ayuda con muchos de los aspectos de Javaque se cubren en el apndice de esta obra. Agradecemos a Lila Kari haber ledo uno de los prime-ros borradores de la seccin acerca de computacin por ADN y aclarar nuestras dudas.

    Desde luego, no tendramos nada acerca de qu escribir sin las muchas personas que realiza-ron las investigaciones originales de las cuales se deriva el material que nos gusta aprender y co-municar a nuevas generaciones de estudiantes. Estamos en deuda con ellos por su trabajo.

    En los aos que han pasado desde que apareci la segunda edicin, varios estudiantes y pro-fesores que usaron el libro enviaron listas de equivocaciones, errores tipogrficos y sugerenciasde cambios. No tenemos una lista completa de sus nombres, pero apreciamos el tiempo y la me-ditacin que invirtieron en sus cartas.

    Las encuestas y reseas del manuscrito obtenidas por Addison Wesley fueron de especial uti-lidad. Muchas gracias a Iliana Bjorling Sachs (del Lafayette College), Mohammad B. Dadfar(Bowling Green State University), Daniel Hirschberg (University of California in Irvine), Mitsu-

    x Prefacio

    1

    2

    3 4

    12

    56

    78

    9

    10

    11

    13

    14

    www.FreeLibros.me

  • nori Ogihara (University of Rochester), R. W. Robinson (University of Georgia), Yaakov L. Varol(University of Nevada, Reno), William W. White (Southern Illinois University at EdwardsVille),Dawn Wilkins (University of Mississippi) y Abdou Youssef (George Washington University).

    Agradecemos a nuestras editoras de Addison Wesley, Mait Surez-Rivas y Karen Wernholm,su confianza y paciencia al trabajar con nosotros en este proyecto que a menudo se apart de losprocedimientos y calendarios estndar de la produccin. Muchas gracias a Joan Flaherty por suminuciosa edicin y valiosas sugerencias para mejorar la presentacin. Las cuidadosas lecturas deBrooke Albright detectaron muchos errores que haban sobrevivido a escrutinios anteriores; des-de luego, todos los que queden son por culpa de los autores.

    Agradecemos a Keith Mayers su ayuda en muchos sentidos. Sara le da las gracias por nohaberle recordado con demasiada frecuencia que rompi la promesa que le hizo al casarse de tra-bajar menos de siete das a la semana.

    Sara Baase, San Diego, Californiahttp://www-rohan.sdsu.edu/faculty/baase

    Allen Van Gelder, Santa Cruz, Californiahttp://www.cse.ucsc.edu/personnel/faculty/avg.html

    Junio de 1999

    Prefacio xi

    www.FreeLibros.me

  • www.FreeLibros.me

  • Contenido

    Prefacio vii

    1 Anlisis de algoritmos y problemas:principios y ejemplos 1

    1.1 Introduccin 21.2 Java como lenguaje algortmico 31.3 Antecedentes matemticos 111.4 Anlisis de algoritmos y problemas 301.5 Clasificacin de funciones por su tasa de crecimiento asinttica 431.6 Bsqueda en un arreglo ordenado 53

    Ejercicios 61Notas y referencias 67

    2 Abstraccin de datos y estructuras de datos bsicas 69

    2.1 Introduccin 702.2 Especificacin de TDA y tcnicas de diseo 712.3 TDA elementales: listas y rboles 732.4 Pilas y colas 862.5 TDA para conjuntos dinmicos 89

    Ejercicios 95Notas y referencias 100

    3 Recursin e induccin 101

    3.1 Introduccin 1023.2 Procedimientos recursivos 1023.3 Qu es una demostracin? 1083.4 Demostraciones por induccin 1113.5 Cmo demostrar que un procedimiento es correcto 118

    www.FreeLibros.me

  • 3.6 Ecuaciones de recurrencia 1303.7 rboles de recursin 134

    Ejercicios 141Notas y referencias 146

    4 Ordenamiento 1494.1 Introduccin 1504.2 Ordenamiento por insercin 1514.3 Divide y vencers 1574.4 Quicksort 1594.5 Fusin de sucesiones ordenadas 1714.6 Mergesort 1744.7 Cotas inferiores para ordenar comparando claves 1784.8 Heapsort 1824.9 Comparacin de cuatro algoritmos para ordenar 1974.10 Shellsort 1974.11 Ordenamiento por base 201

    Ejercicios 206Programas 221Notas y Referencias 221

    5 Seleccin y argumentos de adversario 2235.1 Introduccin 2245.2 Determinacin de max y min 2265.3 Cmo hallar la segunda llave ms grande 229

    5.4 El problema de seleccin 2335.5 Una cota inferior para la determinacin de la mediana 2385.6 Diseo contra un adversario 240

    Ejercicios 242Notas y referencias 246

    6 Conjuntos dinmicos y bsquedas 2496.1 Introduccin 2506.2 Doblado de arreglos 2506.3 Anlisis de tiempo amortizado 2516.4 rboles rojinegros 2536.5 Hashing (dispersin) 2756.6 Relaciones de equivalencia dinmica y programas Unin-Hallar 283

    6.7 Colas de prioridad con operacin de decrementar clave 295Ejercicios 302

    xiv Contenido

    www.FreeLibros.me

  • Programas 309Notas y referencias 309

    7 Grafos y recorridos de grafos 3137.1 Introduccin 3147.2 Definiciones y representaciones 3147.3 Recorrido de grafos 3287.4 Bsqueda de primero en profundidad en grafos dirigidos 3367.5 Componentes fuertemente conectados de un grafo dirigido 3577.6 Bsqueda de primero en profundidad en grafos no dirigidos 3647.7 Componentes biconectados de un grafo no dirigido 366

    Ejercicios 375Programas 384Notas y referencias 385

    8 Problemas de optimizacin de grafos y algoritmos codiciosos 387

    8.1 Introduccin 3888.2 Algoritmo de rbol abarcante mnimo de Prim 3888.3 Caminos ms cortos de origen nico 4038.4 Algoritmo de rbol abarcante mnimo de Kruskal 412

    Ejercicios 416Programas 421Notas y referencias 422

    9 Cierre transitivo, caminos ms cortos de todos los pares 4259.1 Introduccin 4269.2 Cierre transitivo de una relacin binaria 4269.3 Algoritmo de Warshall para cierre transitivo 4309.4 Caminos ms cortos de todos los pares en grafos 4339.5 Clculo del cierre transitivo con operaciones de matrices 436

    9.6 Multiplicacin de matrices de bits: algoritmo de Kronrod 439Ejercicios 446Programas 449Notas y referencias 449

    10 Programacin dinmica 45110.1 Introduccin 45210.2 Grafos de subproblema y su recorrido 45310.3 Multiplicacin de una sucesin de matrices 457

    Contenido xv

    www.FreeLibros.me

  • 10.4 Construccin de rboles de bsqueda binaria ptimos 46610.5 Divisin de sucesiones de palabras en lneas 47410.6 Desarrollo de un algoritmo de programacin dinmica 474

    Ejercicios 475Programas 481Notas y referencias 482

    11 Cotejo de cadenas 48311.1 Introduccin 48411.2 Una solucin directa 48511.3 El algoritmo Knuth-Morris-Pratt 48711.4 El algoritmo Boyer-Moore 49511.5 Cotejo aproximado de cadenas 504

    Ejercicios 508Programas 512Notas y referencias 512

    12 Polinomios y matrices 51512.1 Introduccin 51612.2 Evaluacin de funciones polinmicas 51612.3 Multiplicacin de vectores y matrices 522

    12.4 La transformada rpida de Fourier y convolucin 528Ejercicios 542Programas 546Notas y referencias 546

    13 Problemas NP-completos 54713.1 Introduccin 54813.2 P y NP 54813.3 Problemas NP-completos 55913.4 Algoritmos de aproximacin 57013.5 Llenado de cajones 57213.6 Los problemas de la mochila y de la sumatoria de subconjunto 57713.7 Coloreado de grafos 58113.8 El problema del vendedor viajero 58913.9 Computacin por ADN 592

    Ejercicios 600Notas y referencias 608

    xvi Contenido

    www.FreeLibros.me

  • 14 Algoritmos paralelos 61114.1 Introduccin 61214.2 Paralelismo, la PRAM y otros modelos 61214.3 Algunos algoritmos de PRAM sencillos 61614.4 Manejo de conflictos de escritura 62214.5 Fusin y ordenamiento 62414.6 Determinacin de componentes conectados 62814.7 Una cota inferior para la suma de n enteros 641

    Ejercicios 643Notas y referencias 647

    A Ejemplos y tcnicas en Java 649A.1 Introduccin 650A.2 Un programa principal en Java 651A.3 Una biblioteca de entrada sencilla 656A.4 Documentacin de clases de Java 658A.5 Orden genrico y la interfaz Comparable 659A.6 Las subclases extienden la capacidad de su superclase 663A.7 Copiado a travs de la interfaz Clonable 667

    Bibliografa 669

    ndice 679

    Contenido xvii

    www.FreeLibros.me

  • www.FreeLibros.me

  • 1Anlisis de algoritmos y problemas:

    principios y ejemplos1.1 Introduccin1.2 Java como lenguaje algortmico1.3 Antecedentes matemticos1.4 Anlisis de algoritmos y problemas1.5 Clasificacin de funciones por su tasa

    de crecimiento asinttica1.6 Bsqueda en un arreglo ordenado

    www.FreeLibros.me

  • 1.1 Introduccin

    Decir que un problema se puede resolver algortmicamente implica, informalmente, que es posi-ble escribir un programa de computadora que producir la respuesta correcta para cualquier entra-da si permitimos que se ejecute durante el tiempo suficiente y le proporcionamos todo el espaciode almacenamiento que necesite. En la dcada de 1930, antes de la llegada de las computadoras,los matemticos trabajaron con gran celo para formalizar y estudiar el concepto de algoritmo, queentonces se defina de manera informal como un conjunto claramente especificado de instruccio-nes sencillas a seguir para resolver un problema o calcular una funcin. Se idearon e investigaronvarios modelos de cmputo formales. Muchos de los primeros trabajos en este campo, llamadoteora de la computabilidad, hicieron hincapi en describir o caracterizar los problemas que se po-dan resolver algortmicamente, y en presentar algunos problemas que no se podan resolver deesa manera. Uno de los resultados negativos importantes, establecido por Alan Turing, fue la de-mostracin de la insolubilidad del problema del paro. Este problema consiste en determinar sicualquier algoritmo (o programa de computadora) determinado llegar en algn momento a unpunto en el que se detendr (en vez de, digamos, entrar en un ciclo infinito) al trabajar con unaentrada dada. No puede existir un programa de computadora que resuelva este problema.

    Aunque la teora de la computabilidad tiene implicaciones obvias y fundamentales para lasciencias de la computacin, el saber que en teora un problema se puede resolver con una compu-tadora no basta para decirnos si resulta prctico hacerlo o no. Por ejemplo, se podra escribir unprograma perfecto para jugar ajedrez. La tarea no sera demasiado difcil; las formas de acomo-dar las piezas de ajedrez en el tablero son finitas, y bajo ciertas reglas una partida debe terminardespus de un nmero finito de movimientos. El programa podra considerar todos los movi-mientos posibles que podra efectuar la computadora, cada una de las posibles respuestas del opo-nente, cada una de sus posibles respuestas a esos movimientos, y as hasta que cada una de lassucesiones de posibles movimientos llegara a su fin. Entonces, dado que la computadora conoceel resultado final de cada movimiento, podr escoger la mejor. Segn algunas estimaciones, el n-mero de acomodos distintos de las piezas en el tablero que es razonable considerar (mucho me-nor que el nmero de sucesiones de movimientos) es de aproximadamente 1050. Un programa quelas examinara todas tardara varios miles de aos en ejecutarse. Es por ello que no se ha ejecuta-do un programa semejante.

    Es posible resolver una gran cantidad de problemas con aplicaciones prcticas es decir, sepueden escribir programas para hacerlo pero las necesidades de tiempo y almacenamiento sondemasiado grandes para que tales programas tengan utilidad prctica. Es evidente que las necesi-dades de tiempo y espacio de los programas son importantes en la prctica; por ello, se hanconvertido en el tema de estudios tericos en el rea de las ciencias de la computacin llamadacomplejidad computacional. Una rama de tales estudios, que no se cubrir en este libro, se ocupade establecer una teora formal y un tanto abstracta de la complejidad de las funciones compu-tables. (Resolver un problema equivale a calcular una funcin que a partir del conjunto de entradasproporcione el conjunto de salidas.) Se han formulado axiomas para medir la complejidad, stos sonbsicos y lo bastante generales como para poder usar el nmero de instrucciones ejecutadas o bienel nmero de bits de almacenamiento que ocupa un programa como medida de su complejidad.Utilizado esos axiomas, podemos demostrar la existencia de problemas arbitrariamente comple-jos y de problemas para los que no existe un programa ptimo.

    La rama de la complejidad computacional que estudiaremos en este libro se ocupa de anali-zar problemas especficos y algoritmos especficos. El libro pretende ayudar a los lectores a for-

    2 Captulo 1 Anlisis de algoritmos y problemas: principios y ejemplos

    www.FreeLibros.me

  • mar un repertorio de algoritmos clsicos para resolver problemas comunes, algunas tcnicas, he-rramientas y principios de diseo generales para analizar algoritmos y problemas, y mtodos parademostrar que la solucin es correcta. Presentaremos, estudiaremos y analizaremos algoritmospara resolver diversos problemas para los que comnmente se usan programas de computadora.Analizaremos el tiempo que tardan en ejecutarse los algoritmos, y muchas veces tambin el es-pacio que consumen. Al describir algoritmos para diversos problemas, veremos que hay variastcnicas de diseo de algoritmos que a menudo resultan tiles. Por ello, haremos ahora una pau-sa para hablar acerca de algunas tcnicas generales, como divide y vencers, algoritmos codicio-sos, bsqueda de primero en profundidad y programacin dinmica. Tambin estudiaremos lacomplejidad computacional de los problemas mismos, es decir, el tiempo y espacio que se requie-ren inherentemente para resolver el problema, sea cual sea el algoritmo empleado. Estudiaremosla clase de problemas NP-completos problemas para los que no se conocen algoritmos eficien-tes y consideraremos algunas heursticas para obtener resultados tiles. Tambin describiremosun enfoque para resolver estos problemas empleando ADN en lugar de computadoras electrni-cas. Por ltimo, presentaremos el tema de los algoritmos para computadoras paralelas.

    En las secciones que siguen bosquejaremos el lenguaje algortmico, repasaremos algunos an-tecedentes y herramientas que se usarn en todo el libro, e ilustraremos los principales conceptosque intervienen en el anlisis de algoritmos.

    1.2 Java como lenguaje algortmico

    Escogimos Java como lenguaje algortmico para este libro sopesando varios criterios. Los algo-ritmos deben ser fciles de leer. Queremos concentrarnos en la estrategia y las tcnicas de un al-goritmo, no declaraciones y detalles de sintaxis que interesan al compilador. El lenguaje debemanejar abstraccin de datos y descomposicin de problemas, a fin de facilitar la expresin clarade ideas algortmicas. El lenguaje debe ofrecer un camino prctico hacia la implementacin; debeestar ampliamente disponible e incluir apoyo para el desarrollo de programas. La implementaciny ejecucin reales de algoritmos puede mejorar considerablemente la comprensin del estudian-te, y no debe convertirse en una frustrante batalla con el compilador y el depurador. Por ltimo,dado que este libro ensea algoritmos, no un lenguaje de programacin, debe ser razonablemen-te fcil traducir un algoritmo a diversos lenguajes que los lectores tal vez prefieran usar, por lo queconviene reducir al mnimo las caractersticas especializadas del lenguaje.

    Java obtiene buenas calificaciones segn varios de nuestros criterios, aunque no nos atreve-ramos a decir que es ideal. Java apoya de forma natural la abstraccin de datos; es seguro encuanto a los tipos, lo que significa que objetos de un tipo no se pueden usar en operaciones dise-adas para un tipo distinto; tampoco se permiten conversiones arbitrarias de tipo (llamadascasts, o mutaciones). Hay un tipo bboooolleeaann explcito, de modo que si uno escribe (eloperador de asignacin) cuando la intencin era escribir (el operador de igualdad), el com-pilador lo detecta.

    Java no permite la manipulacin de apuntadores, lo que a menudo dan pie a errores difcilesde encontrar; de hecho, los apuntadores estn ocultos del programador y se manejan automti-camente tras bambalinas. En el momento de la ejecucin, Java verifica que los subndices dearreglos estn dentro del intervalo definido, y cuida que no haya otras incongruencias que podranoriginar errores escondidos. Se efecta recoleccin de basura, o sea que se recicla el espacio dealmacenamiento de objetos a los que ya no se hace referencia; esto alivia considerablemente lacarga del programador en cuanto a administracin del espacio.

    1.2 Java como lenguaje algortmico 3

    www.FreeLibros.me

  • En el lado negativo, Java tiene muchas de las parcas y misteriosas caractersticas de la sinta-xis de C. La estructura de los objetos podra obligar a hacer uso ineficiente del tiempo y el espa-cio. Muchas construcciones de Java requieren escribir ms que en otros lenguajes, como C.

    Aunque Java tiene muchos recursos especializados, los algoritmos que presentamos en estelibro en su mayor parte los evitan, en aras de la independencia respecto al lenguaje. De hecho,algunos pasos de un algoritmo podran estar planteados en pseudocdigo para hacerlos ms com-prensibles. En esta seccin describiremos un pequeo subconjunto de Java que se usar en el libro,as como las convenciones de pseudocdigo que empleamos para hacer ms comprensibles losalgoritmos. El apndice A, especfico para Java, proporciona algunos detalles de implementacinadicionales para los lectores que desean escribir un programa funcional en Java, pero tales deta-lles no son necesarios para entender el grueso del texto.

    1.2.1 Un subconjunto prctico de Java

    No es importante tener un conocimiento exhaustivo de Java para entender los algoritmos del pre-sente texto. En esta seccin se presenta una perspectiva somera de las caractersticas de Java ques aparecen, para aquellos lectores que deseen seguir de cerca los detalles de implementacin. Enalgunos casos mencionamos recursos orientados a objetos de Java que se podran usar, pero queevitamos con el fin de que el texto sea relativamente independiente del lenguaje; esto se hizo pen-sando principalmente en los lectores que manejan algn otro lenguaje orientado a objetos, comoC, pero que no estn perfectamente familiarizados con Java. En el apndice A se presenta unejemplo de programa principal en Java. Existen muchos libros que cubren a fondo el lenguaje.

    Los lectores que conocen bien Java sin duda notarn muchos casos en los que se podra haberusado algn bonito recurso de Java. Sin embargo, los conceptos en los que se basan los algorit-mos no requieren recursos especiales, y queremos que dichos conceptos sean fciles de captar yaplicar en diversos lenguajes, as que dejamos que sea el lector quien, habiendo captado los con-ceptos, adapte las implementaciones a su lenguaje favorito.

    Los lectores que conocen la sintaxis de C reconocern muchas similitudes en la sintaxis deJava: los bloques se delimitan con llaves, { y }; los ndices de arreglo se encierran en cor-chetes, [ y ]. Al igual que en C y C, un arreglo bidimensional es en realidad un arreglounidimensional cuyos elementos son a su vez arreglos unidimensionales, as que se necesitan dospares de corchetes para acceder a un elemento, como en matriz[i][j]. Los operadores, !, y son las versiones de teclado de los operadores de relacin matem-ticos , , y , respectivamente. En pseudocdigo, normalmente se usan de prefe-rencia las versiones matemticas. En los ejemplos del texto se usan los operadores y --para incrementar y decrementar, pero nunca se usan incrustados en otras expresiones. Tambin es-tn los operadores , , y / adoptados de C. Por ejemplo,

    p q; / Sumar q a p. /y x; //Restar x de y.

    Como acabamos de ilustrar, los comentarios se extienden desde // hasta el fin de la lnea, o des-de / hasta / , igual que en C.

    Las cabeceras de funcin normalmente tienen el mismo aspecto en Java y en C. La cabeceraespecifica la rbrica de tipo de parmetros entre parntesis despus del nombre de la funcin,y especifica el tipo devuelto antes del nombre de la funcin. La combinacin de tipo devuelto y r-brica de tipo de parmetros se denomina rbrica de tipo completa, o prototipo, de la funcin. As,

    4 Captulo 1 Anlisis de algoritmos y problemas: principios y ejemplos

    www.FreeLibros.me

  • iinntt obtMin(ColaPrioridad cp)

    nos dice que la funcin obtMin recibe un parmetro del tipo (o ccllaassee) ColaPrioridad y de-vuelve un resultado de tipo iinntt.

    Java tiene unos cuantos tipos primitivos, y todos los dems tipos se llaman clases. Los tiposprimitivos son lgicos (bboooolleeaann) y numricos (bbyyttee, cchhaarr, sshhoorrtt, iinntt, lloonngg, ffllooaatt y ddoouu--bbllee). En Java todas las clases (tipos no primitivos) son de referencia. Tras bambalinas, las va-riables declaradas en clases son apuntadores; sus valores son direcciones. Los ejemplares declases se llaman objetos. El hecho de declarar una variable no crea un objeto. En general, los ob-jetos se crean con un operador nneeww, que devuelve una referencia al nuevo objeto.

    Los campos de datos de un objeto se denominan campos de ejemplar en la terminologa deorientacin a objetos. Se usa el operador binario punto para acceder a los campos de ejemplarde un objeto.

    Ejemplo 1.1 Cmo crear y acceder a objetos en JavaPara este ejemplo, supngase que la informacin de fecha tiene la siguiente estructura lgica ani-dada:

    ao numero esBisiesto

    mes dia

    Es decir, empleando terminologa formal, ao es un atributo compuesto que consiste en el atribu-to booleano esBisiesto y el atributo entero numero, mientras que mes y dia son atributos ente-ros simples. A fin de reflejar la estructura anidada, es preciso definir dos clases en Java, una paratoda la fecha y otra para el campo ao. Supngase que escogemos los nombres Fecha y Ao, res-pectivamente, para estas clases. Entonces declararamos numero y esBisiesto como campos deejemplar en la clase Ao y declararamos ao, mes y dia como campos de ejemplar en la claseFecha. Adems, lo ms probable es que definiramos a Ao como clase interna de Fecha. La sin-taxis se muestra en la figura 1.1.

    ccllaassss Fecha{ppuubblliicc Ao ao;ppuubblliicc iinntt mes;ppuubblliicc iinntt dia;

    ppuubblliicc ssttaattiicc ccllaassss Ao{ppuubblliicc iinntt numero;ppuubblliicc bboooolleeaann esBisiesto;}

    }

    Figura 1.1 Sintaxis de Java para la clase Fecha con una clase interna Ao

    1.2 Java como lenguaje algortmico 5

    www.FreeLibros.me

  • Sin la palabra clave ppuubblliicc, no se podra acceder a los campos de ejemplar fuera de las cla-ses Fecha y Ao; por sencillez, los hacemos ppuubblliicc aqu. Declaramos la clase interna Ao co-mo ssttaattiicc para poder crear un ejemplar de Ao que no est asociado a algn objeto Fecha enparticular. En este libro todas las clases internas sern ssttaattiicc.

    Supngase que hemos creado un objeto Fecha al que hace referencia la variable fechaPa-go. Para acceder al campo de ejemplar ao de este objeto usamos el operador punto, como enfechaPago.ao. Si el campo de ejemplar est en una clase (en lugar de estar en un tipo pri-mitivo), operadores punto adicionales accedern a sus campos de ejemplar, como en fechaPa-go.ao.esBisiesto.

    El enunciado de asignacin copia slo la referencia, o direccin, de un objeto de una clase;no crea una copia de los campos de ejemplar. Por ejemplo, fechaAviso = fechaPago haceque la variable fechaAviso se refiera al mismo objeto que la variable fechaPago. Por tanto, elfragmento de cdigo siguiente probablemente sera un error lgico:

    fechaAviso = fechaPago;fechaAviso.dia = fechaPago.dia 7;

    En la seccin 1.2.2 se ampla la explicacin.

    Los enunciados de control iiff, eellssee, wwhhiillee, ffoorr y bbrreeaakk tienen el mismo significado enJava que en C (y en C) y se usan en este libro. Hay varios otros enunciados de control, perono los usaremos. Las sintaxis de wwhhiillee y ffoorr son

    wwhhiillee (( condicin para continuar )) cuerpoffoorr (( inicializador; condicin para continuar; incremento )) cuerpo

    donde inicializador e incremento son enunciados sencillos (sin {, }), cuerpo es un enun-ciado cualquiera y condicin para continuar es una expresin bboooolleeaannaa. El enunciado bbrreeaakkhace que el programa salga de inmediato del ciclo ffoorr o wwhhiillee circundante ms cercano.1

    Todas las clases forman un rbol (tambin llamado jerarqua) cuya raz es la clase OObbjjeecctt.Al declarar una clase nueva, es posible decir que extiende una clase previamente definida, y lanueva clase se convierte en hija de la clase antes definida dentro del rbol de clases. No creare-mos este tipo de estructuras aqu, a fin de mantener el cdigo lo ms independiente del lenguajeque sea posible; sin embargo, se dan unos cuantos ejemplos en el apndice A. Si la clase nuevano se declara de modo que extienda alguna clase, extiende OObbjjeecctt por omisin. No necesitare-mos estructuras de clase complejas para los algoritmos que se estudian en este texto.

    Las operaciones con objetos se llaman mtodos en la terminologa de orientacin a objetos;sin embargo, nos limitaremos al uso de mtodos estticos, que no son ms que procedimientos yfunciones. En nuestra terminologa, procedimiento es una sucesin de pasos de cmputo que tie-ne un nombre y que puede invocarse (con parmetros); una funcin es un procedimiento que ade-ms devuelve un valor al invocador. En Java, un procedimiento que no devuelve valor alguno sedeclara con tipo devuelto vvooiidd; C y C son similares en este sentido. El trmino esttico esterminologa tcnica de Java, y significa que el mtodo se puede aplicar a cualquier objeto u ob-jetos de los tipos apropiados (el tipo de un objeto es su clase), en congruencia con la rbrica detipo del mtodo (conocida como su prototipo). Un mtodo esttico no est atado a un objeto es-

    6 Captulo 1 Anlisis de algoritmos y problemas: principios y ejemplos

    1 Tambin sale de sswwiittcchh, pero este ttrrmmiinnoo no se utiliza en el libro.

    www.FreeLibros.me

  • pecfico. Los mtodos estticos se comportan como las funciones y procedimientos ordinarios delenguajes de programacin como C, Pascal, etc. Sin embargo, es preciso anteponer a su nombrela clase en la que se definieron, como en Lista.primero(x) para aplicar al parmetro x elmtodo primero que se defini en la clase Lista.

    En Java, los campos de ejemplar de un objeto son privados por omisin, lo que implica queslo los mtodos (funciones y procedimientos) definidos dentro de la misma clase pueden teneracceso a ellos. Esto es congruente con el tema del diseo de tipos de datos abstractos (TDA) deque slo debe accederse a los objetos a travs de las operaciones definidas para el TDA. El cdi-go que implementa estas operaciones de TDA (o mtodos estticos, o funciones y procedimien-tos) existe dentro de la clase y tiene conocimiento de los campos de ejemplar privados y de sustipos. Los mtodos tambin son privados por omisin, pero casi siempre se especifican como p-blicos para que mtodos definidos en otras clases puedan invocarlos. No obstante, los mtodosde bajo nivel que slo deben ser invocados por otros mtodos de la misma clase bien podranser privados.

    Los clientes del TDA (procedimientos y funciones que invocan el TDA) se implementan fue-ra de la clase en la que vive el TDA, de manera que slo tienen acceso a las partes pblicas dela clase de TDA. El mantenimiento de datos privados se denomina encapsulamiento, u oculta-miento de informacin.

    Los campos de ejemplar de un objeto conservan los valores que se les asignan mientras exis-te el objeto, o hasta que una asignacin posterior los sobreescribe. Aqu es evidente la ventaja dehacer que sean privados respecto a la clase en la que se definen. Cualquier parte del programageneral podra asignar un valor arbitrario a un campo de ejemplar pblico. En cambio, slo es po-sible asignar un valor a un campo de ejemplar privado utilizando un mtodo de la clase de TDAdiseado para ese fin. Dicho mtodo podra efectuar otros clculos y pruebas para cerciorarse deque el valor asignado a un campo de ejemplar sea congruente con las especificaciones del TDA,y con los valores almacenados en otros campos de ejemplar del mismo objeto.

    Se crea un objeto nuevo con la frase nneeww nombreClase(); por ejemplo:

    Fecha fechaPago nneeww Fecha();

    Este enunciado hace que Java invoque un constructor por omisin para la clase Fecha. El cons-tructor reserva espacio para un objeto (o ejemplar) nuevo de la clase y devuelve una referencia(probablemente una direccin) para acceder a ese objeto. Los campos de ejemplar de ese nuevoobjeto podran estar inicializados (es decir, tener valores iniciales) o no.

    Detalle de Java: El programador podra escribir funciones constructoras adicionales para unaclase, cuyos cuerpos podran inicializar diversos campos de ejemplar y realizar otros clculos. Enaras de la independencia respecto al lenguaje, no usaremos aqu tales constructores, por lo queomitiremos los pormenores.

    Los arreglos se declaran de forma un poco diferente en Java que en C y C, y sus propie-dades tambin presentan algunas diferencias. La sintaxis de Java para declarar un arreglo de en-teros (o, en trminos ms precisos, para declarar una variable cuyo tipo es arreglo de enteros)es iinntt[] x, mientras que en C se podra usar iinntt x[]. Este enunciado no inicializa a x; esose hace con

    x nneeww iinntt[cuantos];

    1.2 Java como lenguaje algortmico 7

    www.FreeLibros.me

  • donde cuantos es una constante o una variable cuyo valor denota la longitud deseada para elarreglo. Las declaraciones de arreglos de clases son similares. La declaracin y la inicializacinpueden, y por lo regular deberan, combinarse en un solo enunciado:

    iinntt[] x nneeww iinntt[cuantos];Fecha[] fechas nneeww FFeecchhaa[cuantas];

    Aunque estos enunciados inicializan a x y fechas en el sentido de que reservan espacio para losarreglos, slo asignan a los elementos valores por omisin, que con toda seguridad no sern ti-les. Por ello, es preciso asignar valores a los elementos individuales fechas[0], fechas[1], . . . ,(posiblemente utilizando el operador nneeww) antes de usarlos. La sintaxis, fuera de la clase Fecha, es

    fechas[0] nneeww Fecha();fechas[0].mes 1;fechas[0].dia 1;fechas[0].ao nneeww Fecha.Ao();fechas[0].ao.numero 2000;fechas[0].ao.esBisiesto ttrruuee;

    Observe que los nombres de campo van despus del ndice que selecciona un elemento especficodel arreglo. Observe tambin que el nombre de la clase interior, Ao, est calificado por el nom-bre de la clase exterior, Fecha, en el segundo enunciado nneeww, porque el enunciado est afuera dela clase Fecha. Como ya se dijo, quienes programan en Java pueden escribir constructores quereciban parmetros para efectuar este tipo de inicializacin de objetos recin construidos, pero enel presente texto no usaremos tales constructores en aras de la independencia respecto al lenguaje.

    Una vez inicializado el arreglo x con un enunciado nneeww, como se mostr unos prrafos atrs,ya no se podr modificar la longitud del arreglo al que hace referencia. Java ofrece un mecanis-mo para consultar esa longitud, que es x.length. Es decir, el campo de ejemplar length seanexa automticamente al objeto de arreglo como parte de la operacin nneeww, y se puede acce-der a l a travs de x, como se muestra, en tanto x se refiera a ese objeto.

    Los ndices (o subndices) vlidos para elementos de este arreglo son del 0 a (x.length 1). Java detendr el programa (en trminos tcnicos, lanzar una excepcin) si ste intenta acce-der a un elemento cuyo ndice est fuera de ese intervalo. Con frecuencia queremos usar ndicesdentro del intervalo de 1 a n, as que inicializaremos los arreglos con nneeww iinntt[n+1] en esoscasos.

    Java permite sobrecargar y suplantar mtodos. Decimos que un mtodo est sobrecargadosi tiene dos o ms definiciones con distintos tipos de parmetros, pero su tipo devuelto es el mis-mo. Muchos operadores aritmticos estn sobrecargados. Suplantar implica que en la jerarqua declases hay varias definiciones de un mismo mtodo, con los mismos tipos de parmetros, y queJava aplica la definicin ms cercana. (Una vez ms, por compatibilidad con otros lenguajes yporque esta capacidad no es fundamental para entender los algoritmos, evitaremos estos recursosy remitiremos al lector interesado a libros que tratan el lenguaje Java.) Se pueden usar los mismosnombres de mtodos en diferentes clases, pero esto no es realmente sobrecargar porque el nom-bre de clase (o de objeto) aparece como calificador cuando los nombres se usan fuera de la claseen la que se definen. Esto se aclarar con ejemplos posteriores.

    Para los lectores que conocen C, vale la pena sealar que Java no permite al programa-dor definir significados nuevos para los operadores. En este texto usamos tales operadores en

    8 Captulo 1 Anlisis de algoritmos y problemas: principios y ejemplos

    www.FreeLibros.me

  • pseudocdigo para hacerlo ms legible (por ejemplo, x y, donde x y y pertenecen a alguna cla-se no numrica, como SSttrriinngg). No obstante, si usted define una clase y escribe un programa realen Java que la usa, deber escribir funciones con nombre (por ejemplo menor()) e invocarla pa-ra comparar objetos de esa clase.

    1.2.2 Clases organizadoras

    Acuamos el trmino clase organizadora, que no es un trmino estndar de Java, para describiruna clase muy sencilla que simplemente agrupa varios campos de ejemplar. Esta construccin de-sempea un papel hasta cierto punto anlogo al de struct en C y record en Pascal o Modula; exis-ten construcciones anlogas en Lisp, ML, y casi todos los dems lenguajes de programacin. Lasclases organizadoras tienen un propsito diametralmente opuesto al de los tipos de datos abstrac-tos; se limitan a organizar una porcin de almacenamiento, pero no limitan el acceso a l ni pro-porcionan operaciones a la medida para l. En muchos casos es conveniente definir una claseorganizadora dentro de alguna otra clase; en este caso, la clase organizadora sera una clase inter-na en la terminologa de Java.

    Una clase organizadora slo tiene un mtodo, llamado copy. Puesto que las variables son re-ferencias a objetos en Java, el enunciado de asignacin slo copia la referencia, no los campos delobjeto, como se ilustr en el ejemplo 1.1 con fechaPago y fechaAviso. Si estas variables sedeclaran en una clase organizadora llamada Fecha, podramos usar los enunciados

    fechaAviso Fecha.copy(fechaPago);fechaAviso.dia fechaPago.dia 7;

    para copiar los campos de fechaPago en un objeto nuevo al que hace referencia fechaAviso,y luego modificar nicamente el campo dia de fechaAviso.

    Definicin 1.1 La funcin copy de clases organizadorasLa regla general para la forma en que la funcin (o mtodo) copy de una clase organizadora de-be asignar valores a los campos de ejemplar del nuevo objeto (que se ilustrar suponiendo que elobjeto f se est copiando en un objeto nuevo f2) es la siguiente:1. Si el campo de ejemplar (digamos ao) est en otra clase organizadora, entonces se invoca

    el mtodo copy de esa clase, como en f2.ao = Ao.copy(f.ao).2. Si el campo de ejemplar (digamos dia) no est en una clase organizadora, se usar una asig-

    nacin simple, como en f2.dia = f.dia.

    El ejemplo completo se muestra en la figura 1.2. El programador debe cuidar que no haya ciclos en las definiciones de las clases organizado-

    ras, pues si los hubiera es posible que copy nunca termine. Desde luego, tambin se puede crearun objeto nuevo en una clase organizadora de la forma acostumbrada:

    Fecha algunaFecha nneeww Fecha();

    Detalle de Java: Java cuenta con un recurso, basado en el mtodo cclloonnee, para crear una co-pia de un solo nivel de un objeto sin tener que escribir todos y cada uno de los enunciados de asig-nacin, pero dicho recurso no maneja automticamente estructuras anidadas como Fecha; sernecesario escribir algo de cdigo en esos casos. En el apndice A se da el cdigo para una fun-cin copiar1nivel genrica.

    1.2 Java como lenguaje algortmico 9

    www.FreeLibros.me

  • ccllaassss Fecha

    {

    ppuubblliicc Ao ao;

    ppuubblliicc iinntt mes;

    ppuubblliicc iinntt dia;

    ppuubblliicc ssttaattiicc ccllaassss Ao

    {

    ppuubblliicc iinntt numero;

    ppuubblliicc bboooolleeaann esBisiesto;

    ppuubblliicc ssttaattiicc Ao copy(Ao a)

    { Ao a2 nneeww Ao();

    a2.numero a.numero;

    a2.esBisiesto a.esBisiesto;

    rreettuurrnn a2;

    }

    }

    ppuubblliicc ssttaattiicc Fecha copy(Fecha f)

    { Fecha f2 nneeww Fecha();

    f2.ao Ao.copy(f.ao); // clase organizadora

    f2.mes f.mes;

    f2.dia f.dia;

    rreettuurrnn f2;

    }

    ppuubblliicc ssttaattiicc iinntt sigloPorOmision;

    }

    Figura 1.2 Una clase organizadora Fecha con una clase principal organizadora de Ao

    Una clase organizadora slo contiene campos de ejemplar ppuubblliicc. Si tambin aparece la pa-labra clave ssttaattiicc en la declaracin del campo, el campo no estar asociado a ningn objeto es-pecfico, y ser bsicamente una variable global.

    Ejemplo 1.2 Clases organizadoras tpicasEn la figura 1.2 se adornan las clases del ejemplo 1.1 con funciones copy, para que sean clasesorganizadoras. Como se ve, la definicin de copy es mecnica, aunque tediosa. Sus detalles seomitirn en ejemplos futuros. Para que el ejemplo est completo, incluimos sigloPorOmisioncomo ejemplo de variable global, aunque la mayor parte de las clases organizadoras no conten-dr variables globales.

    10 Captulo 1 Anlisis de algoritmos y problemas: principios y ejemplos

    www.FreeLibros.me

  • En sntesis, inventamos el trmino clase organizadora para denotar una clase que simplemen-te agrupa algunos campos de ejemplar y define una funcin para crear copias de los mismos.

    1.2.3 Convenciones de pseudocdigo basado en Java

    La mayor parte de los algoritmos de este libro utilizan un pseudocdigo basado en Java, en lugarde Java estricto, para facilitar la comprensin. Se aplican las convenciones siguientes (excepto enel apndice A, especfico para Java).

    1. Se omiten los delimitadores de bloques ({ y }). Los lmites de los bloques se indicancon sangras.

    2. Se omite la palabra clave ssttaattiicc en las declaraciones de mtodos (funciones y procedi-mientos). Todos los mtodos declarados en el texto son ssttaattiicc. (De vez en cuando apare-cen mtodos no estticos que vienen incluidos en Java; en particular, se usa c.length()para obtener la longitud de una cadena.) La palabra clave ssttaattiicc s aparece cuando se ne-cesita para definir campos de ejemplar y clases internas.

    3. Se omiten los calificadores de nombre de clase en las invocaciones de mtodos (funciones yprocedimientos). Por ejemplo, se podra escribir x = cons(z, x) cuando la sintaxis deJava exige x = ListaInt.cons(z, x). (La clase ListaInt se describe en la seccin2.3.2.) Los calificadores de nombre de clase son obligatorios en Java siempre que se invo-can mtodos estticos desde afuera de la clase en la que se definen.

    4. Se omiten las palabras clave que sirven para controlar la visibilidad: ppuubblliicc, pprriivvaattee ypprrootteecctteedd. Si se colocan todos los archivos relacionados con un programa Java dado en elmismo directorio se hace innecesario ocuparse de cuestiones de visibilidad.

    5. Por lo regular se escriben los operadores de relacin matemticos , y , en lugarde sus versiones de teclado. Se usan operadores de relacin con tipos para los cuales el sig-nificado es obvio, como SSttrriinngg, aunque esto no lo permitira la sintaxis de Java.

    6. Las palabras clave, que son palabras reservadas o bien componentes estndar de Java, apa-recen en este tipo de letra: iinntt, SSttrriinngg. Los comentarios estn en este tipo deletra. Los enunciados de cdigo y los nombres de variables de progra-ma aparecen en este tipo de letra. En cambio, los enunciados de pseudocdigose escriben empleando el tipo de letra normal del texto, como esta oracin.

    Ocasionalmente nos apartaremos de este esquema para destacar algn aspecto especfico del len-guaje Java.

    1.3 Antecedentes matemticos

    Utilizamos diversos conceptos, herramientas y tcnicas matemticas en este libro. En su mayorparte, el lector ya las conocer, aunque unas cuantas podran serle nuevas. En esta seccin se re-nen para poder consultarlas fcilmente, y hacer un repaso somero. Los conceptos de las demos-traciones se cubren ms a fondo en el captulo 3.

    1.3.1 Conjuntos, tuplas y relacionesEn esta seccin presentamos definiciones informales y unas cuantas propiedades elementales delos conjuntos y conceptos afines. Un conjunto es una coleccin de elementos distintos que quere-mos tratar como un solo objeto. Por lo regular los objetos son del mismo tipo y tienen en co-

    1.3 Antecedentes matemticos 11

    www.FreeLibros.me

  • mn algunas otras propiedades que hacen que sea til pensar en ellos como un solo objeto. La no-tacin e S se lee el elemento e es un miembro del conjunto S o, ms brevemente, e est enS. Cabe sealar que en este caso e y S son de diferente tipo. Por ejemplo, si e es un entero, S esun conjunto de enteros, que no es lo mismo que ser un entero.

    Un conjunto dado se define enumerando o describiendo sus elementos entre un par de llaves.He aqu algunos ejemplos de esta notacin:

    S1 {a, b, c}, S2 {x | x es una potencia entera de 2}, S3 {1, . . . , n}.

    La expresin para S2 se lee el conjunto de todos los elementos x tales que x es una potencia ente-ra de 2. El smbolo | se lee tales que en este contexto. A veces se usa un signo de dos puntos(:) en vez de |. Se pueden usar puntos suspensivos . . . cuando es obvio cules son los ele-mentos implcitos.

    Si todos los elementos de un conjunto S1 tambin estn en otro conjunto S2, decimos que S1es un subconjunto de S2 y que S2 es un superconjunto de S1. Las notaciones son S1 S2 y S2 S1.Para denotar que S1 es un subconjunto de S2 y no es igual a S2, escribimos S1 S2 o S2 S1. Esimportante no confundir con . El primero significa es un elemento de y el segundo im-plica es un conjunto de elementos contenido en. El conjunto vaco, denotado por , no tieneelementos, as que es un subconjunto de todos los conjuntos.

    Un conjunto no tiene un orden inherente. As pues, en los ejemplos anteriores, podramos ha-ber definido a S1 como {b, c, a} y S3 podra haberse definido como {i | 1 i n} si se entiendeque i es un entero.

    Un grupo de elementos que est en un orden especfico se denomina sucesin. Adems delorden, otra diferencia importante entre los conjuntos y las sucesiones es que las sucesiones pue-den tener elementos repetidos. Las sucesiones se denotan enumerando sus elementos en orden, en-cerrados en parntesis. As, (a, b, c), (b, c, a) y (a, b, c, a) son sucesiones distintas. Tambin sepueden usar puntos suspensivos en las sucesiones, como en (1, . . . , n).

    Un conjunto S es finito si hay un entero n tal que los elementos de S se puedan colocar en unacorrespondencia uno a uno con {1, . . . , n}; en este caso escribimos |S| n. En general, |S| deno-ta el nmero de elementos que hay en el conjunto S, y tambin se denomina cardinalidad de S.Una sucesin es finita si existe un entero n tal que los elementos de la sucesin se puedan colocaren una correspondencia uno a uno con (1, . . . , n). Un conjunto o sucesin que no es finito es in-finito. Si todos los elementos de una sucesin finita son distintos, decimos que esa sucesin es unapermutacin del conjunto finito que consta de los mismos elementos. Esto destaca una vez msla diferencia entre un conjunto y una sucesin. Un conjunto de n elementos tiene n! permutacio-nes distintas (vase la seccin 1.3.2).

    Cuntos subconjuntos distintos tiene un conjunto finito de n elementos? Tenga presente queel conjunto vaco y el conjunto total son subconjuntos. Para construir cualquier subconjunto tene-mos n decisiones binarias: incluir o excluir cada elemento del conjunto dado. Hay 2n formas dis-tintas de tomar esas decisiones, as que hay 2n subconjuntos.

    Cuntos subconjuntos distintos con cardinalidad k tiene un conjunto finito de n elementos?Existe una notacin especial para esta cantidad: (nk), que se lee n selecciones de k, o de formams explcita, nmero de combinaciones de n cosas tomadas k a la vez. Tambin se usa la no-tacin C(n, k), y estas cantidades se denominan coeficientes binomiales.

    Si queremos obtener una expresin para (nk) o C(n, k), nos concentramos en las opciones enel subconjunto de k en lugar de las opciones en el conjunto original, digamos S. Podemos obtener

    12 Captulo 1 Anlisis de algoritmos y problemas: principios y ejemplos

    www.FreeLibros.me

  • una sucesin de k elementos distintos de S como sigue: como primer elemento de la sucesin sepuede escoger cualquier elemento de S, as que hay n opciones. Luego, como segundo elementode la sucesin se puede escoger cualquier elemento restante de S, as que hay (n 1) opciones eneste caso, y as hasta escoger k elementos. (Si k n es imposible escoger k opciones distintas, asque el resultado es 0.) Por tanto, hay n(n 1) (n k 1) sucesiones distintas de k elemen-tos distintos. Pero vimos que un conjunto especfico de k elementos se puede representar como k!sucesiones. Entonces, el nmero de subconjuntos distintos de k, tomados de un conjunto de n, es

    C(n, k) nk para n k 0. (1.1)Dado que todo subconjunto debe tener algn tamao, de 0 a n, llegamos a la identidad

    n

    k0 2n. (1.2)

    Tuplas y el producto cruz

    Una tupla es una sucesin finita cuyos elementos a menudo no tienen el mismo tipo. Por ejemplo,en un plano bidimensional, un punto se puede representar con el par ordenado (x, y). Si el planoes geomtrico, tanto x como y son longitud. Pero si se trata de una grfica de tiempo de ejecu-cin vs. tamao del problema, y podra ser segundos y x podra ser un entero. Las tuplas cortastienen nombres especiales: par, triple, cudruple, quntuple, etc. En el contexto de tupla, se so-breentiende que estn ordenadas; en otros contextos, par podra significar conjunto de dos enlugar de sucesin de dos, etc. Una k-tupla es una tupla de k elementos.

    El producto cruz de dos conjuntos, digamos S y T, es el conjunto de pares que se pueden for-mar escogiendo un elemento de S como primer elemento de la tupla y un elemento de T como se-gundo. En notacin matemtica, tenemos

    S T {(x, y) | x S, y T} (1.3)

    Por tanto, |S T| |S| |T|. Suele suceder que S y T son el mismo conjunto, pero esto no es ne-cesario. Podemos definir el producto cruz iterado para generar tuplas ms largas. Por ejemplo,S T U es el conjunto de todas las triples que se forman tomando un elemento de S, seguidode un elemento de T, seguido de un elemento de U.

    Relaciones y funciones

    Una relacin no es ms que algn subconjunto de un producto cruz (posiblemente iterado). Di-cho subconjunto podra ser finito o infinito, y puede estar vaco o ser todo el producto cruz. El ca-so ms importante es una relacin binaria, que no es sino algn subconjunto de un producto cruzsimple. Todos conocemos muchos ejemplos de relaciones binarias, como menor que para losreales. Si R denota el conjunto de todos los reales, la relacin menor que se puede definir for-malmente como {(x, y) | x R, y R, x y}. Como vemos, ste es un subconjunto de R R.Como ejemplo adicional, si P es el conjunto de todas las personas, entonces P P es el conjuntode todos los pares de personas. Podemos definir progenitor de como (x, y) tal que x es un pro-genitor de y, antepasado de como (x, y) tal que x es un antepasado de y, y stos son subconjun-tos de P P.

    n

    k

    n!

    (n k)!k!

    n(n 1) (n k 1)

    k!

    1.3 Antecedentes matemticos 13

    www.FreeLibros.me

  • Aunque muchas relaciones son pares en los que ambos elementos son del mismo tipo, la de-finicin no lo exige. Un conjunto de pares {(x, y) | x S, y T} es una relacin binaria. Volvien-do a nuestro ejemplo anterior de una tupla en una grfica, una relacin semejante podra represen-tar la relacin entre el tamao del problema y el tiempo de ejecucin de algn programa. Comoejemplo distinto, F podra ser el conjunto de todas las personas de sexo femenino, y entonces xes madre de y sera un subconjunto de F P.

    Aunque las relaciones pueden ser subconjuntos arbitrarios, hay ciertas propiedades interesan-tes que una relacin R podra tener si ambos elementos se toman del mismo conjunto subyacen-te, digamos S. Adems, en estos casos, dado que muchas relaciones estndar tienen una notacininfija (como x y), es comn usar la notacin xRy para denotar (x, y) R.

    Definicin 1.2 Propiedades importantes de las relacionesSea R S S. Tome nota de los significados de los trminos siguientes:

    reflexivo para toda x S, (x, x) R.simtrico siempre que (x, y) R, (y, x) tambin est en R.antisimtrico siempre que (x, y) R, (y, x) no est en R.transitivo siempre que (x, y) R y (y, z) R, entonces (x, z) R.

    Una relacin que es reflexiva, simtrica y transitiva se denomina relacin de equivalencia, amenudo denotada con .

    Cabe sealar que menor que es transitiva y antisimtrica, en tanto que menor o igual quees transitiva y reflexiva, pero no antisimtrica (porque x x).

    Las relaciones de equivalencia son importantes en muchos problemas porque semejante rela-cin divide el conjunto subyacente S en particiones; es decir, en una coleccin de subconjuntosdisjuntos (llamados clases de equivalencia) S1, S2, . . . , tales que todos los elementos de S1 sonequivalentes entre s, todos los elementos de S2 son equivalentes entre s, etc. Por ejemplo, si Ses algn conjunto de enteros no negativos y definimos R como {(x, y) | x S, y S, (x y) esdivisible entre 3}, entonces R es una relacin de equivalencia en S. Es evidente que (x x) es di-visible entre 3. Si (x y) es divisible entre 3, tambin lo es (y x). Por ltimo, si (x y) y (y z) son divisibles entre 3, tambin lo es (x z). As pues, R satisface las propiedades que definenuna relacin de equivalencia. Cmo divide R a S en particiones? Hay tres grupos, cada uno conun residuo no negativo distinto al dividir entre 3. Todos los elementos que tienen el mismo resi-duo son equivalentes entre s.

    Puesto que una relacin binaria es un conjunto cuyos elementos son pares ordenados, a me-nudo conviene pensar en la relacin como una tabla de dos columnas en la que cada fila contieneuna tupla. Una funcin es simplemente una relacin en la que ningn elemento de la primera co-lumna se repite dentro de la relacin.

    Muchos problemas en los que intervienen relaciones binarias se pueden proyectar comoproblemas en grafos. Los problemas de grafos constituyen una clase abundante de problemas al-gortmicos difciles. Por ejemplo, en un proyecto grande que incluye muchas tareas interdepen-dientes, podramos tener muchos hechos de la forma la tarea x depende de que se haya llevado acabo la tarea y. Si un conjunto fijo de personas va a realizar las tareas, cmo pueden programar-se de modo que el tiempo transcurrido sea mnimo? Estudiaremos muchos problemas como steen captulos posteriores.

    14 Captulo 1 Anlisis de algoritmos y problemas: principios y ejemplos

    www.FreeLibros.me

  • 1.3.2 Herramientas de lgebra y clculo

    En esta seccin presentamos algunas definiciones y propiedades elementales de logaritmos, pro-babilidad, permutaciones, frmulas de sumatoria y sucesiones y series matemticas comunes. (Eneste contexto, una serie es la sumatoria de una sucesin.) Introduciremos herramientas matemti-cas adicionales para ecuaciones de recurrencia en el captulo 3. El lector puede encontrar frmu-las que no se deducen aqu consultando las fuentes enumeradas en las Notas y Referencias al finaldel captulo.

    Funciones piso y techo

    Para cualquier nmero real x, x (lase piso de x) es el entero ms grande que es menor o igualque x. x (lase techo de x) es el entero ms pequeo que es mayor o igual que x. Por ejemplo,2.9 2 y 6.1 7.Logaritmos

    La funcin logaritmo, por lo regular base 2, es la herramienta matemtica que ms se usa en estelibro. Aunque los logaritmos no son muy comunes en las ciencias naturales, son muy comunes enlas ciencias de la computacin.

    Definicin 1.3 Funcin logaritmo y base de logaritmoPara b 1 y x 0, logb x (lase logaritmo base b de x) es aquel nmero real L tal que bL x;es decir, logb x es la potencia a la que debemos elevar b para obtener x.

    Las siguientes propiedades de los logaritmos se deducen fcilmente de la definicin.

    Lema 1.1 Sean x y y nmeros reales positivos arbitrarios, sea a cualquier nmero real, y seanb 1 y c 1 nmeros reales.

    1. logb es una funcin estrictamente creciente, es decir, si x y, entonces logb x logb y.2. logb es una funcin uno a uno, es decir, si logb x logb y, entonces x y.3. logb 1 0.4. logb ba a.5. logb (xy) logb x logb y.6. logb (xa) a logb x.7. xlogb y ylogb x.8. Para convertir de una base a otra: log

    cx (logb x)/(logb c).

    Puesto que el logaritmo base 2 es el que ms a menudo se usa en el campo de la complejidadcomputacional, existe una notacin especial para denotarlo: lg; es decir, lg x log2 x. El loga-ritmo natural (logaritmo base e) se denota con ln, es decir, ln x log

    ex. Cuando se usa log(x)

    sin indicar la base, implica que el enunciado se cumple para cualquier base.A veces se aplica la funcin logaritmo a s misma. La notacin lg lg(x) significa lg(lg(x)). La

    notacin lg(p)(x) implica p aplicaciones, de modo que lg(2)(x) es lo mismo que lg lg(x). Observeque lg(3)(65536) 2, lo cual es muy diferente de (lg(65536))3 4096.

    1.3 Antecedentes matemticos 15

    www.FreeLibros.me

  • En casi todo el texto se obtienen logaritmos de enteros, no de nmeros positivos arbitrarios,y a menudo necesitamos un valor entero cercano al logaritmo ms que su valor exacto. Sea n un ente-ro positivo. Si n es una potencia de 2, digamos n 2k, para algn entero k, entonces lg n k. Sin no es una potencia de 2, entonces hay un entero k tal que 2k n 2k1. En este caso, lg n ky lg n k 1. Las expresiones lg n y lg n se usan con frecuencia. Le recomendamos veri-ficar estas desigualdades:

    n 2lg n 2n.

    n

    2 2lg n 2n.

    Por ltimo, he aqu algunos otros hechos tiles: lg e 1.443 y lg 10 3.32. La derivada deln(x) es 1/x. Utilizando la parte 8 del lema 1.1, la derivada de lg(x) es lg(e)/x.

    Permutaciones

    Una permutacin de n objetos distintos es una sucesin que contiene una vez cada uno de los ob-jetos. Sea S {s1, s2, . . . , sn}. Observe que los elementos de S estn ordenados segn sus ndices;es decir, s1 es el primer elemento, s2 es el segundo, etc. Una permutacin de S es una funcin unoa uno del conjunto {1, 2, . . . , n} sobre s mismo. Podemos ver como un reacomodo de S pa-sando el i-simo elemento, si, a la (i)-sima posicin. Podemos describir con slo enumerarsus valores, es decir, ( (1), (2), . . . , (n)). Por ejemplo, para n 5, (4, 3, 1, 5, 2) reaco-moda los elementos de S como sigue: s3, s5, s2, s1, s4.

    El nmero de permutaciones de n objetos distintos es n!. Para ver esto, observe que el primerelemento se puede pasar a cualquiera de las n posiciones; entonces esa posicin queda ocupaday el segundo elemento se puede pasar a cualquiera de las n 1 posiciones restantes; el tercer ele-mento se puede pasar a cualquiera de las n 2 posiciones restantes, y as. Por tanto, el nmerototal de posibles reacomodos es n (n 1) (n 2) . . . 2 1 n!.

    Probabilidad

    Supngase que, en una situacin dada, un suceso, o experimento, puede tener uno cualquiera dek desenlaces, s1, s2, . . . , sk. Estos desenlaces se denominan sucesos elementales. El conjunto de to-dos los sucesos elementales se llama universo y se denota con U. A cada desenlace si asociamosun nmero real, Pr(si), llamado probabilidad de si, tal que

    0 Pr(si) 1 para 1 i k;Pr(s1) Pr(s2) Pr(sk) 1.

    Es natural interpretar Pr(si) como el cociente del nmero de veces que cabe esperar que si ocurray el nmero total de veces que se repite el experimento. (Cabe sealar, empero, que la definicinno exige que las probabilidades tengan alguna correspondencia con el mundo real.) Decimos quelos sucesos s1, . . . , sk son mutuamente excluyentes porque no puede ocurrir ms de uno de ellos.

    Los ejemplos que con mayor frecuencia se usan para ilustrar el significado de la probabili-dad son el lanzamiento de monedas o dados, y diversos sucesos con naipes. De hecho, se cree queel estudio de la teora de la probabilidad tuvo su origen en el estudio que Blaise Pascal, un mate-mtico francs, hizo de los juegos de azar. Si el experimento es el lanzamiento de una moneda,

    16 Captulo 1 Anlisis de algoritmos y problemas: principios y ejemplos

    www.FreeLibros.me

  • sta puede caer con la cara hacia arriba o con el sello hacia arriba. Sea s1 cara y s2 se-llo, y asignemos Pr(s1) 1/2 y Pr(s2) 1/2. (Si alguien objeta porque la moneda podra caerde canto, podramos definir s3 canto y asignar Pr(s3) 0. Sin embargo, con un nmero finitode sucesos, podemos hacer caso omiso de un suceso con probabilidad cero, por lo que normal-mente no se definen tales sucesos elementales.) Si se lanza un dado de seis caras, hay seis posiblesdesenlaces: para 1 i 6, si el dado cae con la cara nmero i hacia arriba, y Pr(si) 1/6.En general, si hay k posibles desenlaces y todos se consideran igualmente verosmiles, asignamosPr(si) 1/k para cada i. Con frecuencia no hay razn para suponer que todos los desenlaces tie-nen la misma probabilidad; tal supuesto suele usarse en ejemplos o en casos en los que no hay da-tos que apoyen un supuesto mejor.

    Si en el experimento intervienen varios objetos, un suceso elemental deber tomar en cuentalo que se observa acerca de todos ellos. Por ejemplo, si se lanzan dos dados, A y B, el suceso Acae con el lado 1 hacia arriba no es un suceso elemental porque hay varios desenlaces asociadosa B. En este caso, los sucesos elementales seran sij el dado A cae con el lado i hacia arriba yel dado B cae con el lado j hacia arriba, para 1 i, j 6. Abreviaremos esta descripcin a Acae i y B cae j de aqu en adelante. Hay 36 sucesos elementales, y se acostumbra asignar una pro-babilidad de 1/36 a cada uno.

    A menudo es necesario considerar la probabilidad de que ocurra cualquiera de varios desen-laces especificados o de que el desenlace tenga una propiedad dada. Sea S un subconjunto de lossucesos elementales {s1, . . . , sk}. Entonces decimos que S es un suceso, y Pr(S) Si S Pr(si).Por ejemplo, supngase que se lanza un dado, y definimos el suceso S como el nmero que salees divisible entre 3. Entonces, la probabilidad de S es Pr(S) Pr({s3, s6}) Pr(s3) Pr(s6) 1/3. Los sucesos elementales tambin son sucesos.

    Dos sucesos especiales son el suceso seguro, U {s1, . . . , sk}, cuya probabilidad es 1, y elsuceso imposible, , cuya probabilidad es 0. (Recuerde que denota el conjunto vaco.) Tam-bin, para cualquier suceso S, existe el suceso complemento no S, que consiste en todos los su-cesos elementales que no estn en S, es decir, U S. Desde luego, Pr(no S) 1 Pr(S).

    Los sucesos se pueden definir en trminos de otros sucesos utilizando los conectores lgicosy y o. El suceso S1 y S2 es (S1 S2), la interseccin de S1 y S2. El suceso S1 o S2 es (S1 S2), la unin de S1 y S2.

    A menudo necesitamos analizar probabilidades basadas en cierto grado de conocimiento par-cial acerca del experimento. stas se denominan probabilidades condicionales.

    Definicin 1.4 Probabilidad condicionalLa probabilidad condicional de un suceso S dado un suceso T se define como

    1

    S i S TPr(si)

    Pr(ST) PrP(Sr(

    yT)

    T)

    1

    S j TPr(sj), (1.4)

    donde si y sj cubren intervalos de sucesos elementales.

    Ejemplo 1.3 Probabilidad condicional con dos dadosSupngase que en el experimento se lanzan dos dados, A y B. Definamos tres sucesos:

    1.3 Antecedentes matemticos 17

    www.FreeLibros.me

  • S1: A cae 1,S2: B cae 6,S3: La suma de los nmeros que salen es 4 o menos.

    Para tener una idea intuitiva del significado de la probabilidad condicional, consideremos elcaso sencillo en el que todos los sucesos elementales tienen la misma probabilidad. En nuestroejemplo, los 36 sucesos elementales son de la forma A cae i y B cae j, para 1 i, j 6. Enton-ces la probabilidad condicional Pr(S1 | S3) se puede interpretar como la respuesta a la pregunta,De todos los sucesos elementales de S3, qu fraccin de esos sucesos elementales est tambinen S1?

    Enumeremos todos los sucesos elementales de S3:

    A cae 1 y B cae 1, A cae 2 y B cae 1,A cae 1 y B cae 2, A cae 2 y B cae 2,A cae 1 y B cae 3, A cae 3 y B cae 1.

    El suceso S1 consiste en 6 sucesos elementales en los que A cae 1 y B cae cada uno de susseis posibles valores. Tres de los sucesos elementales de S3 estn tambin en S1, as que la res-puesta a la pregunta es 3/6 1/2. Mediante un clculo exacto con la frmula de la ecuacin (1.4),la probabilidad de S1 dado S3 es

    Pr(S1 | S3) 12.

    Observe que la probabilidad condicional de S2 dado S3 es 0; es decir, Pr(S2 | S3) 0.

    En general, el procedimiento para calcular probabilidades condicionales dado algn sucesoespecfico S consiste en eliminar todos los sucesos elementales que no estn en S y luego ajustarla escala de las probabilidades de todos los sucesos elementales restantes utilizando el mismo fac-tor, de modo que la sumatoria de las nuevas probabilidades sea 1. El factor requerido es 1/Pr(S).

    La probabilidad condicional de un suceso puede ser mayor o menor que la probabilidadincondicional de ese suceso. En el ejemplo 1.3 la probabilidad incondicional de S1 es 1/6 y la pro-babilidad condicional de S1 dado S3 es 1/2. Por otra parte, la probabilidad incondicional de queel nmero en que A cae sea divisible entre 3 es de 1/3; pero en el ejemplo 1.3 vemos que la pro-babilidad condicional de que el nmero en que A cae sea divisible entre 3 dado S3 es 1/6.

    Definicin 1.5 Independencia estocsticaDados dos sucesos S y T, si

    Pr(S y T) Pr(S)Pr(T)

    entonces S y T son estocsticamente independientes, o simplemente independientes.

    Si S es estocsticamente independiente de T, entonces Pr(S | T) Pr(S) (vase el ejercicio1.8). Es decir, saber que ha ocurrido el suceso T no influye en la probabilidad de que ocurra el su-

    336

    636

    18 Captulo 1 Anlisis de algoritmos y problemas: principios y ejemplos

    www.FreeLibros.me

  • ceso S, en un sentido o en otro. La propiedad de independencia es extremadamente til si existe,pues permite analizar por separado las probabilidades de que ocurran sucesos diferentes. Por otraparte, se cometen muchas equivocaciones en los anlisis cuando el supuesto de independencia esinjustificado.

    Ejemplo 1.4 Independencia estocsticaContinuando con los sucesos definidos en el ejemplo 1.3, los sucesos S1 y S2 son independientesporque la probabilidad de cada uno es de 1/6, y (S1 y S2) consiste en un suceso elemental, cuyaprobabilidad es 1/36. Observe tambin que Pr(S1 | S2) (1/36)/(6/36) 1/6 Pr(S1).

    De la explicacin del ejemplo 1.3, vemos que S1 y S3 no son independientes, y que S2 y S3 noson independientes.

    Las variables aleatorias y sus valores esperados son importantes en muchas situaciones que im-plican probabilidades. Una variable aleatoria es una variable con valor real que depende de qusuceso elemental ha ocurrido; dicho de otro modo, es una funcin definida para sucesos elemen-tales. Por ejemplo, si el nmero de operaciones efectuadas por un algoritmo depende de las entra-das, y cada posible entrada es un suceso elemental, entonces el nmero de operaciones ser unavariable aleatoria.

    Definicin 1.6 Expectativa y expectativa condicionalSea f(e) una variable aleatoria definida sobre un conjunto de sucesos elementales e U. La ex-pectativa de f, denotada por E(f), se define como

    E(f) 1

    eU

    f(e)Pr(e).

    Esto tambin se conoce como valor promedio de f. La expectativa condicional de f dado un su-ceso S, denotada por E(f | S), se define como

    E(f | S) 1

    eU

    f(e)Pr(e | S) 1

    eSf(e)Pr(e | S)

    puesto que la probabilidad condicional de cualquier suceso que no est en S es 0.

    Las expectativas suelen ser ms fciles de manipular que las variables aleatorias mismas, so-bre todo cuando intervienen mltiples variables aleatorias interrelacionadas, debido a ciertas le-yes importantes que presentamos a continuacin y que se demuestran fcilmente a partir de lasdefiniciones.

    Lema 1.2 (Leyes de expectativas) Para las variables aleatorias f(e) y g(e) definidas sobre unconjunto de sucesos elementales e U, y cualquier suceso S:

    E(f g) E(f) E(g),E(f) Pr(S)E(f | S) Pr(no S) E(f | no S).

    Ejemplo 1.5 Probabilidad condicional y ordenEn el captulo 4 consideraremos probabilidades en relacin con informacin de orden obtenidaefectuando comparaciones. Veamos un ejemplo de ese tipo en el que intervienen cuatro elemen-

    1.3 Antecedentes matemticos 19

    www.FreeLibros.me

  • tos A, B, C, D, que tienen valores numricos distintos, aunque inicialmente no sabemos nada acer-ca de sus valores ni de sus valores relativos. Escribiremos las letras en orden para denotar el su-ceso elemental de que se sea su orden relativo; es decir, CBDA es el suceso de que C B D A. Hay 24 posibles permutaciones:

    ABCD ACBD CABD ACDB CADB CDABABDC ADBC DABC ADCB DACB DCABBACD BCAD CBAD BCDA CBDA CDBABADC BDAC D