Академический Документы
Профессиональный Документы
Культура Документы
Al profesor
Hemos diseado este libro para que sea verstil y completo.
Debe ser til para una variedad de cursos, desde un curso de
licenciatura en estructuras de datos hasta un curso de
postgrado en algoritmos. Debido a que hemos
proporcionado mucho ms material del que se puede
proporcionar en un curso tpico de un trimestre, puedes
considerar este libro como un "buffet" o "smorgasbord" del
cual puedes escoger y elegir el material que mejor apoye el
curso que deseas ensear.
Es fcil organizar su curso en torno a los captulos que
necesite. Hemos hecho captulos relativamente
autosuficientes, de modo que no tiene que preocuparse por
una dependencia inesperada e innecesaria de un captulo a
otro. Cada captulo presenta el primer material ms fcil y el
material ms difcil ms tarde, con lmites de seccin
marcando los puntos de parada naturales. En un curso de
pregrado, usted podra usar solamente las secciones
anteriores de un captulo; en un curso de postgrado, usted
podra cubrir todo el captulo. Hemos incluido 957 ejercicios
y 158 problemas. Cada seccin termina con ejercicios y cada
captulo termina con problemas. Los ejercicios son
generalmente preguntas cortas que prueban el dominio
bsico del material. Algunos son simples ejercicios de
pensamiento de autocomprobacin, mientras que otros son
ms sustanciales y adecuados como tarea asignada. Los
problemas son casos de estudio ms elaborados que a
menudo introducen nuevo material; a menudo consisten en
varias preguntas que llevan al estudiante a travs de los
pasos requeridos para llegar a una solucin. Partiendo de
nuestra prctica en ediciones anteriores de este libro, hemos
puesto a disposicin del pblico soluciones a algunos, pero
de ninguna manera a todos los problemas y ejercicios.
Nuestro sitio web, http://mitpress.mit.edu/algorithms/,
enlaza con estas soluciones. Usted querr comprobar este
sitio para asegurarse de que no contiene la solucin a un
ejercicio o problema que usted planea asignar. Esperamos
que el conjunto de soluciones que publicamos crezca
lentamente con el tiempo, por lo que tendr que comprobarlo
cada vez que imparta el curso.
Hemos protagonizado (?) las secciones y ejercicios ms
adecuados para estudiantes de postgrado que para
estudiantes universitarios. Una seccin con estrellas no es
necesariamente ms difcil que una seccin sin estrellas,
pero puede requerir un entendimiento de matemticas ms
avanzadas. Del mismo modo, los ejercicios con estrellas
pueden requerir un fondo avanzado o una creatividad
superior a la media.
Al estudiante
Esperamos que este libro de texto le proporcione una
introduccin agradable al campo de los algoritmos. Hemos
intentado hacer que cada algoritmo sea accesible e
interesante. Para ayudarle a encontrar algoritmos
desconocidos o difciles, describimos cada uno de ellos paso
a paso. Tambin proporcionamos explicaciones cuidadosas
de las matemticas necesarias para entender el anlisis de los
algoritmos. Si usted ya tiene alguna familiaridad con un
tema, encontrar los captulos organizados para que pueda
hojear secciones introductorias y proceder rpidamente al
material ms avanzado.
Este es un libro grande, y su clase probablemente cubrir
slo una parte de su material. Hemos tratado, sin embargo,
de hacer de este libro un libro que le ser til ahora como
libro de texto del curso y tambin ms tarde en su carrera
como una referencia de escritorio matemtico o un manual
de ingeniera.
Cules son los requisitos previos para leer este libro?
Deberas tener experiencia en programacin. En particular,
debe comprender los procedimientos recursivos y las
estructuras de datos sencillas, como matrices y listas
enlazadas.
Usted debe tener alguna facilidad con pruebas matemticas,
y especialmente pruebas por induccin matemtica. Algunas
porciones del libro se basan en algn conocimiento de
clculo elemental. Ms all de eso, las Partes I y VIII de este
libro te ensean todas las tcnicas matemticas que
necesitars.
Hemos escuchado, alto y claro, el llamamiento a aportar
soluciones a los problemas y ejercicios. Nuestro sitio web,
http://mitpress.mit.edu/algorithms/, contiene enlaces a
soluciones para algunos de los problemas y ejercicios.
Sintase libre de comparar sus soluciones con las nuestras.
Sin embargo, le pedimos que no nos enve sus soluciones.
Al profesional
La amplia gama de temas de este libro lo convierte en un
excelente manual sobre algoritmos. Debido a que cada
captulo es relativamente autnomo, usted puede enfocarse
en los temas que ms le interesan.
La mayora de los algoritmos que discutimos tienen una gran
utilidad prctica. Por lo tanto, abordamos los problemas de
implementacin y otras cuestiones de ingeniera. A menudo
proporcionamos alternativas prcticas a los pocos
algoritmos que son principalmente de inters terico. Si
usted desea implementar cualquiera de los algoritmos,
debera? y la traduccin de nuestro pseudocode a su lenguaje
de programacin favorito debera ser una tarea bastante
sencilla. Hemos diseado el pseudocdigo para presentar
cada algoritmo de forma clara y sucinta. En consecuencia,
no abordamos el manejo de errores y otros problemas de
ingeniera de software que requieren suposiciones
especficas sobre su entorno de programacin. Intentamos
presentar cada algoritmo de forma simple y directa sin
permitir que las idiosincrasias de un lenguaje de
programacin en particular oscurezcan su esencia.
Entendemos que, si usted est usando este libro fuera de un
curso, es posible que no pueda comparar sus soluciones a los
problemas y ejercicios con las soluciones proporcionadas
por un instructor. Nuestro sitio web,
http://mitpress.mit.edu/algorithms/, enlaza con las
soluciones a algunos de los problemas y ejercicios para que
pueda comprobar su trabajo. Por favor, no nos enve sus
soluciones.
A nuestros colegas
Hemos suministrado una extensa bibliografa e indicadores
a la literatura actual. Cada captulo termina con un conjunto
de notas de captulo que dan detalles histricos y erencias.
Sin embargo, las notas del captulo no proporcionan una
referencia completa al conjunto de algoritmos. Aunque
puede ser difcil de creer para un libro de este tamao, las
limitaciones de espacio nos impidieron incluir muchos
algoritmos interesantes. A pesar de las innumerables
peticiones de los estudiantes para encontrar soluciones a los
problemas y ejercicios, hemos optado por la poltica de no
proporcionar referencias para problemas y ejercicios, para
eliminar la tentacin de que los estudiantes busquen una
solucin en lugar de buscarla ellos mismos.
1 We investigated several drawing programs that run under Mac OS X, but all
had signicant short-comings compared with MacDraw Pro. We briey attempted
to produce the illustrations for this book with a different, well known drawing
program. We found that it took at least ve times as long to produce each
illustration as it took with MacDraw Pro, and the resulting illustrations did not
look as good. Hence the decision to revert to MacDraw Pro running on older
Macintoshes.
Introduccin
Los Apndices A-D contienen otro material matemtico que le ser de utilidad
para leer este libro. Es probable que usted haya visto mucho del material en los
captulos del apndice antes de haber ledo este libro (aunque las de?niciones
especficas y las convenciones notacionales que usamos pueden diferir en algunos
casos de lo que ha visto en el pasado), y por lo tanto debera pensar en los
Apndices como material de referencia. Por otra parte, es probable que no hayan
visto ya la mayor parte del material de la Parte I. Todos los captulos de la Parte
I y los Apndices estn escritos con un tutorial?avor.
1 El papel de los algoritmos en la informtica
Qu son los algoritmos? Por qu vale la pena estudiar los algoritmos? Cul es
el papel de los algoritmos en relacin con otras tecnologas utilizadas en
ordenadores? En este captulo responderemos a estas preguntas.
1.1 Algoritmos
Se dice que un algoritmo es correcto si, para cada instancia de entrada, se detiene
con la salida correcta. Decimos que un algoritmo correcto resuelve el problema
computacional dado. Un algoritmo incorrecto puede no detenerse en absoluto en
algunas instancias de entrada, o puede detenerse con una respuesta incorrecta.
Contrariamente a lo que se puede esperar, los algoritmos incorrectos a veces
pueden ser tiles, si podemos controlar su tasa de error. Veremos un ejemplo de
un algoritmo con una tasa de error controlable en el captulo 31 cuando
estudiemos algoritmos para encontrar grandes nmeros primos. Normalmente, sin
embargo, slo nos ocuparemos de los algoritmos correctos.
El Proyecto del Genoma Humano ha hecho grandes progresos hacia los objetivos
de identificar todos los 100.000 genes del ADN humano, determinar las
secuencias de los 3.000 millones de pares de bases qumicas que componen el
ADN humano, almacenar esta informacin en bases de datos y desarrollar
herramientas para el anlisis de datos. Cada uno de estos pasos requiere
algoritmos sofisticados. Aunque las soluciones a los diversos problemas
involucrados estn fuera del alcance de este libro, muchos mtodos para resolver
estos problemas biolgicos usan ideas de varios de los captulos de este libro,
permitiendo as a los cientficos realizar tareas mientras usan los recursos
eficientemente. Los ahorros son en tiempo, tanto humanos como mquinas, y en
dinero, ya que se puede extraer ms informacin de las tcnicas de laboratorio.
Aunque algunos de los detalles de estos ejemplos estn ms all del alcance de
este libro, s damos tcnicas subyacentes que se aplican a estos problemas y reas
problemticas. Tambin mostramos cmo resolver muchos problemas
especficos, incluyendo los siguientes:
Debido a que la funcin factorial crece ms rpido que una funcin exponencial,
no podemos generar de manera factible cada orden posible y luego verificar que,
dentro de ese orden, cada parte aparezca antes que las partes que la usan (a menos
que tengamos slo unas pocas partes). Este problema es un ejemplo de
clasificacin topolgica, y veremos en el captulo 22 cmo resolver este problema
de manera eficiente.
These lists are far from exhaustive (as you again have probably surmised from
this books heft), but exhibit two characteristics that are common to many
interesting algorithmic problems:
2. They have practical applications. Of the problems in the above list, finding the
shortest path provides the easiest examples. A transportation firm, such as a
trucking or railroad company, has a financial interest in finding shortest paths
through a road or rail network because taking shorter paths results in lower labor
and fuel costs. Or a routing node on the Internet may need to find the shortest path
through the network in order to route a message quickly. Or a person wishing to
drive from New York to Boston may want to find driving directions from an
appropriate Web site, or she may use her GPS while driving.
Not every problem solved by algorithms has an easily identified set of candidate
solutions. For example, suppose we are given a set of numerical values
representing samples of a signal, and we want to compute the discrete Fourier
transform of these samples. The discrete Fourier transform converts the time
domain to the frequency domain, producing a set of numerical coefficients, so
that we can determine the strength of various frequencies in the sampled signal.
In addition to lying at the heart of signal processing, discrete Fourier transforms
have applications in data compression and multiplying large polynomials and
integers. Chapter 30 gives an efficient algorithm, the fast Fourier transform
(commonly called the FFT), for this problem, and the chapter also sketches out
the design of a hardware circuit to compute the FFT.
Data structures
This book also contains several data structures. A data structure is a way to store
and organize data in order to facilitate access and modifications. No single data
structure works well for all purposes, and so it is important to know the strengths
and limitations of several of them.
Technique
Although you can use this book as a cookbook for algorithms, you may
someday encounter a problem for which you cannot readily find a published
algorithm (many of the exercises and problems in this book, for example). This
book will teach you techniques of algorithm design and analysis so that you can
develop algorithms on your own, show that they give the correct answer, and
understand their efficiency.
Hard problems
Most of this book is about efficient algorithms. Our usual measure of efficiency
is speed, i.e., how long an algorithm takes to produce its result. There are some
problems, however, for which no efficient solution is known. Chapter 34 studies
an interesting subset of these problems, which are known as NP-complete.
You should know about NP-complete problems because some of them arise
surprisingly often in real applications. If you are called upon to produce an
efficient algorithm for an NP-complete problem, you are likely to spend a lot of
time in a fruitless search. If you can show that the problem is NP-complete, you
can instead spend your time developing an efficient algorithm that gives a good,
but not the best possible, solution.
Parallelism
For many years, we could count on processor clock speeds increasing at a steady
rate. Physical limitations present a fundamental roadblock to ever-increasing
clock speeds, however: because power density increases superlinearly with clock
speed, chips run the risk of melting once their clock speeds become high enough.
In order to perform more computations per second, therefore, chips are being
designed to contain not just one but several processing cores. We can liken
these multicore computers to several sequential computers on a single chip; in
other words, they are a type of parallel computer. In order to elicit the best
performance from multicore computers, we need to design algorithms with
parallelism in mind. Chapter 27 presents a model for multithreaded algorithms,
which take advantage of multiple cores. This model has advantages from a
theoretical standpoint, and it forms the basis of several successful computer
programs, including a championship chess program.
Ejercicios
1.1-1
D un ejemplo del mundo real que requiera clasificacin o un ejemplo del mundo
real que requiera computar un casco convexo.
1.1-2
1.1-3
Seleccione una estructura de datos que haya visto anteriormente y discuta sus
fortalezas y limitaciones.
1.1-4
En qu se diferencian?
1.1-5
Proponga un problema del mundo real en el que slo la mejor solucin bastar.
Luego, invente una solucin en la que una solucin que sea "aproximadamente"
la mejor sea lo suficientemente buena.
Por supuesto, las computadoras pueden ser rpidas, pero no son infinitamente
rpidas. Y la memoria puede ser barata, pero no es gratis. El tiempo de
computacin es por lo tanto un recurso limitado, y tambin lo es el espacio en la
memoria. Usted debe utilizar estos recursos sabiamente, y los algoritmos que son
eficientes en trminos de tiempo o espacio le ayudarn a hacerlo.
Efficiency
Different algorithms devised to solve the same problem often differ dramatically
in their efficiency. These differences can be much more significant than
differences due to hardware and software.
As an example, in Chapter 2, we will see two algorithms for sorting. The first,
known as insertion sort, takes time roughly equal to c1n2 to sort n items, where
c1 is a constant that does not depend on n. That is, it takes time roughly
proportional to n2. The second, merge sort, takes time roughly equal to c2n lg n,
where lg n stands for log2 n and c2 is another constant that also does not depend
on n. Insertion sort typically has a smaller constant factor than merge sort, so that
c1 < c2.
We shall see that the constant factors can have far less of an impact on the running
time than the dependence on the input size n. Lets write insertion sorts running
time as c1n n and merge sorts running time
as c2n lg n. Then we see that where insertion
sort has a factor of n in its running time, merge sort has a factor of lg n, which is
much smaller. (For example, when n D 1000, lg n is approximately 10, and when
n equals one million, lg n is approximately only 20.) Although insertion sort
usually runs faster than merge sort for small input sizes, once the input size n
becomes large enough, merge sorts advantage of lg n vs. n will more than
compensate for the difference in constant factors. No matter how much smaller
c1 is than c2, there will always be a crossover point beyond which merge sort is
faster.
2 .107/2 instructions