Você está na página 1de 10

11/10/12

Algoritmos: busca binria (v erso completa)

Projeto de Algoritmos
Home | Prefcio | Livros | Stios WWW | ndice

"Binary search is to algorithms what a wheel is to mechanics: It is simple, elegant, and immensely important." Udi Manber, Introduction to Algorithms "A good algorithm is like a sharp knife: it does what it is supposed to do with a minimum amount of applied effort. Using the wrong algorithm to solve a problem is like trying to cut a steak with a screwdriver: you may eventually get a digestible result, but you will expend considerably more effort than necessary, and the result is unlikely to be aesthetically pleasing." Th. Cormen, Ch. Leiserson, R. Rivest, Introduction to Algorithms "Binary search is a notoriously tricky algorithm to program correctly. It took seventeen years after its invention until the first correct version of binary search was published!" Steven Skiena, The Algorithm Design Manual

Busca em vetor ordenado


Esta pgina estuda o seguinte problema bsico: determinar se um dado nmero est ou no est em um dado vetor ordenado. Mais precisamente, dado um nmero xe um vetor crescente v 0 . - ] [.n1, encontrar um ndice
j tal que v j = x. [] =

Vamos examinar dois algoritmos para o problema: um bvio e lento e outro sofisticado e muito mais rpido. Veja o verbete Binary search algorithm na Wikipedia. Veja tambm os captulos 4 e 5 do "Programming Pearls".

Decises de projeto
Comecemos por tornar o problema um pouco mais elaborado: vamos exigir que o algoritmo devolva jtal que
vj1 [-]

<

vj . []

Assim, o usurio ficar sabendo onde xest basta comparar xcom v j ou onde [] deveria estar. Para que a coisa fique completa, devemos permitir que jvalha 0 ou n . Nesses casos a condio acima deve ser interpretada com inteligncia: se j= 0ento a = condio se reduz a
x

v0 , []

www.ime.usp.br/~pf /algoritmos/aulas/bubi.html

1/10

11/10/12

Algoritmos: busca binria (v erso completa)

pois v - ]no faz sentido; se j= nento a condio se reduz a [1 =


vn1 [-]

<

x,

pois v n no faz sentido. Tudo se passa como se nosso vetor tivesse um componente [] imaginrio v - ]com valor infinito negativo e um componente imaginrio v n com valor [1 [] infinito positivo. No exemplo abaixo, se xvale 555 ento o valor correto de j 4 Se xvale 1000 ento o valor . correto de j 1 . 3
0 n1 -

111 222 333 444 555 555 666 777 888 888 888 999 999 Precisamos tomar mais uma deciso de projeto: qual o menor vetor com que vamos nos preocupar? Suporemos sempre que
n 1 ,

pois isso torna o raciocnio mais simples. verdade, entretanto, que o problema faz sentido mesmo quando nvale 0 (a soluo do problema necessariamente 0nesse caso).

Busca sequencial
Comecemos com um algoritmo simples e bvio:
it n bsa(n x itn itv] { uc it , n , n [) itj=0 n ; wie( <n& vj <x +j hl j & [] ) +; rtr j eun ; }

Quantas comparaes de xcom elementos de vessa funo faz? A resposta


n

no pior caso.

possvel resolver o problema com menos comparaes? Em outras palavras, possvel resolver o problema sem comparar xcom cada um dos elementos do vetor? A resposta afirmativa, como veremos adiante.

Exerccios
1. Critique a seguinte formulao do problema de busca: dado xe um vetor crescente v 0 . - ] encontrar um ndice jtal que v j 1 x v j . Critique a formulao [.n1, [-] [] construda em torno de "v j 1 < x< v j ". [-] [] 2. Critique a seguinte verso da funo:
itbsa(n x itn itv] { n uc it , n , n [) itj=0 n ;
2/10

11/10/12

Algoritmos: busca binria (v erso completa)

itj=0 n ; wie([]<x& j<n +j hl vj & ) +; rtr j eun ; }

3. Discuta a seguinte verso recursiva da funo b s a uc:


/ Et fn dvleje 0. tlqe / sa uo eov m .n a u / vj1 <x< vj.Easpeqen> 0 / [-] = [] l u u = . itbsa (n x itn itv] { n uc2 it , n , n [) i ( = 0 rtr 0 f n = ) eun ; i ( >vn1)rtr n f x [-] eun ; rtr bsa (,n1 v; eun uc2 x -, ) }

Busca binria
H um mtodo de soluo muito mais eficiente para nosso problema. Ele se baseia no mtodo que todos ns usamos para encontrar um nome em uma lista telefnica. claro que a ideia s faz sentido porque o vetor est ordenado.
/ Afn aax rcb u vtrcecnev0.-] / uo bio eee m eo rset [.n1 / cmn> 1eu nmr x Eadvleu dc j / o = m eo . l eov m nie / e 0. tlqevj1 <x< vj. / m .n a u [-] = [] it n bsaiai (n x itn itv] { ucbnra it , n , n [) ite m d n , , ; i ([-]<x rtr n f vn1 ) eun ; i ( < v0)rtr 0 / aoav0 <x< vn1 f x = [] eun ; / gr [] = [-] e=0 d=n1 ; -; wie( <d1 { hl e -) m=( +d/; e )2 i ([]<x e=m f vm ) ; es d=m le ; } rtr d eun ; }

Os nomes das variveis no foram escolhidos por acaso: e lembra "esquerda", m lembra "meio" e d lembra "direita". O resultado da diviso por 2na expresso ( + ) 2 ed/ automaticamente truncado, pois e de 2so do tipo i t Por exemplo, se ee dvalem 3e 6 , n. respectivamente ento ( + ) 2vale 4 ed/ .
0 e d n1 -

111 222 333 444 555 555 666 777 888 888 888 999 999 A ideia do algoritmo de busca binria (= binary search) um verdadeiro "ovo de Colombo". Ela a base de muitos algoritmos eficientes para diversos problemas.

Busca binria: a funo est correta?


www.ime.usp.br/~pf /algoritmos/aulas/bubi.html 3/10

11/10/12

Algoritmos: busca binria (v erso completa)

Para compreender o algoritmo, basta verificar que no incio de cada repetio do w i e hl, imediatamente antes da comparao de ecom d temos a seguinte relao: ,
ve []

<

vd . []

(Confira!) Como essa relao vale no incio de cada iterao, dizemos que ela invariante. (Note a semelhana entre esta relao e a relao v j 1 < x v j que o objetivo que [-] [] estamos perseguindo.) bvio que d a resposta correta quando e= d 1 = -. Em cada iterao temos e < m < d (por qu?). Logo, tanto d mquanto m eso estritamente menores que d e Portanto, a sequncia de valores da expresso d e estritamente -. decrescente. por isso que o algoritmo para mais cedo ou mais tarde.

Busca binria: desempenho da funo


Quanto tempo o algoritmo leva para parar? No incio da primeira iterao, d evale aproximadamente n No incio da segunda, vale aproximadamente n 2 No incio da terceira, . /. k Quando katinge ou ultrapassa log n o valor da n 4 No incio da ( + ) /. k 1 -sima, n 2 . / 2 , expresso n 2 fica menor ou igual a 1 e o algoritmo para. Logo, o nmero de iteraes /k aproximadamente
l ( ), g n

o que muito melhor que as niteraes da busca sequencial. Por exemplo, se cada iterao consome 1 microssegundo ento uma busca em nelementos consome l ( )microssegundos, gn uma busca em 8 elementos consumir apenas 3 l ( )microssegundos e uma busca em n +gn 1 2 nelementos consumir apenas 1 + g n microssegundos. 04 0l()

Exerccios
4. Responda as seguintes perguntas sobre a funo b s a i a i descrita acima. ucbnra a. Que acontece se "w i e ( < d 1 " for trocado por "w i e ( < d "? ou hl e -) hl e ) por "w i e ( < d 1 "? hl e = -) b. Que acontece se "i ( [ ] < x " for trocado por "i ( [ ] < x "? f vm ) f vm = ) c. Que acontece se "e = m for trocado por "e = m 1 ou por "e = m 1 E " +" - "? se "d = m for trocado por "d = m 1 ou por "d = m 1 " +" - "? 5. Execute b s a i a i com n=9 com v i =ipara cada ie com vrios valores ucbnra , [] de x Repita o exerccio com n=1 e x=9 . 4 . 6. Se preciso de tsegundos para fazer uma busca binria em um vetor com n elementos, de quando tempo preciso para fazer uma busca em n elementos? 7. [Importante] Escreva uma funo de busca binria simplificada que devolva jtal que v j = xou devolva - se tal jno existe. [] = 1
www.ime.usp.br/~pf /algoritmos/aulas/bubi.html 4/10

11/10/12

Algoritmos: busca binria (v erso completa)

Busca binria: uma verso mais limpa


fcil perceber que os testes iniciais, antes do w i e podem ser substitudos por uma hl, inicializao apropriada de ee d :
/ Et fn rcb u vtrcecnev0.-] / sa uo eee m eo rset [.n1 / cmn> 1eu nmr x Eadvleu dc / o = m eo . l eov m nie / je 0. tlqevj1 <x< vj. / m .n a u [-] = [] it n bsaiai2(n x itn itv] { ucbnra it , n , n [) ite m d n , , ; e=-;d=n 1 ; wie( <d1 { hl e -) m=( +d/; e )2 i ([]<x e=m f vm ) ; es d=m le ; } rtr d eun ; }

No incio de cada repetio do w i e imediatamente antes da comparao de ecom d 1 vale hl, -, a propriedade invariante
ve < x vd , [] []

como j vimos acima. Esta propriedade a chave do algoritmo; o algoritmo foi construdo em torno desta propriedade. No incio da primeira iterao, a propriedade est automaticamente satisfeita, pois v - ]e v n no fazem sentido. (No est convencido? Ento [1 [] imagine que v - ]vale infinito negativo e v n vale infinito positivo.) [1 []

Exerccios
8. verdade que mest em 0 . - sempre que a instruo i ( [ ]< x executada? .n1 f vm ) 9. Execute b s a i a i 2com n= 7 com v i = ipara cada ie com vrios valores ucbnra , [] de x . 10. Execute a funo b s a i a i 2com n= 1 , com v i = ipara cada ie com ucbnra 5 [] vrios valores de x . 11. Confira a validade da seguinte afirmao: quando n 1 uma potncia de 2 a + , expresso ( + ) sempre divisvel por 2 quaisquer que sejam ve x ed , . 12. Execute a funo b s a i a i 2com n= 1 . Quais os possveis valores de mna ucbnra 6 primeira iterao? Quais os possveis valores de mna segunda iterao? Na terceira? Na quarta? 13. Escreva uma verso da busca binria que receba um nmero xe um vetor v 0 . - ] [.n1 e devolva jtal que em v j 1 x < v j . (Quais os possveis valores de j [-] [] ?).
www.ime.usp.br/~pf /algoritmos/aulas/bubi.html 5/10

14. Escreva uma verso da busca binria que procure xem v 0 . ](ateno para os [.n ndices). 15. Escreva uma verso da busca binria que procure xem v 1 . ](ateno para os [.n ndices).

Mais exerccios
H muitas maneiras de implementar a busca binria. Os exerccios abaixo discutem algumas implementaes. Todas as funes procuram encontrar xem v 0 . - ] Todas as funes [.n1. produzem (ou deveriam produzir) jem 0 . tal que v j 1 < x v j . .n [-] [] A implementao da busca binria exige cuidado e ateno aos detalhes; muito fcil escrever um algoritmo que d respostas erradas ou "entra em loop". [Leia Programming Pearls, pags. 11, 35-48, 81.] 16. Mostre que a seguinte alternativa de b s a i a i 2funciona corretamente. Ela ucbnra quase to bonita quanto a verso discutida acima.
e=0 d=n ; ; wie( <d { hl e ) / ve1 <x< vd / [-] = [] m=( +d/; e )2 i ([]<x e=m1 f vm ) +; es d=m le ; } / e= d / = rtr d eun ;

Que acontece se trocarmos "w i e( <d " por "w i e( < d "? Que acontece se hl e ) hl e = ) trocarmos "( + ) 2 por "( - + ) 2 ed/" e 1 d / "? 17. Mostre que a seguinte alternativa de b s a i a i 2funciona corretamente. Eu acho ucbnra que ela um pouco mais feia que as verses anteriores.
e=0 d=n1 ; -; wie( < d { hl e = ) / ve1 <x< vd1 / [-] = [+] m=( +d/; e )2 i ([]<x e=m1 f vm ) +; es d=m1 le -; } / e= d1 / = + rtr d1 eun +;

18. A seguinte alternativa de b s a i a i 2funciona corretamente? ucbnra


e=-;d=n1 1 -; wie( <d { hl e ) m=( +d/; e )2 i ([]<x e=m f vm ) ; es d=m1 le -; } rtr d1 eun +;

19. A seguinte alternativa de b s a i a i 2funciona corretamente? ucbnra


e=-;d=n1 1 -; wie( <d { hl e ) m=( +d+1/; e )2

11/10/12

Algoritmos: busca binria (v erso completa)

m=( +d+1/; e )2 i ([]<x e=m f vm ) ; es d=m1 le -; } rtr d1 eun +;

20. Preencha os "? " corretamente. ?


itbsaiai2(n x itn itv] { n ucbnra it , n , n [) ite=?, d=?; n ? ? wie( ? d1 { hl e ? -) m=( +d/; e )2 i ([]? x e=m f vm ? ) ; es d=m } le ; rtr ?;} eun ?

Verso recursiva da busca binria


A formulao do problema que usamos at agora no apropriada para uma soluo recursiva. preciso generalizar a formulao. Para estabelecer uma ponte entre a formulao original e a generalizada, vamos usar uma "funo-embrulho" b s a i a i 3 que trata dos ucbnra, casos triviais e repassa todo o servio pesado para a funo recursiva b . b
/ Afn aax rcb u vtrcecnev0.-] / uo bio eee m eo rset [.n1 / cmn> 1eu nmr x Eadvleu dc j / o = m eo . l eov m nie / e 0. tlqevj1 <x< vj. / m .n a u [-] = [] it n bsaiai3(n x itn itv] { ucbnra it , n , n [) i ([-]<x rtr n f vn1 ) eun ; i ( < v0)rtr 0 f x = [] eun ; rtr b (,0 n1 v; eun b x , -, ) }

A funo recursiva b resolve um problema mais geral: em vez de fazer uma busca em v 0 . b [.n 1 , ela faz a busca em v e . ] com evarivel. ] [.d,
/ Et fn rcb u vtrcecneve1.-]eu / sa uo eee m eo rset [+.d1 m / nmr xtlqeve <x< vd (otno e<d. / eo a u [] = [] prat, ) / Eadvleu dc je e1. tlqe / l eov m nie m +.d a u / vj1 <x< vj. / [-] = [] it n b (n x ite itd itv] { b it , n , n , n [) i ( = d1 rtr d f e = -) eun ; / bs d rcr / ae a euso es { le itm=( +d/; n e )2 i ([]<x f vm ) rtr b (,m d v; eun b x , , ) es le rtr b (,e m v; eun b x , , ) } }

www.ime.usp.br/~pf /algoritmos/aulas/bubi.html

7/10

11/10/12

Algoritmos: busca binria (v erso completa)

Qual a "profundidade da recurso" da funo b ? Ou seja, quantas vezes b chama a si b b mesma? Resposta: cerca de l g nvezes. o2

Exerccios
21. Mostre que b s a i a i 3pode ser simplificada: ucbnra
itbsaiai3(n x itn itv] { n ucbnra it , n , n [) rtr b (,-,n v; eun b x 1 , ) }

(Basta imaginar que que v - ]vale infinito negativo e v n vale infinito positivo.) [1 [] 22. [Importante] Escreva uma funo recursiva de busca binria que devolva jtal que v j = xou devolva - se tal jno existe. [] = 1 23. OVERFLOW. Se o nmero de elementos do vetor (valor da varivel n estiver ) prximo de I T M X o cdigo da busca binria pode descarrilar na linha N_A,
m=( +d/; e )2

em virtude de um overflow aritmtico. Como evitar isso? [Veja artigo de Joshua Bloch no Google Blog em 2006. Dica de Rafael Zanella.]

Mais exerccios
24. VET OR DE ST RINGS. Suponha que v 0 . - ] um vetor de strings em ordem [.n1 lexicogrfica. Escreva uma funo que receba uma string xe devolva um ndice jtal que a string x igual string v j . Se tal jno existe, a funo deve devolver - . [] 1 25. VET OR DE ST RUCT S. Suponha que cada elemento do vetor v 0 . - ] uma struct [.n1 com dois campos: o nome de um aluno e o nmero do aluno. Suponha que o vetor est em ordem crescente de nmeros. Escreva uma funo de busca binria que receba o nmero de um aluno e devolva o seu nome. Se o nmero no est no vetor, a funo deve devolver a string vazia. 26. Familiarize-se com a funo b e r hda biblioteca s d i . sac tlb

Diviso e conquista
O paradigma da busca binria serve de base para o conhecido "mtodo da diviso e conquista", que pode ser usado para resolver eficientemente muitos problemas computacionais.

www.ime.usp.br/~pf /algoritmos/aulas/bubi.html

8/10

11/10/12

27. Escreva uma funo que receba um vetor inteiro estritamente crescente v 0 . - ] [.n1 e devolva um ndice ientre 0e n 1tal que v i = i; se tal ino existe, a funo [] = deve devolver - . O seu algoritmo no deve fazer mais que l ( )comparaes 1 gn envolvendo elementos de v . 28. Escreva uma funo eficiente que receba inteiros positivos k e n e calcule k n. Quantas multiplicaes sua funo executa? 29. A seguinte funo recursiva pretende encontrar o valor de um elemento mximo de v e . ] supondo e d ( claro que no estamos supondo que o vetor est [.d, . ordenado.)
itmx(n e itd itv] { n a it , n , n [) i ( = d rtr vd; f e = ) eun [] es { le itm mx,mx; n , ae ad m=( +d/; e )2 mx =mx(,m v; ae a e , ) mx =mx(+,d v; ad a m1 , ) i (ae> mx)rtr mx; f mx = ad eun ae es rtr mx; le eun ad } }

A funo est correta? Ela mais rpida que a verso iterativa arroz-com-feijo? Quantas vezes a funo chama a si mesma?

URL of this site: www.ime.usp.br/~pf/algoritmos/ 1998 | Last modified: Wed Oct 20 06:50:58 BRT 2010 Paulo Feofiloff IME-USP

www.ime.usp.br/~pf /algoritmos/aulas/bubi.html

9/10

11/10/12

Algoritmos: busca binria (v erso completa)

www.ime.usp.br/~pf /algoritmos/aulas/bubi.html

10/10