mirror of
https://github.com/adambard/learnxinyminutes-docs.git
synced 2024-11-27 13:32:56 +03:00
78 lines
2.4 KiB
Markdown
78 lines
2.4 KiB
Markdown
|
---
|
||
|
category: Algorithms & Data Structures
|
||
|
name: Binary Search
|
||
|
contributors:
|
||
|
- ["Abhishek Jaisingh", "http://github.com/abhishekjiitr"]
|
||
|
translators:
|
||
|
- ["Claudson Martins", "https://github.com/claudsonm"]
|
||
|
lang: pt-br
|
||
|
---
|
||
|
|
||
|
# Busca Binária
|
||
|
|
||
|
## Por Que Busca Binária?
|
||
|
|
||
|
Operações de busca são um dos principais problemas na Ciência da Computação.
|
||
|
Atualmente existem mais de 1 trilhão de buscas por ano, e nós precisamos de
|
||
|
algoritmos que possam realizá-las rapidamente. Busca binária é um dos algoritmos
|
||
|
fundamentais em ciência da computação. A fim de explorá-la, iremos primeiro
|
||
|
construir um conhecimento teórico, e então utilizá-lo para implementar o
|
||
|
algoritmo apropriadamente.
|
||
|
|
||
|
## Introdução
|
||
|
|
||
|
Uma abordagem simples para implementar uma busca é realizar uma busca linear,
|
||
|
mas algoritmos nessa abordagem levam muito tempo, o qual cresce linearmente de
|
||
|
acordo com a quantidade ou número de dados. Por exemplo, iniciando do elemento
|
||
|
mais a esquerda de arr[] e um a um comparar x com cada elemento de arr[], se x
|
||
|
coincide com um elemento, retornar seu índice. Se x não coincide com nenhum dos
|
||
|
elementos, retornar -1.
|
||
|
|
||
|
```
|
||
|
Busca Linear: O (n) Tempo Linear
|
||
|
|
||
|
Busca Binária: O ( log(n) ) Tempo Logarítmico
|
||
|
|
||
|
```
|
||
|
```
|
||
|
def busca(arr, x):
|
||
|
|
||
|
for i in range(len(arr)):
|
||
|
|
||
|
if arr[i] == x:
|
||
|
return i
|
||
|
|
||
|
return -1
|
||
|
|
||
|
```
|
||
|
## Algoritmo de Busca Binária
|
||
|
|
||
|
O pré-requisito básico para que uma busca binária funcione é que os dados que se
|
||
|
desejam buscar devem estar ordenados (em qualquer ordem).
|
||
|
|
||
|
### Pseudocódigo
|
||
|
|
||
|
```
|
||
|
A ideia da busca binária é usar a informação de que o array está ordenado e
|
||
|
reduzir a complexidade de tempo para O(Log n). Nós basicamente ignoramos metade
|
||
|
dos elementos após uma comparação.
|
||
|
|
||
|
1) Compare x com o elemento do meio.
|
||
|
2) Se x coincide com o elemento do meio, retorne o índice do meio.
|
||
|
3) Senão Se x é maior que o elemento do meio, então x só pode estar no lado
|
||
|
direito do elemento do meio. Portanto nós pulamos para a metade direita.
|
||
|
4) Senão (x é menor) pulamos para a metade esquerda.
|
||
|
|
||
|
Essa é a ideia da implementação recursiva da busca binária.
|
||
|
|
||
|
```
|
||
|
|
||
|
### Considerações Finais
|
||
|
|
||
|
Existem outras formas de busca binária que são muito úteis.
|
||
|
|
||
|
## Recursos Online
|
||
|
|
||
|
* [GeeksforGeeks](http://www.geeksforgeeks.org/the-ubiquitous-binary-search-set-1/)
|
||
|
* [Topcoder Tutorial](https://www.topcoder.com/community/data-science/data-science-tutorials/binary-search/)
|