Escolar Documentos
Profissional Documentos
Cultura Documentos
O r i g i n a l E n g l i s h l a n g u a g e e d i t i o n p u b l i s h e d b y M a n n i n g P u b l i c a t i o n s C o . , C o p y r i g h t © 2 0 1 5 b y
M a n n i n g P u b l i c a t i o n s . P o r t u g u e s e - l a n g u a g e e d i t i o n f o r B r a z i l c o p y r i g h t © 2 0 1 7 b y N o v a t e c
E d i t o r a . A l l r i g h t s r e s e r v e d .
E d i ç ã o o r i g i n a l e m I n g l ê s p u b l i c a d a p e l a M a n n i n g P u b l i c a t i o n s C o . , C o p y r i g h t © 2 0 1 5 p e l a
M a n n i n g P u b l i c a t i o n s . E d i ç ã o e m P o r t u g u ê s p a r a o B r a s i l c o p y r i g h t © 2 0 1 7 p e l a N o v a t e c E d i t o r a .
T o d o s o s d i r e i t o s r e s e r v a d o s .
© N o v a t e c E d i t o r a L t d a . 2 0 1 7 .
T o d o s o s d i r e i t o s r e s e r v a d o s e p r o t e g i d o s p e l a L e i 9 . 6 1 0 d e 1 9 / 0 2 / 1 9 9 8 . É p r o i b i d a a r e p r o d u ç ã o
d e s t a o b r a , m e s m o p a r c i a l , p o r q u a l q u e r p r o c e s s o , s e m p r é v i a a u t o r i z a ç ã o , p o r e s c r i t o , d o a u t o r e
d a E d i t o r a .
E d i t o r : R u b e n s P r a t e s
T r a d u ç ã o : B r o d T e c
R e v i s ã o t é c n i c a : N i l o M e n e z e s
R e v i s ã o g r a m a t i c a l : M a r t a A l m e i d a d e S á
A s s i s t e n t e e d i t o r i a l : P r i s c i l a A . Y o s h i m a t s u
E d i t o r a ç ã o e l e t r ô n i c a : C a r o l i n a K u w a b a t a
I S B N : 9 7 8 - 8 5 - 7 5 2 2 - 6 6 2 - 9
H i s t ó r i c o d e e d i ç õ e s i m p r e s s a s :
A b r i l / 2 0 1 7 P r i m e i r a e d i ç ã o
N o v a t e c E d i t o r a L t d a .
R u a L u í s A n t ô n i o d o s S a n t o s 1 1 0
0 2 4 6 0 - 0 0 0 S ã o P a u l o , S P B r a s i l
T e l . : + 5 5 1 1 2 9 5 9 - 6 5 2 9
E m a i l : n o v a t e c @ n o v a t e c . c o m . b r
S i t e : w w w . n o v a t e c . c o m . b r
T w i t t e r : t w i t t e r . c o m / n o v a t e c e d i t o r a
F a c e b o o k : f a c e b o o k . c o m / n o v a t e c
L i n k e d I n : l i n k e d i n . c o m / i n / n o v a t e c
,
S á
P r e f á c i o
A g r a d e c i m e n t o s
S o b r e e s t e l i v r o
1 I ç ã
I n t r o d u ç ã o
O ê á
O ê á ç ã
P e s q u i s a b i n á r i a
U
T ç ã
N o t a ç ã o B i g O
T ç ã
V ç ã B O
A ç ã B O ç ã ó
A ç ã B O
O -
R e c a p i t u l a n d o
2 O ç ã ç ã
C o m o f u n c i o n a a m e m ó r i a
A r r a y s e l i s t a s e n c a d e a d a s
L
A
T
I
D ç õ
O r d e n a ç ã o p o r s e l e ç ã o
R e c a p i t u l a n d o
3 R ã
R e c u r s ã o
C a s o - b a s e e c a s o r e c u r s i v o
A p i l h a
A
A ã
R e c a p i t u l a n d o
4 Q
D i v i d i r p a r a c o n q u i s t a r
Q u i c k s o r t
N o t a ç ã o B i g O r e v i s a d a
M
C é
R e c a p i t u l a n d o
5 T
F u n ç õ e s h a s h
U t i l i z a ç ã o
U
E
U
R
C o l i s õ e s
D e s e m p e n h o
F
U ç ã
R e c a p i t u l a n d o
6 P
I n t r o d u ç ã o a g r a f o s
O q u e é u m g r a f o ?
P e s q u i s a e m l a r g u r a
E í
F
I m p l e m e n t a n d o o g r a f o
I m p l e m e n t a n d o o a l g o r i t m o
T ç ã
R e c a p i t u l a n d o
7 A D
T r a b a l h a n d o c o m o a l g o r i t m o d e D i j k s t r a
T e r m i n o l o g i a
A d q u i r i n d o u m p i a n o
A r e s t a s c o m p e s o s n e g a t i v o s
I m p l e m e n t a ç ã o
R e c a p i t u l a n d o
8 A
O p r o b l e m a d o c r o n o g r a m a d a s a l a d e a u l a
O p r o b l e m a d a m o c h i l a
O p r o b l e m a d a c o b e r t u r a d e c o n j u n t o s
A ç ã
P r o b l e m a s N P - c o m p l e t o s
C - ,
C ç é N P - ?
R e c a p i t u l a n d o
9 P ç ã â
O p r o b l e m a d a m o c h i l a
A ç ã
P ç ã â
P e r g u n t a s f r e q u e n t e s s o b r e o p r o b l e m a d a m o c h i l a
O ê ?
O ê ?
É í ,
?
O ê ?
V ê ç õ ?
O á
L ê
É í ç ã ?
É í ç ã ã ?
M a i o r s u b s t r i n g c o m u m
C
P
A ç ã
M ê
M ê ç ã
R e c a p i t u l a n d o
1 0 K - ó
C l a s s i c a n d o l a r a n j a v e r s u s t o r a n j a s
C r i a n d o u m s i s t e m a d e r e c o m e n d a ç õ e s
E ç ã í
R ã
E í
I n t r o d u ç ã o a o a p r e n d i z a d o d e m á q u i n a
O C R
C
P
R e c a p i t u l a n d o
1 1 P ó
Á r v o r e s
Í n d i c e s i n v e r t i d o s
A t r a n s f o r m a d a d e F o u r i e r
A l g o r i t m o s p a r a l e l o s
M a p R e d u c e
P í ã ú ?
F ç ã
F ç ã
F i l t r o d e B l o o m e H y p e r L o g L o g
F B
H L L
A l g o r i t m o s S H A
C
V
H a s h s e n s i t i v o l o c a l
T r o c a d e c h a v e s d e D i e - H e l l m a n
P r o g r a m a ç ã o l i n e a r
E p í l o g o
R e s p o s t a s d o s e x e r c í c i o s
P á
C o m e c e i a p r o g r a m a r c o m o u m h o b b y . O l i v r o 6
m e e n s i n o u o b á s i c o , e c o n t i n u e i a l e r o u t r o s l i v r o s p a r a a p r e n d e r m a i s .
P o r é m o t e m a a l g o r i t m o s e r a i n c o m p r e e n s í v e l p a r a m i m . E u m e l e m b r o d e
l e r o s s u m á r i o s d o s m e u s p r i m e i r o s l i v r o s d e a l g o r i t m o s e p e n s a r
“ n a l m e n t e v o u e n t e n d e r e s t e a s s u n t o ! . N o e n t a n t o , e r a u m c o n t e ú d o m u i t o
d e n s o , e d e s i s t i d e p o i s d e a l g u m a s s e m a n a s . F o i q u a n d o t i v e o m e u p r i m e i r o
p r o f e s s o r b o m d e a l g o r i t m o s q u e e u p e r c e b i o q u ã o s i m p l e s e e l e g a n t e s e l e s
e r a m .
A l g u n s a n o s a t r á s , e s c r e v i a m i n h a p r i m e i r a p o s t a g e m i l u s t r a d a e m u m b l o g .
E u a p r e n d o m e l h o r c o m i m a g e n s , e g o s t e i m u i t o d o e s t i l o i l u s t r a d o . D e s d e
e n t ã o , t e n h o f e i t o a l g u m a s p o s t a g e n s i l u s t r a d a s s o b r e p r o g r a m a ç ã o
f u n c i o n a l , G i t , a p r e n d i z a d o d e m á q u i n a e c o n c o r r ê n c i a . A p r o p ó s i t o , e u e r a
u m e s c r i t o r m e d í o c r e q u a n d o c o m e c e i . E x p l i c a r c o n c e i t o s t é c n i c o s é d i f í c i l .
C r i a r b o n s e x e m p l o s e d e s c r e v e r c o n c e i t o s c o m p l i c a d o s s ã o a t i v i d a d e s q u e
l e v a m t e m p o . S e n d o a s s i m , é m a i s f á c i l p a s s a r p o r c i m a d a p a r t e
c o m p l i c a d a . A c h a v a q u e e s t a v a f a z e n d o u m t r a b a l h o m u i t o b o m a t é q u e u m
d i a , d e p o i s d e u m a d e m i n h a s p o s t a g e n s t e r c a d o f a m o s a , u m c o l e g a d e
t r a b a l h o m e d i s s e “ E u l i o s e u t e x t o e a i n d a n ã o e n t e n d i i s s o . F o i q u a n d o
p e r c e b i q u e e u a i n d a t i n h a m u i t o a a p r e n d e r p a r a m e a p r i m o r a r .
E m a l g u m m o m e n t o e n q u a n t o e s c r e v i a e s s a s p o s t a g e n s p a r a o b l o g , a
M a n n i n g e n t r o u e m c o n t a t o c o m i g o e p e r g u n t o u s e e u q u e r i a p r o d u z i r u m
l i v r o i l u s t r a d o . B e m , a c o n t e c e q u e o s e d i t o r e s d a M a n n i n g s a b e m m u i t o b e m
c o m o e x p l i c a r c o n c e i t o s t é c n i c o s , e e l e s m e e n s i n a r a m c o m o e n s i n a r . E s c r e v i
e s t e l i v r o p a r a s a n a r u m p r o b l e m a p e s s o a l : q u e r i a u m l i v r o q u e e x p l i c a s s e
b e m o s c o n c e i t o s t é c n i c o s d i f í c e i s , a l é m d e a p r e s e n t a r a l g o r i t m o s f á c e i s d e
s e r c o m p r e e n d i d o s . M e l h o r e i m u i t o a m i n h a e s c r i t a d e s d e a q u e l a p r i m e i r a
p o s t a g e m , e e s p e r o q u e v o c ê a c h e e s t e l i v r o d e l e i t u r a f á c i l e i n f o r m a t i v a .
A g r a d e ç o à M a n n i n g p o r t e r m e d a d o a o p o r t u n i d a d e d e e s c r e v e r e s t e l i v r o
e p o r m e p r o p o r c i o n a r m u i t a l i b e r d a d e c r i a t i v a . A g r a d e ç o a o s m e u s e d i t o r e s
M a r j a n B a c e e M i k e S t e p h e n s p o r m e m a n t e r e m n a l i n h a , a o B e r t B a t e s p o r
m e e n s i n a r a e s c r e v e r e à J e n n i f e r S o u t p o r s e r u m a e d i t o r a i n c r í v e l ,
r e s p o n s á v e l e p r e s t a t i v a . A g r a d e ç o t a m b é m a t o d o o t i m e d e p r o d u ç ã o d a
M a n n i n g : K e v i n S u l l i v a n , M a r y P i e r g i e s , T i a n y T a y l o r , L e s l i e H a i m e s e a o s
o u t r o s n o s b a s t i d o r e s . A l é m d i s s o , q u e r o d i z e r o b r i g a d o a t o d o s o s q u e
l e r a m o m a n u s c r i t o e d e r a m s u g e s t õ e s : K a r e n B e n s d o n , R o b G r e e n , M i c h a e l
H a m r a h , O z r e n H a r l o v i c , C o l i n H a s t i e , C h r i s t o p h e r H a u p t , C h u c k
H e n d e r s o n , P a w e l K o z l o w s k i , A m i t L a m b a , J e a n - F r a n ç o i s M o r i n , R o b e r t
M o r r i s o n , S a n k a r R a m a n a t h a n , S a n d e r R o s s e l , D o u g S p a r l i n g e D a m i e n
W h i t e .
O b r i g a d o a t o d o s q u e m e a j u d a r a m a c h e g a r a t é a q u i : a o s m e u s a m i g o s d a
F l a s k h i t g a m e b o a r d , p o r m e e n s i n a r e m a p r o g r a m a r , a o s v á r i o s a m i g o s q u e
m e a j u d a r a m a r e v i s a r o s c a p í t u l o s , m e d a n d o c o n s e l h o s e m e p e r m i t i n d o
t e s t a r d i f e r e n t e s f o r m a s d e e x p l i c a r u m a s s u n t o , i n c l u i n d o B e n V i n e g a r , K a r l
P u z o n , A l e x M a n n i n g , E s t h e r C h a n , A n i s h B h a t t , M i c h a e l G l a s s , N i k r a d
M a h d i , C h a r l e s L e e , J a r e d F r i e d m a n , H e m a M a n i c k a v a s a g a m , H a r i R a j a ,
M u r a l i G u d i p a t i , S r i n i v a s V a r a d a n e o u t r o s . O b r i g a d o , G e r r y B r a d y , p o r m e
e n s i n a r a l g o r i t m o s . O u t r o g r a n d e o b r i g a d o p a r a a s e s c o l a s d e a l g o r i t m o s
c o m o a C L R S , a K n u t h e a S t r a n g . E u e s t o u r e a l m e n t e e m p é s o b r e o s
o m b r o s d o s g i g a n t e s .
P a i , m ã e , P r i y a n k a e o r e s t o d a f a m í l i a : o b r i g a d o p e l o a p o i o c o n s t a n t e . E
m u i t o o b r i g a d o à m i n h a e s p o s a M a g g i e . H á m u i t a s a v e n t u r a s p e l a f r e n t e , e
a l g u m a s d e l a s n ã o e n v o l v e m c a r e m c a s a e m u m a s e x t a - f e i r a à n o i t e
r e e s c r e v e n d o p a r á g r a f o s .
F i n a l m e n t e , u m g r a n d e o b r i g a d o a t o d o s o s l e i t o r e s q u e d e r a m u m a c h a n c e
a e s t e l i v r o e a o s l e i t o r e s q u e m e d e r a m u m f e e d b a c k n o f ó r u m . V o c ê s
r e a l m e n t e m e a j u d a r a m a t o r n a r e s t e l i v r o m e l h o r .
S
E s t e l i v r o f o i c r i a d o p a r a s e r d e f á c i l l e i t u r a . E u e v i t o g r a n d e s u x o s d e
p e n s a m e n t o . T o d a v e z q u e u m c o n c e i t o é i n t r o d u z i d o , e u o e x p l i c o d e f o r m a
d i r e t a o u a v i s o q u a n d o v o u e x p l i c á - l o . O s c o n c e i t o s m a i s i m p o r t a n t e s s ã o
r e f o r ç a d o s p o r m e i o d e e x e r c í c i o s e d i v e r s a s e x p l a n a ç õ e s p a r a q u e v o c ê
p o s s a c h e c a r s u a s i d e i a s e t e r c e r t e z a d e q u e e s t á n o c a m i n h o c e r t o .
E u e n s i n o c o m e x e m p l o s . E m v e z d e e s c r e v e r u m m o n t e d e s í m b o l o s , m e u
o b j e t i v o é f a z e r c o m q u e v o c ê v i s u a l i z e o s c o n c e i t o s . T a m b é m a c r e d i t o q u e
a p r e n d e m o s m e l h o r q u a n d o c o n s e g u i m o s f a z e r u m a r e l a ç ã o c o m a l g o q u e j á
c o n h e c e m o s , e c o m o s e x e m p l o s c a m a i s f á c i l f a z e r e s s a r e l a ç ã o . L o g o ,
q u a n d o e s t i v e r t e n t a n d o l e m b r a r - s e d a d i f e r e n ç a e n t r e a r r a y s e l i s t a s
e n c a d e a d a s ( e x p l i c a d o n o C a p í t u l o 2 ) , v o c ê p o d e r á f a z e r i s s o s e n t a d o , v e n d o
u m l m e . A l é m d o m a i s , c o r r o o r i s c o d e c a i r n o ó b v i o , m a s g o s t o d e
a p r e n d e r c o m i m a g e n s . E s t e l i v r o é c h e i o d e l a s .
O c o n t e ú d o d e s t e l i v r o f o i c u i d a d o s a m e n t e e s c o l h i d o . N ã o h á n e c e s s i d a d e
d e e s c r e v e r u m l i v r o q u e a b o r d a t o d o s o s t i p o s d e a l g o r i t m o s – p a r a i s s o
t e m o s a W i k i p é d i a e a K h a n A c a d e m y . T o d o s o s a l g o r i t m o s q u e i n c l u í n e s t e
l i v r o s ã o e x e q u í v e i s . E u o s a c h o ú t e i s n o m e u t r a b a l h o c o m o u m e n g e n h e i r o
d e s o w a r e e e l e s f o r n e c e m u m a b o a b a s e p a r a t ó p i c o s m a i s c o m p l e x o s . B o a
l e i t u r a !
R
O s p r i m e i r o s t r ê s c a p í t u l o s d e s t e l i v r o c o n s t i t u e m - s e n o s e g u i n t e :
C í 1
– V o c ê a p r e n d e r á s e u p r i m e i r o a l g o r i t m o p r á t i c o : a p e s q u i s a
b i n á r i a . T a m b é m a p r e n d e r á a a n a l i s a r a v e l o c i d a d e d e u m a l g o r i t m o
u t i l i z a n d o a n o t a ç ã o B i g O , q u e é u t i l i z a d a d u r a n t e t o d o o l i v r o p a r a
a v a l i a r o q u ã o r á p i d o o u l e n t o u m a l g o r i t m o é .
C í 2 – V o c ê a p r e n d e r á d u a s e s t r u t u r a s d e d a d o s f u n d a m e n t a i s :
a r r a y s e l i s t a s e n c a d e a d a s . E s s a s e s t r u t u r a s s ã o u t i l i z a d a s n o l i v r o e
t a m b é m s ã o u s a d a s p a r a c r i a r e s t r u t u r a s d e d a d o s m a i s a v a n ç a d a s , c o m o
a s t a b e l a s h a s h ( C a p í t u l o 5 ) .
C í 3 – V o c ê a p r e n d e r á r e c u r s ã o , u m a t é c n i c a ú t i l u s a d a e m m u i t o s
a l g o r i t m o s ( c o m o o q u i c k s o r t , a b o r d a d o n o C a p í t u l o 4 ) .
D o m e u p o n t o d e v i s t a , a n o t a ç ã o B i g O e a r e c u r s ã o s ã o t ó p i c o s
d e s a a d o r e s p a r a i n i c i a n t e s . E n t ã o d e c i d i d i m i n u i r o r i t m o e d e d i c a r u m
t e m p o e x t r a a e s t a s s e ç õ e s .
O r e s t a n t e d o l i v r o a p r e s e n t a a l g o r i t m o s d e a p l i c a ç ã o m a i s a m p l a :
T é ç ã – A b o r d a d a s n o s C a p í t u l o s 4 , 8 e 9 .
S e d e p a r a r c o m u m p r o b l e m a e n ã o t i v e r c e r t e z a s o b r e c o m o r e s o l v ê - l o d e
m a n e i r a e c i e n t e , t e n t e a d i v i s ã o e a c o n q u i s t a ( C a p í t u l o 4 ) o u a
p r o g r a m a ç ã o d i n â m i c a ( C a p í t u l o 9 ) . O u v o c ê p o d e p e r c e b e r q u e n ã o
e x i s t e u m a s o l u ç ã o e c i e n t e e o b t e r u m a r e s p o s t a a p r o x i m a d a u t i l i z a n d o o
a l g o r i t m o g u l o s o n o l u g a r ( C a p í t u l o 8 ) .
T – A b o r d a d a s n o C a p í t u l o 5 . U m a t a b e l a h a s h é u m a e s t r u t u r a
d e d a d o s m u i t o ú t i l . E l a c o n t é m c o n j u n t o s d e c h a v e s e v a l o r e s a s s o c i a d o s ,
c o m o o n o m e e o e n d e r e ç o d e e m a i l d e u m a p e s s o a , o u u m u s u á r i o
a s s o c i a d o a u m a s e n h a . É d i f í c i l d e s c r e v e r a u t i l i d a d e d a s t a b e l a s h a s h .
Q u a n d o q u e r o r e s o l v e r u m p r o b l e m a , c o m e ç o c o m d o i s p l a n o s d e a t a q u e :
“ P o s s o u s a r t a b e l a h a s h ? e “ P o s s o m o d e l a r i s s o c o m o u m g r a f o ? .
A
– A b o r d a d o s n o s C a p í t u l o s 6 e 7 . G r a f o s s ã o u m a
m a n e i r a d e m o d e l a r u m a r e d e : u m a r e d e s o c i a l , u m a r e d e d e e s t r a d a s ,
u m a r e d e d e n e u r ô n i o s o u q u a l q u e r o u t r o c o n j u n t o d e c o n e x õ e s . A
p e s q u i s a e m l a r g u r a ( C a p í t u l o 6 ) e o a l g o r i t m o d e D i j k s t r a ( C a p í t u l o 7 )
s ã o m a n e i r a s d e d i m i n u i r a d i s t â n c i a e n t r e d o i s p o n t o s e m u m a r e d e . V o c ê
p o d e u s a r e s s a a b o r d a g e m p a r a c a l c u l a r o s g r a u s d e s e p a r a ç ã o e n t r e d u a s
p e s s o a s o u o c a m i n h o m a i s c u r t o d e u m p o n t o a o u t r o e m u m a r o t a .
K - ó ( K N N , - ) – A b o r d a d o n o
C a p í t u l o 7 . E s s a é u m a t é c n i c a s i m p l e s d e a p r e n d i z a d o d e m á q u i n a . V o c ê
p o d e u s a r a t é c n i c a K N N p a r a c r i a r r e c o m e n d a ç õ e s d e s i s t e m a , u m
m e c a n i s m o O C R o u u m s i s t e m a p a r a p r e v e r o s v a l o r e s d a b o l s a d e v a l o r e s
– n a v e r d a d e , t u d o q u e e n v o l v e p r e v e r u m v a l o r , p o r e x e m p l o , “ n ó s
a c h a m o s q u e a c r í t i c a d a r á 4 e s t r e l a s p a r a e s t e l m e . V o c ê p o d e u t i l i z á - l a ,
a i n d a , p a r a c l a s s i c a r u m o b j e t o , p o r e x e m p l o , “ e s t a é a l e t r a Q .
P ó – O C a p í t u l o 1 1 d i s c o r r e s o b r e d e z a l g o r i t m o s q u e v a l e m
a p e n a p a r a u m a l e i t u r a p o s t e r i o r .
C a
A o r d e m d o s c o n t e ú d o s d e s t e l i v r o f o i c u i d a d o s a m e n t e p r o j e t a d a . S e v o c ê
t e m i n t e r e s s e e m u m t ó p i c o e s p e c í c o , s i n t a - s e l i v r e p a r a p u l a r p a r a e l e .
C a s o c o n t r á r i o , l e i a o s c a p í t u l o s n a o r d e m – e l e s s e b a s e i a m u m n o o u t r o .
R e c o m e n d o f o r t e m e n t e q u e v o c ê e x e c u t e o s c ó d i g o s d o s e x e m p l o s . N ã o
c o n s i g o r e f o r ç a r i s s o o s u c i e n t e . A p e n a s r e d i g i t e o s c ó d i g o s o u b a i x e - o s e m
. / / e o s e x e c u t e . V o c ê r e t e r á
m e l h o r o c o n t e ú d o s e o z e r .
T a m b é m r e c o m e n d o q u e v o c ê f a ç a o s e x e r c í c i o s d e s t e l i v r o . O s e x e r c í c i o s
s ã o c u r t o s – g e r a l m e n t e l e v a m d e u m a d o i s m i n u t o s , a l g u m a s v e z e s d e
c i n c o a d e z m i n u t o s . E l e s o a j u d a r ã o a c o n f e r i r o s e u p e n s a m e n t o , a s s i m
v o c ê s a b e r á s e e s t á f o r a d a l i n h a d e p e n s a m e n t o a n t e s d e s e g u i r a d i a n t e .
Q
E s t e l i v r o é p a r a q u a l q u e r u m q u e q u e i r a e n t e n d e r o b á s i c o d e p r o g r a m a ç ã o
e s e f a m i l i a r i z a r c o m a l g o r i t m o s . T a l v e z v o c ê j á t e n h a u m p r o b l e m a d e
p r o g r a m a ç ã o e e s t e j a t e n t a n d o d e s c o b r i r a s o l u ç ã o a l g o r í t m i c a . O u t a l v e z
q u e i r a e n t e n d e r p a r a q u e o s a l g o r i t m o s s ã o ú t e i s . A q u i e s t á u m a l i s t a c u r t a e
i n c o m p l e t a d e p e s s o a s q u e p r o v a v e l m e n t e a c h a r ã o e s t e l i v r o ú t i l .
p r o g r a m a d o r e s h o b i s t a s
e s t u d a n t e s d e c u r s o s d e p r o g r a m a ç ã o
g r a d u a d o s e m c i ê n c i a s d a c o m p u t a ç ã o q u e q u e i r a m r e f r e s c a r a m e m ó r i a
f í s i c o s / m a t e m á t i c o s / o u t r o s p r o s s i o n a i s q u e t e n h a m i n t e r e s s e e m
p r o g r a m a ç ã o
C ç õ a a ç ã a
T o d o s o s e x e m p l o s d e s t e l i v r o u t i l i z a m o P y t h o n 2 . 7 . T o d o s o s c ó d i g o s d e s t e
d i f e r e n c i a r d o t e x t o c o m u m . A l g u m a s a n o t a ç õ e s a c o m p a n h a m o s c ó d i g o s ,
d e s t a c a n d o c o n c e i t o s i m p o r t a n t e s .
V o c ê p o d e b a i x a r o s c ó d i g o s d o s e x e m p l o s d e s t e l i v r o n o s i t e d a e d i t o r a
e m . / / - o u e m
. / / .
A c r e d i t o q u e v o c ê a p r e n d e m e l h o r q u a n d o r e a l m e n t e g o s t a d e a p r e n d e r –
e n t ã o d i v i r t a - s e e e x e c u t e o s c ó d i g o s !
S b a
A B é u m e n g e n h e i r o d e s o w a r e n a E t s y , u m m e r c a d o o n l i n e
d e p r o d u t o s a r t e s a n a i s . E l e é f o r m a d o e m C i ê n c i a s d a C o m p u t a ç ã o p e l a
U n i v e r s i t y o f C h i c a g o . B h a r g a v a t a m b é m é a u t o r d e u m b l o g i l u s t r a d o d e
t e c n o l o g i a e m a d i t . i o .
C a a
E n v i e s e u s c o m e n t á r i o s e s u a s d ú v i d a s s o b r e e s t e l i v r o à e d i t o r a e s c r e v e n d o
p a r a : @ . . .
T e m o s u m a p á g i n a w e b p a r a e s t e l i v r o n a q u a l i n c l u í m o s e r r a t a s , e x e m p l o s e
q u a i s q u e r o u t r a s i n f o r m a ç õ e s a d i c i o n a i s .
P á g i n a d a e d i ç ã o e m p o r t u g u ê s :
: / / . . / / -
P á g i n a d a e d i ç ã o o r i g i n a l e m i n g l ê s :
. . / / -
P a r a o b t e r m a i s i n f o r m a ç õ e s s o b r e o s l i v r o s d a N o v a t e c , a c e s s e n o s s o s i t e :
: / / . . .
1 O a u t o r d o l i v r o d i s p o n i b i l i z o u n o G i t H u b o c ó d i g o - f o n t e e m v á r i a s l i n g u a g e n s d e
p r o g r a m a ç ã o : C # , P y t h o n , R u b y , J a v a , J a v a s c r i p t e S w i , e m s e u f o r m a t o o r i g i n a l ( e m
i n g l ê s ) . O c ó d i g o - f o n t e n o l i v r o f o i t r a d u z i d o p a r a o p o r t u g u ê s , a s s i m c o m o t o d a s a s
i m a g e n s e i l u s t r a ç õ e s v i s a n d o f a c i l i t a r o e n t e n d i m e n t o p e l o l e i t o r .
1
I ç ã
N í
V o c ê t e r á a c e s s o a o f u n d a m e n t a l p a r a c o m p r e e n d e r o r e s t a n t e d o
l i v r o .
E s c r e v e r á s e u p r i m e i r o a l g o r i t m o d e b u s c a ( p e s q u i s a b i n á r i a ) .
A p r e n d e r á c o m o f a l a r s o b r e o t e m p o d e e x e c u ç ã o d e u m a l g o r i t m o
( n a n o t a ç ã o B i g O ) .
S e r á a p r e s e n t a d o a u m a p r á t i c a c o m u m p a r a p r o j e t a r a l g o r i t m o s
( r e c u r s ã o ) .
I ç ã
U m a g i é u m c o n j u n t o d e i n s t r u ç õ e s q u e r e a l i z a m u m a t a r e f a . C a d a
t r e c h o d e c ó d i g o p o d e r i a s e r c h a m a d o d e u m a l g o r i t m o , m a s e s t e l i v r o t r a t a
d o s t r e c h o s m a i s i n t e r e s s a n t e s . E s c o l h i o s a l g o r i t m o s a p r e s e n t a d o s n e s t e
l i v r o p o r q u e e l e s s ã o r á p i d o s o u p o r q u e r e s o l v e m p r o b l e m a s i n t e r e s s a n t e s ,
o u p o r a m b o s o s m o t i v o s . A s e g u i r e s t ã o d e s c r i t o s a l g u n s p o n t o s
i m p o r t a n t e s q u e s e r ã o d e m o n s t r a d o s .
O C a p í t u l o 1 a b o r d a p e s q u i s a b i n á r i a e m o s t r a c o m o u m a l g o r i t m o p o d e
a c e l e r a r o s e u c ó d i g o . E m u m d o s e x e m p l o s , o n ú m e r o d e e t a p a s
n e c e s s á r i a s p a s s a d e 4 b i l h õ e s p a r a 3 2 e t a p a s !
U m d i s p o s i t i v o d e G P S u t i l i z a a l g o r i t m o s d e g r a f o s ( q u e v o c ê a p r e n d e r á
n o s C a p í t u l o s 6 , 7 e 8 ) p a r a c a l c u l a r a r o t a m a i s c u r t a a t é o s e u d e s t i n o .
V o c ê p o d e u s a r a p r o g r a m a ç ã o d i n â m i c a ( v e r C a p í t u l o 9 ) p a r a e s c r e v e r
u m a l g o r i t m o d e I A ( i n t e l i g ê n c i a a r t i c i a l ) q u e j o g a d a m a s .
E m c a d a c a s o , d e s c r e v e r e i o a l g o r i t m o e a p r e s e n t a r e i u m e x e m p l o . E m
s e g u i d a , f a l a r e i s o b r e o t e m p o d e e x e c u ç ã o d o a l g o r i t m o e m n o t a ç ã o B i g O .
P o r m , s e r ã o e x p l o r a d o s o s d e m a i s t i p o s d e p r o b l e m a s q u e p o d e r i a m s e r
s o l u c i o n a d o s c o m o m e s m o a l g o r i t m o .
O ê á
T e n h o u m a b o a n o t í c i a : u m a i m p l e m e n t a ç ã o d e c a d a a l g o r i t m o a p r e s e n t a d o
n e s t e l i v r o p r o v a v e l m e n t e e s t a r á d i s p o n í v e l e m s u a l i n g u a g e m f a v o r i t a ,
p o r t a n t o v o c ê n ã o t e r á q u e e s c r e v e r c a d a a l g o r i t m o ! P o r é m e s s a s
i m p l e m e n t a ç õ e s s e r ã o i n ú t e i s c a s o v o c ê n ã o e n t e n d a o d e s e m p e n h o d o s
a l g o r i t m o s . N e s t e l i v r o , v o c ê a p r e n d e r á c o m o c o m p a r a r o d e s e m p e n h o d e
d i f e r e n t e s a l g o r i t m o s : V o c ê d e v e u t i l i z a r m e r g e s o r t ( o r d e n a ç ã o p o r m i s t u r a )
o u q u i c k s o r t ( o r d e n a ç ã o r á p i d a ) ? V o c ê d e v e u t i l i z a r u m a r r a y o u u m a l i s t a ?
A e s c o l h a d a e s t r u t u r a d e d a d o s p o d e f a z e r u m a g r a n d e d i f e r e n ç a .
O ê á ç ã
V o c ê a p r e n d e r á t é c n i c a s p a r a r e s o l u ç ã o d e p r o b l e m a s q u e p o d e r i a m e s t a r
f o r a d a s u a g a m a d e h a b i l i d a d e s a t é a g o r a , c o m o p o r e x e m p l o :
S e v o c ê g o s t a d e c r i a r j o g o s , p o d e r á d e s e n v o l v e r u m s i s t e m a d e
i n t e l i g ê n c i a a r t i c i a l ( I A ) q u e s e g u e o u s u á r i o u t i l i z a n d o a l g o r i t m o s
g r á c o s .
V o c ê a p r e n d e r á a c r i a r u m s i s t e m a d e r e c o m e n d a ç õ e s u t i l i z a n d o o s K -
v i z i n h o s m a i s p r ó x i m o s .
A l g u n s p r o b l e m a s n ã o p o d e m s e r r e s o l v i d o s e m u m t e m p o h á b i l ! A p a r t e
d e s t e l i v r o q u e t r a t a d e p r o b l e m a s N P - c o m p l e t o s d e m o n s t r a c o m o
i d e n t i c a r e s t e s p r o b l e m a s e c o m o c r i a r u m a l g o r i t m o q u e f o r n e ç a u m a
r e s p o s t a a p r o x i m a d a .
A o t e r m i n a r d e l e r e s t e l i v r o , p r o v a v e l m e n t e , v o c ê c o n h e c e r á a l g u n s d o s
a l g o r i t m o s d e m a i o r a p l i c a b i l i d a d e . A s s i m , p o d e r á u s a r o s s e u s
c o n h e c i m e n t o s p a r a a p r e n d e r s o b r e a l g o r i t m o s m a i s e s p e c í c o s p a r a I A ,
b a n c o s d e d a d o s e t c . A l é m d i s s o , p o d e r á e n c a r a r g r a n d e s d e s a o s e m s e u
t r a b a l h o .
O ê
V o c ê d e v e r á c o n h e c e r á l g e b r a b á s i c a a n t e s d e i n i c i a r a l e i t u r a d e s t e l i v r o . E m p a r t i c u l a r ,
p a r t i n d o d a f u n ç ã o f ( ) = × 2 , q u a l s e r á o v a l o r d e f ( 5 ) ? S e r e s p o n d e u 1 0 , v o c ê e s t á p r o n t o .
A l é m d e t u d o , e s t e c a p í t u l o ( e e s t e l i v r o ) s e r á c o m p r e e n d i d o m a i s f a c i l m e n t e s e v o c ê
c o n h e c e r a l g u m a l i n g u a g e m d e p r o g r a m a ç ã o . T o d o s o s e x e m p l o s d e s t e l i v r o f o r a m e s c r i t o s
e m P y t h o n , a s s i m , c a s o v o c ê n ã o c o n h e ç a n e n h u m a l i n g u a g e m d e p r o g r a m a ç ã o e q u e i r a
a p r e n d e r u m a , e s c o l h a P y t h o n , p o i s e l a é ó t i m a p a r a i n i c i a n t e s . S e v o c ê c o n h e c e a l g u m a
o u t r a l i n g u a g e m , c o m o a R u b y , s e s a i r á b e m .
P á
V a m o s s u p o r q u e v o c ê e s t e j a p r o c u r a n d o o n o m e d e u m a p e s s o a e m u m a
a g e n d a t e l e f ô n i c a ( q u e f r a s e a n t i q u a d a ! ) . O n o m e c o m e ç a c o m K . V o c ê p o d e
c o m e ç a r n a p r i m e i r a p á g i n a d a a g e n d a e i r f o l h e a n d o a t é c h e g a r a o s K s .
P o r é m v o c ê p r o v a v e l m e n t e v a i c o m e ç a r p e l a m e t a d e , p o i s s a b e q u e o s K s
e s t a r ã o m a i s p e r t o d a l i .
O u s u p o n h a q u e e s t e j a p r o c u r a n d o u m a p a l a v r a q u e c o m e ç a c o m O e m u m
d i c i o n á r i o . N o v a m e n t e , v o c ê c o m e ç a a b u s c a p e l o m e i o .
A g o r a , i m a g i n e q u e v o c ê e n t r e n o F a c e b o o k . Q u a n d o f a z i s s o , o F a c e b o o k
p r e c i s a v e r i c a r q u e v o c ê t e m u m a c o n t a n o s i t e . L o g o , e l e p r o c u r a s e u
n o m e d e u s u á r i o e m u m b a n c o d e d a d o s . D i g a m o s q u e s e u u s u á r i o s e j a
k a r l m a g e d d o n . O F a c e b o o k p o d e r i a c o m e ç a r p e l o s A s e p r o c u r a r s e u n o m e
m a s f a z m a i s s e n t i d o q u e e l e c o m e c e a b u s c a p e l o m e i o .
I s t o é u m p r o b l e m a d e b u s c a . E t o d o s e s t e s c a s o s u s a m u m a l g o r i t m o p a r a
r e s o l v ê - l o : e i a b i á i a .
A p e s q u i s a b i n á r i a é u m a l g o r i t m o . S u a e n t r a d a é u m a l i s t a o r d e n a d a d e
e l e m e n t o s ( e x p l i c a r e i m a i s t a r d e p o r q u e m o t i v o a l i s t a p r e c i s a s e r
o r d e n a d a ) . S e o e l e m e n t o q u e v o c ê e s t á b u s c a n d o e s t á n a l i s t a , a p e s q u i s a
b i n á r i a r e t o r n a a s u a l o c a l i z a ç ã o . C a s o c o n t r á r i o , a p e s q u i s a b i n á r i a r e t o r n a
None .
P o r e x e m p l o :
Procurando empresas em uma agenda com a pesquisa binária.
E i s u m e x e m p l o d e c o m o a p e s q u i s a b i n á r i a f u n c i o n a . E s t o u p e n s a n d o e m
u m n ú m e r o e n t r e 1 e 1 0 0 .
V o c ê d e v e p r o c u r a r a d i v i n h a r o m e u n ú m e r o c o m o m e n o r n ú m e r o d e
t e n t a t i v a s p o s s í v e l . A c a d a t e n t a t i v a , d i g o s e v o c ê c h u t o u m u i t o p a r a c i m a ,
m u i t o p a r a b a i x o o u c o r r e t a m e n t e .
D i g a m o s q u e c o m e ç o u t e n t a n d o a s s i m : 1 , 2 , 3 , 4 V e j a c o m o c a r i a .
Uma tentativa ruim de acertar o número.
I s s o s e c h a m a e i a i e ( t a l v e z e i a e ú i d a s e j a u m t e r m o
m e l h o r ) . A c a d a t e n t a t i v a , v o c ê e s t á e l i m i n a n d o a p e n a s u m n ú m e r o . S e o
m e u n ú m e r o f o s s e o 9 9 , v o c ê p r e c i s a r i a d e 9 9 c h a n c e s p a r a a c e r t á - l o !
U
A q u i e s t á u m a t é c n i c a m e l h o r . C o m e c e c o m 5 0 .
M u i t o b a i x o , m a s v o c ê e l i m i n o u e a d e d o s n ú m e r o s ! A g o r a , v o c ê s a b e q u e
o s n ú m e r o s d e 1 a 5 0 s ã o m u i t o b a i x o s . P r ó x i m o c h u t e : 7 5 .
M u i t o a l t o , m a s n o v a m e n t e v o c ê p o d e c o r t a r m e t a d e d o s n ú m e r o s r e s t a n t e s !
C a e i a b i á i a , c ê c h a ú e i e e d i á i e e i i a a
e a d e d ú e e a e a c a d a e . O p r ó x i m o n ú m e r o é o 6 3 ( e n t r e 5 0
e 7 5 ) .
I s s o é a p e s q u i s a b i n á r i a . V o c ê a c a b a d e a p r e n d e r u m a l g o r i t m o ! A q u i e s t á a
q u a n t i d a d e d e n ú m e r o s q u e v o c ê p o d e e l i m i n a r a c a d a t e n t a t i v a .
u m m á x i m o d e s e t e t e n t a t i v a s p o r q u e a p e s q u i s a b i n á r i a e l i m i n a m u i t a s
p o s s i b i l i d a d e s !
S u p o n h a q u e v o c ê e s t e j a p r o c u r a n d o u m a p a l a v r a e m u m d i c i o n á r i o . O
d i c i o n á r i o t e m 2 4 0 . 0 0 0 p a l a v r a s . N a i d a h i ó e e , d e q u a n t a s e t a p a s
v o c ê a c h a q u e a p e s q u i s a p r e c i s a r i a ?
A p e s q u i s a s i m p l e s p o d e r i a l e v a r 2 4 0 . 0 0 0 e t a p a s s e a p a l a v r a q u e v o c ê
e s t i v e s s e p r o c u r a n d o f o s s e a ú l t i m a d o d i c i o n á r i o . A c a d a e t a p a d a p e s q u i s a
b i n á r i a , v o c ê e l i m i n a o n ú m e r o d e p a l a v r a s p e l a m e t a d e a t é q u e s ó r e s t e u m a
p a l a v r a .
L o g o , a p e s q u i s a b i n á r i a l e v a r i a a p e n a s 1 8 e t a p a s u m a g r a n d e d i f e r e n ç a !
D e m a n e i r a g e r a l , p a r a u m a l i s t a d e n ú m e r o s , a p e s q u i s a b i n á r i a p r e c i s a d e
l o g p a r a r e t o r n a r o v a l o r c o r r e t o , e n q u a n t o a p e s q u i s a s i m p l e s p r e c i s a d e
e t a p a s .
L
V o c ê p o d e n ã o s e l e m b r a r d e l o g a r i t m o s , m a s p r o v a v e l m e n t e l e m b r a - s e d e c o m o c a l c u l a r
e x p o n e n c i a i s . A e x p r e s s ã o l o g 1 0 0 b a s i c a m e n t e d i z : “ Q u a n t o s 1 0 s c o n s e g u i m o s m u l t i p l i c a r
1 0
p a r a c h e g a r a 1 0 0 ? . A r e s p o s t a é 2 : 1 0 × 1 0 . E n t ã o , l o g 1 0 0 = 2 . L o g a r i t m o s s ã o o o p o s t o d e
1 0
e x p o n e n c i a i s .
c o n t a q u e l o g s e m p r e s i g n i c a l o g . Q u a n d o v o c ê p r o c u r a u m e l e m e n t o u s a n d o a p e s q u i s a
2
s i m p l e s , n o p i o r d o s c a s o s , t e r á d e a n a l i s a r e l e m e n t o p o r e l e m e n t o , p a s s a n d o p o r t o d o s . S e f o r
u m a l i s t a d e o i t o e l e m e n t o s , p r e c i s a r i a c h e c a r n o m á x i m o o i t o n ú m e r o s . N a p e s q u i s a b i n á r i a ,
p r e c i s a v e r i c a r l o g e l e m e n t o s p a r a o p i o r d o s c a s o s . P a r a u m a l i s t a d e o i t o e l e m e n t o s , l o g 8
= = 3 , p o r q u e 2 = = 8 . E n t ã o , p a r a u m a l i s t a d e o i t o n ú m e r o s , p r e c i s a r i a p a s s a r p o r , n o
m á x i m o , t r ê s t e n t a t i v a s . P a r a u m a l i s t a d e 1 . 0 2 4 e l e m e n t o s , l o g 1 . 0 2 4 = = 1 0 , p o r q u e 2 = =
1 . 0 2 4 . L o g o , p a r a u m a l i s t a d e 1 . 0 2 4 n ú m e r o s , p r e c i s a r i a v e r i c a r n o m á x i m o d e z d e l e s .
F a l a r e i m u i t o s o b r e l o g a r i t m o s n e s t e l i v r o . P o r t a n t o v o c ê d e v e e n t e n d e r o c o n c e i t o . S e n ã o
e n t e n d e r , a K h a n A c a d e m y ( . ) t e m u m v í d e o l e g a l q u e e s c l a r e c e m u i t a
c o i s a .
A p e s q u i s a b i n á r i a s ó f u n c i o n a q u a n d o a s u a l i s t a e s t á o r d e n a d a . P o r e x e m p l o , o s n o m e s
e m u m a a g e n d a t e l e f ô n i c a e s t ã o e m o r d e m a l f a b é t i c a , e n t ã o v o c ê p o d e u t i l i z a r a p e s q u i s a
b i n á r i a p a r a p r o c u r a r u m n o m e . O q u e a c o n t e c e r i a s e a l i s t a n ã o e s t i v e s s e o r d e n a d a ?
V a m o s v e r c o m o e s c r e v e r a p e s q u i s a b i n á r i a e m P y t h o n . O e x e m p l o d e
c ó d i g o q u e u t i l i z a m o s a q u i u s a a r r a y s . S e n ã o s a b e c o m o e l e s f u n c i o n a m ,
n ã o s e p r e o c u p e ; a b o r d a r e m o s i s s o n o p r ó x i m o c a p í t u l o . V o c ê s ó p r e c i s a
s a b e r q u e p o d e a r m a z e n a r u m a s e q u ê n c i a d e e l e m e n t o s e m u m a l i n h a d e
b u c k e t s c o n s e c u t i v o s q u e s e c h a m a a r r a y . O s b u c k e t s s ã o n u m e r a d o s a p a r t i r
d o 0 : o p r i m e i r o b u c k e t e s t á n a p o s i ç ã o # 0 ; o s e g u n d o , e m # 1 ; o t e r c e i r o , e m
# 2 , e a s s i m p o r d i a n t e .
A f u n ç ã o pesquisa_binaria p e g a u m a r r a y o r d e n a d o e u m i t e m . S e o i t e m
e s t á n o a r r a y , a f u n ç ã o r e t o r n a a s u a p o s i ç ã o . D e s s a m a n e i r a , v o c ê é c a p a z d e
s a b e r p o r q u a l p o n t o d o a r r a y d e v e c o n t i n u a r p r o c u r a n d o . N o c o m e ç o , o
c ó d i g o d o a r r a y s e g u e a s s i m :
baixo = 0
alto = len(lista) - 1
A c a d a t e n t a t i v a , v o c ê t e s t a p a r a o e l e m e n t o c e n t r a l .
baixo
S e o c h u t e f o r m u i t o b a i x o , v o c ê a t u a l i z a r á a v a r i á v e l
p r o p o r c i o n a l m e n t e :
E s e o c h u t e f o r m u i t o a l t o , v o c ê a t u a l i z a r á a v a r i á v e l
alto . A q u i e s t á o
c ó d i g o c o m p l e t o :
return meio
ifchute > item: ❺
alto = meio - 1
else: ❻
baixo = meio + 1
return None ❼
minha_lista = [1, 3, 5, 7, 9] ❽
❷ E n q u a n t o a i n d a n ã o c o n s e g u i u c h e g a r a u m ú n i c o e l e m e n t o . . .
❸ v e r i c a o e l e m e n t o c e n t r a l .
❹ A c h a o i t e m .
❺ O c h u t e f o i m u i t o a l t o .
❻ O c h u t e f o i m u i t o b a i x o .
❼ O i t e m n ã o e x i s t e .
❽ V a m o s t e s t á - l o !
❾ L e m b r e - s e , a s l i s t a s c o m e ç a m n o 0 . O p r ó x i m o e n d e r e ç o t e m í n d i c e 1 .
❿ N o n e s i g n i c a n u l o e m P y t h o n . E l e i n d i c a q u e o i t e m n ã o f o i e n c o n t r a d o .
E E C Í C I
1 . 1 S u p o n h a q u e v o c ê t e n h a u m a l i s t a c o m 1 2 8 n o m e s e e s t e j a f a z e n d o u m a
p e s q u i s a b i n á r i a . Q u a l s e r i a o n ú m e r o m á x i m o d e e t a p a s q u e v o c ê l e v a r i a
p a r a e n c o n t r a r o n o m e d e s e j a d o ?
1 . 2 S u p o n h a q u e v o c ê d u p l i q u e o t a m a n h o d a l i s t a . Q u a l s e r i a o n ú m e r o
m á x i m o d e e t a p a s a g o r a ?
T ç ã
S e m p r e q u e f a l o s o b r e u m a l g o r i t m o , f a l o s o b r e o s e u t e m p o d e e x e c u ç ã o .
G e r a l m e n t e , v o c ê e s c o l h e o a l g o r i t m o m a i s e c i e n t e c a s o e s t e j a t e n t a n d o
o t i m i z a r t e m p o e e s p a ç o .
V o l t a n d o à p e s q u i s a s i m p l e s , q u a n t o t e m p o s e o t i m i z a u t i l i z a n d o - a ? B e m , a
p r i m e i r a a b o r d a g e m s e r i a v e r i c a r n ú m e r o p o r n ú m e r o . S e f o s s e u m a l i s t a
d e 1 0 0 n ú m e r o s , p r e c i s a r í a m o s d e 1 0 0 t e n t a t i v a s . S e f o s s e u m a l i s t a d e 4
b i l h õ e s d e n ú m e r o s , p r e c i s a r í a m o s d e 4 b i l h õ e s d e t e n t a t i v a s . L o g o , o
n ú m e r o m á x i m o d e t e n t a t i v a s é i g u a l a o t a m a n h o d a l i s t a . I s s o é c h a m a d o
d e e i e a .
A p e s q u i s a b i n á r i a é d i f e r e n t e . S e a l i s t a t e m 1 0 0 i t e n s , p r e c i s a - s e d e , n o
m á x i m o , s e t e t e n t a t i v a s . S e t e m 4 b i l h õ e s , p r e c i s a - s e d e , n o m á x i m o , 3 2
t e n t a t i v a s . P o d e r o s o , n ã o ? A p e s q u i s a b i n á r i a é e x e c u t a d a c o m e
g a í i c . A t a b e l a a s e g u i r r e s u m e a s n o s s a s d e s c o b e r t a s a t é a g o r a .
Tempo de execução para algoritmos de pesquisa.
N ç ã B O
A n o t a ç ã o B i g O é u m a n o t a ç ã o e s p e c i a l q u e d i z o q u ã o r á p i d o é u m
a l g o r i t m o . M a s q u e m l i g a p a r a i s s o ? B e m , a c o n t e c e q u e v o c ê
f r e q u e n t e m e n t e u t i l i z a r á o a l g o r i t m o q u e o u t r a p e s s o a f e z e q u a n d o f a z
i s s o , é b o m e n t e n d e r o q u ã o r á p i d o o u l e n t o o a l g o r i t m o é . N e s t a s e ç ã o ,
e x p l i c a r e i c o m o a n o t a ç ã o B i g O f u n c i o n a e f o r n e c e r e i u m a l i s t a c o m o s
t e m p o s d e e x e c u ç ã o m a i s c o m u n s p a r a o s a l g o r i t m o s .
T ç ã
B o b e s t á e s c r e v e n d o u m a l g o r i t m o p a r a a N A S A . O a l g o r i t m o d e l e e n t r a r á
e m a ç ã o q u a n d o o f o g u e t e e s t i v e r p r e s t e s a p o u s a r n a l u a , e e l e o a j u d a r á a
c a l c u l a r o l o c a l d e p o u s o .
E s t e é u m e x e m p l o d e c o m o o t e m p o d e e x e c u ç ã o d e d o i s a l g o r i t m o s p o d e
c r e s c e r a t a x a s d i f e r e n t e s . B o b e s t á t e n t a n d o d e c i d i r e n t r e a p e s q u i s a s i m p l e s
e a p e s q u i s a b i n á r i a . O a l g o r i t m o p r e c i s a s e r t ã o r á p i d o q u a n t o c o r r e t o . P o r
u m l a d o , a p e s q u i s a b i n á r i a é m a i s r á p i d a , o q u e é b o m , p o i s B o b t e m a p e n a s
1 0 e g d p a r a d e s c o b r i r o n d e p o u s a r , o u o f o g u e t e s a i r á d e s e u c u r s o . P o r
o u t r o l a d o , é m a i s f á c i l e s c r e v e r a p e s q u i s a s i m p l e s , o q u e g e r a u m r i s c o
m e n o r d e e r r o s . B o b n ã o q u e r e e r r o s n o s e u c ó d i g o ! P a r a s e r a i n d a
m a i s c u i d a d o s o , B o b d e c i d e c r o n o m e t r a r a m b o s o s a l g o r i t m o s c o m u m a
l i s t a d e 1 0 0 e l e m e n t o s .
V a m o s p r e s u m i r q u e l e v a - s e 1 m i l i s s e g u n d o p a r a v e r i c a r u m e l e m e n t o .
C o m a p e s q u i s a s i m p l e s , B o b p r e c i s a v e r i c a r 1 0 0 e l e m e n t o s , e n t ã o a b u s c a
l e v a 1 0 m s p a r a r o d a r . E m c o n t r a p a r t i d a , e l e p r e c i s a v e r i c a r a p e n a s s e t e
e l e m e n t o s n a p e s q u i s a b i n á r i a ( l o g 1 0 0 é a p r o x i m a d a m e n t e 7 ) , l o g o , a
p e s q u i s a b i n á r i a l e v a 7 m s p a r a s e r e x e c u t a d a . P o r é m , r e a l i s t i c a m e n t e
f a l a n d o , a l i s t a p r o v a v e l m e n t e t e r á e m t o r n o d e 1 b i l h ã o d e e l e m e n t o s . S e a
l i s t a t i v e r e s s e n ú m e r o , q u a n t o t e m p o a p e s q u i s a s i m p l e s l e v a r á p a r a s e r
e x e c u t a d a ? E a p e s q u i s a b i n á r i a ? T e n h a c e r t e z a d e q u e s a b e a r e s p o s t a p a r a
e s s a p e r g u n t a a n t e s d e c o n t i n u a r l e n d o .
1 . 0 0 0 . 0 0 0 . 0 0 0 é a p r o x i m a d a m e n t e 3 0 ) . “ 3 0 m s ! e l e p e n s a . “ A p e s q u i s a
b i n á r i a é q u a s e 1 5 v e z e s m a i s r á p i d a d o q u e a p e s q u i s a s i m p l e s , p o r q u e a
p e s q u i s a s i m p l e s l e v o u 1 0 0 m s p a r a u m a l i s t a d e 1 0 0 e l e m e n t o s e a p e s q u i s a
b i n á r i a l e v o u s ó 7 m s . L o g o , a p e s q u i s a s i m p l e s l e v a r á 3 0 × 1 5 = 4 5 0 m s ,
c e r t o ? B e m a b a i x o d o m e u l i m i t e d e 1 0 s e g u n d o s . B o b d e c i d e u t i l i z a r a
p e s q u i s a s i m p l e s . E l e f e z a e s c o l h a c e r t a ?
N ã o . B o b e s t á e r r a d o . M u i t o e r r a d o . O t e m p o d e e x e c u ç ã o p a r a a p e s q u i s a
s i m p l e s p a r a 1 b i l h ã o d e i t e n s é 1 b i l h ã o m s , o u s e j a , 1 1 d i a s ! O p r o b l e m a é
q u e o t e m p o d e e x e c u ç ã o d a p e s q u i s a s i m p l e s e d a p e s q u i s a b i n á r i a c e c e
c a a d i f e e e .
Tempos de execução crescem com velocidades diferentes!
S e n d o a s s i m , c o n f o r m e o n ú m e r o d e i t e n s c r e s c e , a p e s q u i s a b i n á r i a
a u m e n t a s ó u m p o u c o o s e u t e m p o d e e x e c u ç ã o . J á a p e s q u i s a s i m p l e s l e v a
i t e m p o a m a i s . L o g o , c o n f o r m e a l i s t a d e n ú m e r o s c r e s c e , a p e s q u i s a
b i n á r i a s e t o r n a i m a i s r á p i d a d o q u e a p e s q u i s a s i m p l e s . B o b p e n s o u
q u e a p e s q u i s a b i n á r i a f o s s e 1 5 v e z e s m a i s r á p i d a q u e a p e s q u i s a s i m p l e s ,
m a s i s s o e s t á i n c o r r e t o . S e a l i s t a t e m 1 b i l h ã o d e i t e n s , o t e m p o d e e x e c u ç ã o
é a p r o x i m a d a m e n t e 3 3 m i l h õ e s d e v e z e s m a i s r á p i d o . P o r i s s o , n ã o b a s t a
s a b e r q u a n t o t e m p o u m a l g o r i t m o l e v a p a r a s e r e x e c u t a d o v o c ê p r e c i s a
s a b e r s e o t e m p o d e e x e c u ç ã o a u m e n t a c o n f o r m e a l i s t a a u m e n t a . É a í q u e a
n o t a ç ã o B i g O e n t r a .
A n o t a ç ã o B i g O i n f o r m a o q u ã o r á p i d o é u m a l g o r i t m o . P o r e x e m p l o ,
i m a g i n e q u e v o c ê t e m u m a l i s t a d e t a m a n h o . O t e m p o d e e x e c u ç ã o n a
n o t a ç ã o B i g O é O ( ) . O n d e e s t ã o o s s e g u n d o s ? E l e s n ã o e x i s t e m a
n o t a ç ã o B i g O n ã o f o r n e c e o t e m p o e m s e g u n d o s . A a ç ã B i g O e i e
e c ê c a e ú e d e e a ç õ e . E l a i n f o r m a o q u ã o r a p i d a m e n t e
u m a l g o r i t m o c r e s c e .
T e m o s o u t r o e x e m p l o d i s s o . A p e s q u i s a b i n á r i a p r e c i s a d e l o g o p e r a ç õ e s
p a r a v e r i c a r u m a l i s t a d e t a m a n h o . Q u a l é o t e m p o d e e x e c u ç ã o n a
n o t a ç ã o B i g O ? É O ( l o g ) . D e m a n e i r a g e r a l , a n o t a ç ã o B i g O é e s c r i t a d a
s e g u i n t e f o r m a :
d e n o t a ç ã o B i g O p o r q u e c o l o c a - s e u m “ g r a n d e O n a f r e n t e d o n ú m e r o d e
o p e r a ç õ e s ( p a r e c e p i a d a , m a s é v e r d a d e ! ) .
A g o r a , v a m o s v e r a l g u n s e x e m p l o s . V e j a s e c o n s e g u e d e s c o b r i r o t e m p o d e
e x e c u ç ã o p a r a e s s e s a l g o r i t m o s .
V ç ã B O
A q u i s e g u e u m e x e m p l o p r á t i c o q u e v o c ê p o d e r e p r o d u z i r e m c a s a c o m u m
p e d a ç o d e p a p e l e u m l á p i s . S u p o n h a q u e v o c ê t e n h a q u e d e s e n h a r u m a
g r a d e c o m 1 6 d i v i s õ e s .
A 1
U m a f o r m a d e d e s e n h a r e s s a g r a d e d e 1 6 d i v i s õ e s é d e s e n h a r u m a d i v i s ã o d e
c a d a v e z . L e m b r e - s e , a n o t a ç ã o B i g O c o n t a o n ú m e r o d e o p e r a ç õ e s . N e s s e
e x e m p l o , d e s e n h a r u m a d i v i s ã o é u m a o p e r a ç ã o . V o c ê p r e c i s a d e s e n h a r 1 6
d i v i s õ e s . Q u a n t a s o p e r a ç õ e s v o c ê t e r á d e f a z e r s e d e s e n h a r u m a d i v i s ã o p o r
v e z ?
d e e x e c u ç ã o d e s s e a l g o r i t m o ?
A 2
T e n t e a g o r a e s t e a l g o r i t m o . D o b r e o p a p e l .
N e s t e e x e m p l o , d o b r a r o p a p e l u m a v e z é u m a o p e r a ç ã o . V o c ê f e z d u a s
d i v i s õ e s c o m e s s a o p e r a ç ã o !
D o b r e o p a p e l d e n o v o , d e n o v o e d e n o v o .
D e s d o b r e d e p o i s d e q u a t r o d o b r a s e v o c ê t e r á u m a b e l a g r a d e ! A c a d a d o b r a ,
o n ú m e r o d e d i v i s õ e s d u p l i c a . V o c ê f e z 1 6 d i v i s õ e s c o m q u a t r o o p e r a ç õ e s !
p o d e d e s e n h a r 1 6 d i v i s õ e s e m q u a t r o e t a p a s . Q u a l é o t e m p o d e e x e c u ç ã o
p a r a e s s e a l g o r i t m o ? E n c o n t r e o t e m p o d e e x e c u ç ã o d o s d o i s a l g o r i t m o s
a n t e s d e s e g u i r a d i a n t e .
R e a : O A l g o r i t m o 1 t e m t e m p o d e e x e c u ç ã o O ( ) e o a l g o r i t m o 2 t e m
t e m p o d e e x e c u ç ã o O ( l o g ) .
A ç ã B O ç ã
ó
S u p o n h a q u e v o c ê u t i l i z a u m a p e s q u i s a s i m p l e s p a r a p r o c u r a r o n o m e d e
u m a p e s s o a e m u m a a g e n d a t e l e f ô n i c a . V o c ê s a b e q u e a p e s q u i s a s i m p l e s
t e m t e m p o d e e x e c u ç ã o O ( ) , o q u e s i g n i c a q u e n a p i o r d a s h i p ó t e s e s t e r á
v e r i c a d o c a d a n o m e d a a g e n d a t e l e f ô n i c a . N e s s e c a s o , v o c ê e s t á
p r o c u r a n d o u m a p e s s o a c h a m a d a A d i t . E s s a p e s s o a é a p r i m e i r a d e s u a l i s t a .
L o g o , n ã o t e v e d e p a s s a r p o r t o d o s o s n o m e s v o c ê a e n c o n t r o u n a p r i m e i r a
t e n t a t i v a . E s s e a l g o r i t m o l e v o u o t e m p o d e e x e c u ç ã o O ( ) ? O u l e v o u O ( 1 )
p o r q u e e n c o n t r o u o q u e q u e r i a n a p r i m e i r a t e n t a t i v a ?
A p e s q u i s a s i m p l e s a i n d a a s s i m t e m t e m p o d e e x e c u ç ã o O ( ) . N e s s e c a s o ,
v o c ê e n c o n t r o u o q u e q u e r i a i n s t a n t a n e a m e n t e . E s s a é a m e l h o r d a s
h i p ó t e s e s . A n o t a ç ã o B i g O l e v a e m c o n t a a i d a h i ó e e . E n t ã o p o d e - s e
d i z e r q u e , p a r a o i c a , v o c ê a n a l i s o u c a d a i t e m d a l i s t a . E s s e é o t e m p o
O ( ) . É u m a g a r a n t i a v o c ê s a b e , c o m c e r t e z a , q u e a p e s q u i s a s i m p l e s
n u n c a t e r á t e m p o d e e x e c u ç ã o m a i s l e n t o d o q u e O ( ) .
A l é m d o t e m p o d e e x e c u ç ã o p a r a o p i o r d o s c a s o s , é i m p o r t a n t e a n a l i s a r o t e m p o d e
e x e c u ç ã o p a r a o c a s o m é d i o . O p i o r c a s o e o c a s o m é d i o s e r ã o d i s c u t i d o s n o C a p í t u l o 4 .
A ç ã B O
A q u i t e m o s c i n c o t e m p o s d e e x e c u ç ã o B i g O q u e v o c ê e n c o n t r a r á b a s t a n t e ,
o r d e n a d o s d o m a i s r á p i d o p a r a o m a i s l e n t o .
O ( l o g ) , t a m b é m c o n h e c i d o c o m o e g a í i c . E x e m p l o : p e s q u i s a
b i n á r i a .
O ( ) , c o n h e c i d o c o m o e i e a . E x e m p l o : p e s q u i s a s i m p l e s .
O ( * l o g ) . E x e m p l o : u m a l g o r i t m o r á p i d o d e o r d e n a ç ã o , c o m o a
o r d e n a ç ã o q u i c k s o r t ( e x p l i c a d a n o C a p í t u l o 4 ) .
O ( ) . E x e m p l o : u m a l g o r i t m o l e n t o d e o r d e n a ç ã o , c o m o a o r d e n a ç ã o p o r
s e l e ç ã o ( e x p l i c a d a n o C a p í t u l o 2 ) .
O ( ! ) . E x e m p l o : u m a l g o r i t m o b a s t a n t e l e n t o , c o m o o d o c a i x e i r o - v i a j a n t e
( e x p l i c a d o a s e g u i r ! ) .
S u p o n h a q u e v o c ê e s t e j a d e s e n h a n d o n o v a m e n t e a g r a d e d e 1 6 d i v i s õ e s e
v o c ê p o s s a e s c o l h e r c i n c o a l g o r i t m o s d i f e r e n t e s p a r a f a z e r i s s o . S e e s c o l h e r o
p r i m e i r o a l g o r i t m o , l e v a r á u m t e m p o d e e x e c u ç ã o d e O ( l o g ) p a r a
d e s e n h a r a g r a d e . V o c ê p o d e f a z e r d e z o p e r a ç õ e s p o r s e g u n d o . C o m o
t e m p o d e e x e c u ç ã o O ( l o g ) , v o c ê l e v a r á q u a t r o o p e r a ç õ e s p a r a d e s e n h a r
u m a g r a d e c o m 1 6 d i v i s õ e s ( l o g 1 6 é 4 ) . L o g o , l e v a r á 0 , 4 s e g u n d o s p a r a
d e s e n h a r a g r a d e . E s e t i v e r q u e d e s e n h a r 1 . 0 2 4 d i v i s õ e s ? L e v a r á 1 . 0 2 4 = 1 0
o p e r a ç õ e s , o u u m s e g u n d o p a r a d e s e n h a r u m a g r a d e d e 1 . 0 2 4 d i v i s õ e s . E s t e s
n ú m e r o s s ã o p a r a o p r i m e i r o a l g o r i t m o .
O s e g u n d o a l g o r i t m o é m a i s l e n t o : e l e t e m t e m p o d e e x e c u ç ã o O ( ) . L e v a r á
1 6 o p e r a ç õ e s p a r a d e s e n h a r 1 6 d i v i s õ e s e l e v a r á 1 . 0 2 4 o p e r a ç õ e s p a r a
d e s e n h a r 1 . 0 2 4 d i v i s õ e s . Q u a n t o t e m p o i s s o l e v a e m s e g u n d o s ?
A q u i e s t á q u a n t o t e m p o l e v a r i a p a r a d e s e n h a r a g r a d e c o m o s a l g o r i t m o s
r e s t a n t e s , d o m a i s r á p i d o a o m a i s l e n t o :
E x i s t e m o u t r o s t e m p o s d e e x e c u ç ã o , m a s e s s e s s ã o o s c i n c o m a i s c o m u n s .
I s s o é u m a s i m p l i c a ç ã o . N a r e a l i d a d e , v o c ê n ã o p o d e c o n v e r t e r u m t e m p o
d e e x e c u ç ã o n a n o t a ç ã o B i g O p a r a u m n ú m e r o d e o p e r a ç õ e s , m a s a
a p r o x i m a ç ã o é b o a o s u c i e n t e p o r e n q u a n t o . V o l t a r e m o s a f a l a r d a n o t a ç ã o
B i g O n o C a p í t u l o 4 , d e p o i s d e t e r a p r e n d i d o u m p o u c o m a i s s o b r e
a l g o r i t m o s . P o r e n q u a n t o , o s p r i n c i p a i s p o n t o s s ã o o s s e g u i n t e s :
A r a p i d e z d e u m a l g o r i t m o n ã o é m e d i d a e m s e g u n d o s , m a s p e l o
c r e s c i m e n t o d o n ú m e r o d e o p e r a ç õ e s .
E m v e z d i s s o , d i s c u t i m o s s o b r e o q u ã o r a p i d a m e n t e o t e m p o d e e x e c u ç ã o
d e u m a l g o r i t m o a u m e n t a c o n f o r m e o n ú m e r o d e e l e m e n t o s a u m e n t a .
O t e m p o d e e x e c u ç ã o e m a l g o r i t m o s é e x p r e s s o n a n o t a ç ã o B i g O .
O ( l o g ) é m a i s r á p i d o d o q u e O ( ) , e O ( l o g ) c a a i n d a m a i s r á p i d o
c o n f o r m e a l i s t a a u m e n t a .
E E C Í C I
F o r n e ç a o t e m p o d e e x e c u ç ã o p a r a c a d a u m d o s c a s o s a s e g u i r e m t e r m o s d a
n o t a ç ã o B i g O .
1 . 3 V o c ê t e m u m n o m e e d e s e j a e n c o n t r a r o n ú m e r o d e t e l e f o n e p a r a e s s e
n o m e e m u m a a g e n d a t e l e f ô n i c a .
1 . 4 V o c ê t e m u m n ú m e r o d e t e l e f o n e e d e s e j a e n c o n t r a r o d o n o d e l e e m u m a
a g e n d a t e l e f ô n i c a . ( D i c a : D e v e p r o c u r a r p e l a a g e n d a i n t e i r a ! )
1 . 5 V o c ê q u e r l e r o n ú m e r o d e c a d a p e s s o a d a a g e n d a t e l e f ô n i c a .
1 . 6 V o c ê q u e r l e r o s n ú m e r o s a p e n a s d o s n o m e s q u e c o m e ç a m c o m A . ( I s s o
é c o m p l i c a d o ! E s s e a l g o r i t m o e n v o l v e c o n c e i t o s q u e s ã o a b o r d a d o s m a i s
p r o f u n d a m e n t e n o C a p í t u l o 4 . L e i a a r e s p o s t a v o c ê c a r á s u r p r e s o ! )
O -
V o c ê p o d e t e r l i d o a ú l t i m a s e ç ã o e p e n s a d o : “ D e m a n e i r a a l g u m a v o u
e x e c u t a r u m a l g o r i t m o q u e t e m t e m p o d e e x e c u ç ã o O ( ! ) . B e m , d e i x e - m e
t e n t a r p r o v a r o c o n t r á r i o ! A q u i e s t á u m e x e m p l o d e u m a l g o r i t m o c o m u m
t e m p o d e e x e c u ç ã o m u i t o r u i m . E l e é u m p r o b l e m a f a m o s o d a c i ê n c i a d a
c o m p u t a ç ã o , p o i s s e u c r e s c i m e n t o é a p a v o r a n t e e a l g u m a s p e s s o a s m u i t o
i n t e l i g e n t e s a c r e d i t a m q u e e l e p o s s a s e r m e l h o r a d o . E s s e a l g o r i t m o é
c h a m a d o d e “ o p r o b l e m a d o c a i e i - i a j a e .
V o c ê t e m u m c a i x e i r o - v i a j a n t e .
O c a i x e i r o p r e c i s a i r a c i n c o c i d a d e s .
O c a i x e i r o , o q u a l c h a m a r e i d e O p u s , q u e r p a s s a r p o r t o d a s a s c i d a d e s
p e r c o r r e n d o u m a d i s t â n c i a m í n i m a . P o d e m o s e n x e r g a r o p r o b l e m a d a
s e g u i n t e f o r m a : a n a l i s a r c a d a o r d e m p o s s í v e l d e c i d a d e s p a r a v i s i t a r .
E l e s o m a a d i s t â n c i a t o t a l e e s c o l h e o c a m i n h o d e m e n o r d i s t â n c i a . E x i s t e m
1 2 0 p e r m u t a ç õ e s p a r a c i n c o c i d a d e s , l o g o , p r e c i s a - s e d e 1 2 0 o p e r a ç õ e s p a r a
r e s o l v e r o p r o b l e m a d e c i n c o c i d a d e s . P a r a s e i s c i d a d e s , p r e c i s a - s e d e 7 2 0
o p e r a ç õ e s ( o u 7 2 0 p e r m u t a ç õ e s ) . P a r a s e t e c i d a d e s s ã o n e c e s s á r i a s 5 . 0 5 0
o p e r a ç õ e s !
O número de operações aumenta drasticamente.
D e m a n e i r a g e r a l , p a r a i t e n s , é n e c e s s á r i o ! ( f a t o r i a l d e ) o p e r a ç õ e s p a r a
c h e g a r a u m r e s u l t a d o . E n t ã o , e s t e é o t e m p o d e e x e c u ç ã o O ( ! ) o u o e
f a i a . E s s e a l g o r i t m o c o n s o m e m u i t a s o p e r a ç õ e s , e x c e t o p a r a c a s o s
e n v o l v e n d o n ú m e r o s p e q u e n o s . N o e n t a n t o , u m a v e z q u e l i d a m o s c o m m a i s
d e 1 0 0 c i d a d e s , é i m p o s s í v e l c a l c u l a r a r e s p o s t a e m f u n ç ã o d o t e m p o o s o l
e n t r a r á e m c o l a p s o a n t e s .
E s s e é u m a l g o r i t m o t e r r í v e l ! O p u s d e v e r i a u s a r o u t r o , n ã o ? M a s e l e n ã o
p o d e . E s s e é u m p r o b l e m a s e m s o l u ç ã o . N ã o e x i s t e u m a l g o r i t m o m a i s
r á p i d o p a r a e s s e p r o b l e m a , e a s p e s s o a s m a i s i n t e l i g e n t e s a c r e d i t a m s e r
i í e m e l h o r á - l o . O m e l h o r q u e s e p o d e f a z e r é c h e g a r a u m a s o l u ç ã o
a p r o x i m a d a . V e j a o C a p í t u l o 1 0 p a r a s a b e r m a i s s o b r e i s s o .
U m a o b s e r v a ç ã o n a l : s e v o c ê é u m l e i t o r a v a n ç a d o , l e i a s o b r e á r v o r e s
b i n á r i a s d e b u s c a . N o c a p í t u l o s e g u i n t e , h á u m a b r e v e d e s c r i ç ã o d o a s s u n t o .
R
A p e s q u i s a b i n á r i a é m u i t o m a i s r á p i d a d o q u e a p e s q u i s a s i m p l e s .
O ( l o g ) é m a i s r á p i d o d o q u e O ( ) , e O ( l o g ) c a a i n d a m a i s r á p i d o
c o n f o r m e o s e l e m e n t o s d a l i s t a a u m e n t a m .
A r a p i d e z d e u m a l g o r i t m o n ã o é m e d i d a e m s e g u n d o s .
O t e m p o d e e x e c u ç ã o d e u m a l g o r i t m o é m e d i d o p o r m e i o d e s e u
c e c i e .
O t e m p o d e e x e c u ç ã o d o s a l g o r i t m o s é e x p r e s s o n a n o t a ç ã o B i g O .
2
O d e a ç ã e e ç ã
N e e c a í
V o c ê c o n h e c e á a a e l i a e n c a d e a d a d o i i p o d e e a
b á i c a . E l e e ã o p o o d o l g a . V o c ê j á e e a c e o a o a a n o
c a p í l o 1 e c o n i n a á e i l i a n d o d e l e p o p a i c a m e n e o d o
o c a p í l o . A a ã o f n d a m e n a i , e n ã o p e e a e n ç ã o ! P o é m
a l g m a e e é m e l h o a a l i a e n c a d e a d a e m e d o a a . E e
c a p í l o e p l a n a o p ó e o c o n a d e a m b a a e a p a a
q e p o a d e c i d i q a l é a i d e a l p a a o e a l g o i m o .
V o c ê a p e n d e á a f a e o e p i m e i o a l g o i m o d e o d e n a ç ã o .
M i o a l g o i m o ó f n c i o n a m e o d a d o e i e e m o d e n a d o .
L e m b a - e d a p e q i a b i n á i a ? V o c ê ó p o d e e e c á - l a e o
e l e m e n o d e a l i a e i e e m o d e n a d o . E e c a p í l o l h e
a p e e n a á a o d e n a ç ã o p o e l e ç ã o . A m a i o i a d a l i n g a g e n d e
p o g a m a ç ã o c o n é m n a i a m e n e o a l g o i m o d e e l e ç ã o , e n ã o
a a m e n e e á d e e c e e a a p ó p i a e ã o a p a i d o e o . N o
e n a n o a o d e n a ç ã o p o e l e ç ã o é m a m p o l i m p a a o q i c k o ,
q e a b o d a e i n o p ó i m o c a p í l o . O q i c k o é m a l g o i m o
i m p o a n e e e á c o m p e e n d i d o m a i f a c i l m e n e e o c ê j á
c o n h e c e a l g m i p o d e a l g o i m o d e o d e n a ç ã o .
O e c ê e c i a a b e
P a r a e n t e n d e r a a n á l i s e d e d e s e m p e n h o d e s t e c a p í t u l o , v o c ê p r e c i s a c o n h e c e r a n o t a ç ã o B i g O
e l o g a r i t m o s . S e n ã o c o n h e c e , s u g i r o q u e l e i a o C a p í t u l o 1 . A n o t a ç ã o B i g O é u t i l i z a d a e m
t o d o e s t e l i v r o .
C f c i a a e ó i a
I m a g i n e q u e v o c ê v a i a u m s h o w e p r e c i s a g u a r d a r a s s u a s c o i s a s n a
c h a p e l a r i a . A l g u m a s g a v e t a s e s t ã o d i s p o n í v e i s .
C a d a g a v e t a p o d e g u a r d a r u m e l e m e n t o . V o c ê d e s e j a g u a r d a r d u a s c o i s a s ,
e n t ã o p e d e d u a s g a v e t a s .
V o c ê g u a r d o u a s s u a s d u a s c o i s a s a q u i .
V o c ê e s t á p r o n t o p a r a o s h o w ! É m a i s o u m e n o s a s s i m q u e a m e m ó r i a d o
s e u c o m p u t a d o r f u n c i o n a . O c o m p u t a d o r s e p a r e c e c o m u m g r a n d e
c o n j u n t o d e g a v e t a s , e c a d a g a v e t a t e m s e u e n d e r e ç o .
f e e e b é o e n d e r e ç o d e u m s l o t n a m e m ó r i a .
C a d a v e z q u e q u e r a r m a z e n a r u m i t e m n a m e m ó r i a , v o c ê p e d e a o
c o m p u t a d o r u m p o u c o d e e s p a ç o e e l e t e d á u m e n d e r e ç o n o q u a l v o c ê p o d e
a r m a z e n a r o s e u i t e m . S e q u i s e r a r m a z e n a r m ú l t i p l o s i t e n s , e x i s t e m d u a s
m a n e i r a s p a r a f a z e r i s s o : a r r a y s e l i s t a s . F a l a r e i s o b r e a r r a y s e l i s t a s d e p o i s ,
b e m c o m o s o b r e o s p r ó s e c o n t r a s d e c a d a u m . N ã o e x i s t e a p e n a s u m a
m a n e i r a c o r r e t a p a r a a r m a z e n a r i t e n s e m c a d a u m d o s c a s o s , e n t ã o é
i m p o r t a n t e s a b e r a s d i f e r e n ç a s .
A a e i a e c a d e a d a
A l g u m a s v e z e s , v o c ê p r e c i s a a r m a z e n a r u m a l i s t a d e e l e m e n t o s n a m e m ó r i a .
S u p o n h a q u e v o c ê e s t e j a e s c r e v e n d o u m a p l i c a t i v o p a r a g e r e n c i a r o s s e u s
a f a z e r e s . É n e c e s s á r i o a r m a z e n a r o s s e u s a f a z e r e s c o m o u m a l i s t a n a
m e m ó r i a .
V o c ê d e v e u s a r u m a r r a y o u u m a l i s t a e n c a d e a d a ? V a m o s a r m a z e n a r o s
a f a z e r e s p r i m e i r o e m u m a r r a y , p o i s a s s i m a c o m p r e e n s ã o c a m a i s f á c i l .
U s a r u m a r r a y s i g n i c a q u e t o d a s a s s u a s t a r e f a s e s t ã o a r m a z e n a d a s
c o n t i g u a m e n t e ( u m a a o l a d o d a o u t r a ) n a m e m ó r i a .
A g o r a , s u p o n h a q u e v o c ê q u e i r a a d i c i o n a r m a i s u m a t a r e f a . N o e n t a n t o a
p r ó x i m a g a v e t a e s t á o c u p a d a p o r c o i s a s d e o u t r a p e s s o a !
É c o m o s e v o c ê e s t i v e s s e i n d o a o c i n e m a c o m o s s e u s a m i g o s e e n c o n t r a s s e
u m l u g a r p a r a s e n t a r , m a s o u t r o a m i g o s e j u n t a s s e a v o c ê s e n ã o h o u v e s s e
l u g a r p a r a e l e . V o c ê s t o d o s p r e c i s a r i a m s e m o v e r e e n c o n t r a r u m l u g a r o n d e
t o d o s c o u b e s s e m . N e s t e c a s o , v o c ê p r e c i s a r i a s o l i c i t a r a o c o m p u t a d o r u m a
á r e a d e m e m ó r i a e m q u e c o u b e s s e m t o d a s a s s u a s t a r e f a s . E n t ã o v o c ê a s
m o v e r i a p a r a l á .
S e o u t r o a m i g o a p a r e c e s s e , v o c ê s c a r i a m s e m l u g a r n o v a m e n t e e t o d o s
p r e c i s a r i a m s e m o v e r u m a s e g u n d a v e z ! Q u e i n c ô m o d o . D a m e s m a f o r m a ,
a d i c i o n a r n o v o s i t e n s a u m a r r a y s e r á m u i t o l e n t o . U m a m a n e i r a f á c i l d e
r e s o l v e r i s s o é “ r e s e r v a n d o l u g a r e s : m e s m o q u e v o c ê t e n h a t r ê s i t e n s n a s u a
l i s t a d e t a r e f a s , v o c ê p o d e s o l i c i t a r a o c o m p u t a d o r d e z e s p a ç o s , s ó p o r v i a
d a s d ú v i d a s . E n t ã o , v o c ê p o d e a d i c i o n a r d e z i t e n s a s u a l i s t a s e m p r e c i s a r
m o v e r n a d a . I s t o é u m a b o a m a n e i r a d e c o n t o r n a r o p r o b l e m a , m a s v o c ê
p r e c i s a c a r a t e n t o à s d e s v a n t a g e n s :
V o c ê p o d e n ã o p r e c i s a r d o s e s p a ç o s e x t r a s q u e r e s e r v o u ; e n t ã o a m e m ó r i a
s e r á d e s p e r d i ç a d a . V o c ê n ã o e s t á u t i l i z a n d o a m e m ó r i a , m a s n i n g u é m
m a i s p o d e u s á - l a t a m b é m .
V o c ê p o d e p r e c i s a r a d i c i o n a r m a i s d e d e z i t e n s a s u a l i s t a d e t a r e f a s , e n t ã o
v o c ê t e r á d e m o v e r s e u s i t e n s d e q u a l q u e r m a n e i r a .
E m b o r a s e j a u m a b o a f o r m a d e c o n t o r n a r o p r o b l e m a , n ã o é u m a s o l u ç ã o
p e r f e i t a . L i s t a s e n c a d e a d a s r e s o l v e m e s t e p r o b l e m a d e a d i ç ã o d e i t e n s .
L i a e c a d e a d a
C o m a s l i s t a s e n c a d e a d a s , s e u s i t e n s p o d e m e s t a r e m q u a l q u e r l u g a r d a
m e m ó r i a .
C a d a i t e m a r m a z e n a o e n d e r e ç o d o p r ó x i m o i t e m d a l i s t a . U m m o n t e d e
e n d e r e ç o s a l e a t ó r i o s d e m e m ó r i a e s t ã o l i g a d o s .
Endereços de memória ligados.
É c o m o u m a c a ç a a o t e s o u r o . V o c ê v a i a o p r i m e i r o e n d e r e ç o e e l e d i z “ o
p r ó x i m o i t e m p o d e s e r e n c o n t r a d o n o e n d e r e ç o 1 2 3 . E n t ã o v a i a o e n d e r e ç o
1 2 3 e e l e d i z “ O p r ó x i m o i t e m p o d e s e r e n c o n t r a d o n o e n d e r e ç o 8 4 7 , e
a s s i m p o r d i a n t e . A d i c i o n a r u m i t e m a u m a l i s t a e n c a d e a d a é f á c i l : v o c ê o
c o l o c a e m q u a l q u e r l u g a r d a m e m ó r i a e a r m a z e n a o e n d e r e ç o d o i t e m
a n t e r i o r .
C o m a s l i s t a s e n c a d e a d a s v o c ê n u n c a p r e c i s a m o v e r o s s e u s i t e n s ; t a m b é m
e v i t a o u t r o p r o b l e m a . D i g a m o s q u e v o c ê v á a u m c i n e m a f a m o s o c o m o s
s e u s a m i g o s . V o c ê s s e i s e s t ã o t e n t a n d o p r o c u r a r u m l u g a r p a r a s e n t a r , m a s o
c i n e m a e s t á c h e i o . N ã o h á s e i s l u g a r e s j u n t o s . B e m , a l g u m a s v e z e s i s s o
a c o n t e c e c o m a r r a y s . I m a g i n e q u e e s t á t e n t a n d o e n c o n t r a r 1 0 . 0 0 0 s l o t s p a r a
u m a r r a y . S u a m e m ó r i a t e m 1 0 . 0 0 0 s l o t s , m a s e l e s n ã o e s t ã o j u n t o s . V o c ê
n ã o c o n s e g u e a r r u m a r u m l u g a r p a r a o s e u a r r a y ! U s a r u m a l i s t a e n c a d e a d a
s e r i a c o m o d i z e r “ v a m o s n o s d i v i d i r e a s s i s t i r a o l m e . S e e x i s t i r e s p a ç o n a
m e m ó r i a , v o c ê t e r á e s p a ç o p a r a a s u a l i s t a e n c a d e a d a .
S e a s l i s t a s e n c a d e a d a s s ã o m u i t o m e l h o r e s p a r a i n s e r ç õ e s , p a r a q u e s e r v e m
o s a r r a y s ?
A a
O s w e b s i t e s q u e a p r e s e n t a m l i s t a s “ t o p 1 0 u s a m u m a t á t i c a t r a p a c e i r a p a r a
c o n s e g u i r m a i s v i s u a l i z a ç õ e s . E m v e z d e m o s t r a r e m a l i s t a e m u m a ú n i c a
p á g i n a , e l e s c o l o c a m u m i t e m e m c a d a p á g i n a e f a z e m v o c ê c l i c a r e m
“ p r ó x i m o p a r a l e r o i t e m s e g u i n t e . P o r e x e m p l o , “ O s 1 0 m e l h o r e s v i l õ e s d a
T V n ã o e s t a r ã o l i s t a d o s e m u m a ú n i c a p á g i n a , e m v e z d i s s o , v o c ê c o m e ç a r á
p e l o # 1 0 ( N e w m a n ) e s e g u i r á c l i c a n d o e m “ p r ó x i m o a t é c h e g a r e m # 1
( G u s t a v o F r i n g ) . E s t a t é c n i c a f o r n e c e a o s s i t e s d e z p á g i n a s i n t e i r a s p a r a
i n c l u i r a n ú n c i o s , m a s c a c h a t o c a r c l i c a n d o e m “ p r ó x i m o n o v e v e z e s a t é
c h e g a r a o n ú m e r o 1 . S e r i a m u i t o m e l h o r s e a l i s t a e s t i v e s s e e m u m a ú n i c a
p á g i n a e v o c ê p u d e s s e c l i c a r n o n o m e d e c a d a v i l ã o p a r a s a b e r m a i s .
L i s t a s e n c a d e a d a s t ê m u m p r o b l e m a s i m i l a r . S u p o n h a q u e v o c ê q u e i r a l e r o
ú l t i m o i t e m d e u m a l i s t a e n c a d e a d a . V o c ê n ã o p o d e f a z e r i s s o p o r q u e n ã o
s a b e o e n d e r e ç o d e l e . E m v e z d i s s o , p r e c i s a i r a o i t e m # 1 p a r a p e g a r o
e n d e r e ç o d o i t e m # 2 . E n t ã o , é n e c e s s á r i o i r a o i t e m # 2 p a r a e n c o n t r a r o
e n d e r e ç o d o i t e m # 3 , e a s s i m p o r d i a n t e , a t é c o n s e g u i r o e n d e r e ç o d o ú l t i m o
i t e m . L i s t a s e n c a d e a d a s s ã o ó t i m a s s e v o c ê q u i s e r l e r t o d o s o s i t e n s , u m d e
c a d a v e z : v o c ê p o d e l e r u m i t e m , s e g u i r p a r a o e n d e r e ç o d o p r ó x i m o i t e m e
f a z e r i s s o a t é o m d a l i s t a . M a s s e v o c ê q u i s e r p u l a r d e u m i t e m p a r a o u t r o ,
a s l i s t a s e n c a d e a d a s s ã o t e r r í v e i s .
C o m a r r a y s é d i f e r e n t e . V o c ê s a b e o e n d e r e ç o d e c a d a i t e m . P o r e x e m p l o ,
s u p o n h a q u e s e u a r r a y t e n h a c i n c o i t e n s e q u e v o c ê s a i b a q u e o p r i m e i r o e s t á
n o e n d e r e ç o 0 0 . Q u a l é o e n d e r e ç o d o i t e m # 5 ?
A m a t e m á t i c a l h e d á a r e s p o s t a : e s t á n o e n d e r e ç o 0 4 . A r r a y s s ã o ó t i m o s s e
v o c ê d e s e j a l e r e l e m e n t o s a l e a t ó r i o s , p o i s p o d e e n c o n t r a r q u a l q u e r e l e m e n t o
i n s t a n t a n e a m e n t e e m u m a r r a y . N a l i s t a e n c a d e a d a , o s e l e m e n t o s n ã o e s t ã o
p r ó x i m o s u n s d o s o u t r o s , e n t ã o v o c ê n ã o p o d e c a l c u l a r i n s t a n t a n e a m e n t e a
p o s i ç ã o d e u m e l e m e n t o n a m e m ó r i a p r e c i s a i r a o p r i m e i r o e l e m e n t o p a r a
e n c o n t r a r o e n d e r e ç o d o s e g u n d o , e n t ã o i r a o s e g u n d o e l e m e n t o p a r a
e n c o n t r a r o e n d e r e ç o d o t e r c e i r o e s e g u i r f a z e n d o i s s o a t é c h e g a r a o
e l e m e n t o q u e d e s e j a .
T e i g i a
O s e l e m e n t o s e m u m a r r a y s ã o n u m e r a d o s . E s s a n u m e r a ç ã o c o m e ç a n o 0 ,
n ã o n o 1 . N e s t e a r r a y , p o r e x e m p l o , o n ú m e r o 2 0 e s t á n a p o s i ç ã o 1 .
O n ú m e r o 1 0 e s t á n a p o s i ç ã o 0 . I s s o g e r a l m e n t e c o n f u n d e n o v o s
p r o g r a m a d o r e s . C o m e ç a r n o 0 s i m p l i c a t o d o s o s t i p o s d e a r r a y n a
p r o g r a m a ç ã o , l o g o , o s p r o g r a m a d o r e s n ã o p o d e m f u g i r d i s s o . Q u a s e t o d a s
a s l i n g u a g e n s d e p r o g r a m a ç ã o c o m e ç a r ã o o s a r r a y s n u m e r a n d o o p r i m e i r o
e l e m e n t o c o m o 0 . L o g o v o c ê s e a c o s t u m a !
A p o s i ç ã o d e u m e l e m e n t o é c h a m a d a d e í d c e . P o r t a n t o , e m v e z d e d i z e r “ o
n ú m e r o 2 0 e s t á n a ç ã 1 , a t e r m i n o l o g i a c o r r e t a s e r i a d i z e r “ o n ú m e r o
2 0 e s t á n o í d c e 1 . U s a r e i í n d i c e p a r a f a l a r d e ç ã n e s t e l i v r o .
A q u i e s t á o t e m p o d e e x e c u ç ã o p a r a o p e r a ç õ e s c o m u n s d e a r r a y s e l i s t a s .
P e r g u n t a : P o r q u e é n e c e s s á r i o t e m p o d e e x e c u ç ã o O ( ) p a r a i n s e r i r u m
e l e m e n t o e m u m a r r a y ? S u p o n h a q u e v o c ê q u e i r a i n s e r i r u m e l e m e n t o n o
c o m e ç o d e u m a r r a y . C o m o f a r i a i s s o ? Q u a n t o t e m p o l e v a r i a ? E n c o n t r e a s
r e s p o s t a s n o n a l d e s t a s e ç ã o !
E E C Í C I O
2 . 1 S u p o n h a q u e v o c ê e s t e j a c r i a n d o u m a p l i c a t i v o p a r a a c o m p a n h a r a s s u a s
n a n ç a s .
T o d o s o s d i a s v o c ê a n o t a r á t u d o o q u e g a s t o u e o n d e g a s t o u . N o n a l d o
m ê s , v o c ê d e v e r á r e v i s a r o s s e u s g a s t o s e r e s u m i r o q u a n t o g a s t o u . L o g o ,
v o c ê t e r á u m m o n t e d e i n s e r ç õ e s e p o u c a s l e i t u r a s . V o c ê d e v e r á u s a r u m
a r r a y o u u m a l i s t a p a r a i m p l e m e n t a r e s t e a p l i c a t i v o ?
I e i d a g e i d a i a
I m a g i n e q u e v o c ê q u e i r a q u e a s u a l i s t a d e t a r e f a s s e p a r e ç a m a i s c o m u m
c a l e n d á r i o . A n t e s , v o c ê a d i c i o n a v a o s i t e n s a o n a l d a l i s t a . A g o r a , q u e r
a d i c i o n a r s u a s t a r e f a s n a o r d e m e m q u e e l a s d e v e m s e r r e a l i z a d a s .
Lista desordenada.
O q u e s e r i a m e l h o r s e v o c ê q u i s e s s e i n s e r i r e l e m e n t o s n o m e i o d e u m a l i s t a :
a r r a y s o u l i s t a s e n c a d e a d a s ? U s a n d o l i s t a s e n c a d e a d a s , b a s t a m u d a r o
e n d e r e ç o p a r a o q u a l o e l e m e n t o a n t e r i o r e s t á a p o n t a n d o .
J á p a r a a r r a y s , v o c ê d e v e m o v e r t o d o s o s i t e n s q u e e s t ã o a b a i x o d o e n d e r e ç o
d e i n s e r ç ã o .
S e n ã o h o u v e r e s p a ç o , p o d e s e r n e c e s s á r i o m o v e r t u d o p a r a u m n o v o l o c a l !
P o r i s s o , l i s t a s e n c a d e a d a s s ã o m e l h o r e s c a s o v o c ê q u e i r a i n s e r i r u m
e l e m e n t o n o m e i o d e u m a l i s t a .
D e e ç õ e
E s e v o c ê q u i s e r d e l e t a r u m e l e m e n t o ? N o v a m e n t e , é m a i s f á c i l f a z e r i s s o
u s a n d o l i s t a s e n c a d e a d a s , p o i s é n e c e s s á r i o m u d a r a p e n a s o e n d e r e ç o p a r a o
q u a l o e l e m e n t o a n t e r i o r e s t á a p o n t a n d o . C o m a r r a y s , t u d o p r e c i s a s e r
m o v i d o q u a n d o u m e l e m e n t o é e l i m i n a d o .
A o c o n t r á r i o d o q u e o c o r r e c o m a s i n s e r ç õ e s , a e l i m i n a ç ã o d e e l e m e n t o s
s e m p r e f u n c i o n a r á . A i n s e r ç ã o p o d e r á f a l h a r q u a n d o n ã o h o u v e r e s p a ç o
s u c i e n t e n a m e m ó r i a .
A q u i e s t ã o o s t e m p o s d e e x e c u ç ã o p a r a a s o p e r a ç õ e s m a i s c o m u n s e m a r r a y s
e l i s t a s e n c a d e a d a s .
V a l e a p e n a m e n c i o n a r q u e i n s e r ç õ e s e e l i m i n a ç õ e s t e r ã o t e m p o d e e x e c u ç ã o
O ( 1 ) s o m e n t e s e v o c ê p u d e r a c e s s a r i n s t a n t a n e a m e n t e o e l e m e n t o a s e r
d e l e t a d o . É u m a p r á t i c a c o m u m a c o m p a n h a r o p r i m e i r o e o ú l t i m o i t e m d e
u m a l i s t a e n c a d e a d a p a r a q u e o t e m p o d e e x e c u ç ã o p a r a d e l e t á - l o s s e j a O ( 1 ) .
O q u e é m a i s u s a d o : a r r a y s o u l i s t a s ? O b v i a m e n t e , i s s o d e p e n d e d o c a s o e m
q u e s e a p l i c a m . E n t r e t a n t o o s a r r a y s s ã o m a i s c o m u n s p o r q u e p e r m i t e m
a c e s s o a l e a t ó r i o . E x i s t e m d o i s t i p o s d e a c e s s o : o a e a ó e o e e c a . O
s e q u e n c i a l s i g n i c a l e r o s e l e m e n t o s , u m p o r u m , c o m e ç a n d o p e l o p r i m e i r o .
L i s t a s e n c a d e a d a s ó p o d e m l i d a r c o m a c e s s o s e q u e n c i a l . S e v o c ê q u i s e r l e r o
d é c i m o e l e m e n t o d e u m a l i s t a e n c a d e a d a , p r i m e i r o p r e c i s a r á l e r o s n o v e
e l e m e n t o s a n t e r i o r e s p a r a c h e g a r a o e n d e r e ç o d o d é c i m o e l e m e n t o . O
a l e a t ó r i o p e r m i t e q u e v o c ê p u l e d i r e t o p a r a o d é c i m o e l e m e n t o . M u i t o s
c a s o s r e q u e r e m o a c e s s o a l e a t ó r i o , o q u e f a z o s a r r a y s s e r e m m a i s u t i l i z a d o s .
A r r a y s e l i s t a s s ã o u s a d o s p a r a i m p l e m e n t a r o u t r a s e s t r u t u r a s d e d a d o s ( i s s o
s e r á e x p l i c a d o m a i s a d i a n t e ) .
E E C Í C I O
2 . 2 S u p o n h a q u e v o c ê e s t e j a c r i a n d o u m a p l i c a t i v o p a r a a n o t a r o s p e d i d o s
d o s c l i e n t e s e m u m r e s t a u r a n t e . S e u a p l i c a t i v o p r e c i s a d e u m a l i s t a d e
p e d i d o s . O s g a r ç o n s a d i c i o n a m o s p e d i d o s a e s s a l i s t a e o s c h e f e s r e t i r a m
o s p e d i d o s d a l i s t a . F u n c i o n a c o m o u m a l a . O s g a r ç o n s c o l o c a m o s
p e d i d o s n o n a l d a l a e o s c h e f e s r e t i r a m o s p e d i d o s d o c o m e ç o d e l a
p a r a c o z i n h á - l o s .
V o c ê u s a r i a u m a r r a y o u u m a l i s t a e n c a d e a d a p a r a i m p l e m e n t a r e s s a l i s t a ?
( D i c a : l i s t a s e n c a d e a d a s s ã o b o a s p a r a i n s e r ç õ e s / e l i m i n a ç õ e s e a r r a y s s ã o
b o n s p a r a a c e s s o a l e a t ó r i o . O q u e f a z e r n e s t e c a s o ? )
2 . 3 V a m o s a n a l i s a r u m e x p e r i m e n t o . I m a g i n e q u e o F a c e b o o k g u a r d a u m a
l i s t a d e u s u á r i o s . Q u a n d o a l g u é m t e n t a a c e s s a r o F a c e b o o k , u m a b u s c a é
f e i t a p e l o n o m e d e u s u á r i o . S e o n o m e d a p e s s o a e s t á n a l i s t a , e l a p o d e
c o n t i n u a r o a c e s s o . A s p e s s o a s a c e s s a m o F a c e b o o k c o m m u i t a
f r e q u ê n c i a , e n t ã o e x i s t e m m u i t a s b u s c a s n e s s a l i s t a . P r e s u m a q u e o
F a c e b o o k u s a a p e s q u i s a b i n á r i a p a r a p r o c u r a r u m n o m e n a l i s t a . A
p e s q u i s a b i n á r i a r e q u e r a c e s s o a l e a t ó r i o v o c ê p r e c i s a s e r c a p a z d e
a c e s s a r o m e i o d a l i s t a d e n o m e s i n s t a n t a n e a m e n t e . S a b e n d o d i s s o , v o c ê
i m p l e m e n t a r i a e s s a l i s t a c o m o u m a r r a y o u u m a l i s t a e n c a d e a d a ?
2 . 4 A s p e s s o a s s e i n s c r e v e m n o F a c e b o o k c o m m u i t a f r e q u ê n c i a t a m b é m .
S u p o n h a q u e v o c ê d e c i d a u s a r u m a r r a y p a r a a r m a z e n a r a l i s t a d e
u s u á r i o s . Q u a i s a s d e s v a n t a g e n s d e u m a r r a y e m r e l a ç ã o à s i n s e r ç õ e s ? E m
p a r t i c u l a r , i m a g i n e q u e v o c ê e s t á u s a n d o a p e s q u i s a b i n á r i a p a r a b u s c a r
o s l o g i n s . O q u e a c o n t e c e q u a n d o v o c ê a d i c i o n a n o v o s u s u á r i o s e m u m
a r r a y ?
2 . 5 N a v e r d a d e , o F a c e b o o k n ã o u s a n e m a r r a y s n e m l i s t a s e n c a d e a d a s p a r a
a r m a z e n a r i n f o r m a ç õ e s . V a m o s c o n s i d e r a r u m a e s t r u t u r a d e d a d o s
h í b r i d a : u m a r r a y d e l i s t a s e n c a d e a d a s . V o c ê t e m u m a r r a y c o m 2 6 s l o t s .
C a d a s l o t a p o n t a p a r a u m a l i s t a e n c a d e a d a . P o r e x e m p l o , o p r i m e i r o s l o t
d o a r r a y a p o n t a p a r a u m a l i s t a e n c a d e a d a q u e c o n t é m o s u s u á r i o s q u e
c o m e ç a m c o m a l e t r a A . O s e g u n d o s l o t a p o n t a p a r a a l i s t a e n c a d e a d a
q u e c o n t é m o s u s u á r i o s q u e c o m e ç a m c o m a l e t r a B , e a s s i m p o r d i a n t e .
S u p o n h a q u e o A d i t B s e i n s c r e v a n o F a c e b o o k e v o c ê q u e i r a a d i c i o n á - l o à
l i s t a . V o c ê v a i a o s l o t 1 d o a r r a y , a s e g u i r p a r a a l i s t a e n c a d e a d a d o s l o t 1 , e
a d i c i o n a A d i t B n o n a l . A g o r a , s u p o n h a q u e v o c ê q u e i r a p r o c u r a r o
Z a k h i r H . V o c ê v a i a o s l o t 2 6 , q u e a p o n t a p a r a a l i s t a e n c a d e a d a d e t o d o s
o s n o m e s c o m e ç a d o s e m Z . E n t ã o , p r o c u r a p e l a l i s t a a t é e n c o n t r a r o
Z a k h i r H .
C o m p a r e e s t a e s t r u t u r a h í b r i d a c o m a r r a y s e l i s t a s e n c a d e a d a s . É m a i s l e n t o
o u m a i s r á p i d o f a z e r i n s e r ç õ e s e e l i m i n a ç õ e s n e s s e c a s o ? V o c ê n ã o p r e c i s a
r e s p o n d e r d a n d o o t e m p o d e e x e c u ç ã o B i g ( O ) , a p e n a s d i g a s e a n o v a
e s t r u t u r a d e d a d o s é m a i s r á p i d a o u m a i s l e n t a d o q u e o s a r r a y s e a s l i s t a s
e n c a d e a d a s .
O d e a ç ã e e ç ã
V a m o s j u n t a r t u d o a p r e n d i d o a t é a q u i p a r a v o c ê c o n h e c e r o s e u s e g u n d o
a l g o r i t m o : a o r d e n a ç ã o p o r s e l e ç ã o . P a r a s e g u i r n e s t a s e ç ã o , v o c ê p r e c i s a t e r
c o m p r e e n d i d o a r r a y s e l i s t a s , b e m c o m a n o t a ç ã o B i g O .
S u p o n h a q u e v o c ê t e n h a u m m o n t e d e m ú s i c a s n o s e u c o m p u t a d o r . P a r a
c a d a a r t i s t a , v o c ê t e m u m c o n t a d o r d e p l a y s .
V o c ê q u e r o r d e n a r u m a l i s t a d e a r t i s t a s , d o a r t i s t a m a i s t o c a d o p a r a o m e n o s
t o c a d o , p a r a q u e p o s s a c a t e g o r i z a r o s s e u s a r t i s t a s f a v o r i t o s . C o m o p o d e
f a z e r i s s o ? U m a m a n e i r a s e r i a p e g a r o a r t i s t a m a i s t o c a d o d a l i s t a d e m ú s i c a s
e a d i c i o n á - l o a u m a n o v a l i s t a .
F a ç a i s s o d e n o v o p a r a e n c o n t r a r o p r ó x i m o a r t i s t a m a i s t o c a d o .
C o n t i n u e f a z e n d o i s s o e e n t ã o v o c ê t e r m i n a r á c o m u m a l i s t a o r d e n a d a .
V a m o s p e n s a r c o m o e n g e n h e i r o s d a c o m p u t a ç ã o e a v a l i a r q u a n t o t e m p o
i s s o d e m o r a r i a a s e r e x e c u t a d o . L e m b r e - s e d e q u e o t e m p o d e e x e c u ç ã o O ( )
s i g n i c a q u e v o c ê p r e c i s a p a s s a r p o r t o d o s o s e l e m e n t o s d a l i s t a u m a v e z .
P o r e x e m p l o , e x e c u t a r u m a p e s q u i s a s i m p l e s n a l i s t a d e a r t i s t a s s i g n i c a
o l h a r p a r a c a d a a r t i s t a u m a v e z .
P a r a e n c o n t r a r o a r t i s t a c o m o m a i o r n ú m e r o d e p l a y s v o c ê p r e c i s a v e r i c a r
c a d a i t e m d a l i s t a . I s s o t e m t e m p o d e e x e c u ç ã o O ( ) , c o m o v o c ê a c a b o u d e
v e r . E n t ã o v o c ê t e m u m a o p e r a ç ã o c o m t e m p o d e e x e c u ç ã o O ( ) e p r e c i s a
r e p e t i r e s s a o p e r a ç ã o v e z e s :
I s s o t e m t e m p o d e e x e c u ç ã o O ( × ) o u O ( ) .
A l g o r i t m o s d e o r d e n a ç ã o s ã o m u i t o ú t e i s . A g o r a v o c ê p o d e o r d e n a r :
n o m e s e m u m a a g e n d a t e l e f ô n i c a
d a t a s d e v i a g e m
e m a i l s ( d o m a i s n o v o a o m a i s a n t i g o )
V e i c a d e e e e a c a d a e
T a l v e z v o c ê e s t e j a p e n s a n d o : c o n f o r m e p a s s a p e l a s o p e r a ç õ e s , o n ú m e r o d e e l e m e n t o s q u e
p r e c i s a a n a l i s a r d i m i n u i . E v e n t u a l m e n t e , v o c ê a c a b a t e n d o d e c h e c a r a p e n a s u m e l e m e n t o .
E n t ã o c o m o o t e m p o d e e x e c u ç ã o p e r m a n e c e s e n d o O ( ) ? I s t o é u m a b o a p e r g u n t a , e a
r e s p o s t a t e m a v e r c o m a n o t a ç ã o B i g O . F a l a r e i m a i s s o b r e i s s o n o c a p í t u l o 4 , m a s a q u i v a i o
p o n t o p r i n c i p a l .
V o c ê e s t a v a c e r t o s o b r e n ã o p r e c i s a r v e r i c a r e l e m e n t o s a c a d a v e z .
V o c ê v e r i c a e l e m e n t o s , e n t ã o 1 , - 2 2 , 1 . N a m é d i a , v o c ê v e r i c a u m a l i s t a q u e t e m
½ × e l e m e n t o s . O t e m p o d e e x e c u ç ã o é O ( × ½ × ) . M a s c o n s t a n t e s c o m o ½ s ã o
i g n o r a d a s n a n o t a ç ã o B i g O ( n o v a m e n t e , l e i a o C a p í t u l o 4 p a r a t e r a c e s s o à d i s c u s s ã o
c o m p l e t a ) , e n t ã o v o c ê e s c r e v e a p e n a s O ( × ) o u O ( ) .
A o r d e n a ç ã o p o r s e l e ç ã o é u m a l g o r i t m o b o m , m a s n ã o é m u i t o r á p i d o . O
Q u i c k s o r t é u m a l g o r i t m o d e o r d e n a ç ã o m a i s r á p i d o , q u e t e m t e m p o d e
e x e c u ç ã o d e a p e n a s O ( l o g ) . F a l a r e i d e l e n o c a p í t u l o 4 !
E E M P L O D E C Ó D I G O
N ó s n ã o l h e m o s t r a m o s o c ó d i g o p a r a o r d e n a r a l i s t a d e m ú s i c a s , m a s a
s e g u i r e s t ã o a l g u n s c ó d i g o s q u e f a r ã o a l g o b e m s i m i l a r : o r d e n a r u m a r r a y d o
m e n o r p a r a o m a i o r . V a m o s e s c r e v e r u m a f u n ç ã o p a r a e n c o n t r a r o m e n o r
e l e m e n t o e m u m a r r a y :
def buscaMenor(arr):
menor = arr[0] ❶
menor_indice = 0 ❷
fori in range(1, len(arr)):
ifarr[i] < menor:
menor = arr[i]
menor_indice = i
return menor_indice
❶ A m a e n a o m e n o a l o .
❷ A m a e n a o í n d i c e d o m e n o a l o .
A g o r a , v o c ê p o d e u s a r e s t a f u n ç ã o p a r a e s c r e v e r a o r d e n a ç ã o p o r s e l e ç ã o :
def ordenacaoporSelecao(arr): ❶
novoArr = []
fori in range(len(arr)):
menor = buscaMenor(arr) ❷
novoArr.append(arr.pop(menor))
return novoArr
❷ E n c o n a o m e n o e l e m e n o d o a a e a d i c i o n a a o n o o a a .
R e c a i a d
A m e m ó r i a d o s e u c o m p u t a d o r é c o m o u m c o n j u n t o g i g a n t e d e g a v e t a s .
Q u a n d o s e q u e r a r m a z e n a r m ú l t i p l o s e l e m e n t o s , u s a - s e u m a r r a y o u u m a
l i s t a .
N o a r r a y , t o d o s o s e l e m e n t o s s ã o a r m a z e n a d o s u m a o l a d o d o o u t r o .
N a l i s t a , o s e l e m e n t o s e s t ã o e s p a l h a d o s e u m e l e m e n t o a r m a z e n a o
e n d e r e ç o d o p r ó x i m o e l e m e n t o .
A r r a y s p e r m i t e m l e i t u r a s r á p i d a s .
L i s t a s e n c a d e a d a s p e r m i t e m r á p i d a s i n s e r ç õ e s e e l i m i n a ç õ e s .
T o d o s o s e l e m e n t o s d e u m a r r a y d e v e m s e r d o m e s m o t i p o ( t o d o s i n t s ,
t o d o s d o u b l e s , e a s s i m p o r d i a n t e ) .
3
R ã
N í
V o c ê a p r e n d e r á r e c u r s ã o . A r e c u r s ã o é u m a t é c n i c a d e p r o g r a m a ç ã o
u t i l i z a d a e m m u i t o s a l g o r i t m o s . É u m a s s u n t o i m p o r t a n t e p a r a a
c o m p r e e n s ã o d o s c a p í t u l o s s e g u i n t e s .
V o c ê a p r e n d e r á c o m o s e p a r a r u m p r o b l e m a e m c a s o - b a s e e c a s o
r e c u r s i v o . A e s t r a t é g i a d i v i d i r p a r a c o n q u i s t a r ( C a p í t u l o 4 ) u s a e s t e
c o n c e i t o s i m p l e s p a r a r e s o l v e r p r o b l e m a s c o m p l i c a d o s .
E s t o u a n i m a d o c o m e s t e c a p í t u l o p o r q u e t r a t a d e r e c u r s ã o , u m a m a n e i r a
e l e g a n t e d e s o l u c i o n a r p r o b l e m a s . A r e c u r s ã o é u m d o s m e u s t ó p i c o s
f a v o r i t o s , m a s e l a é p o l ê m i c a . A s p e s s o a s o u a a m a m o u a o d e i a m , o u e l a s a
o d e i a m a t é q u e a p r e n d a m a a m á - l a a l g u n s a n o s d e p o i s . E u e s t a v a n e s s a
t e r c e i r a s i t u a ç ã o . P a r a f a c i l i t a r a s c o i s a s , t e n h o u m c o n s e l h o :
E s t e c a p í t u l o a p r e s e n t a v á r i o s e x e m p l o s d e c ó d i g o s . E x e c u t e - o s p a r a v e r
c o m o e l e s f u n c i o n a m .
F a l a r e i s o b r e f u n ç õ e s r e c u r s i v a s . P e l o m e n o s u m a v e z , a n a l i s e u m a f u n ç ã o
r e c u r s i v a c o m u m p a p e l e u m a c a n e t a , a l g o d o t i p o “ v a m o s v e r , p a s s o o
n ú m e r o 5 p a r a a f fatorial u n ç ã o , e e n t ã o r e t o r n o c i n c o v e z e s p a s s a n d o
o n ú m e r o 4 p a r a fatorial , o q u e m e d á , e a s s i m p o r d i a n t e . A n a l i s a r
u m a f u n ç ã o d e s s a f o r m a l h e a j u d a r á a e n t e n d e r c o m o f u n c i o n a m a s
f u n ç õ e s r e c u r s i v a s .
E s t e c a p í t u l o i n c l u i m u i t o s p s e u d o c ó d i g o s . P s e u d o c ó d i g o s s ã o u m a d e s c r i ç ã o
d e a l t o n í v e l d e u m p r o b l e m a e m f o r m a t o d e c ó d i g o . É e s c r i t o c o m o u m
c ó d i g o , m a s u t i l i z a l i n g u a g e m m a i s p r ó x i m a d a h u m a n a .
R ã
S u p o n h a q u e v o c ê e s t e j a v a s c u l h a n d o o p o r ã o d e s u a a v ó e e n c o n t r e u m a
m i s t e r i o s a m a l a t r a n c a d a .
A s u a a v ó d i z q u e a c h a v e p a r a a m a l a p r o v a v e l m e n t e e s t á e m u m a c a i x a .
E s t a c a i x a c o n t é m m a i s c a i x a s c o m m a i s c a i x a s d e n t r o d e l a s . A c h a v e e s t á
e m a l g u m a d e s t a s c a i x a s . Q u a l é o s e u a l g o r i t m o p a r a p r o c u r á - l a ? P e n s e
n i s s o a n t e s d e c o n t i n u a r a l e i t u r a .
A q u i e s t á u m a a b o r d a g e m .
1 . M o n t e u m a p i l h a c o m a s c a i x a s q u e s e r ã o a n a l i s a d a s .
2 . P e g u e u m a c a i x a e o l h e o q u e t e m d e n t r o d e l a .
3 . S e v o c ê e n c o n t r a r o u t r a c a i x a d e n t r o d e l a , a d i c i o n e - a a u m n o v o m o n t e
p a r a s e r v e r i c a d a m a i s t a r d e .
4 .
S e v o c ê e n c o n t r a r u m a c h a v e , t e r m i n o u !
5 .
R e p i t a .
A q u i e s t á o u t r a a b o r d a g e m .
1 . O l h e o q u e t e m d e n t r o d a c a i x a .
2 .
S e e n c o n t r a r o u t r a c a i x a , v o l t e a o p a s s o 1 .
3 . S e e n c o n t r a r a c h a v e , t e r m i n o u !
Q u a l a b o r d a g e m l h e p a r e c e m a i s f á c i l ? A p r i m e i r a a b o r d a g e m u t i l i z a u m
l o o p while ( e n q u a n t o , e m p o r t u g u ê s ) . E n q u a n t o o m o n t e e x i s t i r , p e g u e u m a
c a i x a e o l h e o q u e t e m d e n t r o d e l a :
def procure_pela_chave(caixa_principal):
pilha = main_box.crie_uma_pilha_para_busca
main_box.crie_uma _pilha_para_busca()
()
whilepilha is not vazia:
caixa = pilha.pegue_caixa()
pilha.pegue_caix a()
foritem in caixa:
if item.e_uma_caixa():
pilha.append(item)
elif item.e_uma_chave():
print "achei a chave!"
A s e g u n d a m a n e i r a u t i l i z a a r e c u r s ã o . R e c u r s ã o é q u a n d o u m a f u n ç ã o
c h a m a a s i m e s m a . V e j a o p s e u d o c ó d i g o d e c o m o i s s o f u n c i o n a .
def procure_pela_chave(caixa):
foritem in caixa:
if item.e_uma_caixa():
procure_pela_chave(item) ❶
elif item.e_uma_chave():
print "achei a chave!"
❶ R e c u r s ã o !
A m b a s a s a b o r d a g e n s c u m p r e m c o m a m e s m a p r o p o s t a , m a s a s e g u n d a m e
p a r e c e m a i s o b j e t i v a . A r e c u r s ã o é u s a d a p a r a t o r n a r a r e s p o s t a m a i s c l a r a .
N ã o h á n e n h u m b e n e f í c i o q u a n t o a o d e s e m p e n h o a o u t i l i z a r a r e c u r s ã o . N a
v e r d a d e , o s l o o p s a l g u m a s v e z e s s ã o m e l h o r p a r a o d e s e m p e n h o d e u m
p r o g r a m a . G o s t o d e s t a f r a s e d e L e i g h C a l d w e l l , d o S t a c k O v e r o w : “ O s
l o o p s p o d e m m e l h o r a r o d e s e m p e n h o d o s e u p r o g r a m a . A r e c u r s ã o m e l h o r a
o d e s e m p e n h o d o s e u p r o g r a m a d o r . E s c o l h a o q u e f o r m a i s i m p o r t a n t e p a r a
a s u a s i t u a ç ã o .
M u i t o s a l g o r i t m o s i m p o r t a n t e s u s a m a r e c u r s ã o , e n t ã o é f u n d a m e n t a l
e n t e n d e r e s t e c o n c e i t o .
C -
D e v i d o a o f a t o d e a f u n ç ã o r e c u r s i v a c h a m a r a s i m e s m a , é m a i s f á c i l
e s c r e v ê - l a e r r o n e a m e n t e e a c a b a r e m u m l o o p i n n i t o . P o r e x e m p l o ,
s u p o n h a q u e v o c ê e s c r e v a u m a f u n ç ã o q u e i m p r i m a u m a c o n t a g e m
r e g r e s s i v a , c o m o e s t a :
> 3...2...1
V o c ê p o d e e s c r e v e r i s s o d e m a n e i r a r e c u r s i v a f a z e n d o o s e g u i n t e :
def regressiva(i):
print i
regressiva(i-1)
E s c r e v a e s t e c ó d i g o e e x e c u t e - o . V o c ê p e r c e b e r á u m p r o b l e m a : e s s a f u n ç ã o
c a r á e x e c u t a n d o p a r a s e m p r e !
Loop infinito.
> 3...2...1...0...-1...-2...
( P r e s s i o n e C t r l - C p a r a i n t e r r o m p e r o s e u s c r i p t . )
Q u a n d o v o c ê e s c r e v e u m a f u n ç ã o r e c u r s i v a , d e v e i n f o r m a r q u a n d o a
r e c u r s ã o d e v e p a r a r . É p o r i s s o q u e t o d a f u n ç ã o r e c u r s i v a t e m d u a s p a r t e s : o
c a s o - b a s e e o c a s o r e c u r s i v o . O c a s o r e c u r s i v o é q u a n d o a f u n ç ã o c h a m a a s i
m e s m a . O c a s o - b a s e é q u a n d o a f u n ç ã o n ã o c h a m a a s i m e s m a n o v a m e n t e ,
d e f o r m a q u e o p r o g r a m a n ã o s e t o r n a u m l o o p i n n i t o .
V a m o s a d i c i o n a r o c a s o - b a s e à f u n ç ã o d e c o n t a g e m r e g r e s s i v a :
def regressiva(i):
print i
ifi <= 1: ❶
return
else: ❷
regressiva(i-1)
❶ C a s o - b a s e .
❷ C a s o r e c u r s i v o .
A g o r a , a f u n ç ã o f u n c i o n a c o m o e s p e r a d o . E l a c a m a i s o u m e n o s a s s i m :
A
E s t a s e ç ã o a b o r d a a p i l h a d e c h a m a d a ( c a l l s t a c k ) . I s t o é u m c o n c e i t o
i m p o r t a n t e e m p r o g r a m a ç ã o e i n d i s p e n s á v e l p a r a e n t e n d e r a r e c u r s ã o .
S u p o n h a q u e v o c ê e s t e j a f a z e n d o u m c h u r r a s c o p a r a o s s e u s a m i g o s . V o c ê
t e m u m a l i s t a d e a f a z e r e s e m f o r m a d e u m a p i l h a d e n o t a s a d e s i v a s .
V o c ê s e l e m b r a d e q u e , q u a n d o f a l a m o s d e a r r a y s e l i s t a s , t a m b é m h a v i a
u m a l i s t a d e a f a z e r e s ? P o d i a a d i c i o n a r i t e n s e m q u a l q u e r l u g a r d a l i s t a o u
r e m o v e r i t e n s a l e a t ó r i o s . A p i l h a d e n o t a s a d e s i v a s é b e m m a i s s i m p l e s .
Q u a n d o v o c ê i n s e r e u m i t e m , e l e é c o l o c a d o n o t o p o d a p i l h a . Q u a n d o v o c ê
l ê u m i t e m , l ê a p e n a s o i t e m d o t o p o d a p i l h a e e l e é r e t i r a d o d a l i s t a . L o g o ,
s u a l i s t a d e a f a z e r e s c o n t é m a p e n a s d u a s a ç õ e s : p u s h ( i n s e r i r ) e p o p ( r e m o v e r
e l e r ) .
V a m o s v e r c o m o i s s o f u n c i o n a n a p r á t i c a .
E s t a e s t r u t u r a d e d a d o s é c h a m a d a d e p i l h a . A p i l h a é u m a e s t r u t u r a d e
d a d o s s i m p l e s . V o c ê a t e m u s a d o e s s e t e m p o t o d o s e m p e r c e b e r !
A
S e u c o m p u t a d o r u s a u m a p i l h a i n t e r n a d e n o m i n a d a p i l h a d e c h a m a d a .
V a m o s v e r i s t o n a p r á t i c a . A q u i e s t á u m e x e m p l o s i m p l e s :
def sauda(nome):
print "Olá, " + nome + "!"
sauda2(nome)
print "preparando para dizer tchau..."
tchau()
E s t a f u n ç ã o t e c u m p r i m e n t a e c h a m a o u t r a s d u a s f u n ç õ e s :
def sauda2(nome):
print "Como vai " + nome + "?"
deftchau():
print "ok, tchau!"
V a m o s a n a l i s a r o q u e a c o n t e c e q u a n d o v o c ê c h a m a u m a f u n ç ã o .
print é u m a f u n ç ã o e m P y t h o n , m a s , p a r a f a c i l i t a r a s c o i s a s , v a m o s n g i r q u e n ã o é . E n t r e
n a b r i n c a d e i r a .
N . R . T . : t e c n i c a m e n t e
print n ã o é u m a f u n ç ã o e m P y t h o n 2 , m a s u m a i n s t r u ç ã o o u
s t a t e m e n t .
S u p o n h a q u e v o c ê c h a m e sauda("maggie") . P r i m e i r o , s e u c o m p u t a d o r
a l o c a u m a c a i x a d e m e m ó r i a p a r a e s s a c h a m a d a .
A g o r a , v a m o s u s a r a m e m ó r i a . A v a r i á v e l nome é s e t a d a p a r a “ m a g g i e . I s s o
p r e c i s a s e r s a l v o .
C a d a v e z q u e v o c ê f a z u m a c h a m a d a d e f u n ç ã o , s e u c o m p u t a d o r s a l v a n a
m e m ó r i a o s v a l o r e s p a r a t o d a s a s v a r i á v e i s . D e p o i s d i s s o , i m p r i m e olá,
maggie! . E n t ã o , c h a m a sauda2("maggie").
N o v a m e n t e , s e u c o m p u t a d o r a l o c a u m a c a i x a d e m e m ó r i a p a r a e s s a
c h a m a d a d e f u n ç ã o .
S e u c o m p u t a d o r e s t á u s a n d o u m a p i l h a p a r a e s t a s c a i x a s . A s e g u n d a c a i x a é
a d i c i o n a d a e m c i m a d a p r i m e i r a . V o c ê i m p r i m e " " .
E n t ã o , r e t o r n a d a c h a m a d a d e f u n ç ã o . Q u a n d o i s s
como vai maggie?
o a c o n t e c e , a c a i x a d o
t o p o d a p i l h a é r e t i r a d a .
A g o r a , a c a i x a d o t o p o d a p i l h a a l o c a o s v a l o r e s d a f u n ç ã o sauda , o q u e
s i g n i c a q u e v o c ê r e t o r n o u à f u n ç ã o sauda . Q u a n d o v o c ê c h a m o u a f u n ç ã o
sauda2 , a f u n ç ã o sauda c o u p a r c i a l m e n t e c o m p l e t a . E s t a é a g r a n d e i d e i a
p o r t r á s d e s t a s e ç ã o : q u a n d o v o c ê c h a m a u m a f u n ç ã o a p a r t i r d e o u t r a , a
c h a m a d a d e f u n ç ã o c a p a u s a d a e m u m e s t a d o p a r c i a l m e n t e c o m p l e t o . T o d o s
o s v a l o r e s d a s v a r i á v e i s p a r a a q u e l a f u n ç ã o a i n d a e s t ã o a r m a z e n a d o s n a
m e m ó r i a . A g o r a q u e v o c ê j á u t i l i z o u a f u n ç ã o sauda2 , v o c ê e s t á d e v o l t a n a
f u sauda n ç ã o e p o d e c o n t i n u a r d e o n d e p a r o u . P r i m e i r o , i m p r i m e
i m p r i m i r ok, tchau! , r e t o r n a r á d a c h a m a d a d e f u n ç ã o .
A g o r a , v o c ê e s t á d e v o l t a à f u n ç ã o sauda . N ã o h á n a d a m a i s a s e r f e i t o , e
v o c ê p o d e s a i r d a f u n ç ã o sauda t a m b é m . E s s a p i l h a u s a d a p a r a g u a r d a r a s
v a r i á v e i s d e m ú l t i p l a s f u n ç õ e s é d e n o m i n a d a p i l h a d e c h a m a d a .
E E C Í C I
3 . 1 S u p o n h a q u e e u f o r n e ç a u m a p i l h a d e c h a m a d a c o m o e s t a :
Q u a i s i n f o r m a ç õ e s v o c ê p o d e r e t i r a r b a s e a n d o - s e a p e n a s n e s t a p i l h a d e
c h a m a d a ?
A g o r a , v a m o s v e r e s t a p i l h a d e c h a m a d a s e n d o e x e c u t a d a c o m u m a f u n ç ã o
r e c u r s i v a .
A ã
A s f u n ç õ e s r e c u r s i v a s t a m b é m u t i l i z a m a p i l h a d e c h a m a d a ! V a m o s a n a l i s a r
i s t o n a p r á t i c a c o m a f u n ç ã o fat ( f a t o r i a l ) . fat(5) é e s c r i t a c o m o 5 ! e é
d e n i d a d a s e g u i n t e f o r m a : 5 ! = 5 * 4 * 3 * 2 * 1 . D e f o r m a s e m e l h a n t e ,
fat(3) é 3 * 2 * 1 . A q u i e s t á u m a f u n ç ã o r e c u r s i v a p a r a c a l c u l a r a f a t o r i a l
d e u m n ú m e r o :
deffat(x):
ifx == 1:
return 1
else:
return x * fat(x-1)
A g o r a , v o c ê c h a m a a f u n ç ã o
fat(3) . V a m o s a n a l i s a r e s t a p i l h a d e c h a m a d a
l i n h a p o r l i n h a e v e r c o m o e l a s e a l t e r a . L e m b r e - s e , a c a i x a m a i s p r ó x i m a a o
t o p o l h e d i z e m q u a l c h a m a d a a f u n ç ã o fat s e e n c o n t r a a t u a l m e n t e .
R e p a r e q u e c a d a c h a m a d a p a r a a f u n ç ã o fat t e m s e u p r ó p r i o v a l o r d e x .
V o c ê n ã o c o n s e g u e a c e s s a r a m e s m a f u n ç ã o c o m o u t r o v a l o r d e x .
A p i l h a t e m u m p a p e l i m p o r t a n t e n a r e c u r s ã o . N o p r i m e i r o e x e m p l o ,
m o s t r e i d u a s a b o r d a g e n s p a r a e n c o n t r a r a c h a v e . A q u i e s t á a p r i m e i r a .
D e s t a f o r m a , v o c ê f e z u m m o n t e c o m c a i x a s p a r a a n a l i s a r , e n t ã o s a b e q u a i s
c a i x a s v o c ê a i n d a p r e c i s a a b r i r .
M a s n a a b o r d a g e m r e c u r s i v a n ã o e x i s t e m m o n t e s .
S e n ã o e x i s t e m m o n t e s , c o m o u m a l g o r i t m o r e c o n h e c e q u a i s c a i x a s e l e d e v e
p r o c u r a r ? A q u i e s t á u m e x e m p l o .
N e s t e p o n t o , a p i l h a d e c h a m a d a s e p a r e c e c o m i s t o :
O “ m o n t e d e c a i x a s é s a l v o n a p i l h a ! E s t a é u m a p i l h a c o m a s f u n ç õ e s d e
c h a m a d a c o m p l e t a d a s a t é a m e t a d e , c a d a u m a c o m a s u a l i s t a d e c a i x a s ,
t a m b é m c o m p l e t a d a s a t é a m e t a d e , p a r a s e r a n a l i s a d a s . U t i l i z a r a p i l h a é
c o n v e n i e n t e p o r q u e v o c ê n ã o p r e c i s a a c o m p a n h a r o m o n t e d e c a i x a s – a
p i l h a f a z i s s o p a r a v o c ê . U s a r a p i l h a é b o m , p o r é m , e x i s t e u m c u s t o : s a l v a r
t o d a e s s a i n f o r m a ç ã o p o d e o c u p a r m u i t a m e m ó r i a . C a d a u m a d e s t a s
f u n ç õ e s d e c h a m a d a o c u p a u m p o u c o d e m e m ó r i a , e q u a n d o a s u a p i l h a e s t á
m u i t o c h e i a é s i n a l d e q u e s e u c o m p u t a d o r e s t á s a l v a n d o i n f o r m a ç ã o p a r a
m u i t a s c h a m a d a s d e f u n ç õ e s . P a r a e s t a s i t u a ç ã o , v o c ê t e m d u a s o p ç õ e s :
R e e s c r e v e r s e u c ó d i g o u t i l i z a n d o l o o p s .
U t i l i z a r o q u e c h a m a m o s d e t a i l r e c u r s i o n ( r e c u r s ã o d e c a u d a ) . I s t o é u m
t ó p i c o a v a n ç a d o e m r e c u r s ã o e e s t á f o r a d o e s c o p o d e s t e l i v r o . E s t a t é c n i c a
t a m b é m n ã o é s u p o r t a d a p o r t o d a s a s l i n g u a g e n s d e p r o g r a m a ç ã o .
E E C Í C I
3 . 2 S u p o n h a q u e v o c ê a c i d e n t a l m e n t e e s c r e v a u m a f u n ç ã o r e c u r s i v a q u e
q u e e x e c u t a n d o i n n i t a m e n t e . C o m o v o c ê v i u , s e u c o m p u t a d o r a l o c a
m e m ó r i a n a p i l h a p a r a c a d a c h a m a d a d e f u n ç ã o . O q u e a c o n t e c e c o m a
p i l h a q u a n d o a f u n ç ã o r e c u r s i v a c a e x e c u t a n d o i n n i t a m e n t e ?
R
R e c u r s ã o é q u a n d o u m a f u n ç ã o c h a m a a s i m e s m a .
T o d a f u n ç ã o r e c u r s i v a t e m d o i s c a s o s : o c a s o - b a s e e o c a s o r e c u r s i v o .
U m a p i l h a t e m d u a s o p e r a ç õ e s : p u s h e p o p .
T o d a s a s c h a m a d a s d e f u n ç ã o v ã o p a r a a p i l h a d e c h a m a d a .
A p i l h a d e c h a m a d a p o d e c a r m u i t o g r a n d e e o c u p a r m u i t a m e m ó r i a .
.
1 : / / a c e . c / a / 7 2 6 9 4 / 1 3 9 1 1 7
4
Q
N í
V o c ê i á e d e a a , o c a i o n a l m e n e , c o m o b l e m a e n ã o
o d e m e e o l i d o c o m a l g m a l g o i m o d e e c o n h e c i m e n o .
P o é m a n d o m b o m d e e n o l e d o d e a l g o i m o e n c o n a m
d e e o b l e m a , e l e n ã o d e i e . P e l o c o n á i o , e l e i l i a m a
a m l a g a m a d e é c n i c a a a e n c o n a m a o l ç ã o , e n d o a
é c n i c a d e d i i d i a a c o n i a a i m e i a e o c ê a e n d e á .
V o c ê c o n h e c e á a m b é m o i c k o , m a l g o i m o d e o d e n a ç ã o
e l e g a n e e é i l i a d o c o m f e ê n c i a . E e a l g o i m o i l i a a
é c n i c a d e d i i d i a a c o n i a .
N o ú l t i m o c a p í t u l o v o c ê a p r e n d e u t u d o s o b r e r e c u r s ã o . E s t e c a p í t u l o f o c a r á
n a u t i l i z a ç ã o d e s t a s s u a s n o v a s h a b i l i d a d e s a p l i c a d a s n a r e s o l u ç ã o d e
p r o b l e m a s . P a r a i s t o , v a m o s e x p l o r a r a t é c n i c a d i i d i a a c i a ( D C ) ,
u m a t é c n i c a r e c u r s i v a m u i t o c o n h e c i d a p a r a r e s o l u ç ã o d e p r o b l e m a s .
E s t e c a p í t u l o t r a t a d o p o n t o p r i n c i p a l d o s a l g o r i t m o s , p o i s u m a l g o r i t m o
q u e c o n s e g u e r e s o l v e r a p e n a s u m t i p o d e p r o b l e m a n ã o é m u i t o ú t i l . A s s i m ,
a t é c n i c a D C o f e r e c e u m a n o v a m a n e i r a d e p e n s a r s o b r e a r e s o l u ç ã o d e
p r o b l e m a s , t o r n a n d o - s e m a i s u m a a l t e r n a t i v a e m s u a c a i x a d e f e r r a m e n t a s .
Q u a n d o v o c ê s e d e p a r a r c o m u m p r o b l e m a n o v o , n ã o t e r á m o t i v o s p a r a
c a r d e s n o r t e a d o . E m v e z d i s s o , p o d e r á s e p e r g u n t a r “ S e r á q u e p o s s o
r e s o l v e r e s t e p r o b l e m a u s a n d o a t é c n i c a d e d i v i d i r p a r a c o n q u i s t a r ? .
A o n a l d e s t e c a p í t u l o v o c ê t e r á a p r e n d i d o o s e u p r i m e i r o a l g o r i t m o q u e
u t i l i z a a t é c n i c a D C : o i c . O a l g o r i t m o q u i c k s o r t é u m a l g o r i t m o d e
o r d e n a ç ã o m u i t o m a i s r á p i d o d o q u e o a l g o r i t m o d e o r d e n a ç ã o p o r s e l e ç ã o
( q u e v o c ê a p r e n d e u n o C a p í t u l o 2 ) , e é t a m b é m u m b o m e x e m p l o d e
p r o g r a m a ç ã o e l e g a n t e .
D
A t é c n i c a D C p o d e l e v a r a l g u m t e m p o p a r a s e r c o m p r e e n d i d a . P o r i s s o ,
v e r e m o s t r ê s e x e m p l o s . P r i m e i r o , m o s t r a r e i u m e x e m p l o v i s u a l . D e p o i s ,
m o s t r a r e i u m c ó d i g o d e e x e m p l o s i m p l e s , m a s n ã o t ã o e l e g a n t e . P o r m , n o s
a p r o f u n d a r e m o s n o q u i c k s o r t , u m a l g o r i t m o d e o r d e n a ç ã o q u e u t i l i z a D C .
S u p o n h a q u e v o c ê s e j a u m f a z e n d e i r o q u e t e n h a u m a á r e a d e t e r r a .
V o c ê q u e r d i v i d i r s u a f a z e n d a e m p o r ç õ e s a d a d a i g u a i s , s e n d o q u e e s t a s
p o r ç õ e s d e v e m t e r o m a i o r t a m a n h o p o s s í v e l . A s s i m , n e n h u m a d e s t a s
a l t e r n a t i v a s f u n c i o n a r á .
C o m o e n c o n t r a r á o m a i o r t a m a n h o p o s s í v e l p a r a e s t e s q u a d r a d o s ? U s a n d o a
e s t r a t é g i a D C ! O s a l g o r i t m o s D C s ã o r e c u r s i v o s . A s s i m , p a r a r e s o l v e r u m
p r o b l e m a u t i l i z a n d o D C , v o c ê d e v e s e g u i r d o i s p a s s o s :
1 . D e s c u b r a o c a s o - b a s e , q u e d e v e s e r o c a s o m a i s s i m p l e s p o s s í v e l .
2 . D i v i d a o u d i m i n u a o s e u p r o b l e m a a t é q u e e l e s e t o r n e o c a s o - b a s e .
V a m o s u s a r D C p a r a e n c o n t r a r a s o l u ç ã o d e s t e p r o b l e m a . Q u a l é a m a i o r
l a r g u r a q u e v o c ê p o d e u s a r ?
P r i m e i r o , d e s c u b r a o c a s o - b a s e . S e r i a m a i s f á c i l s o l u c i o n a r e s t e p r o b l e m a s e
u m d o s l a d o s f o s s e m ú l t i p l o d o o u t r o .
S u p o n h a q u e u m d o s l a d o s t e n h a 2 5 m e t r o s ( m ) e o o u t r o t e n h a 5 0 . A s s i m ,
o m a i o r q u a d r a d o q u e v o c ê p o d e t e r m e d e 2 5 m x 2 5 m . V o c ê p r e c i s a d e
d o i s d e s t e s q u a d r a d o s p a r a d i v i d i r a p o r ç ã o d e t e r r a .
A g o r a v o c ê p r e c i s a d e s c o b r i r o c a s o r e c u r s i v o , e é a q u i q u e a e s t r a t é g i a D C
e n t r a e m a ç ã o . S e g u i n d o a e s t r a t é g i a D C , a c a d a r e c u r s ã o v o c ê d e v e r e d u z i r
o s e u p r o b l e m a . E n t ã o , c o m o r e d u z i r e s t e p r o b l e m a ? V a m o s c o m e ç a r
i d e n t i c a n d o o s m a i o r e s q u a d r a d o s q u e v o c ê p o d e u t i l i z a r .
V o c ê p o d e p o s i c i o n a r d o i s q u a d r a d o s d e 6 4 0 × 6 4 0 n a f a z e n d a e a i n d a
c o n t i n u a r á c o m u m a p o r ç ã o d e t e r r a p a r a s e r d i v i d i d a . E s t e é o m o m e n t o
“ A h a ! . V o c ê a i n d a t e m u m s e g m e n t o d a f a z e n d a q u e d e v e s e r d i v i d i d o . P
e ã a i c a e e e a g i e e e g e ?
V o c ê i n i c i o u c o m u m a p o r ç ã o d e t e r r a m e d i n d o 1 . 6 8 0 × 6 4 0 q u e d e v e r i a s e r
d i v i d i d a . P o r é m a g o r a v o c ê p r e c i s a d i v i d i r u m s e g m e n t o m e n o r , q u e m e d e
6 4 0 × 4 0 0 . C a s o e c e a i a d a d e d i i d e e e e g e , e e e á
a i a d a d e d i i d i á d a a f a e d a . V o c ê a c a b o u d e r e d u z i r u m
p r o b l e m a d e d i v i s ã o d e u m a f a z e n d a m e d i n d o 1 . 6 8 0 × 6 4 0 p a r a u m
p r o b l e m a d e d i v i s ã o d e u m a á r e a m e d i n d o 6 4 0 × 4 0 0 !
A E
“ C a s o v o c ê e n c o n t r e o m a i o r q u a d r a d o q u e d i v i d e e s t e s e g m e n t o , e l e s e r á o m a i o r q u a d r a d o
q u e i r á d i v i d i r t o d a a f a z e n d a . S e n ã o p a r e c e ó b v i o o m o t i v o d e e s t a a r m a ç ã o s e r
v e r d a d e i r a , n ã o s e p r e o c u p e , e l a r e a l m e n t e n ã o é t r i v i a l . I n f e l i z m e n t e , a p r o v a d e s t a a r m a ç ã o
é u m p o u c o l o n g a p a r a s e r i n c l u í d a n e s t e l i v r o , e n t ã o v o c ê t e r á d e c o n a r e m m i m . C a s o v o c ê
q u e i r a e n t e n d e r a p r o v a , p r o c u r e o A l g o r i t m o d e E u c l i d e s . A K h a n A c a d e m y d e u u m a b o a
e x p l i c a ç ã o , d i s p o n í v e l a q u i : : / / . . / / -
/ / / / - - .
V a m o s a p l i c a r o m e s m o a l g o r i t m o n o v a m e n t e . C o m e ç a n d o c o m u m a
f a z e n d a m e d i n d o 6 4 0 × 4 0 0 m , o m a i o r q u a d r a d o q u e v o c ê p o d e t e r m e d e
4 0 0 × 4 0 0 m .
E i s s o d e i x a v o c ê c o m u m s e g m e n t o m e n o r d o q u e 4 0 0 × 2 4 0 m .
V o c ê p o d e d e s e n h a r u m q u a d r a d o n e s t e s e g m e n t o q u e l h e d e i x a c o m u m
s e g m e n t o a i n d a m e n o r , d e 2 4 0 × 1 6 0 m .
E n t ã o , v o c ê d e s e n h a u m q u a d r a d o n e s t e s e g m e n t o p a r a t e r u m s e g m e n t o
a i n d a m e n o r .
E i , v o c ê a c a b o u d e d e s c o b r i r o c a s o - b a s e , p o i s 8 0 é u m m ú l t i p l o d e 1 6 0 . S e
d i v i d i r e s t e s e g m e n t o e m q u a d r a d o s , n ã o h a v e r á s e g m e n t o s s o b r a n d o !
A s s i m , p a r a a f a z e n d a o r i g i n a l , o m a i o r q u a d r a d o q u e v o c ê p o d e u t i l i z a r é
8 0 × 8 0 m .
P a r a r e c a p i t u l a r , e s t e s s ã o o s p a s s o s p a r a a p l i c a ç ã o d a e s t r a t é g i a D C :
1 . D e s c u b r a o c a s o - b a s e , q u e d e v e s e r o c a s o m a i s s i m p l e s p o s s í v e l .
2 . D e s c u b r a c o m o r e d u z i r o s e u p r o b l e m a p a r a q u e e l e s e t o r n e o c a s o - b a s e .
O a l g o r i t m o D C n ã o é u m s i m p l e s a l g o r i t m o q u e v o c ê a p l i c a e m u m
p r o b l e m a , m a s s i m u m a m a n e i r a d e p e n s a r s o b r e o p r o b l e m a . V a m o s v e r
m a i s u m e x e m p l o .
V o c ê t e m u m a r r a y d e n ú m e r o s .
V o c ê d e v e s o m a r t o d o s o s n ú m e r o s e r e t o r n a r o v a l o r t o t a l . I s t o é s i m p l e s d e
s e r f e i t o c o m u m l o o p :
def soma(lista):
total = 0
for
x in lista:
total += x
return
total
print soma([1, 2, 3, 4])
M a s c o m o i s s o p o d e r i a s e r f e i t o c o m u m a f u n ç ã o r e c u r s i v a ?
1 :
D e s c u b r a o c a s o - b a s e . Q u a l é o a r r a y m a i s s i m p l e s q u e v o c ê p o d e
o b t e r ? P e n s e s o b r e o c a s o m a i s s i m p l e s : s e v o c ê t i v e r u m a r r a y c o m 0 o u
c o m 1 e l e m e n t o , s e r á m u i t o s i m p l e s c a l c u l a r a s o m a .
L o g o , e s s e é o c a s o - b a s e .
2 : V o c ê d e v e c h e g a r m a i s p e r t o d e u m a r r a y v a z i o a c a d a r e c u r s ã o .
C o m o p o d e r e d u z i r o t a m a n h o d o s e u p r o b l e m a ? E s t a é u m a a l t e r n a t i v a :
A s o m a d e s t e a r r a y é i g u a l a i s t o :
E m a m b o s o s c a s o s o r e s u l t a d o é 1 2 . P o r é m , n a s e g u n d a v e r s ã o , v o c ê e s t á
u s a n d o u m a r r a y m e n o r n a f u n ç ã o soma . O u s e j a , c ê e á d i i i d
a a h d b e a !
A s u a f u n ç ã o soma p o d e r i a f u n c i o n a r a s s i m :
A q u i e s t á u m e x e m p l o d a f u n ç ã o n a p r á t i c a :
L e m b r e - s e d e q u e a r e c u r s ã o t e m m e m ó r i a d o s e s t a d o s a n t e r i o r e s .
D
Q u a n d o e s t i v e r e s c r e v e n d o u m a f u n ç ã o d e r e c u r s ã o q u e e n v o l v a u m a r r a y , o
c a s o - b a s e s e r á , m u i t a s v e z e s , u m a r r a y v a z i o o u u m a r r a y c o m a p e n a s u m
e l e m e n t o . S e e s t i v e r c o m p r o b l e m a s , u s e e s t e c a s o c o m o b a s e .
U ç ã
“ P o r q u e e u f a r i a i s t o r e c u r s i v a m e n t e q u a n d o é m a i s s i m p l e s f a z e r a t r a v é s d e u m l o o p ? é o
q u e v o c ê p o d e e s t a r p e n s a n d o . B e m , e s t a m o s d a n d o u m a e s p i a d a e m p r o g r a m a ç ã o f u n c i o n a l !
L i n g u a g e n s d e p r o g r a m a ç ã o f u n c i o n a l , c o m o H a s k e l l , n ã o c o n t ê m l o o p s , e i s s o f a z c o m q u e
v o c ê t e n h a d e u s a r f u n ç õ e s c o m o e s s a . S e v o c ê c o m p r e e n d e b e m o q u e é r e c u r s ã o , l i n g u a g e n s
f u n c i o n a i s s e r ã o s i m p l e s d e e n t e n d e r . P o r e x e m p l o , v o c ê e s c r e v e r i a u m a f u n ç ã o s o m a t ó r i a e m
H a s k e l l a s s i m :
soma [] = 0 ❶
soma (x:xs) = x + (soma xs) ❷
❶ C a o - b a e .
❷ C a o e c i o .
P e r c e b a q u e p a r e c e q u e v o c ê t e m d u a s d e n i ç õ e s p a r a a f u n ç ã o . A p r i m e i r a d e n i ç ã o é
e x e c u t a d a q u a n d o v o c ê a l c a n ç a o c a s o - b a s e , e a s e g u n d a é e x e c u t a d a n o c a s o r e c u r s i v o . V o c ê
t a m b é m p o d e e s c r e v e r e s s a f u n ç ã o e m H a s k e l l u s a n d o u m o p e r a d o r c o n d i c i o n a l i f ( s e , e m
p o r t u g u ê s ) :
r e c u r s ã o , e s s a l i n g u a g e m i n c l u i v á r i o s d e t a l h e s c o m o e s t e p a r a t o r n a r a r e c u r s ã o m a i s
s i m p l e s . S e v o c ê g o s t a d e r e c u r s ã o o u c a s o v o c ê e s t e j a i n t e r e s s a d o e m a p r e n d e r u m a n o v a
l i n g u a g e m d e p r o g r a m a ç ã o , d ê u m a o l h a d a e m H a s k e l l .
E E C Í C I
4 . 1 E s c r e v a o c ó d i g o p a r a a f u n ç ã o soma , v i s t a a n t e r i o r m e n t e .
4 . 2
E s c r e v a u m a f u n ç ã o r e c u r s i v a q u e c o n t e o n ú m e r o d e i t e n s e m u m a l i s t a .
4 . 3 E n c o n t r e o v a l o r m a i s a l t o e m u m a l i s t a .
4 . 4 V o c ê s e l e m b r a d a p e s q u i s a b i n á r i a d o C a p í t u l o 1 ? E l a t a m b é m é u m
a l g o r i t m o d o t i p o d i v i d i r p a r a c o n q u i s t a r . V o c ê c o n s e g u e d e t e r m i n a r o
c a s o - b a s e e o c a s o r e c u r s i v o p a r a a p e s q u i s a b i n á r i a ?
Q
O q u i c k s o r t é u m a l g o r i t m o d e o r d e n a ç ã o . E s t e a l g o r i t m o é m u i t o m a i s
r á p i d o d o q u e a o r d e n a ç ã o p o r s e l e ç ã o e é m u i t o u t i l i z a d o n a p r á t i c a . P o r
e x e m p l o , a b i b l i o t e c a - p a d r ã o d a l i n g u a g e m C t e m u m a f u n ç ã o c h a m a d a
qsort , q u e é u m a i m p l e m e n t a ç ã o d o q u i c k s o r t . O a l g o r i t m o q u i c k s o r t
t a m b é m u t i l i z a a e s t r a t é g i a D C .
V a m o s u s a r o q u i c k s o r t p a r a o r d e n a r u m a r r a y . Q u a l é o a r r a y m a i s s i m p l e s
q u e u m a l g o r i t m o d e o r d e n a ç ã o p o d e o r d e n a r ( l e m b r e - s e d a m i n h a d i c a n a
s e ç ã o a n t e r i o r ) ? B e m , a l g u n s a r r a y s n ã o p r e c i s a m n e m s e r o r d e n a d o s .
A r r a y s v a z i o s o u a r r a y s c o m a p e n a s u m e l e m e n t o s e r ã o o c a s o - b a s e . V o c ê
p o d e a p e n a s r e t o r n a r e s s e s a r r a y s c o m o e l e s e s t ã o , v i s t o q u e n ã o h á n a d a
p a r a o r d e n a r :
def quicksort(array):
len(array)
if < 2:
array
return
V a m o s d a r u m a o l h a d a e m a r r a y s m a i o r e s . U m a r r a y c o m d o i s e l e m e n t o s
t a m b é m é m u i t o s i m p l e s d e o r d e n a r .
E u m a r r a y c o m t r ê s e l e m e n t o s ?
L e m b r e - s e , v o c ê e s t á u s a n d o D C . S e n d o a s s i m , q u e r q u e b r a r e s t e a r r a y a t é
q u e v o c ê c h e g u e a o c a s o - b a s e . P o r t a n t o o f u n c i o n a m e n t o d o q u i c k s o r t s e g u e
e s t a l ó g i c a : p r i m e i r o , e s c o l h a u m e l e m e n t o d o a r r a y . E s s e e l e m e n t o s e r á
c h a m a d o d e i ô .
F a l a r e m o s s o b r e c o m o e s c o l h e r u m b o m p i v ô m a i s t a r d e . N e s t e m o m e n t o ,
v a m o s u t i l i z a r o p r i m e i r o i t e m d o a r r a y c o m o p i v ô .
A s s i m , e n c o n t r e o s e l e m e n t o s q u e s ã o m e n o r e s d o q u e o p i v ô e t a m b é m o s
e l e m e n t o s q u e s ã o m a i o r e s .
I s s o é c h a m a d o d e a i c i a e . D e s s e m o d o , v o c ê t e m :
U m s u b a r r a y c o n t e n d o t o d o s o s n ú m e r o s m e n o r e s d o q u e o p i v ô
O p i v ô
U m s u b a r r a y c o n t e n d o t o d o s o s n ú m e r o s m a i o r e s d o q u e o p i v ô
O s d o i s s u b a r r a y s n ã o e s t ã o o r d e n a d o s , a p e n a s p a r t i c i o n a d o s . P o r é m , s e e l e s
e s t i v e s s e m o r d e n a d o s , a o r d e n a ç ã o d o a r r a y c o n t e n d o t o d o s o s e l e m e n t o s
s e r i a s i m p l e s .
C a s o o s s u b a r r a y s e s t e j a m o r d e n a d o s , p o d e r á c o m b i n á - l o s d e s t a f o r m a :
33] , q u e é u m a r r a y o r d e n a d o .
C o m o v o c ê p o d e o r d e n a r o s s u b a r r a y s ? B e m , o c a s o - b a s e d o q u i c k s o r t
c o n s e g u e o r d e n a r a r r a y s d e d o i s e l e m e n t o s ( o s u b a r r a y e s q u e r d o ) e t a m b é m
a r r a y s v a z i o s ( o s u b a r r a y d i r e i t o ) . A s s i m , s e u t i l i z a r o q u i c k s o r t e m a m b o s
o s s u b a r r a y s e e n t ã o c o m b i n a r o s r e s u l t a d o s , t e r á u m a r r a y o r d e n a d o !
I s t o f u n c i o n a r á c o m q u a l q u e r p i v ô . S u p o n h a q u e v o c ê t e n h a e s c o l h i d o o
n ú m e r o 1 5 c o m o p i v ô .
A m b o s o s s u b a r r a y s c o n t ê m a p e n a s u m e l e m e n t o , e v o c ê j á s a b e c o m o
o r d e n a r e s t e t i p o d e a r r a y . L o g o , j á s a b e c o m o o r d e n a r u m a r r a y d e t r ê s
e l e m e n t o s . E s t e s s ã o o s p a s s o s :
1 . E s c o l h a u m p i v ô .
2 .
P a r t i c i o n e o a r r a y e m d o i s s u b a r r a y s , s e p a r a n d o - o s e n t r e e l e m e n t o s
m e n o r e s d o q u e o p i v ô e e l e m e n t o s m a i o r e s d o q u e o p i v ô .
3 . E x e c u t e o q u i c k s o r t r e c u r s i v a m e n t e e m a m b o s o s s u b a r r a y s .
E q u a n t o a u m a r r a y d e q u a t r o e l e m e n t o s ?
S u p o n h a q u e , d e s t a v e z , v o c ê e s c o l h e u o n ú m e r o 3 3 c o m o p i v ô .
O a r r a y d a e s q u e r d a c o n t é m t r ê s e l e m e n t o s , e v o c ê j á s a b e c o m o o r d e n a r
a r r a y s d e t r ê s e l e m e n t o s : e x e c u t a n d o o q u i c k s o r t r e c u r s i v a m e n t e .
A g o r a p o d e o r d e n a r a r r a y s d e q u a t r o e l e m e n t o s . S a b e n d o o r d e n a r a r r a y s
c o m q u a t r o e l e m e n t o s , v o c ê c o n s e g u e o r d e n a r a r r a y s c o m c i n c o e l e m e n t o s .
C o m o ? S u p o n h a q u e t e n h a u m a r r a y c o m c i n c o e l e m e n t o s .
E s t a s s ã o t o d a s a s m a n e i r a s p e l a s q u a i s v o c ê p o d e p a r t i c i o n a r e s t e a r r a y ,
d e p e n d e n d o d o p i v ô q u e e s c o l h e r .
P e r c e b a q u e t o d o s e s t e s s u b a r r a y s t ê m e n t r e 0 a 4 e l e m e n t o s , e v o c ê j á s a b e
c o m o o r d e n a r a r r a y s d e 0 a 4 e l e m e n t o s u s a n d o o q u i c k s o r t ! L o g o , n ã o
i m p o r t a o p i v ô q u e v o c ê e s c o l h e r , p o i s v o c ê p o d e r á e x e c u t a r o q u i c k s o r t
r e c u r s i v a m e n t e e m a m b o s o s s u b a r r a y s .
P o r e x e m p l o , i m a g i n e q u e v o c ê e s c o l h e u o n ú m e r o 3 c o m o p i v ô . V o c ê
e x e c u t a o q u i c k s o r t n o s s u b a r r a y s .
O s s u b a r r a y s s ã o o r d e n a d o s e e n t ã o v o c ê o s c o m b i n a , o b t e n d o u m a r r a y
o r d e n a d o . I s t o f u n c i o n a r á m e s m o q u e e s c o l h a o n ú m e r o 5 c o m o p i v ô .
I s s o f u n c i o n a r á , n a v e r d a d e , c o m q u a l q u e r e l e m e n t o c o m o p i v ô . A g o r a v o c ê
j á c o n s e g u e o r d e n a r u m a r r a y d e c i n c o e l e m e n t o s . U s a n d o a m e s m a l ó g i c a ,
c o n s e g u i r á o r d e n a r u m a r r a y d e s e i s e l e m e n t o s o u m a i s .
P ç ã
V o c ê a c a b o u d e o b s e r v a r a l g u n s e x e m p l o s d e ç ã . E s t a s p r o v a s r e p r e s e n t a m
u m a m a n e i r a d e m o s t r a r q u e o s e u a l g o r i t m o f u n c i o n a . C a d a p r o v a p o r i n d u ç ã o s e g u e d o i s
p a s s o s : o c a s o - b a s e e o c a s o i n d u t i v o . I s s o n ã o s o a f a m i l i a r ? I m a g i n e q u e e u q u e i r a p r o v a r q u e
s o u c a p a z d e s u b i r a t é o t o p o d e u m a e s c a d a . N o c a s o i n d u t i v o , s e m i n h a s p e r n a s e s t i v e r e m
e m u m d e g r a u , p o d e r e i c o l o c á - l a s n o p r ó x i m o d e g r a u . A s s i m , s e e s t i v e r n o d e g r a u 2 , p o d e r e i
s u b i r p a r a o d e g r a u 3 . E s t e é o c a s o i n d u t i v o . J á p a r a o c a s o - b a s e , f a l a r e i q u e m i n h a s p e r n a s
e s t ã o n o d e g r a u 1 e q u e , p o r t a n t o , s o u c a p a z d e s u b i r a e s c a d a i n t e i r a , u m d e g r a u d e c a d a v e z .
V o c ê u s a u m a l ó g i c a s e m e l h a n t e p a r a o q u i c k s o r t . N o c a s o - b a s e , m o s t r e i q u e o a l g o r i t m o
f u n c i o n a p a r a o c a s o - b a s e : a r r a y s d e t a m a n h o 0 e 1 . N o c a s o i n d u t i v o , m o s t r e i q u e , d a m e s m a
f o r m a q u e o q u i c k s o r t f u n c i o n a p a r a u m a r r a y d e t a m a n h o 1 , e l e t a m b é m f u n c i o n a r á p a r a
a r r a y s d e t a m a n h o 2 . A s s i m c o m o e l e f u n c i o n a p a r a a r r a y s d e d o i s e l e m e n t o s , t a m b é m
f u n c i o n a r á p a r a a r r a y s d e t r ê s e l e m e n t o s , e a s s i m p o r d i a n t e . D e s s a f o r m a , p o d e m o s d i z e r
q u e o q u i c k s o r t f u n c i o n a p a r a t o d o s o s t a m a n h o s d e a r r a y . N ã o m e a p r o f u n d a r e i e m p r o v a s
p o r i n d u ç ã o , m a s e l a s s ã o d i v e r t i d a s e a n d a m l a d o a l a d o c o m a e s t r a t é g i a D C .
A q u i e s t á o c ó d i g o p a r a o q u i c k s o r t :
def quicksort(array):
len(array)
if < 2:
returnarray ❶
:
else
pivo = array[0] ❷
menores = [i for i in array[1:] if i <= pivo] ❸
maiores = [i for i in array[1:] if i > pivo] ❹
returnquicksort(menores) + [pivo] + quicksort(maiores)
❷ C a o e c i o .
❸ S b a a d e o d o o e l e m e n o m e n o e d o e o i ô .
❹ S b a a d e o d o o e l e m e n o m a i o e d o e o i ô .
N ç ã B O
O a l g o r i t m o q u i c k s o r t é ú n i c o , p o i s s u a v e l o c i d a d e d e p e n d e d o p i v ô
e s c o l h i d o . A n t e s d e f a l a r m o s s o b r e q u i c k s o r t , v a m o s a n a l i s a r n o v a m e n t e o s
t e m p o s d e e x e c u ç ã o B i g O m a i s c o m u n s .
Estimativas baseadas em um computador lento que realiza dez
operações por segundo.
O s e x e m p l o s d e t e m p o s d e e x e c u ç ã o c o n t i d o s n e s t e s g r á c o s s ã o e s t i m a t i v a s
p a r a u m c a s o e m q u e v o c ê e x e c u t a d e z o p e r a ç õ e s p o r s e g u n d o . E s t e s
g r á c o s n ã o s ã o p r e c i s o s , m a s s e r v e m a p e n a s p a r a f o r n e c e r u m e x e m p l o d o
q u ã o d i f e r e n t e s ã o o s t e m p o s d e e x e c u ç ã o . N a r e a l i d a d e , o s e u c o m p u t a d o r é
c a p a z d e e x e c u t a r m u i t o m a i s d o q u e d e z o p e r a ç õ e s p o r s e g u n d o .
C a d a t e m p o d e e x e c u ç ã o c o n t é m u m a l g o r i t m o d e e x e m p l o a n e x o . D ê u m a
o l h a d a n o a l g o r i t m o d e o r d e n a ç ã o p o r s e l e ç ã o , q u e a p r e n d e u n o C a p í t u l o 2 .
O s e u t e m p o d e e x e c u ç ã o é O ( ) ; é b a s t a n t e l e n t o .
H á o u t r o a l g o r i t m o d e o r d e n a ç ã o c h a m a d o e g e , q u e t e m t e m p o d e
e x e c u ç ã o O ( l o g ) , o q u e é m u i t o m a i s r á p i d o ! O a l g o r i t m o q u i c k s o r t é
u m c a s o c o m p l i c a d o . N a p i o r s i t u a ç ã o , o q u i c k s o r t t e m t e m p o d e e x e c u ç ã o
O ( ) .
E l e é t ã o l e n t o q u a n t o a o r d e n a ç ã o p o r s e l e ç ã o ! P o r é m e s t e é o p i o r c a s o
p o s s í v e l . N o c a s o m é d i o , o q u i c k s o r t t e m t e m p o d e e x e c u ç ã o O ( l o g ) . E
a g o r a v o c ê p o d e e s t a r s e p e r g u n t a n d o :
O q u e s i g n i c a i c a e c a é d i ?
S e o q u i c k s o r t t e m t e m p o d e e x e c u ç ã o m é d i o O ( l o g ) , e o m e r g e s o r t
t e m t e m p o d e e x e c u ç ã o O ( l o g ) s e m p r e , p o r q u e n ã o u t i l i z a r o m e r g e
s o r t ? N ã o s e r i a m a i s r á p i d o ?
M
S u p o n h a q u e v o c ê t e n h a e s t a s i m p l e s f u n ç ã o q u e i m p r i m e n a t e l a t o d o s o s
i t e n s d e u m a l i s t a :
def imprime_itens(lista):
item
for in lista:
print item
E s t a f u n ç ã o a n a l i s a c a d a i t e m d a l i s t a e o i m p r i m e . C o m o e s t a f u n ç ã o p a s s a
p o r t o d a a l i s t a u m a v e z , e l a t e m t e m p o d e e x e c u ç ã o O ( ) . A g o r a , i m a g i n e
q u e v o c ê m o d i c o u e s t a f u n ç ã o p a r a q u e e l a a g u a r d e u m s e g u n d o a n t e s d e
i m p r i m i r u m i t e m :
i m p r i m a u m a l i s t a c o n t e n d o c i n c o i t e n s u t i l i z a n d o a m b a s a s f u n ç õ e s .
A m b a s a s f u n ç õ e s p a s s a m p o r t o d a a l i s t a u m a v e z , p o r t a n t o e l a s t ê m t e m p o
d e e x e c u ç ã o O ( n ) . Q u a l d a s d u a s v o c ê a c h a q u e s e r á m a i s r á p i d a n a p r á t i c a ?
A c h o q u e a f u n ç ã o imprime_itens s e r á m u i t o m a i s r á p i d a , v i s t o q u e e l a
n ã o a g u a r d a u m s e g u n d o a n t e s d e i m p r i m i r c a d a i t e m . A s s i m , m e s m o q u e
a m b a s a s f u n ç õ e s t e n h a m o m e s m o t e m p o d e e x e c u ç ã o n a n o t a ç ã o B i g O , a
f u n ç ã o imprime_itens a c a b a s e n d o m a i s r á p i d a n a p r á t i c a . Q u a n d o v o c ê
e s c r e v e a l g o n a n o t a ç ã o B i g O , c o m o O ( ) , p o r e x e m p l o , e s t á q u e r e n d o d i z e r
i s s o .
A l e t r a c é u m a q u a n t i d a d e d e t e r m i n a d a d e t e m p o q u e o s e u a l g o r i t m o l e v a
p a r a s e r e x e c u t a d o . E l a é c h a m a d a d e c a e . P o d e s e r , p o r 10 e x e m p l o ,
N o r m a l m e n t e v o c ê i g n o r a a c o n s t a n t e , p o i s , c a s o d o i s a l g o r i t m o s t e n h a m
t e m p o s d e e x e c u ç ã o B i g O d i f e r e n t e s , a c o n s t a n t e n ã o i m p o r t a r á . V a m o s
u s a r a p e s q u i s a b i n á r i a e a p e s q u i s a s i m p l e s c o m o e x e m p l o s d e s t e f a t o .
I m a g i n e q u e a m b o s o s a l g o r i t m o s c o n t e n h a m e s t a s c o n s t a n t e s .
V o c ê p o d e p e n s a r “ N o s s a ! A p e s q u i s a s i m p l e s c o n t é m u m a c o n s t a n t e d e 1 0
m i l i s s e g u n d o s , e n q u a n t o a p e s q u i s a b i n á r i a c o n t é m u m a c o n s t a n t e d e u m
s e g u n d o . A p e s q u i s a s i m p l e s é m u i t o m a i s r á p i d a ! . A g o r a , s u p o n h a q u e
e s t e j a r e a l i z a n d o u m a b u s c a e m u m a l i s t a c o m 4 b i l h õ e s d e e l e m e n t o s . A
s e g u i r , p o d e v i s u a l i z a r o s t e m p o s d e e x e c u ç ã o d e s t a b u s c a .
C o m o v o c ê p o d e v e r , a p e s q u i s a b i n á r i a c o n t i n u a s e n d o m u i t o m a i s r á p i d a .
A c o n s t a n t e n ã o c a u s o u d i f e r e n ç a a l g u m a n o n a l d a s c o n t a s .
P o r é m , à s v e z e s , a c o n s t a n t e d e f a z e r d i f e r e n ç a . O q u i c k s o r t , c o m p a r a d o
a o m e r g e s o r t , é u m e x e m p l o d i s s o . O q u i c k s o r t t e m u m a c o n s t a n t e m e n o r
d o q u e o m e r g e s o r t . A s s i m , c o m o a m b o s t ê m t e m p o d e e x e c u ç ã o O ( l o g
) , o q u i c k s o r t a c a b a s e n d o m a i s r á p i d o . A l é m d i s s o , o q u i c k s o r t é m a i s
r á p i d o , n a p r á t i c a , p o i s e l e f u n c i o n a m a i s v e z e s n o c a s o m é d i o d o q u e n o
p i o r c a s o .
E a g o r a v o c ê p o d e e s t a r s e p e r g u n t a n d o : o q u e é o c a s o m é d i o e o q u e é o
p i o r c a s o ?
C é
O d e s e m p e n h o d o q u i c k s o r t d e p e n d e b a s t a n t e d a e s c o l h a d o p i v ô . I m a g i n e
q u e v o c ê s e m p r e e s c o l h a o p r i m e i r o e l e m e n t o c o m o p i v ô e q u e v o c ê e x e c u t e
o q u i c k s o r t e m u m a r r a y q u e á e e a d e a d . O q u i c k s o r t n ã o f a z u m a
c h e c a g e m p a r a c o n f e r i r s e o a r r a y j á e s t á o r d e n a d o . L o g o , e l e t e n t a r á
o r d e n a r o a r r a y m e s m o a s s i m .
P e r c e b a c o m o v o c ê n ã o e s t á d i v i d i n d o o a r r a y e m d u a s m e t a d e s . E m v e z
d i s s o , u m d o s s u b a r r a y s e s t á s e m p r e v a z i o , o q u e f a z c o m q u e a p i l h a d e
c h a m a d a s e j a s e m p r e m u i t o l o n g a . A g o r a , i m a g i n e q u e v o c ê s e m p r e e s c o l h a
o e l e m e n t o c e n t r a l d o a r r a y c o m o p i v ô . P e r c e b a c o m o a p i l h a d e c h a m a d a é
m e n o r .
A p i l h a d e c h a m a d a é m u i t o m e n o r ! I s s o a c o n t e c e p o r q u e v o c ê d i v i d e o
a r r a y n a m e t a d e , o q u e f a z c o m q u e v o c ê n ã o p r e c i s e f a z e r t a n t a s e x e c u ç õ e s
r e c u r s i v a s . A s s i m , v o c ê c h e g a a o c a s o - b a s e e a p i l h a d e c h a m a d a é
c o n s i d e r a v e l m e n t e m e n o r .
O p r i m e i r o e x e m p l o q u e v o c ê v i u r e p r e s e n t a o p i o r c a s o , e n q u a n t o o
s e g u n d o e x e m p l o r e p r e s e n t a o m e l h o r c a s o . N o p i o r c a s o , o t a m a n h o d a
p i l h a é O ( ) . N o m e l h o r c a s o , o t a m a n h o d a p i l h a é O ( l o g ) .
A g o r a , o b s e r v e o p r i m e i r o n í v e l d a p i l h a . V o c ê e s c o l h e u m e l e m e n t o c o m o o
p i v ô e o s d e m a i s e l e m e n t o s s ã o d i v i d i d o s e m d o i s s u b a r r a y s . A s s i m , v o c ê
t e m d e p a s s a r p o r t o d o s o s e l e m e n t o s n o a r r a y . L o g o , e s t a p r i m e i r a e x e c u ç ã o
t e m t e m p o d e e x e c u ç ã o O ( ) . N e s t e n í v e l d a p i l h a v o c ê p a s s a p o r t o d o s o s
e l e m e n t o s d o a r r a y . P o r é m e m t o d o s o s n í v e i s d a p i l h a d e c h a m a d a v o c ê
p a s s a r á p o r O ( ) e l e m e n t o s .
M e s m o q u e v o c ê p a r t i c i o n e o a r r a y d e f o r m a d i f e r e n t e , c o n t i n u a r á p a s s a n d o
p o r O ( ) e l e m e n t o s a c a d a e x e c u ç ã o .
D e s s a f o r m a , c a d a n í v e l t e m t e m p o d e e x e c u ç ã o O ( ) .
N e s t e e x e m p l o , e x i s t e m O ( l o g ) n í v e i s ( a m a n e i r a m a i s t é c n i c a d e d i z e r i s s o
é “ O p e s o d a p i l h a d e c h a m a d a [ o u p i l h a d e e x e c u ç ã o ] é O ( l o g ) ) . C a d a
n í v e l t e m t e m p o d e e x e c u ç ã o O ( ) . A l é m d i s s o , o a l g o r i t m o c o m o u m t o d o
t e m t e m p o d e e x e c u ç ã o O ( ) * O ( l o g ) = O ( l o g ) . E s t e é o m e l h o r c a s o .
N o p i o r c a s o , e x i s t e m O ( ) n í v e i s . P o r t a n t o o a l g o r i t m o t e m t e m p o d e
e x e c u ç ã o O ( ) * O ( ) = O ( ) .
A d i v i n h e ? O m e l h o r c a s o t a m b é m é o c a s o m é d i o . S e c ê e e e c h e
e e e a e a ó i d a a c i ô , o q u i c k s o r t s e r á c o m p l e t a d o c o m
t e m p o d e e x e c u ç ã o m é d i o O ( l o g ) . O a l g o r i t m o q u i c k s o r t é u m d o s m a i s
r á p i d o s a l g o r i t m o s d e o r d e n a ç ã o q u e e x i s t e m , s e n d o u m ó t i m o e x e m p l o d e
D C .
E E C Í C I
Q u a n t o t e m p o l e v a r i a , e m n o t a ç ã o B i g O , p a r a c o m p l e t a r c a d a u m a d e s t a s
o p e r a ç õ e s ?
4 . 5 I m p r i m i r o v a l o r d e c a d a e l e m e n t o e m u m a r r a y .
4 . 6 D u p l i c a r o v a l o r d e c a d a e l e m e n t o e m u m a r r a y .
4 . 7 D u p l i c a r o v a l o r a p e n a s d o p r i m e i r o e l e m e n t o d o a r r a y .
4 . 8 C r i a r u m a t a b e l a d e m u l t i p l i c a ç ã o c o m t o d o s o s e l e m e n t o s d o a r r a y .
A s s i m , c a s o o s e u a r r a y s e j a [ 2 , 3 , 7 , 8 , 1 0 ] , v o c ê p r i m e i r o m u l t i p l i c a r á
c a d a e l e m e n t o p o r 2 . D e p o i s , m u l t i p l i c a r á c a d a e l e m e n t o p o r 3 e e n t ã o
p o r 7 , e a s s i m p o r d i a n t e .
R
A e s t r a t é g i a D C f u n c i o n a p o r m e i o d a d i v i s ã o d o p r o b l e m a e m p r o b l e m a s
m e n o r e s . S e v o c ê e s t i v e r u t i l i z a n d o D C e m u m a l i s t a , o c a s o - b a s e
p r o v a v e l m e n t e s e r á u m a r r a y v a z i o o u u m a r r a y c o m a p e n a s u m e l e m e n t o .
S e v o c ê e s t i v e r i m p l e m e n t a n d o o q u i c k s o r t , e s c o l h a u m e l e m e n t o
a l e a t ó r i o c o m o o p i v ô . O t e m p o d e e x e c u ç ã o m é d i o d o q u i c k s o r t é O (
l o g ) !
A c o n s t a n t e , n a n o t a ç ã o B i g O , p o d e s e r r e l e v a n t e e m a l g u n s c a s o s . E s t a é
a r a z ã o p e l a q u a l o q u i c k s o r t é m a i s r á p i d o d o q u e o m e r g e s o r t .
A c o n s t a n t e d i c i l m e n t e s e r á r e l e v a n t e n a c o m p a r a ç ã o e n t r e p e s q u i s a
s i m p l e s e p e s q u i s a b i n á r i a , p o i s O ( l o g ) é m u i t o m a i s r á p i d o d o q u e O ( )
q u a n d o s u a l i s t a é g r a n d e .
5
T a b a a
N a í
V o c ê c o n h e c e r á a a b e l a h a h , m a e r r a d e d a d o b á i c a
m i o ú i l .
V o c ê a m b é m c o n h e c e r á o d e a l h e o b r e a a b e l a h a h :
i m p l e m e n a ç ã o , c o l i õ e e f n ç õ e h a h .
I m a g i n e q u e v o c ê t r a b a l h a e m u m m e r c a d o . Q u a n d o u m c l i e n t e c o m p r a u m
p r o d u t o , é p r e c i s o c o n f e r i r o p r e ç o d e s t e p r o d u t o e m u m c a d e r n o . P o r é m , s e
o c a d e r n o n ã o e s t i v e r o r g a n i z a d o a l f a b e t i c a m e n t e , v o c ê l e v a r á m u i t o t e m p o
a n a l i s a n d o c a d a l i n h a a t é e n c o n t r a r o p r e ç o d a a ç ã , p o r e x e m p l o .
P r o c u r a n d o d e s t a f o r m a v o c ê r e a l i z a r i a u m a p e s q u i s a s i m p l e s , v i s t a n o
C a p í t u l o 1 , e p o r m e i o d e l a t e r i a d e a n a l i s a r t o d a s a s l i n h a s . V o c ê l e m b r a
q u a l e r a o t e m p o d e e x e c u ç ã o d a p e s q u i s a s i m p l e s ? O ( ) . N o e n t a n t o , s e o
c a d e r n o e s t i v e s s e o r d e n a d o a l f a b e t i c a m e n t e , p o d e r i a e x e c u t a r u m a p e s q u i s a
b i n á r i a p a r a e n c o n t r a r o p r e ç o d a m a ç ã c o m u m t e m p o d e e x e c u ç ã o O ( l o g
) .
V a l e l e m b r a r q u e e x i s t e u m a g r a n d e d i f e r e n ç a e n t r e u m t e m p o d e e x e c u ç ã o
O ( ) e O ( l o g ) ! S u p o n h a q u e v o c ê c o n s e g u i s s e l e r d e z l i n h a s d o c a d e r n o
p o r s e g u n d o . N a g u r a a s e g u i r v o c ê p o d e v e r q u a n t o t e m p o l e v a r i a u s a n d o
a p e s q u i s a b i n á r i a e a p e s q u i s a s i m p l e s .
V o c ê j á s a b e q u e a p e s q u i s a b i n á r i a é m u i t o m a i s r á p i d a . P o r é m , c o m o u m
c a i x a d e m e r c a d o , v o c ê j á s a b e q u e p r o c u r a r o p r e ç o d e m e r c a d o r i a s e m u m
c a d e r n o é u m a t a r e f a c h a t a , m e s m o q u e e s t e c a d e r n o e s t e j a o r d e n a d o , p o i s o
c l i e n t e e s t á c a i m p a c i e n t e e n q u a n t o a p r o c u r a p e l o p r e ç o d o s i t e n s é
r e a l i z a d a . A s s i m , o q u e v o c ê p r e c i s a é d e u m a m i g o q u e c o n h e ç a t o d a s a s
m e r c a d o r i a s e o s s e u s p r e ç o s , p o i s , d e s s a f o r m a , n ã o é n e c e s s á r i o p r o c u r a r
n a d a : v o c ê p e d e p a r a e s t e s e u a m i g o e e l e i n f o r m a o p r e ç o i m e d i a t a m e n t e .
A s u a a m i g a M a g g i e p o d e d i z e r o p r e ç o c o m t e m p o d e e x e c u ç ã o O ( 1 ) p a r a
t o d o s o s i t e n s , n ã o i m p o r t a n d o a q u a n t i d a d e d e i t e n s q u e c o m p õ e m o
c a d e r n o d e p r e ç o s . D e s s a f o r m a , e l a é a i n d a m a i s r á p i d a d o q u e a p e s q u i s a
b i n á r i a .
Q u e a m i g a m a r a v i l h o s a ! M a s , e n t ã o , c o m o v o c ê a r r a n j a u m a “ M a g g i e ?
A g o r a , v a m o s v o l t a r a f a l a r d e e s t r u t u r a s d e d a d o s . V o c ê j á c o n h e c e d u a s
e s t r u t u r a s a t é a g o r a : a r r a y s e l i s t a s ( n ã o v o u f a l a r s o b r e a s p i l h a s , p o i s n ã o é
p o s s í v e l “ p r o c u r a r a l g o n e l a s ) . S e r i a p o s s í v e l i m p l e m e n t a r e s t e s e u c a d e r n o
d e p r e ç o s c o m o u m a r r a y .
C a d a i t e m n e s t e a r r a y é , n a r e a l i d a d e , u m a d u p l a d e i t e n s : u m é o n o m e e o
t i p o d o p r o d u t o e o o u t r o é o p r e ç o . S e o r d e n a r e s t e a r r a y p o r n o m e , s e r á
p o s s í v e l e x e c u t a r u m a p e s q u i s a b i n á r i a p a r a p r o c u r a r o p r e ç o d e u m i t e m .
L o g o , é p o s s í v e l p e s q u i s a r i t e n s c o m t e m p o d e e x e c u ç ã o O ( l o g ) .
E n t r e t a n t o n ó s q u e r e m o s e n c o n t r a r i t e n s c o m t e m p o d e e x e c u ç ã o O ( 1 ) , o u
s e j a , q u e r e m o s u m a “ M a g g i e , e é a í q u e e n t r a m a s f u n ç õ e s h a s h .
F ç õ a
U m a f u n ç ã o h a s h é u m a f u n ç ã o n a q u a l v o c ê i n s e r e u m a s t r i n g e , d e p o i s
d i s s o , a f u n ç ã o r e t o r n a u m n ú m e r o .
E m u m a t e r m i n o l o g i a m a i s t é c n i c a , d i r í a m o s q u e u m a f u n ç ã o h a s h “ m a p e i a
s t r i n g s e n ú m e r o s . V o c ê p o d e p e n s a r q u e n ã o e x i s t e u m p a d r ã o i n d i c a n d o
q u a l n ú m e r o s e r á r e t o r n a d o a p ó s a i n s e r ç ã o d e u m a s t r i n g , m a s e x i s t e m
a l g u n s r e q u i s i t o s p a r a u m a f u n ç ã o h a s h :
E l a d e v e s e r c o n s i s t e n t e . I m a g i n e q u e v o c ê i n s e r e a s t r i n g “ m a ç ã e r e c e b e
o n ú m e r o 4 . T o d a s a s v e z e s q u e v o c ê i n s e r i r “ m a ç ã , a f u n ç ã o d e v e r á
r e t o r n a r o n ú m e r o “ 4 ; c a s o c o n t r á r i o , s u a t a b e l a h a s h n ã o f u n c i o n a r á
c o r r e t a m e n t e .
A f u n ç ã o d e v e m a p e a r d i f e r e n t e s p a l a v r a s p a r a d i f e r e n t e s n ú m e r o s . D e s t a
f o r m a , u m a f u n ç ã o h a s h n ã o s e r á ú t i l s e e l a s e m p r e r e t o r n a r “ 1 ,
i n d e p e n d e n t e m e n t e d a p a l a v r a i n s e r i d a . N o m e l h o r c a s o , c a d a p a l a v r a
d i f e r e n t e d e v e r i a s e r m a p e a d a e l i g a d a a u m n ú m e r o d i f e r e n t e .
E n t ã o , u m a f u n ç ã o h a s h m a p e i a s t r i n g s e a s r e l a c i o n a a n ú m e r o s . M a s q u a l é
a u t i l i d a d e d i s s o ? B e m , v o c ê p o d e u s a r e s t a f u n c i o n a l i d a d e p a r a c r i a r a s u a
“ M a g g i e !
C o m e c e c o m u m a r r a y v a z i o :
V o c ê a r m a z e n a r á o s p r e ç o s d a s m e r c a d o r i a s n e s t e a r r a y . V a m o s a d i c i o n a r o
p r e ç o d e u m a m a ç ã . I n s i r a “ m a ç ã n a f u n ç ã o h a s h .
E l a r e t o r n a r á o v a l o r “ 3 . A g o r a , v a m o s a r m a z e n a r o p r e ç o d a m a ç ã n o
í n d i c e 3 d o a r r a y .
V a m o s a d i c i o n a r o l e i t e a g o r a . I n s i r a “ l e i t e n a f u n ç ã o h a s h .
A f u n ç ã o h a s h r e t o r n o u “ 0 . A g o r a , a r m a z e n e o p r e ç o d o l e i t e n o í n d i c e 0 .
C o n t i n u e e , e v e n t u a l m e n t e , t o d o o a r r a y e s t a r á r e p l e t o d e p r e ç o s .
A g o r a , v o c ê p o d e r á p e r g u n t a r “ E i , q u a l é o p r e ç o d e u m a b a c a t e ? e n ã o s e r á
n e c e s s á r i o p r o c u r a r o p r e ç o d e s t e p r o d u t o n o a r r a y . E m v e z d i s s o , i n s i r a
“ a b a c a t e n a f u n ç ã o h a s h .
E l a i n f o r m a r á o p r e ç o a r m a z e n a d o n o í n d i c e 4 .
A f u n ç ã o h a s h i n f o r m a r á a p o s i ç ã o e x a t a e m q u e o p r e ç o e s t á a r m a z e n a d o .
A s s i m , n ã o p r e c i s a r á p r o c u r á - l o ! I s t o f u n c i o n a p o r q u e
A f u n ç ã o h a s h m a p e i a c o n s i s t e n t e m e n t e u m n o m e p a r a o m e s m o í n d i c e .
T o d a s a s v e z e s q u e v o c ê i n s e r i r “ a b a c a t e , e l a r e t o r n a r á o m e s m o n ú m e r o .
A s s i m , a p r i m e i r a e x e c u ç ã o d a f u n ç ã o h a s h s e r v i r á p a r a i d e n t i c a r o n d e é
p o s s í v e l a r m a z e n a r o p r e ç o d o a b a c a t e , e d e p o i s d i s s o e l a s e r á u t i l i z a d a
p a r a e n c o n t r a r e s t e v a l o r a r m a z e n a d o .
A f u n ç ã o h a s h m a p e i a d i f e r e n t e s s t r i n g s p a r a d i f e r e n t e s í n d i c e s . A s t r i n g
“ a b a c a t e é m a p e a d a p a r a o í n d i c e 4 . A s t r i n g “ l e i t e é m a p e a d a p a r a o
í n d i c e 0 . T o d a s a s d i f e r e n t e s s t r i n g s s ã o m a p e a d a s p a r a d i f e r e n t e s l u g a r e s
d o a r r a y o n d e v o c ê e s t á a r m a z e n a n d o o s p r e ç o s .
A f u n ç ã o h a s h t e m c o n h e c i m e n t o s o b r e o t a m a n h o d o s e u a r r a y e
r e t o r n a r á a p e n a s í n d i c e s v á l i d o s . P o r t a n t o , c a s o o s e u a r r a y t e n h a c i n c o
i t e n s , a f u n ç ã o h a s h n ã o r e t o r n a r á 1 0 0 , p o i s e s t e v a l o r n ã o s e r i a u m í n d i c e
v á l i d o d o a r r a y .
V o c ê a c a b o u d e c r i a r u m a “ M a g g i e ! C o l o q u e u m a f u n ç ã o h a s h e m c o n j u n t o
c o m u m a r r a y e v o c ê t e r á u m a e s t r u t u r a d e d a d o s c h a m a d a a b a a .
U m a t a b e l a h a s h é a p r i m e i r a e s t r u t u r a d e d a d o s q u e t e m u m a l ó g i c a
a d i c i o n a l a l i a d a q u e v o c ê a p r e n d e r á , v i s t o q u e a r r a y s e l i s t a s m a p e i a m
d i r e t a m e n t e p a r a a m e m ó r i a , p o r é m a s t a b e l a s h a s h s ã o m a i s i n t e l i g e n t e s .
E l a s u s a m u m a f u n ç ã o h a s h p a r a i n d i c a r , d e m a n e i r a i n t e l i g e n t e , o n d e
a r m a z e n a r o s e l e m e n t o s .
A s t a b e l a s h a s h s ã o , p r o v a v e l m e n t e , a s m a i s ú t e i s e c o m p l e x a s e s t r u t u r a s d e
d a d o s q u e v o c ê a p r e n d e r á . E l a s t a m b é m s ã o c o n h e c i d a s c o m o m a p a s h a s h ,
m a p a s , d i c i o n á r i o s e t a b e l a s d e d i s p e r s ã o . A l é m d i s s o , a s t a b e l a s h a s h s ã o
m u i t o r á p i d a s ! V o c ê s e l e m b r a d a n o s s a d i s c u s s ã o s o b r e a r r a y s e l i s t a s
e n c a d e a d a s n o C a p í t u l o 2 ? V o c ê p o d e p e g a r u m i t e m d e u m a r r a y
i n s t a n t a n e a m e n t e q u e a s t a b e l a s h a s h u s a r ã o a r r a y s p a r a a r m a z e n a r o s
d a d o s d e s s e i t e m ; d e s t a f o r m a , e l a s s ã o i g u a l m e n t e v e l o z e s .
V o c ê p r o v a v e l m e n t e n u n c a t e r á d e i m p l e m e n t a r u m a t a b e l a h a s h , p o i s
q u a l q u e r l i n g u a g e m d e p r o g r a m a ç ã o j á t e r á u m a i m p l e m e n t a ç ã o d e l a . A
l i n g u a g e m P y t h o n c o n t é m t a b e l a s h a s h c h a m a d a s d e c á . P a r a c r i a r
dict
u m a n o v a t a b e l a h a s h v o c ê p o d e u t i l i z a r a f u n ç ã o :
p r e ç o s a e l a .
>>> caderno["maçã"] = 0.67 ❶
>>> caderno["leite"] = 1.49 ❷
>>> caderno["abacate"] = 1.49
>>> print caderno
{'abacate': 1.49, 'maçã': 0.67, 'leite': 1.49}
❶ U m a m a ç ã c a 6 7 c e n a o .
❷ O l e i e c a R $ 1 , 4 9
F á c i l ! A g o r a , v a m o s p e r g u n t a r o p r e ç o d e u m a b a c a t e :
U m a t a b e l a h a s h c o n t é m c h a v e s e v a l o r e s . N a h a s h caderno , o s n o m e s d o s
p r o d u t o s s ã o a s c h a v e s e o s p r e ç o s s ã o o s v a l o r e s . L o g o , u m a t a b e l a h a s h
m a p e i a c h a v e s e v a l o r e s .
N a p r ó x i m a s e ç ã o v o c ê v e r á a l g u n s e x e m p l o s e m q u e a s t a b e l a s h a s h s ã o
m u i t o ú t e i s .
E E C Í C I
É i m p o r t a n t e q u e f u n ç õ e s h a s h r e t o r n e m o m e s m o v a l o r d e s a í d a q u a n d o o
m e s m o v a l o r d e e n t r a d a f o r i n s e r i d o . C a s o c o n t r á r i o , n ã o s e r á p o s s í v e l
e n c o n t r a r o i t e m q u e v o c ê d e s e j a n a t a b e l a h a s h !
Q u a i s d e s t a s f u n ç õ e s h a s h s ã o c o n s i s t e n t e s ?
5 . 1 f(x) = 1 ❶
5 . 2 f(x) = rand() ❷
5 . 3 f(x) = proximo_espaco_vazio() ❸
5 . 4 f(x) = len(x) ❹
❶ R e o r n a 1 p a r a q a l q e r e n r a d a .
❷ R e o r n a m n ú m e r o a l e a ó r i o a c a d a e e c ç ã o .
❸ R e o r n a o í n d i c e d o p r ó i m o e p a ç o l i r e d a a b e l a h a h .
❹ U a o c o m p r i m e n o d a r i n g c o m o í n d i c e .
U a ç ã
T a b e l a s h a s h s ã o a m p l a m e n t e u t i l i z a d a s . N e s t a s e ç ã o , v a m o s a n a l i s a r a l g u n s
c a s o s .
U a a b a a a a a
O s e u c e l u l a r t e m u m a a g e n d a t e l e f ô n i c a i n t e g r a d a .
C a d a n o m e e s t á a s s o c i a d o a u m n ú m e r o t e l e f ô n i c o .
I m a g i n e q u e v o c ê q u e i r a c o n s t r u i r u m a l i s t a t e l e f ô n i c a c o m o e s t a . S e r á
n e c e s s á r i o m a p e a r o n o m e d a s p e s s o a s e a s s o c i á - l o s a n ú m e r o s t e l e f ô n i c o s .
D e s s a f o r m a , a s u a l i s t a t e l e f ô n i c a d e v e r á t e r e s t a s f u n c i o n a l i d a d e s :
A d i c i o n a r o n o m e d e u m a p e s s o a e o n ú m e r o d e t e l e f o n e a s s o c i a d o a e s t e
n o m e .
I n s e r i r o n o m e d e u m a p e s s o a e r e c e b e r o n ú m e r o t e l e f ô n i c o a s s o c i a d o a
e l a .
E s t e é u m e x e m p l o p e r f e i t o d e s i t u a ç õ e s e m q u e t a b e l a s h a s h p o d e m s e r
u s a d a s ! A s t a b e l a s h a s h s ã o ó t i m a s o p ç õ e s q u a n d o
V o c ê d e s e j a m a p e a r a l g u m i t e m c o m r e l a ç ã o a o u t r o
V o c ê p r e c i s a p e s q u i s a r a l g o
C r i a r u m a l i s t a t e l e f ô n i c a é u m a t a r e f a s i m p l e s . P r i m e i r o , f a ç a u m a n o v a
t a b e l a h a s h p a r a lista_telefonica :
h a s h u t i l i z a n d o d u a s c h a v e s :
>>> lista_telefonica = {} ❶
❶ I g a l a o q e f o i f e i o c o m lista_telefonica = dict() .
E n t ã o v a m o s a d i c i o n a r o n ú m e r o d e a l g u m a s p e s s o a s n e s t a l i s t a :
P a r a i s s o , é n e c e s s á r i o a p e n a s i n f o r m a r a c h a v e p a r a a h a s h :
I m a g i n e q u e t i v e s s e d e f a z e r i s t o u t i l i z a n d o u m a r r a y . C o m o f a r i a ? A s t a b e l a s
h a s h t o r n a m s i m p l e s a m o d e l a g e m d e u m a r e l a ç ã o e n t r e d o i s i t e n s .
A s t a b e l a s h a s h s ã o u s a d a s p a r a p e s q u i s a s e m u m a e s c a l a m u i t o m a i o r . P o r
e x e m p l o , s u p o n h a q u e v o c ê q u e i r a a c e s s a r u m w e b s i t e c o m o o : / / a . .
O s e u c o m p u t a d o r d e v e t r a d u z i r a d i t . i o p a r a a f o r m a d e u m e n d e r e ç o d e I P .
P a r a c a d a w e b s i t e q u e v o c ê a c e s s a r , o e n d e r e ç o d e v e r á s e r t r a d u z i d o p a r a
u m e n d e r e ç o d e I P .
N o s s a , m a p e a r o e n d e r e ç o d e u m w e b s i t e p a r a u m e n d e r e ç o I P ? I s s o p a r e c e
o c a s o p e r f e i t o p a r a a u t i l i z a ç ã o d e t a b e l a s h a s h ! E s t e p r o c e s s o é c h a m a d o d e
ç ã D N S , e a s t a b e l a s h a s h s ã o u m a d a s m a n e i r a s p e l a s q u a i s e s t a
f u n c i o n a l i d a d e p o d e s e r i m p l e m e n t a d a .
E a a a a a
I m a g i n e q u e e s t e j a o r g a n i z a n d o u m a v o t a ç ã o . O b v i a m e n t e , c a d a p e s s o a
p o d e r á v o t a r a p e n a s u m a v e z . C o m o v o c ê p o d e v e r i c a r s e u m a p e s s o a j á
n ã o v o t o u a n t e s ? V o c ê p o d e p e r g u n t a r p a r a a p e s s o a q u e v e i o v o t a r q u a l é o
s e u n o m e c o m p l e t o e e n t ã o c o n f e r i r e s s e n o m e e m u m a l i s t a q u e c o n t e n h a o
n o m e d a s p e s s o a s q u e j á v o t a r a m .
S e o n o m e d e s s a p e s s o a e s t i v e r n a l i s t a , i s s o s i g n i c a q u e e l a j á v o t o u , o u
s e j a , v o c ê d e v e d i s p e n s á - l a ! C a s o c o n t r á r i o , v o c ê d e v e r á a d i c i o n a r o n o m e
d e l a n a l i s t a e p e r m i t i r q u e e l a v o t e . A g o r a , s u p o n h a q u e d i v e r s a s p e s s o a s
c h e g a r a m p a r a v o t a r e q u e , a l é m d i s s o , a l i s t a d e p e s s o a s q u e j á v o t a r a m s e j a
m u i t o l o n g a .
A c a d a n o v a p e s s o a q u e c h e g a r p a r a v o t a r , v o c ê d e v e r á c o n f e r i r e s t a l i s t a
e n o r m e p a r a c h e c a r s e e s t a p e s s o a j á v o t o u . N o e n t a n t o , t e m o s u m a s o l u ç ã o
m e l h o r : u s e u m a h a s h !
votaram
P r i m e i r o , c r i e u m a h a s h p a r a r e g i s t r a r a s p e s s o a s q u e j á v o t a r a m :
>>> votaram = {}
Q u a n d o a l g u é m c h e g a r p a r a v o t a r , c o n r a s e o n o m e d e s t a p e s s o a j á e s t á n a
h a s h :
C a s o c o n t r á r i o , e l a r e t o r n a r á None ( n a d a ) . V o c ê p o d e u s a r e s t a
f u n c i o n a l i d a d e p a r a c o n f e r i r s e a s p e s s o a s j á v o t a r a m !
A q u i v o c ê p o d e c o n f e r i r o c ó d i g o c o m p l e t o :
voted = {}
def verifica_eleitor(nome):
ifvotaram.get(nome):
print "Mande embora!"
:
else
voted[nome] = True
print "Deixe votar!"
V a m o s f a z e r a l g u n s t e s t e s :
>>> verifica_eleitor("tom")
Deixe votar!
>>> verifica_eleitor("mike")
Deixe votar!
>>> verifica_eleitor("mike")
Mande embora!
N a p r i m e i r a v e z q u e T o m f o r i n s e r i d o , a p a r e c e r á a m e n s a g e m n a t e l a “ D e i x e
v o t a r ! . D e p o i s , o n o m e M i k e s e r á i n s e r i d o e n o v a m e n t e a m e n s a g e m “ D e i x e
v o t a r ! s e r á m o s t r a d a n a t e l a . P o r m , M i k e s e r á i n s e r i d o m a i s u m a v e z e a
m e n s a g e m “ M a n d e e m b o r a ! s u r g i r á n a t e l a .
L e m b r e - s e : s e v o c ê e s t i v e s s e a r m a z e n a n d o e s t e s n o m e s e m u m a l i s t a d e
p e s s o a s q u e j á v o t a r a m , e s t a f u n ç ã o s e t o r n a r i a m u i t o l e n t a e v e n t u a l m e n t e ,
p o i s u m a p e s q u i s a s i m p l e s s e r i a u t i l i z a d a p a r a p e s q u i s a r e m t o d a a l i s t a .
P o r é m v o c ê e s t á a r m a z e n a n d o e s t e s n o m e s e m u m a t a b e l a h a s h , e a t a b e l a
h a s h i n f o r m a i n s t a n t a n e a m e n t e s e o n o m e d a p e s s o a e s t á o u n ã o n a l i s t a .
L o g o , a c h e c a g e m p o r d u p l i c a t a s é r e a l i z a d a m u i t o r a p i d a m e n t e c o m o u s o
d e u m a t a b e l a h a s h .
U a a b a a a
A p r e s e n t a r e m o s u m ú l t i m o u s o p a r a t a b e l a s h a s h : u t i l i z a ç ã o c o m o c a c h e . S e
v o c ê t r a b a l h a c o m w e b s i t e s , t a l v e z j á t e n h a o u v i d o f a l a r s o b r e a u t i l i z a ç ã o d e
c a c h e c o m o u m a b o a p r á t i c a . A i d e i a é e s t a : i m a g i n e q u e v o c ê v i s i t e
a c b . c :
1 .
V o c ê f a z u m a s o l i c i t a ç ã o a o s s e r v i d o r e s d o F a c e b o o k .
2 . O s e r v i d o r p e n s a p o r u m s e g u n d o e e n t ã o e n v i a u m a p á g i n a w e b .
3 . V o c ê r e c e b e u m a p á g i n a d a w e b .
O s e r v i d o r d o F a c e b o o k p o d e e s t a r c o l e t a n d o t o d a a a t i v i d a d e d o s s e u s
a m i g o s p a r a e n t ã o m o s t r a r a v o c ê , p o r e x e m p l o . P a r a c o l e t a r t o d o s e s t e s
d a d o s , o s e r v i d o r p o d e l e v a r a l g u n s s e g u n d o s . E n t r e t a n t o e s t e s p o u c o s
s e g u n d o s p o d e m p a r e c e r u m a e t e r n i d a d e , e v o c ê p o d e p e n s a r “ P o r q u e o
F a c e b o o k e s t á t ã o l e n t o ? . P o r o u t r o l a d o , o s e r v i d o r d o F a c e b o o k p r e c i s a
r e s p o n d e r a s o l i c i t a ç õ e s d e m i l h õ e s d e p e s s o a s , e e s t e s p o u c o s s e g u n d o s v ã o
s e a c u m u l a n d o . O u s e j a , o s e r v i d o r d o F a c e b o o k e s t á t r a b a l h a n d o d u r o p a r a
r e s p o n d e r a t o d a s a s s o l i c i t a ç õ e s . M a s s e r á q u e e x i s t e a l g u m a m a n e i r a d e
t o r n a r o F a c e b o o k m a i s r á p i d o e f a z e r c o m q u e o s s e u s s e r v i d o r e s t r a b a l h e m
m e n o s ?
S u p o n h a q u e v o c ê t e n h a u m a s o b r i n h a q u e f a ç a m u i t a s p e r g u n t a s s o b r e
p l a n e t a s d o t i p o “ O q u ã o d i s t a n t e M a r t e c a d a T e r r a ? , “ Q u a l a d i s t â n c i a a t é
a L u a ? e “ Q u a l a d i s t â n c i a a t é J ú p i t e r ? . A c a d a p e r g u n t a v o c ê p r e c i s a
p e s q u i s a r n o G o o g l e a r e s p o s t a e s ó e n t ã o v o c ê c o n s e g u i r á r e s p o n d e r . L o g o
v o c ê t e r á m e m o r i z a d o q u e a L u a c a a 3 8 4 . 4 0 0 k m d e d i s t â n c i a e n ã o
p r e c i s a r á m a i s p r o c u r a r e s t a r e s p o s t a n o G o o g l e . É d e s t a f o r m a q u e o c a c h e
f u n c i o n a : o s w e b s i t e s l e m b r a m d o s d a d o s e m v e z d e r e c a l c u l á - l o s a c a d a
s o l i c i t a ç ã o .
C a s o v o c ê e s t e j a c o n e c t a d o a o F a c e b o o k , s a i b a q u e t o d o o c o n t e ú d o q u e
v o c ê v ê f o i f e i t o s o b m e d i d a . A s s i m , t o d a s a s v e z e s q u e v o c ê a c e s s a a p á g i n a
f a c e b o o k . c o m , o s s e r v i d o r e s p r e c i s a m p e n s a r e s e l e c i o n a r q u a l c o n t e ú d o é
d e s e u i n t e r e s s e . P o r é m , s e v o c ê n ã o e s t i v e r l o g a d o a o F a c e b o o k , v e r á a p e n a s
a p á g i n a d e l o g i n , s e n d o q u e t o d a s a s p e s s o a s v e r ã o a m e s m a p á g i n a d e
l o g i n . O u s e j a , o F a c e b o o k e n g l o b a d i v e r s a s s o l i c i t a ç õ e s p a r a a m e s m a
i n f o r m a ç ã o : “ M o s t r e - m e a p á g i n a i n i c i a l q u a n d o e u n ã o e s t i v e r l o g a d o . I s s o
e v i t a q u e o s e r v i d o r t e n h a d e p e n s a r c o m o a p á g i n a i n i c i a l é , p o i s e l e
m e m o r i z a c o m o a p á g i n a i n i c i a l d e v e s e r a p r e s e n t a d a e e n t ã o a e n v i a a v o c ê .
I s s o s e c h a m a c a c , e e s t a p r á t i c a o f e r e c e d u a s v a n t a g e n s :
V o c ê r e c e b e a p á g i n a d a w e b m u i t o m a i s r a p i d a m e n t e , d a m e s m a f o r m a
q u e v o c ê m e m o r i z o u a d i s t â n c i a e n t r e a T e r r a e a L u a . A s s i m , d a p r ó x i m a
v e z q u e s u a s o b r i n h a p e r g u n t a r s o b r e i s s o , n ã o s e r á n e c e s s á r i o p e s q u i s a r
n o G o o g l e , p o i s v o c ê c o n s e g u i r á r e s p o n d e r i n s t a n t a n e a m e n t e .
O F a c e b o o k p r e c i s a t r a b a l h a r m e n o s .
E s t a t é c n i c a é u m a m a n e i r a c o m u m d e a g i l i z a r a s c o i s a s . T o d o s o s g r a n d e s
s i t e s u s a m c a c h i n g , e o s d a d o s d e s t e s c a c h i n g s s ã o a r m a z e n a d o s e m u m a
t a b e l a h a s h !
O F a c e b o o k n ã o e s t á s ó a p l i c a n d o o c a c h i n g n a p á g i n a d e e n t r a d a . E l e e s t á
f a z e n d o c a c h e d a s p á g i n a s S o b r e , C o n t a t o , T e r m o s e C o n d i ç õ e s e m u i t a s
o u t r a s . A s s i m , e l e p r e c i s a m a p e a r a U R L d e u m a p á g i n a e r e l a c i o n á - l a a o s
d a d o s d a p á g i n a .
Q u a n d o v o c ê v i s i t a r u m a p á g i n a n o F a c e b o o k , e s t e i r á p r i m e i r o c h e c a r s e
e s t a p á g i n a e s t á a r m a z e n a d a n a h a s h .
A q u i v o c ê p o d e v e r i s s o e m f o r m a d e c ó d i g o :
cache = {}
def pega_pagina(url):
ifcache.get(url):
return cache[url] ❶
:
else
dados = pega_dados_do_servidor(url)
pega_dados_do_ser vidor(url)
cache[url] = dados ❷
return dados
❶ R e o r n a o d a d o d o c a c h e .
❷ S a l a e e d a d o p r i m e i r o n o e c a c h e .
D e s t a f o r m a , v o c ê f a z o s e r v i d o r t r a b a l h a r a p e n a s s e a U R L n ã o e s t i v e r
a r m a z e n a d a n o c a c h e . A n t e s d e v o c ê r e t o r n a r o s d a d o s , e l e s s e r ã o s a l v o s n o
c a c h e . A s s i m , a p r ó x i m a v e z q u e a l g u é m s o l i c i t a r e s t a U R L , v o c ê p o d e r á
e n v i a r o s d a d o s d o c a c h e e m v e z d e f a z e r o s e r v i d o r e x e c u t a r e s t a t a r e f a .
R a a
A s t a b e l a s h a s h s ã o ú t e i s p a r a
M o d e l a r r e l a ç õ e s e n t r e d o i s i t e n s
F i l t r a r p o r d u p l i c a t a s
C a c h i n g / m e m o r i z a ç ã o d e d a d o s , e m v e z d e s o l i c i t a r e s t e s d a d o s d o
s e r v i d o r .
C õ
C o m o e u d i s s e a n t e s , a m a i o r i a d a s l i n g u a g e n s d e p r o g r a m a ç ã o c o n t é m
t a b e l a s h a s h , p o r i s s o v o c ê n ã o p r e c i s a e s c r e v ê - l a s d o z e r o . S e n d o a s s i m , n ã o
f a l a r e i m u i t o s o b r e a e s t r u t u r a d a s t a b e l a s h a s h . N o e n t a n t o v o c ê p r e c i s a
s a b e r s o b r e o d e s e m p e n h o d e l a s , e p a r a i s s o p r e c i s a p r i m e i r o e n t e n d e r o q u e
s ã o c o l i s õ e s . A s d u a s p r ó x i m a s s e ç õ e s f a l a m s o b r e c o l i s õ e s e d e s e m p e n h o .
P r i m e i r o , p r e c i s o d i z e r q u e e s t i v e c o n t a n d o u m a p e q u e n a m e n t i r a . D i s s e
q u e u m a f u n ç ã o h a s h s e m p r e m a p e i a d i f e r e n t e s c h a v e s p a r a d i f e r e n t e s
e s p a ç o s e m u m a r r a y .
N a r e a l i d a d e , é p r a t i c a m e n t e i m p o s s í v e l e s c r e v e r u m a f u n ç ã o h a s h q u e f a ç a
i s s o . V a m o s a n a l i s a r e s t e e x e m p l o s i m p l e s : s u p o n h a q u e v o c ê t e n h a u m
a r r a y q u e c o n t e n h a 2 6 e s p a ç o s .
S u a f u n ç ã o h a s h é b e m s i m p l e s : e l a a p e n a s i n d i c a u m e s p a ç o d o a r r a y
a l f a b e t i c a m e n t e .
T a l v e z v o c ê j á c o n s i g a v e r o p r o b l e m a . V o c ê q u e r i n s e r i r o p r e ç o d e u m a
a m e i x a n a s u a h a s h . A s s i m , o p r i m e i r o e s p a ç o d o a r r a y é i n d i c a d o .
D e p o i s , v o c ê q u e r i n s e r i r o p r e ç o d a s b a n a n a s . E n t ã o , o s e g u n d o e s p a ç o d o
a r r a y é i n d i c a d o .
T u d o e s t á i n d o t ã o b e m ! M a s a g o r a q u e r i n s e r i r o p r e ç o d o s a b a c a t e s n a s u a
h a s h . E n t ã o , o p r i m e i r o e s p a ç o d o a r r a y é i n d i c a d o n o v a m e n t e .
A h , n ã o ! A s a m e i x a s j á e s t ã o n e s t e e s p a ç o ! O q u e v a m o s f a z e r ? I s s o s e
c h a m a c ã : d u a s c h a v e s s ã o i n d i c a d a s p a r a o m e s m o e s p a ç o , e i s t o é u m
p r o b l e m a . A s s i m , s e a r m a z e n a r o p r e ç o d o s a b a c a t e s n e s t e e s p a ç o , e l e s i r ã o
s o b r e s c r e v e r o p r e ç o d a s a m e i x a s . D e s t a f o r m a , d a p r ó x i m a v e z q u e a l g u é m
p e r g u n t a r o p r e ç o d a s a m e i x a s , o p r e ç o d o s a b a c a t e s s e r á i n f o r m a d o !
C o l i s õ e s s ã o u m p r o b l e m a , e v o c ê p r e c i s a s o l u c i o n á - l o . P a r a i s s o h á v á r i a s
a l t e r n a t i v a s , e a m a i s s i m p l e s é e s t a : s e d i v e r s a s c h a v e s m a p e i a m p a r a o
m e s m o e s p a ç o , i n i c i e u m a l i s t a e n c a d e a d a n e s t e e s p a ç o .
N e s t e e x e m p l o , t a n t o a “ a m e i x a q u a n t o o “ a b a c a t e s ã o m a p e a d o s p a r a o
m e s m o e s p a ç o . L o g o , v o c ê d e v e i n i c i a r u m a l i s t a e n c a d e a d a n e s t e e s p a ç o .
C a s o v o c ê q u e i r a s a b e r o p r e ç o d a s b a n a n a s , e s t a i n f o r m a ç ã o a i n d a s e r á
a c e s s a d a d e m a n e i r a r á p i d a . P o r é m , s e v o c ê q u i s e r s a b e r o p r e ç o d a s
a m e i x a s , e s s a i n f o r m a ç ã o s e r á r e t o r n a d a d e f o r m a m a i s l e n t a , p o i s v o c ê
p r e c i s a r á p e s q u i s a r n a s u a l i s t a e n c a d e a d a p a r a e n c o n t r a r “ a m e i x a s . S e a
l i s t a e n c a d e a d a f o r p e q u e n a , n ã o h a v e r á n e n h u m p r o b l e m a , p o i s v o c ê
d e v e r á p e s q u i s a r e n t r e t r ê s o u q u a t r o e l e m e n t o s . M a s i m a g i n e q u e v o c ê
t r a b a l h a e m u m m e r c a d o o n d e s ã o v e n d i d o s a p e n a s p r o d u t o s q u e i n i c i a m
c o m a l e t r a A .
E i , e s p e r e u m p o u c o a í ! Q u a s e t o d a a t a b e l a h a s h e s t á v a z i a , e x c e t o p o r u m
e s p a ç o , e n e s t e e s p a ç o h á u m a l i s t a g i g a n t e l i n k a d a ! O u s e j a , c a d a e l e m e n t o
d e s s a t a b e l a h a s h e s t á c o n t i d o n e s s a l i s t a . I s s o é t ã o i n e c i e n t e q u a n t o
c o l o c a r t o d o s e s s e s e l e m e n t o s a p e n a s n a l i s t a e n c a d e a d a , p o i s e s s a l i s t a
d i m i n u i r á o t e m p o d e e x e c u ç ã o d a s u a t a b e l a h a s h .
A p r e n d e m o s d u a s l i ç õ e s a q u i :
A ç ã a é a . E l a m a p e i a t o d a s a s c h a v e s p a r a u m
ú n i c o e s p a ç o . I d e a l m e n t e , a s u a f u n ç ã o h a s h m a p e a r i a c h a v e s d e m a n e i r a
s i m é t r i c a p o r t o d a a h a s h .
C a s o a s l i s t a s e n c a d e a d a s s e t o r n e m m u i t o l o n g a s , e l a s d i m i n u i r ã o d e m a i s
o t e m p o d e e x e c u ç ã o d a t a b e l a h a s h . P o r é m e l a s n ã o s e t o r n a r ã o m u i t o
l o n g a s s e v o c ê a a b a ç ã a !
A s f u n ç õ e s h a s h s ã o i m p o r t a n t e s , p o i s u m a b o a f u n ç ã o h a s h c r i a p o u c a s
c o l i s õ e s . M a s c o m o v o c ê e s c o l h e u m a b o a f u n ç ã o h a s h ? É i s s o q u e v e r e m o s
n a p r ó x i m a s e ç ã o !
D
V o c ê i n i c i o u e s t e c a p í t u l o e m u m s u p e r m e r c a d o , p o i s e r a n e c e s s á r i o c r i a r
a l g o q u e f o r n e c e s s e o s p r e ç o s d o s p r o d u t o s a a a . B e m , a s
t a b e l a s h a s h s ã o m u i t o r á p i d a s .
N o c a s o m é d i o , a s t a b e l a s h a s h t ê m t e m p o d e e x e c u ç ã o O ( 1 ) p a r a t u d o .
A s s i m , O ( 1 ) é c h a m a d o d e c a . V o c ê a i n d a n ã o f o i a p r e s e n t a d o
a t e m p o c o n s t a n t e . T e m p o c o n s t a n t e n ã o é a l g o q u e a c o n t e c e
i n s t a n t a n e a m e n t e , m a s s i m u m t e m p o q u e c o n t i n u a r á s e m p r e o m e s m o ,
i n d e p e n d e n t e m e n t e d e q u ã o g r a n d e a t a b e l a h a s h p o s s a c a r . P o r e x e m p l o ,
v o c ê s a b e q u e a p e s q u i s a s i m p l e s t e m t e m p o d e e x e c u ç ã o l i n e a r .
A p e s q u i s a b i n á r i a é m a i s r á p i d a , p o i s t e m t e m p o d e e x e c u ç ã o l o g :
P r o c u r a r a l g o e m u m a t a b e l a h a s h t e m t e m p o d e e x e c u ç ã o c o n s t a n t e .
P e r c e b e c o m o é u m a l i n h a r e t a ? I s s o s i g n i c a q u e n ã o i m p o r t a s e a s u a
t a b e l a h a s h t e m 1 e l e m e n t o o u 1 b i l h ã o d e e l e m e n t o s , p o i s o r e t o r n o d a
t a b e l a h a s h s e m p r e l e v a r á a m e s m a q u a n t i d a d e d e t e m p o . N a v e r d a d e , v o c ê
j á v i u t e m p o c o n s t a n t e a n t e s , p o i s r e t o r n a r u m i t e m d e u m a r r a y l e v a u m
t e m p o c o n s t a n t e . N o v a m e n t e , n ã o i m p o r t a o t a m a n h o d o a r r a y , p o i s e l e
s e m p r e l e v a r á a m e s m a q u a n t i d a d e d e t e m p o p a r a r e t o r n a r u m e l e m e n t o .
N o c a s o m é d i o , a s t a b e l a s h a s h s ã o m u i t o r á p i d a s .
N o p i o r c a s o , u m a t a b e l a h a s h t e m t e m p o d e e x e c u ç ã o O ( ) , o u s e j a , t e m p o
d e e x e c u ç ã o l i n e a r p a r a t u d o , o q u e é b e m l e n t o . V a m o s c o m p a r a r a s t a b e l a s
h a s h c o m o s a r r a y s e c o m a s l i s t a s .
P r e s t e a t e n ç ã o a o c a s o m é d i o p a r a a s t a b e l a s h a s h . A s t a b e l a s h a s h s ã o t ã o
v e l o z e s q u a n t o o s a r r a y s n a b u s c a ( p e g a r u m v a l o r e m a l g u m í n d i c e ) , e e l a s
s ã o t ã o v e l o z e s q u a n t o a s l i s t a s n a i n s e r ç ã o e n a r e m o ç ã o d e i t e n s . O u s e j a ,
e l a é o m e l h o r d o s d o i s m u n d o s ! P o r é m , n o p i o r c a s o , a s t a b e l a s h a s h s ã o
l e n t a s e m a m b o s o s c a s o s . A s s i m , é i m p o r t a n t e q u e v o c ê n ã o o p e r e n o p i o r
c a s o ; p a r a i s s o é p r e c i s o e v i t a r c o l i s õ e s . P a r a e v i t a r c o l i s õ e s s ã o n e c e s s á r i o s
u m b a i x o f a t o r d e c a r g a ;
u m a b o a f u n ç ã o h a s h .
A n e d e i n i c i a r e a e ç ã o , a i b a q e e l a n ã o é m a l e i r a o b r i g a ó r i a , p o i f a l a r e i o b r e
c o m o i m p l e m e n a r m a a b e l a h a h . P o r é m o c ê p r o a e l m e n e n n c a f a r á i o . N ã o
i m p o r a a l i n g a g e m n a q a l o c ê p r o g r a m e , e l a e r á m a i m p l e m e n a ç ã o d e a b e l a h a h
j á a g r e g a d a . A i m , é p o í e l a r e a a b e l a h a h a g r e g a d a e a d m i i r q e e l a e r á m
b o m d e e m p e n h o . A p r ó i m a e ç ã o p o d e e r c o n i d e r a d a m a e p i a d a d e n r o d o c a p ô
p a r a a n a l i a r o f n c i o n a m e n o d o m o o r .
F a a a
O f a t o r d e c a r g a d e u m a t a b e l a h a s h é s i m p l e s d e c a l c u l a r .
A s t a b e l a s h a s h u t i l i z a m u m a r r a y p a r a a r m a z e n a m e n t o , e n t ã o v o c ê d e v e
c o n t a r o n ú m e r o d e e s p a ç o s u s a d o s n o a r r a y . P o r e x e m p l o , e s t a t a b e l a h a s h
t e m f a t o r d e c a r g a d e 2 / 5 , o u 0 , 4 .
Q u a l o f a t o r d e c a r g a d e s t a t a b e l a h a s h ?
S e v o c ê d i s s e u m t e r ç o , a c e r t o u . O f a t o r d e c a r g a m e d e q u a n t o s e s p a ç o s
c o n t i n u a m v a z i o s n a s u a t a b e l a h a s h .
S u p o n h a q u e v o c ê p r e c i s e a r m a z e n a r o p r e ç o d e c e m p r o d u t o s e m s u a t a b e l a
h a s h , c o n s i d e r a n d o q u e e l a t e n h a c e m e s p a ç o s . N a m e l h o r h i p ó t e s e , c a d a
i t e m t e r á s e u p r ó p r i o e s p a ç o .
E s t a t a b e l a h a s h t e m u m f a t o r d e c a r g a d e 1 . E s e a t a b e l a h a s h t i v e s s e a p e n a s
c i n q u e n t a e s p a ç o s ? N e s t e c a s o , e l a t e r i a u m f a t o r d e c a r g a d e 2 , s e n d o
i m p o s s í v e l q u e c a d a i t e m t e n h a o s e u p r ó p r i o e s p a ç o , p o i s n ã o e x i s t e m
e s p a ç o s s u c i e n t e s ! U m f a t o r d e c a r g a m a i o r d o q u e 1 i n d i c a q u e v o c ê t e m
m a i s i t e n s d o q u e e s p a ç o s e m s e u a r r a y . S e o f a t o r d e c a r g a c o m e ç a r a
c r e s c e r , s e r á n e c e s s á r i o a d i c i o n a r m a i s e s p a ç o s e m s u a t a b e l a h a s h . I s s o s e
c h a m a a . S u p o n h a , p o r e x e m p l o , q u e v o c ê t e n h a e s t a
t a b e l a h a s h q u e e s t á q u a s e c h e i a :
É n e c e s s á r i o r e d i m e n s i o n a r e s t a t a b e l a h a s h . P a r a i s s o , p r i m e i r o v o c ê d e v e
c r i a r u m a r r a y m a i o r . E m p i r i c a m e n t e , d e n i u - s e q u e e s t e a r r a y d e v e t e r o
d o b r o d o t a m a n h o d o a r r a y o r i g i n a l .
A g o r a é n e c e s s á r i o r e i n s e r i r t o d o s o s i t e n s n e s t a n o v a t a b e l a h a s h u t i l i z a n d o
a f u n ç ã o hash :
E s t a n o v a t a b e l a t e m u m f a t o r d e c a r g a d e ⅜ ( t r ê s o i t a v o s ) . B e m m e l h o r !
C o m u m f a t o r d e c a r g a m e n o r h a v e r á m e n o s c o l i s õ e s e s u a t a b e l a t e r á
m e l h o r d e s e m p e n h o . U m a b o a r e g r a g e r a l é : r e d i m e n s i o n e q u a n d o o f a t o r
d e c a r g a f o r m a i o r d o q u e 0 , 7 .
V o c ê p o d e e s t a r p e n s a n d o “ R e d i m e n s i o n a r l e v a m u i t o t e m p o ! , e i s t o é
v e r d a d e . O r e d i m e n s i o n a m e n t o é c a r o e n ã o d e v e s e r f e i t o c o m f r e q u ê n c i a .
N o e n t a n t o , e m m é d i a , a s t a b e l a s h a s h t ê m t e m p o d e e x e c u ç ã o O ( 1 ) , m e s m o
c o m o r e d i m e n s i o n a m e n t o .
U a b a ç ã a
U m a b o a f u n ç ã o h a s h d i s t r i b u i o s v a l o r e s n o a r r a y s i m e t r i c a m e n t e .
U m a f u n ç ã o h a s h n ã o i d e a l a g r u p a v a l o r e s e p r o d u z d i v e r s a s c o l i s õ e s .
M a s o q u e é u m a b o a f u n ç ã o h a s h ? I s s o é a l g o c o m q u e v o c ê j a m a i s d e v e r á
s e p r e o c u p a r , p o i s h o m e n s ( e m u l h e r e s ) v e l h o s e b a r b u d o s s e n t a m e m
q u a r t o s e s c u r o s e s e p r e o c u p a m c o m i s s o . S e v o c ê é m u i t o c u r i o s o , d ê u m a
o l h a d a n a f u n ç ã o S H A ( h á u m a b r e v e d e s c r i ç ã o s o b r e e l a n o ú l t i m o
c a p í t u l o ) . V o c ê p o d e u s a r a q u i l o c o m o s u a f u n ç ã o h a s h .
E E C Í C I
É i m p o r t a n t e q u e f u n ç õ e s h a s h t e n h a m u m a b o a d i s t r i b u i ç ã o . D e s s a f o r m a ,
e l a s c a m c o m o m a p e a m e n t o m a i s a m p l o p o s s í v e l . O p i o r c a s o é u m a
f u n ç ã o h a s h q u e m a p e i a t o d o s o s i t e n s p a r a o m e s m o e s p a ç o d a t a b e l a h a s h .
S u p o n h a q u e v o c ê t e n h a e s t a s q u a t r o f u n ç õ e s h a s h q u e o p e r a m c o m s t r i n g s :
. R e t o r n e “ 1 p a r a q u a l q u e r e n t r a d a .
.
U s e o c o m p r i m e n t o d a s t r i n g c o m o o í n d i c e .
.
U s e o p r i m e i r o c a r a c t e r e d a s t r i n g c o m o í n d i c e . A s s i m , t o d a s a s s t r i n g s
q u e i n i c i a m c o m a l e t r a a s ã o h a s h e a d a s j u n t a s e a s s i m p o r d i a n t e .
M a p e i e c a d a l e t r a p a r a u m n ú m e r o p r i m o : a = 2 , b = 3 , c = 5 , d = 7 , e =
.
1 1 , e a s s i m p o r d i a n t e . P a r a u m a s t r i n g , a f u n ç ã o h a s h é a s o m a d e t o d o s
o s c a r a c t e r e s - m ó d u l o c o n f o r m e o t a m a n h o d a h a s h . S e o t a m a n h o d e s u a
h a s h f o r 1 0 , p o r e x e m p l o , e a s t r i n g f o r “ b a g , o í n d i c e s e r á ( 3 + 2 + 1 7 ) %
1 0 = 2 2 % 1 0 = 2 .
P a r a c a d a u m d e s t e s e x e m p l o s , q u a l f u n ç ã o h a s h f o r n e c e r á u m a b o a
d i s t r i b u i ç ã o ? C o n s i d e r e q u e o t a m a n h o d a t a b e l a h a s h t e n h a d e z e s p a ç o s .
5 . 5 U m a l i s t a t e l e f ô n i c a e m q u e a s c h a v e s s ã o o s n o m e s e o s v a l o r e s s ã o o s
n ú m e r o s t e l e f ô n i c o s . O s n o m e s s ã o o s s e g u i n t e s : E s t h e r ,