Projeto de Algoritmos
Projeto de Algoritmos
Nivio Ziviani
Outras Obras
Ph.D. em Ciência da Computação, Univer-
Projeto de
sity of Waterloo, 1982. Professor Emérito
da UFMG, Professor Titular do Departa-
mento de Ciência da Computação da Algoritmos Projeto de Algoritmos e Lógica de Programação
Marco Antonio Furlan de Souza,
Marcelo Marques Gomes,
Marcio Vieira Soares e
Algoritmos
UFMG, onde coordena o Laboratório para
Tratamento da Informação (LATIN). Co- Ricardo Concilio
com implementações em Java e C++
fundador de duas empresas especializadas Compiladores: Princípios e Práticas
em tecnologia de busca na Web, a Miner Kenneth C. Louden
Technology Group, vendida para o UOL / Algoritmos e estruturas de dados formam o núcleo da ciência da computação, sendo os componentes
Grupo Folha de São Paulo em 1999, e a básicos de qualquer software. Aprender como programar computadores está intimamente ligado a Estrutura de Dados e
Akwan Information Technologies, algoritmos, já que programas são formulações concretas de algoritmos. Aprendê-los é crucial para
qualquer pessoa que deseja desenvolver softwares de qualidade.
com implementações em Java e C++ Algoritmos em C++
vendida para a Google Inc. em 2005. Autor Adam Drozdek
de três livros na área de algoritmos e co- Esta obra apresenta os principais algoritmos e estruturas de dados conhecidos. As técnicas de projeto Introdução à Ciência da Computação
autor de mais de cem artigos técnicos nas de algoritmos são ensinadas de forma simples, seguindo o paradigma de orientação a objetos, por
Ricardo Daniel Fedeli,
áreas de algoritmos, recuperação de infor- 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. Enrico Giulio Franco Polloni e
mação, compressão de textos e áreas corre- Fernando Eduardo Peres
Projeto de Algoritmos
latas. Co-criador da conferência SPIRE Destaques:
Introdução aos Fundamentos da
(String Processing and Information § O livro cobre estruturas de dados básicas, contendo listas lineares, pilhas e filas; algoritmos de
Nivio Ziviani
mento de software orientado a objetos nas
linguagens Java e C++.
06-7021 CDD-005.1
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
Impresso no Brasil.
Printed in Brazil.
1 2 3 4 10 09 08 07
!"#$ %
&'()(*+,-./
!01%2
3 #
10
34 3
2
7
8
33
5
4
4
6 :
4 9
2
43 ; !3
4 < 9
=
5
<
> !
8
4 3
3 3 3
3 5
8 <
3 ?>
3
3 3 5
0
8
=
5
0
5 43 6 5
3
4
3
5
A
@ 3 0
3
0
3
<
5
B 3
3 <
4 3 <
2
4
1 5
FG
P FG PM
K CD E HIJEHI K KMNO KI M OI Q JKR E E HIOI Q JKR KMNO KI
JEHICS4CL CC C C CD
< CL<TC C C
4 4 48 S
=
T
5
8
4 3
U
<
T
V 4
3
8
3
T
< 4 3
5
WXX YZ[\]^[_]`ab[ZX^c[d
8
T
4
3
S = T
3
4 4 4 3T 0
e
U 5
4 S5
0
<
S A T
4
e
U
3<
<
5 4
<
4
f4
S T
4 4 3 A
34
A
g
4
0
5 e
3A !
= 9
T
8
T
e
9! A
5
A
0
A
483
3 35 9 0
5
3
<> h
3
3
48<
U0
3
3 5
$
< ++
0
5e
!
48
i
<
0
5 < T <
3
ji20k
l mHn oGKFEnpEqEDrIHPEsttu
vCCMJIREKCFHM CnwNOCMGCnxyFGHPEsttz
{|}'~/
3
V !h
! 4 3
V
h
h!
5e
A
5
3
!
h$V
! !3 VV
3 5S S48 V
V $
3$ V
i4 <5
++
3
AT
VVV 6
5
j
VV 6 j
V V V @
g j
V !3 h
VV i
V
V¢ 3 5 ¡
VV !!3
¢¢V
i4 33 !
A ¢
AT ¢
£ YZ[\]^[_]`ab[ZX^c[d
¤ ¥ ¦§
¨
? ?
65 ? !
8
V 6 5
!
0j< ?
V 8 ©V
V 65 !
©
VV 6 5
!
0j< ©
©
65 !8 ©
V 6 j 5
i4 !
0 <
T 3
A
ª «
S56
V S5 ¬ 5
56 5 ¢
S
¬
@
V
® V
5
¢ S5
V S 5A V
V 6 5i¯
VV 6 5 ¬5¬
4
5
V 5 e
V 65 <
V @
A V
Ti4
A 3
°
±²
³
¬´ ¢V
V
i ¢
µ
i i ¢
µ i
i ¢
V µ
h3 ©©
V · GK ¸ ©
h < 5 ¶ CN Mm ©
5e h <5 ©¢
¹ºc»ZX[ £X
V ? 4 ©
·NGK5 !
©©
i4 C Mm < V
A T 3 VV
¼ °
±²
½
³
5
¯
¬
VV
VV©
V ! ¬ V 6
´ 6A 5
¬ 35 VVV
V ¾ !
V¢
µ
i V
?
µµ i V
V !
? i VV
µ
i4
5e V©
?
A
T 3 VVVV
³
¿
¢¢ 5e 4i ¼³ V
¢
V Sh !
¢¢V 652 !< 8 V ¢V
8 =
V
V V 6 5 j ! =
? g V¢
!
0 <
¢V 65? !8=g ¢
¢ !
8
VV ©
¢ i¢
V 3
<
= 6 5 e
h h V
¢V h ¯
5!
<!T V ¢ V
¢¢ i
? 3
5h3 V©V V
¢¢¢ S
V© ¢
µ
¢ ¢ ! T
S 4
µ
T VV©©
3
¢¢¢¢V !31
¢¢ ! 3
! 4
®
3<
© Sh
ATi4 3 ¢
¢
¨ À
À ¤
V
£X YZ[\]^[_]`ab[ZX^c[d
A V
V V
!A V
V @
V
VV h®AÁ ?3
3
g
VV
5
g
®
Ág vÂJEN
i4
V
h A
T 3 ¢
A ¢
à ÄN P ÅÀÆ
Æ
¤³³
© ©4! 3NP0
0
¢
© V ! N P 0 N P 0 <T
®
©V ©
T !
3 ! A ©
VVV !®
3T
A 4
g h
©
©©V !3 !A N P04 0 ©©
Ti4
A 3
NP
À++ ÀÆÇ ª
§ À++ ÀÆÇ ª³
À À++ ÀÆÇ¤ ª¤¤
¦À++ ÀÆÇª ªªÃ
¥À++ ÀÆÇ ª¼
È À++ ÀÆÇ¼ ªÃ¤
¿À++ ÀÆÇ³ É
ÊÀ++ ÀÆÇ¨ ¤
À++ ÀÆÇÃ
Ë À++ ÆÌ
Í
ÍÎÆÆ¥Ç
½
¼
À½À ó
ÎÌ
§
Ä
Ï ÃÃ
Ð
Î
Ñ ¼ÉÃ
Ò'(Ó}Ô~/
5
3 ! 0
8 3 A 5
53e
T <
A
0
3
94
S 3
3
< 2
0A
e
5
3
A 9
3
5
3 8 3
5
! 8
548 $ 3 3
3
5 3
3
$
T
=
h 3
4
3
T
A
++
E Õ3
3 F
ÕIHÖEJHPE×FmHIKJDHNRHDØDOFEDEMJCÙÚEN
D CNRC E o
ÛÜÝÞßàáÜ
S
2 5
0
3 5
4
T 3<
3
T
N P0
3
9US
3
4 0
A
5
3
$ 0
3 3
3
£XW YZ[\]^[_]`ab[ZX^c[d
V 3 8
3 U
5
¸4 3
35 ¡ 3 3
3 A
¶
4 U
5U 5
5
5 4
5
A U 5 5 <
4
G GK U
G GK ´
CN Mm
CN Mm<
i
U ´A0
¢ !3 3< U
5 4
<
4
0
3
5T 3
<
3
3<
e
U 4
AA
A 3
3
© 4 N P 0 U N P 0 T
N P 0 < <0
3 A
0
5 T
4
A08
3 A
<
3 A Ð
Å
Ñ 6 4
2
e
A 4
!
<
3 5 4
3
<5e
âãÝäåæäßÝç áßèéÜäéæêæëìÜ
3
33
!3 5
$ 2
$5
3
3
4
4 83
2A 4
++
g e 4 S8
5 e 4
5 5
5 <
A
4
!
3
$
++
3
48
48 3
48 5
!3 5
83
4
< 5e
YZ]í»îX[ £W
j
3
3 4
48 4
3
5
3
=5
5
4
<
0
3 A8 3
5
5
3
3
0
3 ï
3
5 S
A 3 3<
4
2
3 0
< 5 3<
ðÜèéÜñßççÜé
S
3
5 03
5A
2 0A
< 5 3
!
3
ò
=
¸
8
T3 5 ¶
A
3
3
5 ++ $
25
¯ e <
2 g 0
U 4
❑
!3
=<
6
i0
=
5
¬
56<
5 3
3
5
!
B ¡
5 !
0
3
3
4 3
5
$
3
5 ï 3 0
5
❑
!3
=< =
66
i0
5
¬
56<
5 3
5
3
!
B ¡
5
3
U
5
ï 3 5 U 5
5
3 ´ A 4
0
5
<
4¶GCNGKMm¸
U
40
5 5 U
U
A ´ i
A
3
666
!
i0
❑
=< =
5
£WX YZ[\]^[_]`ab[ZX^c[d
¬ 6<
5 5 3
4 8
3 3
3 U
8 3
4 N P 0
T 3 A0
3
3<
8! =! 3
5 3
❑
8 3
3
U 3
43
3< 3
T 3 A 0
3
NP
0
4S 3
0
8
S 3
<
3 8
3 2
4
T V
3
8 5¡ 3
5<
T
T AT !=1
! T 4 !3
A T
e
T
A
e 4
4
34
A
S 4 2
A
! A T
4 523 2
h 4T
48
< =
44 T
4
S
5
3 < = 3
443
<= 3
T
A
8
=
<
8
3
<
A
4
5 <
=
3
A 0
8
=
= 38! 0
= l K ó
<
ÕHNJ
RI
3 O J
Õ p
¶ r ¸
0
IHôNEI
lRIKOJ
Õpó ! =õ
ÕHNJ
4 NKJE5>>>
<34 3 0
8
YZ]í»îX[ £WX
ðÜöçÞåáæÝÞß
S
3
8
h 34
3
3
< 3 T 0
5
3
< 5e
! 4 T
8483
< 3
3 5
<2
T
< 3 <
8!3
=
3 <
8
3
5 3 ï
5 0
3
A = 3
5 4
4
3
8
!
T
0
2
A 3
! 3
A
ðÜèéÜ÷ççãÜÝæø
A
4
2
3
8
<
e
5
3
A
3
$S 3 5
e
3
3
5
A
N$KJE A
5
++
S
3 P $
ú r û
++
F 4
8 5ôôô ù RR
ùy
D m
ù I C mHI KJD HNÖ
ü CýC
=
3
A
++
ðäéæáßþãêßÝÞÜç
3 93
3 4
T
2¬
¬ 233
T B
!j3 ®
?i
4 j!S
j4 ¬i3 j40
¬
2 j ¡3 j
h ¯3!
3
! f3 $ f3 h=
S 4 2 8
4
i 0
3 $
4
<
2
4 !
3
5 5 5 5
5 3 4 @
AA 4
AT
! j i20k 35
3 T
40
33 8
3i
!
3
A¯ B
5 j 4¬ g
i3
3 e 4 3 3
3 $++
<
4
3 35
0
B
! ?
2
h 6
?
!
4 e
< 2
4
A
5
g 0 S A =
3
5 0
5
4
T 3
3
3
5
666 !
8 !3 !
3
3 66
5!3
i
3
¯ B
¬ i
j
¬4!
!
4 ih ¬
6
i T
¬
2
j j4
j
j 0
®
j4
µ¬
3 ? ¬ 3 !
3
h
j
!
03
5
A 4 5
i4
3 4
i
!
¬ !
2
!
3j4 hAA
A ¬
24
!98 0
2 ¬
?3!
¬
3
j
i
f
g 3 0
U
S !
5 ?h7 3
<5
YZ]í»îX[ £X£
A 3
5
5 4$ GCNGKMm<
j¬
A
3
3 ++ 0
5 $
®5 5
A ? 5 3 4
j 4
A
T
h
3
e 3 0
5! $
!
i
$9 4® fi ¬ ! T
?
! 43 4 !
h
5 ®!8¯ 3 6! @ $
0
?
j ! 1= S
1
?
$
¯ 2
2 ! B !
4i? j i!
¬
2 40
¯
3
e
T S ¬?9 ¬ S
< ! A
j3
¬
35
4
"
0
T h
3
38
"õ "
õ 8
= j
6< U 6
h0
S
V ¢õV0i 0
5
"! 4 5
j
5 6< 5 f f f
V©õ©0
h
4 h
2
<
3
< 5 A
ÿ
vEFHFG·HIPKqHMJE
xy H Esttz
££ YZ[\]^[_]`ab[ZX^c[d
èéßñ þãÜáÜÛÜÝçåøÞÜé æ æß Û++
3
3 < <5
3
=
<
A T++ 3 $ ´=
3
<
3 $ 3 ++ 5 <
3 3 ï < T 4
25 4 3 3 ï
$ T 4
4
! h 3 3 <
¯
T
!
$
i 2 =
3
ÿ
?
3
< 5
3
*+'/ {-./
9 2 4
54
5 55
4
T3
3
<
$
5
2
3 94 <
5
5 T 5T3 5 T3
f3
¢4 ¸
e
3
¶ © Æ <
5 3
&
''
( YZ[\]^[_]`ab[ZX^c[d
4
4 5e
T
3
3 2
3
2 3
3 3
3
4 ´=
5e 4
0
<
3
3
8
< < 3
¬3
3
335
53
©¢¸
¶ 5 T
A T3T0
A
5
3
) *+!" #! "*+, !" #!
3
3 3 5
AÆ0
e <
5 e
28
T
3
<
5¶f ©¢ 0¸
A
4r F h $ T
KMJn rHHFE CMn RGCI HC3
J
A
M
HH EC
-
<
S
3
5
$
33 < ! 3
3 <
3
¬5
g
Æ Ä
5
e
4
8
e
4 S
0
A
5
44 5!
®4<
5 g
¶5 <
© ¸
2
A
5 3
8
3
3
TA3
3
< 4
3
3 5
43
3
5
2!
h 4 3
25e
e
5
e <
5
5 4
3
5 25
4
3
5 5e 4
2
9 5 3
^Z[_º [
./01234 56 7
5
2
4T
A
4
? 3
5e
U
<5 2
V 4 2
A 5 e
40
5
g
T 85
4 ?
! 3
5
3
3
0
3 5
4 ¬A
5 ï
0 5
3
4
8
< 5 e
4 0
<
8
5
g<2
e
4
5< 5e 2 4
8 9"!! !*"+!":";<=!"$
S 83 <4
0
e 8
3
2
8
5 e 3
2
0
A
5 5
5e
3
T
44
0
25 3<
4 4
3
¸ A 0
<
¶©¢U 1
¶¸3
Æ
4
T
@;
T
3
3 <20 0
9 2
3 A
3
¸
¶ 4
@
;
3
T
T
<
T
3
4
8 T 6 3
3 48
> YZ[\]^[_]`ab[ZX^c[d
A
3 ï A
T
9T
9
T 5<
e
e
M 5
4@
3
T 0
5
4 !
3
T
3²
3
4
5e A
3
¬
< 34 T 0
S
25
3
g A
5 A
5
3
4
< 4
!
8 32
! 485 e
U ¶¸
< e ¸
GCIP3
ô
C
IE¶ ¸
5
3
¶
2 0
0k ¶©© ¢¸ 3
< ! 4
i2
3
5 e
A
4 A
3A
5
3 2 !
5 e
0
5 A5 3
g<
4
25
3
A
67 1
¸
8
0
2 e A
¶ © S
5
A
5
5e
e3
5 5
3
3
S
83 85
9
3 5e 5 e
5
5 A
4 e T
A
5
3
Æ f
f (n)
4
<
5
0
A
3
n ¬3
! ¶ ©¢¢¸ f (n)
¬
4
0
A
<
5
3
n
Æ
Æ 3
¬
f
n
f
<
5 ÆA
Æ
33f (n)
0
^Z[_º [
./01234 56 ?
! 8
<
<
=ATf
<
5
ò
A0
A2
9
5 A
3
3
$
v [0..n8− 1], n<
5
≥ 1
A
f (n) 95e v v n
< 3 ¬
@
f
?3
¯
3 3²
f (n) = n − 1, para n > 0.
\]^_]`a bcdef
\ghij^ ^i]kk l cmn
\ghij^ ko]oj^ jpo q cm rjpo stu v jpo wx n
jpo qcmy s tzu f
{|} rjpo ~ yef ~ wf ~ xj{ rq cmst~ ux qcmyst~ uf
o q
}a g}p cmf
U @
3
e
8
n n ≥ 1 <2 n − 1 5
4
4 n ¬ f
<
5 A
f (n)
3
S
¶
¸ ï A0
Ä
5 4 n
ÆÄÄ
¯
8
44 4
45 2 n
3
<
T 4
4 4
òT
3
5
2 3
4
3
Ñ 9
4
2
%
3
23
3
A
<2
ư
S
° 3 A
8
3
3
°
8 f
<
5 A
f (n) 93
¬
9 2
3 S U
melhor caso : f (n) = 1
pior caso : f (n) = n
33
S
caso médio : f (n) = (n + 1)/2
S
9
2n 5e
4 4
3
A
8
¬ p < 0
3
0 3 i0
5e
i
i i
f (n) 4 4 4
f (n) = 1 × p1 + 2 × p2 + 3 × p3 + · · · + n × pn .
4
5 p ¬
44
3
U
i
p = 1/n, 0 ≤ i < n
i
1 1 n(n + 1) n+1
f (n) = (1 + 2 + 3 + · · · + n) = = ·
n n 2 2
./01234 ^Z[_º [
56 ±
5
g 3
5 U
v [i] > max
3
melhor caso : f (n) = n − 1
pior caso : f (n) = 2(n − 1)
caso médio : f (n) = 3n/2 − 3/2
S
v S
v [i]
max v 2 ?3
n−1 3n 3
f (n) = n − 1 + = − , para n > 0.
2 2 2
º YZ[\]^[_]`ab[ZX^c[d
A BCDBEF EGH»³P QJTPTZOR´µLP TJ¼LMRWRQRMRLSOTMLPUVNPLTLP¶ZNPL
\]^_]`a bcdef
\ghij^ ^i]kk l cml ~w¹ n
\ghij^ ko]oj^ jpo tu q cml ~w¹ rjpo stu v jpo wx n
jpo q cmystzu v q ~wystzuf
{|} rjpo ~ yef ~ wf ~ xn
j{ rst~u ·q cmx q cmyst~ uf
aika j{ rst~u q ~wx q ~wyst~ u f
jpo q cml ~wtu yp a¸jpot¹uf
q cml ~wtzu yq cmf q cml ~wteu yq ~wf
}aog}pq cml ~wf
4
3 9 5e 2
4 A
; 4
!
3
3U
¸
v 0
48
4
8
5
3
e <
dn/2e 5
V¸ SA4
48
½
dn/2e − 1 5e
¸ ST4
48
e
dn/2e − 1 5
e e e ··· Contém o máximo
e
e e e ··· e Contém o mínimo
¾¿DÀBEGGÁRMON´µLWT TPWLNÂÂXSYLZ
[XZOLÂ
H v Ã
Algoritmos
UFMG, onde coordena o Laboratório para
Tratamento da Informação (LATIN). Co- Ricardo Concilio
com implementações em Java e C++
fundador de duas empresas especializadas Compiladores: Princípios e Práticas
em tecnologia de busca na Web, a Miner Kenneth C. Louden
Technology Group, vendida para o UOL / Algoritmos e estruturas de dados formam o núcleo da ciência da computação, sendo os componentes
Grupo Folha de São Paulo em 1999, e a básicos de qualquer software. Aprender como programar computadores está intimamente ligado a Estrutura de Dados e
Akwan Information Technologies, algoritmos, já que programas são formulações concretas de algoritmos. Aprendê-los é crucial para
qualquer pessoa que deseja desenvolver softwares de qualidade.
com implementações em Java e C++ Algoritmos em C++
vendida para a Google Inc. em 2005. Autor Adam Drozdek
de três livros na área de algoritmos e co- Esta obra apresenta os principais algoritmos e estruturas de dados conhecidos. As técnicas de projeto Introdução à Ciência da Computação
autor de mais de cem artigos técnicos nas de algoritmos são ensinadas de forma simples, seguindo o paradigma de orientação a objetos, por
Ricardo Daniel Fedeli,
áreas de algoritmos, recuperação de infor- 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. Enrico Giulio Franco Polloni e
mação, compressão de textos e áreas corre- Fernando Eduardo Peres
Projeto de Algoritmos
latas. Co-criador da conferência SPIRE Destaques:
Introdução aos Fundamentos da
(String Processing and Information § O livro cobre estruturas de dados básicas, contendo listas lineares, pilhas e filas; algoritmos de
Nivio Ziviani
mento de software orientado a objetos nas
linguagens Java e C++.