Docsity
Docsity

Prepare-se para as provas
Prepare-se para as provas

Estude fácil! Tem muito documento disponível na Docsity


Ganhe pontos para baixar
Ganhe pontos para baixar

Ganhe pontos ajudando outros esrudantes ou compre um plano Premium


Guias e Dicas
Guias e Dicas


Algoritmos Teoria e Pratica, Notas de estudo de Algoritmos

Otima apostila de Algoritmos

Tipologia: Notas de estudo

2012

Compartilhado em 23/01/2012

breno-silva-20
breno-silva-20 🇧🇷

5

(1)

2 documentos

1 / 934

Toggle sidebar

Esta página não é visível na pré-visualização

Não perca as partes importantes!

bg1
www.baixebr.org
pf3
pf4
pf5
pf8
pf9
pfa
pfd
pfe
pff
pf12
pf13
pf14
pf15
pf16
pf17
pf18
pf19
pf1a
pf1b
pf1c
pf1d
pf1e
pf1f
pf20
pf21
pf22
pf23
pf24
pf25
pf26
pf27
pf28
pf29
pf2a
pf2b
pf2c
pf2d
pf2e
pf2f
pf30
pf31
pf32
pf33
pf34
pf35
pf36
pf37
pf38
pf39
pf3a
pf3b
pf3c
pf3d
pf3e
pf3f
pf40
pf41
pf42
pf43
pf44
pf45
pf46
pf47
pf48
pf49
pf4a
pf4b
pf4c
pf4d
pf4e
pf4f
pf50
pf51
pf52
pf53
pf54
pf55
pf56
pf57
pf58
pf59
pf5a
pf5b
pf5c
pf5d
pf5e
pf5f
pf60
pf61
pf62
pf63
pf64

Pré-visualização parcial do texto

Baixe Algoritmos Teoria e Pratica e outras Notas de estudo em PDF para Algoritmos, somente na Docsity!

www.baixebr.org

www.baixebr.org

www.baixebr.org

ÃO DAS ww balxebr org www.baixebr. Preencha a ficha de cadastro no final deste livro e receba gratuitamente informações sobre os lançamentos e as promoções de Editora Campus. Consulte também nosso catálogo completo e últimos lançamentos em Wwww.campus.com.br Do original introduation to algorithms — Second Edition Tradução autorizada do idioma inglês da edição publicada por The MiT Press Copyright 2001 by The Massachusetts Institute of Technology 2002, Elsevier Editora Ltda. Todos os direitos reservados e protegidos pela Lei 8.610 de 19/02/1998, Nenhuma parte deste livro, sem autorização prévia por escrito da editora, poderá ser reproduzida ou transmitida sejam quais forem os meios empregados: eletrônicos, mecânicos, fotográficos, gravação ou quaisquer outros. Editoração Eletrônica Estúdio Casteliani Revisão Gráfica Jane Castellani Projeto Gráfico Elsevier Editora Lida. A Qualidade da Informação. Rua Sete de Setembro, 111 — 16º andar 20050-006 Rio de Janeiro Ry Brasil Telefons: (21) 3870-8300 FAX: (21) 2507-1991 E-mail: info O elsevier.com.br Escritório São Paulo: Rua Elvira Ferraz, 198 94552-040 Vila Olimpia São Paulo SP Tel: (11) 3841.8555 ISBN 85-352-0926-3 (Edição original: ISBN 0-07-013151-1) CIP-Brasil, Catalogação-na-tonte. Sindicato Nacional dos Editores de Livros, Fu Asas Algoritmos : teoria e prática / Thomas H. Cormen... [et at]; tradução da segunda edição [americana] Vandenberg D. de Souza, — Rio de Janeiro : Elsevier, 2002 — 6º Reimpressão. Tradução de: Introduction to algorithms ISBN 85-352.0926-3 1. Programação (Computadores). 2, Algoritmos de computador. 1. Cormen. Thomas H. o1-1674 CDD 0051 COL - 004.421 04 05 06 07 9876 Sumário wuw.baixeb Prefácio..........ill css c reis ss essas cercar ea rr aa sena nara renan x Partel | Fundamentos Introdução ...........cccci ii l ces cc ctsscerra cara racerrrecrare aaa 1 1 A função dos algoritmos na computação 1.1 Algoritmos 1.2 Algoritmos como uma tecnologia .........iccicccireceseseanerearos 7 2 Conceitos básicos ............cccccllc lis it ci rece cer ecacrraa 2.1 Ordenação por inserção .. 2.2 Análise de algoritmos .... 2.3 Projeto de algoritmos ........ccccccerentccreereraerereraerarais 3 Crescimento de funções .............cccccccccciccsscrcirrcceera 32 3.1 Notação assintótica 3.2 Notações padrão e funções comuns. . 4 4.1 O método de substituição . 51 4.2 O método de árvore de recursão.... 4.3 O método mestre. * 44 Prova do teorema mestre... 5 Análise probabilística e algoritmos aleatórios .. 5.1 O problema da contratação . 5.2 Indicadores de variáveis aleatórias. 5.3 Algoritmos aleatórios. . * 5.4 Análise probabilística e usos adicionais de indicadores de variáveis aleatórias. . 85 Parte II Ordenação e estatísticas de ordem Introdução. ........ciccittcctcstanaereecacecseranannaarrrasa a 99 6 Heapsort . 6.1 Heaps . 6.2 Manutenção da propricdade de heap.. 6.3 A construção de um heap 64 O algoritmo heapsort 6.5 Filas de prioridades 7 Quicksort... 7.1 Descrição do quicksort .... 7.2 O desempenho de quicksor ... 7.3 Uma versão aleatória de quicksort 7.4 Análise de quicksort . 16 Algoritmos gulosos 16.1 Um problema de seleção de atividade . 16.2 Elementos da estratégia gulosa ... 16.3 Códigos de Huffman -. 296 -297 303 .307 * 16.4 Fundamentos teóricos de métodos gulosos .. .. 314 * 16.5 Um problema de programação de tarefas. ... .319 .. 324 A análise agregada. .. 325 17.2 O método de contabilidade. . .. 328 17.3 O método potencial «. 330 17.4 Tabelas dinâmicas... 333 Parte V Estruturas de dados avançadas Introdução 345 349 18.1 Definição de árvores B .. 352 18.2 Operações básicas sobre árvores B.. . .. 354 18.3 Eliminação de uma chave de uma árvore B... 360 19 Heaps binomiais 365 19.1 Árvores binomiais e heaps binomiais -. 366 19.2 Operações sobre heaps binomiais .... 370 20 Heaps de Fibonacci .............cicco ires co .381 20.1 Estrutura de heaps de Fibonacci .. .. 382 20.2 Operações de heaps intercaláveis. . .. 384 20.3 Como decrementar uma chave e eliminar um nó. -. 390 20.4 Como limitar o grau máximo .394 21 Estruturas de dados para conjuntos disjuntos ... 398 21.1 Operações de conjuntos disjuntos .. 398 21.2 Representação de conjuntos disjuntos por listas ligadas .. .. 400 21.3 Florestas de conjuntos disjuntos .. 403 * 21.4 Análise da união por ordenação com compressão de caminho ............ 406 Parte VI Algoritmos de grafos Introdução ... 22 Algoritmos elementares de grafos ..........cicccccestetrereereres 419 22.1 Representações de grafos... 22.2 Busca em largura..... 22.3 Busca em profundidade 224 Ordenação topológica... 22.5 Componentes fortemente conectados . 23.1 Como aumentar uma árvore espalhada mínima. . 23.2 Os algoritmos de Kruskal e Prim 24 Caminhos mais curtos de única origem .........ceccccccssrrarcasos 459 24.1 O algoritmo de Bellman-Ford..........ccicccccsisciisecsecreras 465 VE 25 26 24.2 Caminhos mais curtos de única origem em grafos acíclicos orientados. .... 468 24.3 Algoritmo de Dijkstra 24.4 Restrições de diferenças e caminhos mais curtos .... 24.5 Provas de propriedades de caminhos mais curtos... Caminhos mais curtos de todos os pares 25.1 Caminhos mais curtos e multiplicação de marrizes... 25.2 O algoritmo de Floyd-Warshall 25.3 Algoritmo de Johnson para grafos esparsos .. Fluxo máximo .... 26.1 Fluxoemredes........ 26.2 O método de Ford-Fulkerson 26.3 Emparelhamento bipartido máximo 264 Algoritmos de push-relabel .... 26.5 O algoritmo de relabel-to-front.. . Parte VII Tópicos selecionados 27 28 29 30 31 553 Redes de ordenação 27.1 Redes de comparação ... 27.2 Oprincípiozeroum........... 27.3 Uma rede de ordenação bitônica .. 274 Uma rede de intercalação .. 27.5 Uma rede de ordenação. ... 555 ..555 559 561 564 .. 566 --571 ..571 «579 .. 585 597 Operações sobre matrizes... 28.1 Propriedades de matrizes 28.2 Algoritmo de Strassen para multiplicação de matrizes 28.3 Resolução de sistemas de equações lineares 28.4 Inversão de matrizes... ... 28.5 Matrizes simétricas definidas como positivas e aproximação de mínimos quadrados 601 - 610 616 622 626 638 .643 Programação linear 29.1 Formas padrão e relaxada... 29.2 Formulação de problemas como programas lineares ... 29.3 Oalgoritmo simplex..........cciciisi iii 29.4 Dualidade . 29.5 A solução básica inicial possível... Polinômios e a FFT .. 30.1 Representação de polinômios .. 30.2 ADFTeaFFT.. 651 653 6s8 30.3 Implementações eficientes de FFT 664 Algoritmos de teoria dos números . ... 672 31.1 Noções de reoria elementar dos números. ..673 31.2 Máximo divisor comum .. ... 678 31.3 Aritmética modular ...... ...682 314 Resolução de equações lineares modulares ... ... 688 315 O teorema chinês do resto. ... . 691 31.6 Potências de um elemento... .. 693 Prefácio Este livro oferece uma introdução abrangente ao estudo moderno de algoritmos de computa- dor. Ele apresenta muitos algoritmos e os examina com uma profundidade considerável, tor- nando seu projeto e sua análise acessíveis aos leitores de todos os níveis. Tentamos manter as explicações em um nível elementar sem sacrificar a profundidade do enfoque ou o rigor mate- mático. Cada capítulo apresenta um algoritmo, uma técnica de projeto, uma área de aplicação ou um tópico relacionado. Os algoritmos são descritos em linguagem comum e em um “pseudocó- digo” projetado para ser legível por qualquer pessoa que tenha um pouco de experiência em programação. O livro contém mais de 230 figuras ilustrando como os algoritmos funcionam. Tendo em vista que enfatizamos a eficiência como um critério de projeto, incluímos análises cui- dadosas dos tempos de execução de todos os nossos algoritmos. O texto foi planejado principalmente para uso em graduação e pós-graduação em algoritmos ou estruturas de dados. Pelo fato de discutir questões de engenharia relacionadas ao projeto de ai- goritmos, bem como aspectos matemáticos, o livro é igualmente adequado para auto-estudo de profissionais técnicos. Nesta segunda edição, atualizamos o livro inteiro. As mudanças variam da adição de novos capítulos até a reestruturação de frases individuais. Para o professor Este livro foi projetado para ser ao mesmo tempo versátil e completo. Você descobrirá sua utilidade para uma variedade de cursos, desde a graduação em estruturas de dados, até a pós-graduação em algoritmos. Pelo fato de fornecermos uma quantidade de material conside- ravelmente maior do que poderia caber em um curso típico de um período, você deve imagi- nar o livro como um “bufê” ou “depósito”, do qual pode selecionar e extrair o material que me- lhor atender ao curso que desejar ministrar. Você achará fácil organizar seu curso apenas em torno dos capítulos de que necessitar. Tor- namos os capítulos relativamente autônomos, para que você não precise se preocupar com uma dependência inesperada e desnecessária de um capítulo em relação a outro. Cada capítulo apre- senta primeiro o materia! mais fácil e mostra os assuntos mais difíceis em seguida, com limites de seções assinalando pontos de parada naturais. Na graduação, poderão ser utilizadas apenas as primeiras seções de um capítulo; na pós-graduação, será possível estudar o capítulo inteiro. Incluímos mais de 920 exercícios e mais de 140 problemas. Cada seção termina com exercí- cios, e cada capítulo com problemas. Em geral, os exercícios são perguntas curtas que testam o domínio básico do assunto. Alguns são exercícios simples criados para a sala de aula, enquanto outros são mais substanciais e apropriados para uso como dever de casa. Os problemas são estu- dos de casos mais elaborados que, com frequência, apresentam novos assuntos; normalmente, eles consistem em várias perguntas que conduzem o aluno por etápas exigidas para chegar a uma solução. Assinalamos com asteriscos (*) as seções e os exercícios mais adequados para alunos avança- dos. Uma seção com asteriscos não é necessariamente mais difícil que outra que não tenha aste- riscos, mas pode exigir a compreensão de matemática em um nível mais profundo. Da mesma forma, os exercícios com asteriscos podem exigir um conhecimento mais avançado ou criativi- dade acima da média. Mudanças na segunda edição O que mudou entre a primeira e a segunda edição deste livro? Dependendo de como você o encara, o livro pode não ter mudado muito ou ter mudado bastante. Um rápido exame no sumário mostra que a maior parte dos capítulos e das seções da primei- ra edição também estão presentes na segunda edição. Removemos dois capítulos e algumas se- ções, mas adicionamos três novos capítulos é quatro novas seções além desses novos capítulos. Se fosse julgar o escopo das mudanças pelo sumário, você provavelmente concluiria que as mu- danças foram modestas. Porém, as alterações vão muito além do que aparece no sumário. Sem qualquer ordem parti- cular, aqui está um resumo das mudanças mais significativas da segunda edição: e Cliff Stein foi incluído como co-autor. e Oserros foram corrigidos. Quantos erros? Vamos dizer apenas que foram vários. e Hátrês novos capítulos: e O Capítulo 1 discute a função dos algoritmos em informática. « OcCapítulo5 abrange a análise probabilística e os algoritmos aleatórios. Como na pri- meira edição, esses tópicos aparecem em todo o livro. * O Capítulo 29 é dedicado à programação linear. * Dentro dos capítulos que foram trazidos da primeira edição, existem novas seções sobre os seguintes tópicos: e Hash perfeito (Seção 11.5). * Duas aplicações de programação dinâmica (Seções 15.1 e 15.5). * Algoritmos de aproximação que usam técnicas aleatórias e programação linear (Seção 35.4). * Para permitir que mais algoritmos apareçam mais cedo no livro, três dos capítulos sobre fundamentos matemáticos foram reposicionados, migrando da Parte | para os apêndices, que formam a Parte VII. * Há mais de 40 problemas novos e mais de 185 exercícios novos. * Tornamos explícito o uso de loops invariantes para demonstrar a correção. Nosso pri- meiro loop invariante aparece no Capítulo 2, e nós os utilizamos algumas dezenas de ve- zes ao longo do livro. e Muitas das análises probabilísticas foram reescritas. Em particular, usamos em aproximada- mente uma dezena de lugares a técnica de “variáveis indicadoras aleatórias” que simplificam as análises probabilísticas, em especial quando as variáveis aleatórias são dependentes. * Expandimos e atualizamos as notas dos capítulos e a bibliografia. A bibliografia cresceu mais de 50%, e mencionamos muitos novos resultados algorítmicos que surgiram após a impressão da primeira edição. Também fizemos as seguintes mudanças: * O capítulo sobre resolução de recorrências não contém mais o método de iteração. Em vez disso, na Seção 4.2, “promovemos” as árvores de recursão, que passaram a constituir um método por si só. Concluímos que criar árvores de recursão é menos propenso a er- ros do que fazer a iteração de recorrências. Porém, devemos assinalar que as árvores de recursão são mais bem usadas como um modo de gerar hipóteses que serão então verifi- cadas através do método de substituição. xi * O método de particionamento usado para ordenação rápida (Seção 7.1) e no algoritmo de ordem estatística de tempo linear esperado (Seção 9.2) é diferente. Agora usamos q método desenvolvido por Lomuto que, junto com variáveis indicadoras aleatórias, per- mite uma análise um pouco mais simples. O método da primeira edição, devido a Hoare, é apresentado como um problema no Capítulo 7. * Modificamos a discussão sobre o hash universal da Seção 11.3.3 de forma que ela se inte- gre à apresentação do hash perfeito. * Você encontrará na Seção 12.4 uma análise muito mais simples da altura de uma árvore de pesquisa binária construída aleatoriamente. * Asdiscussões sobre os elementos de programação dinâmica (Seção 15.3) e os elementos de algoritmos gulosos (Seção 16.2) foram significativamente expandidas. A exploração do problema de seleção de atividade, que inicia o capítulo de algoritmos gulosos, ajuda a esclarecer a relação entre programação dinâmica e algoritmos gulosos. * Substituímos a prova do tempo de execução da estrutura de dados de união de conjuntos disjuntos na Seção 21.4 por uma prova que emprega o método potencial para derivar um limite restrito. * A prova de correção do algoritmo para componentes fortemente conectados na Seção 22.5 é mais simples, mais clara e mais direta. * O Capírulo 24, que aborda os caminhos mais curtos de origem única, foi reorganizado com a finalidade de mover as provas das propriedades essenciais para suas próprias se- ções. A nova organização permite que nos concentremos mais cedo nos algoritmos. * ASeção 34.5 contém uma visão geral ampliada do caráter Ni] P-completo, e também novas provas de caráter NP-completo para os problemas do ciclo hamiltoniano e da soma de subconjuntos. Por fim, virtualmente todas as seções foram editadas para corrigir, simplificar e tornar mais claras as explicações e demonstrações. Agradecimentos da primeira edição Muitos amigos e colegas contribuíram bastante para a qualidade deste livro. Agradecemos a to- dos por sua ajuda e suas críticas construtivas. O laboratório de ciência da computação do MIT proporcionou um ambiente de trabalho ideal. Nossos colegas do grupo de teoria da computação do laboratório foram particularmente incenti- vadores e tolerantes em relação aos nossos pedidos incessantes de avaliação crítica dos capítulos. Agradecemos especificamente a Baruch Awerbuch, Shafi Goldwasser, Leo Guibas, Tom Leighton, Albert Meyer, David Shmoys e Éva Tardos. Agradecemos a William Ang, Sally Bemus, Ray Hirschfeld e Mark Reinhold por manterem nossas máquinas (equipamentos DEC Microvax, Apple Macintosh e Sun Sparcstation) funcionando e por recompilarem TEX sempre que excedemos um limite de prazo de compilação. A Thinking Machines Corporation forneceu suporte parcial a Char- les Leiserson para trabalhar neste livro durante um período de ausência do MIT. Muitos colegas usaram rascunhos deste texto em cursos realizados em outras faculdades. Eles sugeriram numerosas correções e revisões. Desejamos agradecer em particular a Richard Beigel, Andrew Goldberg, Joan Lucas, Mark Overmars, Alan Sherman e Diane Souvaine. Muitos assistentes de ensino em nossos cursos apresentaram contribuições significativas para o desenvolvimento deste material. Agradecemos especialmente a Alan Baratz, Bonnie Ber- ger, Aditi Dhaga:, Burt Kaliski, Arthur Lent, Andrew Moulton, Marios Papaefthymiou, Cindy Phil- lips, Mark Reinhold, Phil Rogaway, Flavio Rose, Arie Rudich, Alan Sherman, Cliff Stein, Susmita xw| Sur, Gregory Troxel e Margaret Tuttle. kop, Sudipta Sengupta, Donna Slonim, Joshua A. Tauber, Sivan Toledo, Elisheva Werner-Reiss, Lea Wittie, Qiang Wu e Michael Zhang. O suporte de informática foi oferecido por William Ang, Scott Blomquist e Greg Shomo no MIT e por Wayne Cripps, John Konkle e Tim Tregubov em Dartmouth. Agradecemos também a Be Blackburn, Don Dailey, Leigh Deacon, Irene Sebeda e Cheryl Patton Wu no MIT, e a Phyllis Bellmore, Kelly Clark, Delia Mauceli, Sammie Travis, Deb Whiting e Beth Young, de Dartmouth, pelo suporte administrativo. Michael Fromberger, Brian Campbell, Amanda Eubanks, Sung Hoon Kim e Neha Narula também ofereceram apoio oportuno em Dartmouth. Muitas pessoas fizeram a gentileza de informar sobre erros cometidos na primeira edição. Agradecemos aos leitores mencionados na lista a seguir; cada um deles foi o primeiro a relatar um erro da primeira edição: Len Adleman, Selim Aki, Richard Anderson, Juan Andrade-Cetro, Gregory Bachelis, David Barrington, Paul Beame, Richard Beigel, Margrit Betke, Alex Blakemo- re, Bobby Blumofe, Alexander Brown, Xavier Cazin, Jack Chan, Richard Chang, Chienhua Chen, len Cheng, Hoon Choi, Drue Coles, Christian Collberg, George Collins, Eric Conrad, Peter Csas- zar, Paul Dietz, Martin Dietzfelbinger, Scot Drysdale, Patricia Ealy, Yaakov Eisenberg, Michael Ernst, Michael Formann, Nedim Fresko, Hal Gabow, Marek Galecki, Igal Galperin, Luisa Garga- no, John Gately, Rosario Genario, Mihaly Gereb, Ronald Greenberg, Jerry Grossman, Stephen Guattery, Alexander Hartemik, Anthony Hill, Thomas Hofmeister, Mathew Hostetter, Yih-Chun Hu, Dick Johnsonbaugh, Marcin Jurdzinki, Nabil Kahale, Fumiaki Kamiya, Anand Kanagala, Mark Kantrowitz, Scott Kartin, Dean Kelley, Sanjay Khanna, Haluk Konuk, Dina Kravets, Jon Kro- ger, Bradley Kuszmaul, Tim Lambert, Hang Lau, Thomas Lengauer, George Madrid, Bruce Maggs, Victor Miller, Joseph Muskat, Tung Nguyen, Michael Orlov, James Park, Seongbin Park, Ioannis Paschalidis, Boaz Patt-Sharnir, Leonid Peshkin, Patrício Poblete, Ira Pohl, Stephen Pon- zio, Kjell Post, Todd Poynor, Colin Prepscius, Sholom Rosen, Dale Russell, Hershel Safer, Karen Seidel, Joel Seiferas, Erik Seligman, Stanley Selkow, Jeffrey Shallit, Greg Shannon, Micha Sharir, Sasha Shen, Norman Shulman, Andrew Singer, Daniel Sleator, Bob Sioan, Michael Sofka, Volker Strumpen, Lon Sunshine, Julie Sussman, Asterio Tanaka, Clark Thomborson, Nils Thommesen, Homer Tilton, Martin Tompa, Andrei Toom, Felzer Torsten, Hirendu Vaishnav, M. Veldhorst, Luca Venuti, Jian Wang, Michael Wellman, Gerry Wiener, Ronald Williams, David Wolfe, Jeff Wong, Richard Woundy, Neal Young, Huaiyuan Yu, Tian Yuxing, Joe Zachary, Steve Zhang, Flo- rian Zschoke e Uri Zwick. Muitos de nossos colegas apresentaram críticas atentas ou preencheram um longo formulário de pesquisa. Agradecemos aos revisores Nancy Amato, Jim Aspnes, Kevin Compton, William Evans, Peter Gacs, Michael Goldwasser, Andrzej Proskurowski, Vijaya Ramachandran e John Reif. Também agradecemos às seguimes pessoas por devolverem a pesquisa: James Abello, Josh Benaloh, Bryan Beresford-Smith, Kenneth Blaha, Hans Bodlaender, Richard Borie, Ted Brown, Domenico Cantone, M. Chen, Robert Cimikowski, William Clocksin, Paul Culí, Rick Decker, Matthew Dickerson, Robert Douglas, Margaret Fleck, Michael Goodrich, Susanne Hambrusch, Dean Hendrix, Richard Johnson- baugh, Kyriakos Kalorkoti, Srinivas Kankanahalli, Hikyoo Koh, Steven Lindell, Errol Lloyd, Andy Lo- pez, Dian Rae Lopez, George Lucker, David Maier, Charles Martel, Xiannong Meng, David Mount, Alberto Policriti, Andrzej Proskurowski, Kirk Pruhs, Yves Robert, Guna Seetharaman, Stanley Sel- kow, Rober Sloan, Charles Steele, Gerard Tel, Murali Varanasi, Bernd Walter e Alden Wright. Gosta- ríamos que tivesse sido possível implementar todas as suas sugestões. O único problema é que, se isso fosse feito, a segunda edição teria mais ou menos 3.000 páginas! A segunda edição foi produzida em I4TFX2,. Michael Downes converteu as macros de IATEX do TATEX “clássico” para IATFX 2, e converteu os arquivos de texto para usar essas novas macros. David Jones também forneceu suporte para JATEX 2,. As figuras da segunda edição foram produ- zidas pelos autores usando o MacDraw Pro. Como na primeira edição, o índice foi compilado com o uso de Windex, um programa em C escrito pelos autores, € a bibliografia foi preparada com a utilização do BiBTEX Ayorkor Mills-Tettey e Rob Leathern ajudaram a converter as figuras para MacDraw Pro, e Ayorkor também conferiu nossa bibliografia. Como também aconteceu na primeira edição, trabalhar com The MIT Press e com a McGraw. Hill foi um prazer. Nossos editores, Bob Prior da MIT Press € Betsy Jones da McGraw-Hill, tolera- ram nossos gracejos e nos mantiveram no rumo. Finalmente, agradecemos a nossas esposas — Nicole Cormen, Gail Rivest e Rebecca Ivry — a nossos filhos — Ricky, William e Debby Leiserson, Alex e Christopher Rivest, e Molly, Noah e Ben- jamin Stein - e a nossos pais - Renee e Perry Cormen, Jean e Mark Leiserson, Shirley e Lloyd Ri- vest, e Irene e Ira Stein — por seu carinho e apoio durante a elaboração deste livro. O amor, a pa- ciência e o incentivo de nossos familiares tornaram este projeto possível. Dedicamos afetuosa- mente este livro a eles. Thomas H. Cormen Hanover, New Hampshire Charles E. Leiserson Cambridge, Massachusetts Ronald L. Rivest Cambridge, Massachusetts Chifford Stein Hanover, New Hampshire Maio de 2001 Xv Parte I Fundamentos Introdução Esta parte o fará refletir sobre o projeto e a análise de algoritmos. Ela foi planejada para ser uma introdução suave ao modo como especificamos algoritmos, a algumas das estratégias de projeto que usaremos ao longo deste livro e a muitas das idéias fundamentais empregadas na análise de algoritmos. As partes posteriores deste livro serão elaboradas sobre essa base. O Capítulo 1 é uma visão geral dos algoritmos e de seu lugar nos modernos sistemas de com- putação. Esse capítulo define o que é um algoritmo e lista alguns exemplos. Ele também apre- senta os algoritmos como uma tecnologia, da mesma maneira que um hardware rápido, interfa- ces gráficas do usuário, sistemas orientados a objetos e redes de computadores. No Capítulo 2, veremos nossos primeiros algoritmos, que resolvem o problema de ordenar uma sequência de x números. Eles são escritos em um pseudocódigo que, embora não possa ser traduzido diretamente para qualquer linguagem de programação convencional, transmite a es- trutura do algoritmo com clareza suficiente para que um programador competente possa imple- mentá-la na linguagem de sua escolha. Os algoritmos de ordenação que examinaremos são a or- denação por inserção, que utiliza uma abordagem incremental, e a ordenação por intercalação, que usa uma técnica recursiva conhecida como “dividir e conquistar”. Embora o tempo exigido por cada uma aumente com o valor 12, a taxa de aumento difere entre os dois algoritmos. Deter- minaremos esses tempos de execução no Capítulo 2 e desenvolveremos uma notação útil para expressá-los. O Capítulo 3 define com exatidão essa notação, que chamaremos notação assintótica. Ele come- ça definindo diversas notações assintóticas que utilizaremos para delimitar os tempos de execução dos algoritmos acima e/ou abaixo. O restante do Capítulo 3 é principalmente uma apresentação da notação matemática. Seu propósito maior é o de assegurar que o uso que você fará da notação cor- responderá à utilização deste livro, em vez de ensinar-lhe novos conceitos matemáticos. O Capítulo 4 mergulha mais profundamente no método de dividir e conquistar introduzido no Capítulo 2. Em particular, o Capítulo 4 contém métodos para sokução de recorrências que são úteis para descrever os tempos de execução de algoritmos recursivos. Uma técnica eficiente é o “método mestre”, que pode ser usado para resolver recorrências que surgem dos algoritmos de dividir e conquistar. Grande parte do Capítulo 4 é dedicada a demonstrar a correção do mé- todo mestre, embora essa demonstração possa ser ignorada sem problemas. O Capítulo 5 introduz a análise probabilística e os algoritmos aleatórios. Em geral, usaremos a análise probabilística para determinar o tempo de execução de um algoritmo nos casos em que, devido à presença de uma distribuição de probabilidades inerente, o tempo de execução pode diferir em diversas entradas do mesmo tamanho. Em alguns casos, vamos supor que as en- tradas obedecem a uma distribuição de probabilidades conhecida, e assim calcularemos o tem- po de execução médio sobre todas as entradas possíveis. Em outros casos, a distribuição de pro- babilidades não vem das entradas, mas sim das escolhas aleatórias feitas durante o curso do algo- ritmo. Um algoritmo cujo comportamento é determinado não apenas por sua entrada, mas também pelos valores produzidos por um gerador de números aleatórios, é um algoritmo alea- tório. Podemos usar algoritmos aleatórios para impor uma distribuição de probabilidade sobre as entradas — assegurando assim que nenhuma entrada específica sempre causará um fraco de- sempenho — ou mesmo para limitar a taxa de erros de algoritmos que têm permissão para pro- duzir resultados incorretos de forma limitada. Os Apêndices A, B e € contêm outros materiais matemáticos que você irá considerar úteis à medida que ler este livro. É provável que você tenha visto grande parte do material dos apêndi- ces antes de encontrá-los neste livro (embora as convenções específicas de notação que usamos possam diferir em alguns casos daquelas que você já viu), e assim você deve considerar os apên- dices um guia de referência. Por outro lado, é provável que você ainda não tenha visto a maior Parte do material contido na Parte I. Todos os capítulos da Parte 1 e os apêndices foram escritos com um “toque” de tutorial.