Algoritmos de busca linear e busca binária
Problema da busca em vetores
Dada uma lista
: são os índices da lista; : são os valores da lista; é a posição do elemento o qual queremos buscar.
Na linguagem C, existem bibliotecas que possuem funções prontas para buscar elementos em um vetor tais como, lsearch
, ifind
e bsearch
.
Busca linear
A busca linear, também chamada de busca sequencial, consistem no seguinte algoritmo:
- Para cada posição do vetor, verifica-se se ela contém o elemento a ser buscado. Caso seja verdadeiro, devolve-se a posição do elemento.
- Se após percorrer todo o vetor e não for encontrado o elemento, devolve-se um resposta de que o vetor não contém esse elemento, geralmente é retornado
-1
.
Exemplo
Suponha o seguinte vetor abaixo e considere que queremos buscar o elemento 6. Agora, vamos executar o algoritmo da busca linear para encontrar esse elemento. Então vamos percorrer todos os elementos do vetor até encontrar o elemento 6 e então retornar a sua posição.
Exemplo em C
#include <stdio.h>
int linear_search(int array[], int size, int element) {
for (int i = 0; i < size; i++) {
if (array[i] == element) {
return i;
}
}
return -1;
}
Busca binária
Quando a lista está ordenada e não contém elementos repetidos, é possível utilizar uma técnica de divisão e conquista chamada de busca binária. Ela consiste no seguinte algoritmo:
- Calcular o índice médio e verificar o valor da lista nesta posição.
- Se o elemento procurado for igual ao valor do meio da lista, então a resposta foi encontrada.
- Se o elemento procurado for menor que o valor do meio da lista, então, é repetido o procedimento na primeira metade da lista
- Se o elemento procurado for maior que o valor do meio da lista, então, é repetido o procedimento na segunda metade da lista
- Caso uma das listas a ser verificada for vazia, então o elemento não foi encontrado.
Exemplo
Suponha a lista abaixo no qual queremos buscar o elemento 7 usando o algoritmo de busca binária. A partir dessa lista, vamos aplicar o algoritmo de busca binária para encontrar o elemento 7.
Exemplo em C
int binary_search(int arr[], int l, int r, int x)
{
while (l <= r) {
int m = l + (r - l) / 2;
// Check if x is present at mid
if (arr[m] == x)
return m;
// If x greater, ignore left half
if (arr[m] < x)
l = m + 1;
// If x is smaller, ignore right half
else
r = m - 1;
}
// If we reach here, then element was not present
return -1;
}