Ciências da computação dia 174

Algoritmos de busca: pesquisa linear e binária

Durante nossa aula de hoje, exploramos dois algoritmos fundamentais para a busca de elementos em listas: a busca linear e a busca binária. Embora simples, esses algoritmos são a base para estruturas de dados mais complexas e são frequentemente cobrados em entrevistas técnicas e provas de ciência da computação.

1. O que é busca?

Busca é o processo de localizar um elemento específico dentro de um conjunto de dados. O conjunto pode ser um array, uma lista ligada, um arquivo ou qualquer outra estrutura. A eficiência da busca depende do algoritmo escolhido e da organização dos dados.

2. Busca Linear

A busca linear (ou busca sequencial) percorre cada elemento da lista até encontrar o alvo ou chegar ao final. É o algoritmo mais simples, e não requer que a lista esteja ordenada.

def busca_linear(lista, alvo):
    for i in range(len(lista)):
        if lista[i] == alvo:
            return i
    return -1

Análise de complexidade: No melhor caso (alvo é o primeiro elemento), a complexidade é O(1). Nos casos médio e pior (alvo não está na lista), é O(n), onde n é o número de elementos.

3. Busca Binária

A busca binária é muito mais eficiente, mas exige que a lista esteja ordenada. O algoritmo divide repetidamente a lista ao meio, comparando o alvo com o elemento central.

def busca_binaria(lista, alvo):
    esquerda, direita = 0, len(lista) - 1
    while esquerda <= direita:
        meio = (esquerda + direita) // 2
        if lista[meio] == alvo:
            return meio
        elif lista[meio] >< alvo:
            esquerda = meio + 1
        else:
            direita = meio - 1
    return -1
>

Análise de complexidade: Em cada iteração, o espaço de busca é reduzido à metade. Portanto, a complexidade é O(log n) tanto no caso médio quanto no pior caso. O melhor caso (alvo é o elemento central) é O(1).

4. Comparação de Desempenho

A tabela abaixo resume as complexidades:

AlgoritmoMelhor CasoCaso MédioPior Caso
Busca LinearO(1)O(n)O(n)
Busca BináriaO(1)O(log n)O(log n)

Para listas pequenas (n < 100), a diferença pode ser imperceptível. Porém, em listas grandes, a busca binária é exponencialmente mais rápida.

5. Vantagens e Desvantagens

  • Busca Linear: Simples, funciona com dados não ordenados, mas lenta para listas grandes.
  • Busca Binária: Muito rápida, mas exige ordenação prévia e acesso aleatório à lista.

6. Exemplo Prático

Vamos testar os algoritmos com uma lista de números:

numeros = [1, 3, 5, 7, 9, 11, 13, 15]
print(busca_linear(numeros, 7))   # 3
print(busca_binaria(numeros, 7))  # 3
print(busca_linear(numeros, 2))   # -1
print(busca_binaria(numeros, 2))  # -1

Ambos retornam o mesmo resultado, mas a busca binária é muito mais rápida para listas grandes.

7. Conclusão

Nesta aula, vimos que a escolha do algoritmo de busca depende do contexto. Se os dados estão desordenados, a busca linear é a única opção. Se estão ordenados e o acesso é indexado, a busca binária é preferível. Entender essas diferenças é fundamental para escrever programas eficientes.

Perguntas Frequentes

O que é necessário para a busca binária funcionar?

A lista deve estar ordenada e permitir acesso direto aos elementos (como arrays).

Qual a complexidade da busca linear no pior caso?

O(n), onde n é o tamanho da lista. Ocorre quando o alvo não está presente ou está no último elemento.

A busca binária pode ser usada em listas ligadas?

Não diretamente, pois listas ligadas não oferecem acesso aleatório em O(1). A busca binária perderia eficiência e poderia se tornar O(n log n) ou pior.

Para mais conteúdos como este, visite a página de Posts ou navegue pelas Tags do blog.