Mestre em Ciência da Computação, Universidade Federal de Minas Gerais, 2004. Atualmente é aluno de doutorado do Departamento de Ciência da Computação da Universidade Federal de Minas Gerais, onde trabalha com funções hash perfeitas mínimas para representar eficientemente um dicionário. Desenvolvedor e mantenedor de uma biblioteca de software livre intitulada CMPH, que contém todos os algoritmos desenvolvidos durante o seu doutorado. Especialista em desenvolvimento de software orientado a objetos nas linguagens Java e C++.
com implementações em Java e C++ Algoritmos e estruturas de dados formam o núcleo da ciência da computação, sendo os componentes básicos de qualquer software. Aprender como programar computadores está intimamente ligado a algoritmos, já que programas são formulações concretas de algoritmos. Aprendê-los é crucial para qualquer pessoa que deseja desenvolver softwares de qualidade.
Projeto de Algoritmos com implementações em Java e C++
Esta obra apresenta os principais algoritmos e estruturas de dados conhecidos. As técnicas de projeto de algoritmos são ensinadas de forma simples, seguindo o paradigma de orientação a objetos, por meio de refinamentos sucessivos até o nível de uma implementação na linguagem Java, e todo programa Java tem um programa C++ correspondente nos apêndices. Destaques: § O livro cobre estruturas de dados básicas, contendo listas lineares, pilhas e filas; algoritmos de ordenação e de pesquisa em memórias primária e secundária; algoritmos em grafos e processamento de cadeias de caracteres; técnicas de análise de algoritmos; paradigmas de projeto de algoritmos; e estudo da complexidade computacional de algoritmos. § Ênfase em tipos abstratos de dados, programação modular, programação orientada a objetos, encapsulamento e independência de implementação de tipos abstratos de dados com reaproveitamento de código. § Informação sobre o comportamento teórico e prático dos algoritmos, fornecendo uma base de comparação entre os algoritmos. § Mais de 156 exercícios propostos dos quais 58 com soluções; 195 programas em Java e 195 programas em C++; 164 figuras ilustrativas. § Material de apoio para professores na forma de transparências e os códigos em Java e C++ podem ser obtidos no site www.dcc.ufmg.br/algoritmos-java.
Aplicações Livro-texto para cursos de Ciência da Computação, Matemática Computacional, Sistemas de Informação, Engenharias de Computação, de Controle e Automação, Elétrica, Eletrônica e Mecânica, entre outros. Pelo fato de apresentar muitas implementações de algoritmos práticos, o texto é igualmente útil para profissionais engajados no desenvolvimento de software nas linguagens Java e C++.
Algoritmos e Lógica de Programação Marco Antonio Furlan de Souza, Marcelo Marques Gomes, Marcio Vieira Soares e Ricardo Concilio Compiladores: Princípios e Práticas Kenneth C. Louden Estrutura de Dados e Algoritmos em C++ Adam Drozdek
Introdução aos Fundamentos da Computação Newton José Vieira Modelos Clássicos de Computação Flávio Soares Corrêa da Silva e Ana Cristina Vieira de Melo Projeto de Algoritmos: Com Implementações em Pascal e C – a 2 Edição Revista e Ampliada Nivio Ziviani
Nivio Ziviani Para suas soluções de curso e aprendizado, visite www.cengage.com.br
Outras Obras
Introdução à Ciência da Computação Ricardo Daniel Fedeli, Enrico Giulio Franco Polloni e Fernando Eduardo Peres
Projeto de Algoritmos
Fabiano Cupertino Botelho
Projeto de Algoritmos
com implementações em Java e C++
Ph.D. em Ciência da Computação, University of Waterloo, 1982. Professor Emérito da UFMG, Professor Titular do Departamento de Ciência da Computação da UFMG, onde coordena o Laboratório para Tratamento da Informação (LATIN). Cofundador de duas empresas especializadas em tecnologia de busca na Web, a Miner Technology Group, vendida para o UOL / Grupo Folha de São Paulo em 1999, e a Akwan Information Technologies, vendida para a Google Inc. em 2005. Autor de três livros na área de algoritmos e coautor de mais de cem artigos técnicos nas áreas de algoritmos, recuperação de informação, compressão de textos e áreas correlatas. Co-criador da conferência SPIRE (String Processing and Information Retrieval) e Coordenador Geral da conferência ACM SIGIR 2005, a mais importante do mundo na área de recuperação de informação. Membro da ACM (Association for Computing Machinery), EATCS (European Association for Theoretical Computer Science), IEEE Computer Society e SBC (Sociedade Brasileira de Computação).
Nivio Ziviani
Nivio Ziviani
Consultoria em Java e C++ de
Fabiano Cupertino Botelho
Dados Internacionais de Catalogação na Publicação (CIP) (Câmara Brasileira do Livro, SP, Brasil) Ziviani, Nivio Projeto de algoritmos : com implementaçþes em Java e C++ / Nivio Ziviani ; consultoria em Java e C++ de Fabiano Cupertino Botelho - SĂŁo Paulo: Cengage Learning, 2011. 1. reimpr. da 1. ed. de 2007. BibliograďŹ a. ISBN 1. Algoritmos de computadores 2. C++ (Linguagem de programação para computadores) 3. Dados - Estruturas (CiĂŞncia da computação) 4. Java (Linguagem de programação para computadores) I. Botelho, Fabiano Cupertino. II. TĂtulo. 06-7021
CDD-005.1
�ndice para catålogo sistemåtico: 1. Algoritmos: Programação de computadores: Implementação em Java e C++: Processamento de dados 005.1
Projeto de Algoritmos – Com implementaçþes em Java e C++ Nivio Ziviani
Gerente Editorial: Patricia La Rosa
Š
Cengage Learning Ediçþes Ltda.
Todos os direitos reservados. Nenhuma parte deste livro poderå ser reproduzida, sejam quais forem os meios empregados, sem a permissão, por escrito, da Editora. Aos infratores aplicam-se as sançþes previstas nos artigos , , 6e da Lei no .6 , de de fevereiro de 8.
Editora de Desenvolvimento: Ligia Cosmo Cantarelli Supervisor de Produção Editorial: Fåbio Gonçalves
Para informaçþes sobre nossos produtos, entre em contato pelo telefone
Supervisora de Produção Gråfica: Fabiana Alencar Albuquerque
Para permissĂŁo de uso de material desta obra, envie seu pedido para direitosautorais@cengage.com
Produtora Editorial: Renata Siqueira Campos Copidesque: MĂ´nica Cavalcante Di Giacomo RevisĂŁo: AndrĂŠa Vidal
Š
Cengage Learning. Todos os direitos reservados.
Composição: Nivio Ziviani e Fabiano Cupertino Botelho
ISBN- :
Capa: F.Z.DĂĄblio Design Studio Cengage Learning CondomĂnio E-Business Park Rua Werner Siemens, – PrĂŠdio – Espaço Lapa de Baixo – CEP – SĂŁo Paulo – SP Tel.: ( ) 66 – Fax: ( ) 66 SAC: 8 Para suas soluçþes de curso e aprendizado, visite www.cengage.com.br
Impresso no Brasil. Printed in Brazil. 1 2 3 4 10 09 08 07
! "#$ %
+,-./ &'()(*
3 # 1 0 ! 01 % 2 3 3 2 4 3 4 3 5 7 8 4 9 6
: 4 2 < 4 3 ; ! 3 9 4 5 < > ! = 3 3 3 3
4 8 3 3 3 5 ? >
8 < 3 3 5
0 8 = 5 0 5 4 3 6 5 3 4 3 5 A
@ 3 0 0 3 3 < 5
B 3 3 < 4 3 < 2 4 M 5 F G P F G P 1 K K K Q K Q K K K K CD
E HIJEHI MNO I M OI J R E E HIOI J R MNO I C C CD < CL <T C C C C C JEHIC S4 CL 4 4 4 8 S T = 5 3
U 4 8 <
4 8 T
V 3 3
T < 4 3 5
WXX YZ[\]^[_]`ab[ZX^c[d
T 4 8 3 4 4 4 3 T 0 T 3 = S e U 5
4 S 5
0 < A T 4 e
S < 5 4
3 < U
<
4 f 4
4 4 T 3 A
S
3 4 A 0 g 4 e
5 3 A ! T 8 T e = 9 ! A
5
9
0
A A 48 3 3 3 5 9 0 5 3 < > 3 48 <
U0 h 3 3 3 5
$ < ++ 0 5e 4 8 i ! < 0 5 T < <
3 j i 2 0k l mHn oGKFEnpEqEDrIHPEsttu vCCMJIREKCFHM CnwNOCMGCnxyFGHPEsttz
}'~/ {|
3 4 V 3 V !h ! h 3 A 5 h ! 5e ! h$ V ! !3 VV 3 5 S S 48 V V 3 $ V $ < 5 ++ i 4 3 A T VV V 6
5 j V V 6 j g j V V V
@ V ! 3 h VV i
V ¡ V ¢ 3 5 ¢¢ V VV !! 3 ! 3 3 A ¢ i 4 A T ¢
£ YZ[\]^[_]`ab[ZX^c[d ¤ ¥ ¦ § ¨ ? ? ! 8 6 5 ? V 6 5
j < ? !
0 V ! 8 © V V 6 5 © V V 6 5 j < © !
0 © 6 5 ! 8 © V 6 5 j ! <
0 i 4 T 3 A ª « S 5 6 ¬ 5 V S 5 5 6 5 ¢ S ¬ @ V ® V 5 ¢ S 5 V S 5 A V 5 i ¯ V 6 ¬ 5 ¬ 4 5 V V 6 5 V 5 e V 6 5 < V @ A V Ti 4 3 A ± ² ³ ° ¬ ´ ¢V V i ¢ µ i i ¢ µ i i ¢ V µ
h 3 ©© V · GK ¸ © h < ¶ CN Mm © 5 5e h < 5 ©¢
¹ºc»ZX[ £X V ? 4 © ! ©© · NGK 5 < V Mm C i 4 T 3 VV A ± ² ½ ¼ ³ ° 5 ¬ VV ¯ VV © V 6 5 ¬ 3 5 ´ 6 A VV V V ! ¬ V ¢ ! V ¾ ? µ i V µµ i V µ i VV V ! 5e V © i 4 T 3 VV VV A ¿ ³ ¢¢ 5e 4i ¼³ V ¢ ! V V < V Sh 8 ¢¢ V 6 5 2 ! ¢ = V 8 = V V 6 5 ! ? g V¢ j <
!
0 ¢ V 6 5 ? ! 8 = g ¢ 8 ! VV © ¢ e = V 6 5 3 < h h V ¢ i¢ 5 ! V ¢ V h ¯ < ! T V ¢ ¢¢ i 3 V ? 5 h 3 V©V ¢¢ ¢ S ¢ V © µ T ¢ S 4 µ T VV©© ¢ ! 3 ¢¢ ¢¢ V ! 3 1 3 ! ¢¢
4 ® ! 3 < © Sh ¢ A T i 4 3 ¢ ¤ ¨ À À V ?
?
£X YZ[\]^[_]`ab[ZX^c[d A V ! A V V V V V @ g V V h® AÁ ? 3 3
VV g ® Á g vÂJEN 5 V
i 4 A h T 3 ¢ A ¢ Ä N P ÅÀ Æ Æ Ã ¤³³ ¢ © © 4 ! 3 N P 0 0 V ! N P 0 <T © N P 0 ® © T ! 3 ! A © V © VV V !® 3 T A g h © 4 © © V ! 3 ! A N P 0 4 0 ©© NP T i 4 3 A ª À++ À ÆÇ ª ³ § À++ À ÆÇ ª¤¤ À À++ À ÆÇ ¤ ªªÃ ¦ À++ À ÆÇ ª ¥ À++ À ÆÇ ª¼ È À++ À ÆÇ ¼ ªÃ¤ ¿ À++ À ÆÇ ³ É Ê À++ À ÆÇ ¨ ¤ À++ À ÆÇ Ã Ë À++ ÆÌ Í ÍÎ Æ Æ ¥ Ç ½ ¼ À ½À ó Î Ì § Ä Ï ÃÃ Ð Î Ñ ¼ÉÃ
Ò '(Ó}Ô~/
5 3 ! 0 8 3 A 5 53 e
A
0 T < 3 3
0 A 94 3 2 S < e 9 5 3 A 3 5 8 3 3 5 8 ! 3 3
3 5 48 $ T $ 5 3 3 3 3 h ++ 4 = T A ÕIHÖEJHPE×FmHIKJDHNRHDØDOFEDEMJCÙÚEN E Õ 3 3 F D CNRC E o ÛÜÝÞßàáÜ 2 5 0 S 4 3 5
3 T T 3 <
N P0
3 9 US 3 4 0 A 5 3 0
$ 3 3 3
£XW YZ[\]^[_]`ab[ZX^c[d 3 U 5 ¸ 4 3 V 3 8
¶
3 5 ¡ 3 3 3 A
4 U 5
5 U 5 5 5 4 A U 5 5 < 4 G U
´ GK G GK CN Mm CN Mm < i U ´ A 0 4 4 ¢ ! 3 3 < U 5
<
0 3 5T 3 <
3 < 3 U 4 A A e A 3 3 4 N P 0 T U © N P 0 N P 0 < < 0 3 A 0 4 T 5 A 0 8 3 A Ð Å < 3 A A 4 2 Ñ 6 4 e ! < 5 3
4 3 < 5e âãÝäåæäßÝç áßèéÜäéæêæëìÜ 3 3 3 ! 3 5
5 2 $ $ 3 3
++ 4
2 A 4 8 3 4 g e 4 S 8 5
4 e 5 5
< A 5 4 $ ! 3 ++ 3 48 3 5 ! 3 5
48 48 8 3
4
< 5e
YZ]í»îX[ £W 3 4 3 4 j 48 3 3 5 4 < 5 = 5 0
3 A 8 3 5 5 3 0
3
3 ï 3 5 3 3 <
A 0 S
4 2 3 < 5 3 < ðÜèéÜñßççÜé
A 2 0 S 3 5 03 5 A < 5 3 8 ! 3
ò ¸ = 5 ¶ A 3 3
T 3 $
2 5 5 ++
<
e 2 g 0 ¯ 4 U 6 i 0 ! 3 = 5 = <
¬ 5 6 < 5 3 5 3 B ¡ !
5 !
0 3 $ 3 3 5 4 3 3 5 ï 0
5
66 i 0 ! 3 = 5 =
< ¬ 5 6 < 5 3 5 3 B ¡ !
5 3
U 5 3 5 U 5
ï 3 ´ A 5
0
4 5
U
4 0
4 ¶GCNGK Mm¸ < 5 U 5 A
U A ´ i 3 666 i 0 ! = < = 5 ❑
❑
❑
ยฃWX YZ[\]^[_]`ab[ZX^c[d 3 ย ย 6 < ยฌ 5 5 4 8
3 3
3 U 8 3 3 4 N P 0 T 3 A 0 3 < 3 8 ! = !
5 3 ย ย
U 3 4 3 3 8 3
3 3 < 0
NP T 3 A 0 3 3 0 4 S
< S 3
3 8 8 3 2
4 T V 3
5 <
8 5 ยก 3 T T A T ! = 1 ! T 4 !3 A T A 4 e T e 4
A S 4 2
3 4 A T ! A
2
4 5 2 3 4 T
h = T < S
48 4 4 4 = 5 3 < 3 4 4 3
< = 3 T A 8 = 8 3 A
< <
= < 3 A 0
4 5 = 8 = 38 ! 0
l รณ K = < ร HNJ 0 RI O J ร p
ยธ r
3 ยถ IHรดNEI lRIKOJ
ร pรณ ! = รต
ร HNJ 4 NKJE 5 >>> < 3 4 3 0 8 โ
YZ]รญยปรฎX[ ยฃWX รฐร รถรงร รฅรกรฆร ร ร 3 8
S h 3 4 3 3
T < 3 0 4 e T 5 5 < 3 ! 8 48 3 < 3 3 5 < 2
T = < 3 <
3 < 8 ! 3
8 3 5 3 รฏ 5
0
= 3 3 4 A 5
4 3 8 !
0 T
A 3
2 ! 3 A รฐร รจรฉร รทรงรงรฃร ร รฆรธ 4 A 8 3
2 e < 5 3
3 ! 3 3 e 4 5 3 5
A 4
5e A 3 e 3 3 S 3 5 $ 5 ++ 4 $ A S 3 ++ รป รบ N$KJE A 5 P r F K ร 5 รดรดรด RR y m I m HI J HN รฝ รผ รน รน D รน C D C C
8 = 3 ++ A รฐรครฉรฆรกร รพรฃรชร ร ร ร รง 3 e
T
3 9 3 ย ย 4 8 !3 5 T 0
£WXX YZ[\]^[_]`ab[ZX^c[d ? ! B ! < ! 4 ® Â&#x2019; i j 4 $ Â&#x2019;
0 ?
4 j ÿ ? i 4 ® $ 3 S
Â&#x2019; $ 2 T
$ 3 4
4 µ !4 4 ? ¬ ? h !
!
2
?
i i T B ¬ ! j 3 ?i
2 3 3 ?
2 ¬ ® Â&#x2019; 4 j ! S Â&#x2019; j 4 ¬ i 3 j 4 0 ¬ 2 j ¡ 3 Â&#x2019; j h ¯ 3 ! 3 Â&#x2019; Â&#x2019; ! f 3 $ f 3 h = 4 4 i 8 Â&#x2019;
2 0 S $ 3 < 2 !
4 4 Â 3 Â&#x2019; 5 5
@ 5 3 4 5 5
4 A A A T i 2 0k 3 5 3 T 4 0 j ! 8 3 i ! 5 j 4 ¬ 3 3 3 A ¯ g B i 3 3 e 4 3 3 3 $ ++ 3 3 5  4 0 < B
! ? 2Â&#x2019; Â&#x2019; h 6 ? 4 e ! A < 2 4 = 5 A
5 g Â&#x2019; 0 S 3 5 0
4 T 3 3 3 5 ! 3
3 66 !3 i 3
8 666 ! ! 3 5
! ¬ i
j ¬ 4 !
B ¯ ¬ ih Â&#x2019;
4 i j 4 ® T 6 Â&#x2019;
¬ 2
j j 4 j j 0
µ ¬ Â&#x2019; 3 !
¬ 3
3
?
h j 4 ! 3 A 5
5 0 i4 3 !
4 i !
! Â&#x2019; 2
3 j 4 h A A
¬ Â&#x2019; A
¬ 2 4 ! 98 0 ? 3 ! 2 ¬ j f i ¬ g
3 0
3
U !
S
5 ?h 7 3 < 5
YZ]í»îX[ £X£ 5 4 $ GCNGKMm < A 3 5 A 3
++ 0 3 5 $ j ¬ 5 3 4 ® 5 5 A ? A T h j 4 e 3 3 0 5 ! $ T ! ¬ !
i $9 4 ® f i ? 4 4 ! 3 !
3 6 ! @
$ 0 5 ® ! 8 ¯ h 1= S 1
? j !
? $ B
2 2 ! !
¯ 4 i ? j i ! ¬ 2 4 0
¯ 3 e ! A < T S ¬ ?9 ¬ S j 3 ¬ 3 5 4 " 0 8
3
T h 38 " " = j
õ õ U 6 h0 S V ¢õ V0 i 0 6 < 5 5 4 j f f f
"! 5 6 < 5
V © õ© 0 4 2
h h < 5 A
< 3 ÿ vEFHFG·HIPKqHMJE xy H Esttz
££ YZ[\]^[_]`ab[ZX^c[d èéßñ þãÜáÜÛÜÝçåøÞÜé æ æß Û++ 3 3 3 5 8 A 4 9 < ! 3 ! A 3
8 3
3 < < 5 2 ÿ 4 S4 3
< $ 0 4 5e 3
< 5 3 < 2 e 3 0 5 3 5 < 5 5 < 4 8 5e 3 < 3 $ $++ < < 4 3 S T 2
A
length T A $ ++ $ ! T 3 3 ¬ 5e <
4 = 3 < 3 $ T++ ´= A 3 <
$ 3 ++ 5 < 3 4 T 3 ï <
3 2 5 4 3 3 ï
$ 4 T
4 3 3 T < ¯ h ! ! 3 2
$ i = < 5
3
?
ÿ 3
5 < 4 i vEFHFG·HIPKqHMJE xy H Esttz
+'/ { -./ *
" #! "$ !
3 < 2 e ! 5 0 0 S e 5
3 g 3
3 A 4 e ´= 5 A
5
5 ¸ 4 ¢ 8 ¬ 3 ¶
©
A 8 5
5e ! A 5 a + b 4 8 5 < 2
a b ¥ 3 3 3
0 3 5 4 4 5 8 3 5
! 3 < 0
5 0 Æ ! 5 < 4 e 5 2
4 9 5 < 54 4 $ 5 5
T3 3 5
5 2
3 94 < T 5 5 3 T 5 T3
f 3 4 ¸ 3 ¢ e ¶ © Æ < 5 3 %
%
'' &
YZ[\]^[_]`ab[ZX^c[d 4 5e T 4 3 2 3 3
2 3 3 3 3
4 0 ´= 5e 4 <
3 3 8 < 3
< ¬ 3
3 3 3 5 5 3 ¶ ©¢ ¸ T 3 T 0
T A 5 A 5 3 (
)
, + + * ! " #! "* ! " #!
3 3 3 5 AÆ 0
e e T < 5
2 8 A
3 < 5 ¶f ©¢ 0 ¸ T $ 4r F h KMJ n r HH FE CM n RGC I HC 3 A J
< HH E C M
3 5
S $ 3 3 < ! < 3 3 3 ¬ 5 Ä
Æ g 5 4 e 8 0
S 4 e 5 5
¶ 5 < ¸ 44 5!
®4 < A
2 g © 8 A 5 3 3 3 5 3 3 T A 3 3 < 4 4 3 3 5 2 !
2 5e 4 3 h e 5 < 3 e 2 5
4 5 5 5
4
3 5 5e 4 2
9 5 3 -
^Z[_º [ 5 2 A 4 4 T 3 5e ? U < 5 2 V 4 2 4 0 A 5 e T 8 5 5 g ! 3
5
?
4 3 3 0 3 5 5 ¬ A 5 ï 0 4 3 4 4 8 e < 5 0
4 8 e < 5
g < 2 5 < 5e 2 4 ./01234
8
56
! ! 9 "! * " ! " <= ! " + $ :";
7
0 8 3 < 4 S e 8 2
3
2
0 8 e 5 3
5e A 5 5 3 T
0 4 4 2 5 3 <
4 4 3 A 0
¸ 1 < ¶ ©¢ U Æ ¶ ¸3
@ ; 4 T T 3 < 20 0 3 9 2 3 A
3 4 @ 3 ¸ ¶
; T T T <
4 48 3 3 8 T 6 3
YZ[\]^[_]`ab[ZX^c[d A 3 ï A
e T 9 T 5 < e 9T 5 M
3 T
0 4 @ 5
4 ! 3 T
3 3 ² 3 5e A 4 ¬
< 3 4 T 0 3 2 5 S A 5 A 5 3 g
4 < ! 8 3 2 4
¸ 48 e ! 5 U ¶ ¸ e <
¶
5 ¸ GC IP3 2 0 3 ô IE ¶ C
0k ¶ ©© ¢¸ 3 < !
4 i 2 e 3
A A
5
4 3 A 5 3 2 ! 0
e 5
5 A 5 3 4 2 5 3 g <
8 0 ¸ A 67 1 ¶
2 © S e A
5
A 5 5 5 3
e3 5e 3 S 8 3 8 5 e 9 5 3 5e
4 e T 5 5 A 3 < 5 A 5
Æ 0 f f (n) 4 A
3 ¬ 3
n 4 ! ¶ ©¢¢¸ f (n) ¬
0 A
3 n
f < 5 Æ Æ 3 ¬
f (n) 3 3 0 Æ A
Æ f < 5 n >
^Z[_º [ A 0 8 = A T f < 5 ! <
A 2 ò < 9 5 A
3 3 v [0..n8 − 1], n < 5 A ≥ 1 $ < 3 ¬
f f (n) 9 5e v v n ? 3
./01234
56
?
@
¯ 3 3 ² f (n) = n − 1, para n > 0.
A [XZOL UVNP EGHGIJKLMNOP BCDBEF LQRMRLSOTM LP LWTXPYLZ \]^_]`a bcdef \ghij^ ^i]kk l cmn \ghij^ ko]oj^ jpo q cm rjpo stu v jpo wx n t u jpo q z s cmy f xj{ rq {|} rjpo ~ yef ~ wf ~ cm st~ ux q cmyst~ uf o q }a g}p cmf
3 e 8 U
@ n n ≥ 1 < 2 n − 1 5 Ñ U e en − 1 5 3 ? 3 n − 1 5 2 e 9 5 <
2 2 S
max Max ! A 5 3 3 A 5 < 5
3 3 A 5 < 5
max 4 3
< 3
4 8 n $ 3 5 U 3
4
¡ ¡ ¢£ ¤ ¢ ¡¥ £¦ § ¨ ©ª « ¬¬
YZ[\]^[_]`ab[ZX^c[d = U 4 T 3
h Â?  Â&#x2020;Â&#x20AC;Â&#x201E;Â&#x2014;Â&#x161;Â&#x2020; A 5 S Â&#x2122; n S Â&#x2026;Â&#x2020;Â&#x20AC;Â&#x201E;Â&#x2014;Â&#x161;Â&#x2020; Ă&#x2020; A 5 4 n ÂŹ f < 5 A 4 f (n) 3 Â&#x152;Â&#x2026;Â&#x2020;Âś ¸ ĂŻ A 0 Â&#x201E;Â&#x2014;Â&#x161;Â&#x2020;Â&#x2122; S Â&#x152; 4 n 5 Â&#x152;Â&#x2026;Â&#x161;Â&#x2039; Â&#x20AC; Â&#x2026;Ă&#x201E; Â? Â&#x2026;Â&#x17D; Â? Â&#x2020; Â&#x152; Ă&#x2020;Â&#x20AC;Â&#x2020; Ă&#x201E; Â&#x2014;Ă&#x201E;Â&#x2026;Â?Â&#x2026;Â&#x152; 8 Â&#x2014;  Â&#x161;
n 4 4 5 2 4 4 T 3 < 4 4 4 5 òT 3
2 3 4 Â&#x2026; Â&#x161;Â&#x2039;Â&#x20AC;Â&#x2020;Â&#x161; Â&#x20AC;Â Â&#x2DC;
3 Â&#x201E; Â&#x2014;Ă&#x2018;Â 9 4 2
3
2 3 3
S Â&#x2026; Â&#x2026; Â? Â&#x161;Â&#x2014;Â&#x161; °  Â&#x160;Â&#x201E;Â&#x2014; 3 A < 2 Ă&#x2020; Â&#x161;°Â? A 8
3 3
8 f < 5 A f (n) 9 3 ÂŹ 9 2
3 S U ÂŽ
%
ÂŻ
%
°
melhor caso : f (n) = 1 pior caso : f (n) = n caso m´edio : f (n) = (n + 1)/2
S S 3 3 9
2 n 5e 4 4 A
3 ÂŹ
p < 0 8 3 0 3 i0 5 e
i
i
i
4 4 f (n) 4 4 5
p ÂŹ 4 4 3 U p = 1/n, 0 â&#x2030;¤ i < n f (n) = 1 Ă&#x2014; p1 + 2 Ă&#x2014; p2 + 3 Ă&#x2014; p3 + ¡ ¡ ¡ + n Ă&#x2014; pn .
i
i
1 1 f (n) = (1 + 2 + 3 + ¡ ¡ ¡ + n) = n n
n(n + 1) 2
=
n+1 ¡ 2
^Z[_Âş [ 5 ! A A 3 4 Â&#x2019; 3 v [0..nâ&#x2C6;&#x2019;1], n â&#x2030;Ľ 1 g 3 3 Â? Â? < 4 Â? V 3 S maxMin e Â&#x2022; Â? 5 2 maxMin1 v ÂŹ 8 f < 5 A f (n) 9 5e v v n ? 3
./01234
56
Âą
f (n) = 2(n â&#x2C6;&#x2019; 1), para n > 0,
A UVNP ÂśZNP EGH²³P BCDBEF QJTP TZOR´¾LWNMTORQRMRLSOTMLP LTLP L \]^_]`a bcdef ~we n \ghij^ ^i]kk l cml j j j h i o o ~we rjpo stu v jpo wx n \g ^ k ] ^ po tu q cml t u v t jpo q z s q ~ w s cmy y zuf xn {|} rjpo ~ yef ~ wf ~Â&#x20AC; Â&#x20AC; x t uf j{ rst~u ¡q q s ~ cm cmy j{ rst~u q ~wx q ~wyst~ uf  jpo q ~wtu yp a¸jpotšuf cml t u z q ~ w q ~wteu yq ~wf l cm cml y cmf q ~wf }aog}pq cml  Â
4 3 Â? V < i 0 S 5 v [i] < < min
5 Â? Â&#x2018; 3 3 g v [i] > max 5 U melhor caso : f (n) = n â&#x2C6;&#x2019; 1 pior caso : f (n) = 2(n â&#x2C6;&#x2019; 1) caso m´edio : f (n) = 3n/2 â&#x2C6;&#x2019; 3/2
S v S v [i] max v 2 ? 3
f (n) = n â&#x2C6;&#x2019; 1 +
nâ&#x2C6;&#x2019;1 3n 3 = â&#x2C6;&#x2019; , para n > 0. 2 2 2
º
YZ[\]^[_]`ab[ZX^c[d
A UVNP ¶ZNP EGH»³P BCDBEF QJTP TZOR´µLP TJ¼LMRWRQRMRLSOTMLP LTLP L \]^_]`a bcdef ~w¹ n \ghij^ ^i]kk l cml ~w¹ rjpo stu v jpo wx n \ghij^ ko]oj^ jpo tu q cml jpo q ~wystzuf cmystzu v q xn {|} rjpo ~ yef ~ wf ~ j{ rst~u ·q cmx q cmyst~ uf ~wx q ~wyst~ u f aika j{ rst~u q jpo q ~wtu yp a¸jpot¹uf cml q ~wtzu yq ~wteu yq ~wf cml cmf q cml ~wf }aog}pq cml
e 4 9 5 A 2
; 4 3 4 ! 3 3 U v 0 4 8 ¸
5
4 8
3
<
e
dn/2e 5 4 8 V¸ S A 4
dn/2e − 1 5e ¸ S T 4 4 8 e
dn/2e − 1 5 ½
e e
Contém o máximo
e e e Contém o mínimo ··· ¾¿DÀBEGGÁRMON´µLWT TPWLNÂÂXSYLZ [XZOL H à v e
e
···
e
5 3 0 ! 3 ÄÅÆ¢ ©ª ¤ Æ¢ ©ª ÈÉ Ê Ë¢ Ë¢ £ª d e Ç ¡ x Ç ¢¡ ¡ dxe ¡ £ ¡ ¢ ¢ x ¬ Ì ¡ ¡ Æ ¡ Æ¢ ©ª b c Ç ¤ ¡ Æ¢ ©ª ÈÉ £ ¡ ¢ ¢ x ¬ ¨ e = 2, 71828 . . . £ª bxc ¡ dee = 3 bec = 2 d−ee = −2 b−ec = −3 ¬
Mestre em Ciência da Computação, Universidade Federal de Minas Gerais, 2004. Atualmente é aluno de doutorado do Departamento de Ciência da Computação da Universidade Federal de Minas Gerais, onde trabalha com funções hash perfeitas mínimas para representar eficientemente um dicionário. Desenvolvedor e mantenedor de uma biblioteca de software livre intitulada CMPH, que contém todos os algoritmos desenvolvidos durante o seu doutorado. Especialista em desenvolvimento de software orientado a objetos nas linguagens Java e C++.
com implementações em Java e C++ Algoritmos e estruturas de dados formam o núcleo da ciência da computação, sendo os componentes básicos de qualquer software. Aprender como programar computadores está intimamente ligado a algoritmos, já que programas são formulações concretas de algoritmos. Aprendê-los é crucial para qualquer pessoa que deseja desenvolver softwares de qualidade.
Projeto de Algoritmos com implementações em Java e C++
Esta obra apresenta os principais algoritmos e estruturas de dados conhecidos. As técnicas de projeto de algoritmos são ensinadas de forma simples, seguindo o paradigma de orientação a objetos, por meio de refinamentos sucessivos até o nível de uma implementação na linguagem Java, e todo programa Java tem um programa C++ correspondente nos apêndices. Destaques: § O livro cobre estruturas de dados básicas, contendo listas lineares, pilhas e filas; algoritmos de ordenação e de pesquisa em memórias primária e secundária; algoritmos em grafos e processamento de cadeias de caracteres; técnicas de análise de algoritmos; paradigmas de projeto de algoritmos; e estudo da complexidade computacional de algoritmos. § Ênfase em tipos abstratos de dados, programação modular, programação orientada a objetos, encapsulamento e independência de implementação de tipos abstratos de dados com reaproveitamento de código. § Informação sobre o comportamento teórico e prático dos algoritmos, fornecendo uma base de comparação entre os algoritmos. § Mais de 156 exercícios propostos dos quais 58 com soluções; 195 programas em Java e 195 programas em C++; 164 figuras ilustrativas. § Material de apoio para professores na forma de transparências e os códigos em Java e C++ podem ser obtidos no site www.dcc.ufmg.br/algoritmos-java.
Aplicações Livro-texto para cursos de Ciência da Computação, Matemática Computacional, Sistemas de Informação, Engenharias de Computação, de Controle e Automação, Elétrica, Eletrônica e Mecânica, entre outros. Pelo fato de apresentar muitas implementações de algoritmos práticos, o texto é igualmente útil para profissionais engajados no desenvolvimento de software nas linguagens Java e C++.
Algoritmos e Lógica de Programação Marco Antonio Furlan de Souza, Marcelo Marques Gomes, Marcio Vieira Soares e Ricardo Concilio Compiladores: Princípios e Práticas Kenneth C. Louden Estrutura de Dados e Algoritmos em C++ Adam Drozdek
Introdução aos Fundamentos da Computação Newton José Vieira Modelos Clássicos de Computação Flávio Soares Corrêa da Silva e Ana Cristina Vieira de Melo Projeto de Algoritmos: Com Implementações em Pascal e C – a 2 Edição Revista e Ampliada Nivio Ziviani
Nivio Ziviani Para suas soluções de curso e aprendizado, visite www.cengage.com.br
Outras Obras
Introdução à Ciência da Computação Ricardo Daniel Fedeli, Enrico Giulio Franco Polloni e Fernando Eduardo Peres
Projeto de Algoritmos
Fabiano Cupertino Botelho
Projeto de Algoritmos
com implementações em Java e C++
Ph.D. em Ciência da Computação, University of Waterloo, 1982. Professor Emérito da UFMG, Professor Titular do Departamento de Ciência da Computação da UFMG, onde coordena o Laboratório para Tratamento da Informação (LATIN). Cofundador de duas empresas especializadas em tecnologia de busca na Web, a Miner Technology Group, vendida para o UOL / Grupo Folha de São Paulo em 1999, e a Akwan Information Technologies, vendida para a Google Inc. em 2005. Autor de três livros na área de algoritmos e coautor de mais de cem artigos técnicos nas áreas de algoritmos, recuperação de informação, compressão de textos e áreas correlatas. Co-criador da conferência SPIRE (String Processing and Information Retrieval) e Coordenador Geral da conferência ACM SIGIR 2005, a mais importante do mundo na área de recuperação de informação. Membro da ACM (Association for Computing Machinery), EATCS (European Association for Theoretical Computer Science), IEEE Computer Society e SBC (Sociedade Brasileira de Computação).
Nivio Ziviani
Nivio Ziviani
Consultoria em Java e C++ de
Fabiano Cupertino Botelho