Table Of ContentMinicurso de
Análise de Algoritmos
http://www.ime.usp.br/~pf/livrinho-AA/
PauloFeofiloff
DepartamentodeCiênciadaComputação
InstitutodeMatemáticaeEstatística
UniversidadedeSãoPaulo
26dejulhode2011
2 FEOFILOFF
Sumário
1 Introdução 9
1.1 Problemaseinstâncias . . . . . . . . . . . . . . . . . . . . . . . . . . . 9
1.2 Consumodetempodealgoritmos . . . . . . . . . . . . . . . . . . . . 10
1.3 Recursãoealgoritmosrecursivos . . . . . . . . . . . . . . . . . . . . . 11
1.4 Convençõesdenotação . . . . . . . . . . . . . . . . . . . . . . . . . . . 12
2 Comparaçãoassintóticadefunções 13
2.1 NotaçãoO . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13
2.2 NotaçãoÔmega . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14
2.3 NotaçãoTeta . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15
2.4 Consumodetempodealgoritmos . . . . . . . . . . . . . . . . . . . . 15
3 Soluçãoderecorrências 17
3.1 Exemplo1 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17
3.2 Exemplo2 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18
3.3 Exemplo3 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18
3.4 Exemplo4 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20
3.5 Teoremamestre . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22
4 Ordenaçãodevetor 25
4.1 AlgoritmoMergesort . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25
4.2 Divisãoeconquista . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 26
5 Segmentodesomamáxima 27
5.1 Oproblema . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27
5.2 Primeiroalgoritmo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28
5.3 Segundoalgoritmo: divisãoeconquista . . . . . . . . . . . . . . . . . 29
5.4 Terceiroalgoritmo: programaçãodinâmica . . . . . . . . . . . . . . . 30
5.5 Observaçõessobreprogramaçãodinâmica. . . . . . . . . . . . . . . . 32
3
4 FEOFILOFF
6 Oproblemadamaioria 33
6.1 Oproblema . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 33
6.2 Umalgoritmolinear . . . . . . . . . . . . . . . . . . . . . . . . . . . . 34
7 Multiplicaçãodenúmerosnaturais 37
7.1 Oproblema . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 37
7.2 Oalgoritmousual . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 37
7.3 Divisãoeconquista . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 38
7.4 AlgoritmodeKaratsuba . . . . . . . . . . . . . . . . . . . . . . . . . . 40
7.5 Detalhesdeimplementação . . . . . . . . . . . . . . . . . . . . . . . . 41
7.6 Divisãoeconquista . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 42
8 Escalonamentodeintervalos 43
8.1 Oproblema . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 43
8.2 Aestruturarecursivadoproblema . . . . . . . . . . . . . . . . . . . . 44
8.3 Algoritmodeprogramaçãodinâmica. . . . . . . . . . . . . . . . . . . 44
9 Aslinhasdeumparágrafo 47
9.1 Oproblema . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 47
9.2 Aestruturarecursivadoproblema . . . . . . . . . . . . . . . . . . . . 48
9.3 Umalgoritmodeprogramaçãodinâmica . . . . . . . . . . . . . . . . 49
10 Mochiladevalormáximo 51
10.1 Oproblema . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 51
10.2 Aestruturarecursivadoproblema . . . . . . . . . . . . . . . . . . . . 51
10.3 Algoritmodeprogramaçãodinâmica. . . . . . . . . . . . . . . . . . . 52
10.4 Instânciasespeciaisdoproblemadamochila . . . . . . . . . . . . . . 54
11 Mochiladevalorquasemáximo 55
11.1 Oproblema . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 55
11.2 Algoritmodeaproximação. . . . . . . . . . . . . . . . . . . . . . . . . 55
11.3 Observaçõessobrealgoritmosdeaproximação . . . . . . . . . . . . . 57
12 Acoberturadeumgrafo 59
12.1 Grafos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 59
12.2 Oproblemadacobertura . . . . . . . . . . . . . . . . . . . . . . . . . . 59
12.3 Umalgoritmodeaproximação . . . . . . . . . . . . . . . . . . . . . . 60
12.4 Comentáriossobreométodoprimal-dual . . . . . . . . . . . . . . . . 62
12.5 Instânciasespeciaisdoproblema . . . . . . . . . . . . . . . . . . . . . 62
ANÁLISEDEALGORITMOS 5
13 Conjuntosindependentesemgrafos 63
13.1 Oproblema . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 63
13.2 Algoritmoprobabilístico . . . . . . . . . . . . . . . . . . . . . . . . . . 64
13.3 Comentáriossobrealgoritmosprobabilísticos . . . . . . . . . . . . . . 66
14 Buscaemlarguranumgrafo 67
14.1 Oproblemadocomponente . . . . . . . . . . . . . . . . . . . . . . . . 67
14.2 Buscaemlargura: versãopreliminar . . . . . . . . . . . . . . . . . . . 67
14.3 Buscaemlargura: versãomaisconcreta . . . . . . . . . . . . . . . . . 69
15 Buscaemprofundidadenumgrafo 71
15.1 Buscaemprofundidade . . . . . . . . . . . . . . . . . . . . . . . . . . 71
Posfácio 74
Bibliografia 77
Índiceremissivo 79
6 FEOFILOFF
Prefácio
A Análise de Algoritmos (veja o verbete Analysis of Algorithms na Wikipedia) é uma
disciplinabem-estabelecida,cobertaporumbomnúmerodeexcelenteslivros(amaio-
riaeminglês). Estelivrinhofazumamodestaintroduçãoaoassunto. Depoisdetratar
brevementedealgunspré-requisitos(comonotaçãoassintóticaeresoluçãoderecorrên-
cias),otextoanalisaalgunsalgoritmosclássicos,discutesuaeficiência,echamaaaten-
ção para as estratégias (divisão e conquista, programação dinâmica, método primal-
dual)quelevaramàsuaconcepção.
EstelivrinhoéumaversãocorrigidadominicursoqueministreinasJAI(Jornadas
deAtualizaçãoemInformática)de2009daSBC(SociedadeBrasileiradeComputação),
ocorridas em Bento Gonçalves, RS, em julho de 2009. O minicurso foi publicado no
livroorganizadoporAndréP.L.F.deCarvalhoeTomaszKowaltowski[5].
O texto deve muito a Cristina Gomes Fernandes e José Coelho de Pina Jr., ambos
do Departamento de Ciência da Computação do Instituto de Matemática e Estatística
daUSP,quecontribuíramcommaterial,ideiasevaliosassugestões.
IME–USP,SãoPaulo,agostode2009
P.F.
7
8 FEOFILOFF
Capítulo 1
Introdução
AAnálisedeAlgoritmos1estudacertosproblemascomputacionaisrecorrentes,ouseja,
problemasqueaparecem,sobdiversosdisfarces,emumagrandevariedadedeaplica-
çõesedecontextos. Aanálisedeumalgoritmoparaumdadoproblematratade
1. provarqueoalgoritmoestácorretoe
2. estimarotempoqueaexecuçãodoalgoritmoconsome.
(A estimativa do espaço de memória usado pelo algoritmo também é importante em
muitos casos.) Dados dois algoritmos para um mesmo problema, a análise permite
decidirqualdosdoisémaiseficiente.
Pode-se dizer que a Análise de Algoritmos é uma disciplina de engenharia, pois
ela procura prever o comportamento de um algoritmo antes que ele seja efetivamente
implementadoecolocado“emprodução”.
Numnívelmaisabstrato,aanálisedealgoritmosprocuraidentificaraspectosestru-
turais comuns a algoritmos diferentes e estudar paradigmas de projeto de algoritmos
(comoadivisãoeconquista,aprogramaçãodinâmica,ométodoprimal-dual,etc.)
EstetextoéumabreveintroduçãoàAnálisedeAlgoritmos,baseadanosexcelentes
livrosdeCormen,Leiserson,RivesteStein[3],deBrassardeBratley[2],deBentley[1],
deKleinbergeTardos[10]edeManber[14].
No restante desta introdução, faremos uma rápida revisão de conceitos básicos e
fixaremosanotaçãoeaterminologiaempregadasnotexto.
1.1 Problemas e instâncias
Da mesma forma que distinguimos um algoritmo de sua aplicação a uma particular
“entrada”, convémdistinguirproblemasdesuasinstâncias. Todoproblemacomputa-
cional é uma coleção de instâncias.2 Cada instância do problema é definida por um
particularconjuntodedados.
1 AexpressãofoicunhadaporD.E.Knuth[12].
2 Apalavrainstânciaéumneologismoimportadodoinglês.Elaestásendoempregadaaquinosentido
deexemplo,espécime,amostra,ilustração.
9
10 FEOFILOFF
Considere, por exemplo, o problema de encontrar a média dos elementos de um
vetor A[1..n] de números. Uma das instâncias deste problema consiste em encontrar
amédiadoselementosdovetor(876,−145,323,112,221).
Em discussões informais, é aceitável dizer “problema” quando “instância do pro-
blema”seriamaiscorreto. Emgeral, entretanto, éimportantemanterclaraadistinção
entreosdoisconceitos.
Otamanhodeumainstânciadeumproblemaéaquantidadededadosnecessária
para descrever a instância. O tamanho de uma instância é descrito, em geral, por um
sónúmeronatural,masàsvezeséconvenienteusardoisouatémaisnúmeros. Aideia
detamanhopermitedizerqueumainstânciaémenoroumaiorqueoutra.
Noproblemadamédiacitadoacima,porexemplo,érazoáveldizerqueotamanho
da instância (876,−145,323,112,221) é 5 e, em geral, que o tamanho de uma instân-
cia A[1..n] é n. (Dependendo das circunstâncias, entretanto, pode ser mais apropri-
adoadotaronúmerototaldedígitosdecimaisdeA[1..n]comotamanhodainstância.
Nesse caso, a instância (876,−145,323,112,221) terá tamanho 15 ou, se o leitor assim
preferir,16.)
1.2 Consumo de tempo de algoritmos
Dizemos que um algoritmo resolve um problema se, ao receber a descrição de uma
instância do problema, devolve uma solução da instância (ou informa que a instância
nãotemsolução). Paracadainstânciadoproblema,oalgoritmoconsomeumaquanti-
dadedetempodiferente. DigamosqueoalgoritmoconsomeT(I)unidadesdetempo
paraprocessarainstânciaI. ArelaçãoentreT(I)eotamanhodeI dáumamedidada
eficiênciadoalgoritmo.
Em geral, um problema tem muitas instâncias diferentes de um mesmo tamanho.
Isto exige a introdução dos conceitos de “pior caso” e “melhor caso”. Dado um algo-
ritmo A para o problema e um número natural n, seja T∗(n) o máximo de T(I) para
todasasinstânciasI detamanhondoproblema. Dizemosque
T∗ medeoconsumodetempodeAnopiorcaso.
Demodoanálogo,sejaT (n)omínimodeT(I)paratodasasinstânciaI detamanhon.
∗
DizemosqueT medeoconsumodeAnomelhorcaso.
∗
Por exemplo, um algoritmo pode consumir 200n unidades de tempo no melhor
casoe10n2+100nunidadesnopior. (Estouignorandoosvalorespequenosden,para
osquais200némaiorque10n2+100n.)
Nas nossas análises, suporemos quase sempre (o Capítulo 7 é uma exceção) que
umaexecuçãodecadalinhadepseudocódigoconsomeumaquantidadedetempoque
nãodependedotamanhodainstânciasubmetidaaoalgoritmo. (Paraisso, seráneces-
sário descrever os algoritmos de maneira suficientemente detalhada.) Em particular,
suporemosquasesemprequeoconsumodetempodasoperaçõesaritméticas(adição,
multiplicação, comparação, atribuição, etc.) não depende do tamanho dos números
envolvidos.
Description:cional é uma coleção de instâncias.2 Cada instância do problema é definida por um particular conjunto de dados. 1 A expressão foi cunhada por D. E. Knuth [12]. número real maior que 1. Por exemplo, é exponencial qualquer algoritmo que consome. Ω(1.1n) unidades de tempo. Se n é multiplica