4.1 Comparação de Complexidade Temporal entre Busca Linear e Binária
Vamos comparar a complexidade temporal entre a busca linear e a busca binária.
Busca Linear:
- Complexidade Temporal:
O(n), ondené o número de elementos no array ou lista. - Melhor caso:
O(1)— elemento encontrado na primeira posição. - Caso médio:
O(n/2) = O(n)— elemento encontrado em média na metade. - Pior caso:
O(n)— elemento encontrado na última posição ou ausente.
Busca Binária:
- Complexidade Temporal:
O(log n), ondené o número de elementos no array ou lista. - Melhor caso:
O(1)— elemento encontrado no primeiro passo (elemento médio). - Caso médio:
O(log n)— busca em array ordenado. - Pior caso:
O(log n)— elemento encontrado no último passo ou ausente.
Exemplo de Análise de Complexidade Temporal
Busca Linear:
- Array
[1, 3, 5, 7, 9, 11, 13], elemento procurado 7. - Verificando cada elemento até encontrar 7 no índice 3.
- Foram necessárias 4 verificações, correspondendo a
O(n).
Busca Binária:
- Array
[1, 3, 5, 7, 9, 11, 13], elemento procurado7. - Elemento médio (7) encontrado no primeiro passo.
- Foi necessária 1 verificação, correspondendo a
O(log n).
4.2 Vantagens e Desvantagens de Cada Método
Vamos ver as vantagens e desvantagens de cada tipo de busca.
Busca Linear:
Vantagens:
- Simplicidade de implementação: Busca linear é muito fácil de implementar e entender.
- Sem requisitos de dados: Busca linear pode ser aplicada a dados não ordenados.
- Adequado para pequenos arrays: Busca linear é eficiente para arrays de tamanho pequeno.
Desvantagens:
- Baixa eficiência para grandes arrays: A complexidade temporal
O(n)a torna ineficiente para grandes arrays. - Tempo de execução prolongado: Para grandes arrays, a busca linear pode demorar, especialmente se o elemento procurado estiver próximo ao final do array ou ausente.
Busca Binária:
Vantagens:
- Alta eficiência para grandes arrays: A complexidade temporal
O(log n)a torna muito eficiente para grandes arrays. - Execução rápida: Busca binária é significativamente mais rápida que a busca linear ao lidar com grandes arrays ordenados.
Desvantagens:
- Requer dados ordenados: A busca binária só funciona com arrays ordenados, o que pode exigir tempo extra para ordenação prévia.
- Complexidade de implementação: Implementar a busca binária é mais complicado comparado à busca linear.
4.3 Quando Usar Cada Tipo de Busca
Vamos ver quando usar a busca linear e quando usar a busca binária.
Busca Linear.
Use busca linear quando:
- O array ou lista não estão ordenados.
- O tamanho do array ou lista é pequeno.
- É necessária simplicidade e uma solução rápida sem custos adicionais para ordenação.
- Precisa encontrar a primeira ocorrência ou todas as ocorrências de um elemento.
- Os dados chegam em tempo real, e a ordenação prévia não é possível ou não é prática.
Busca Binária.
Use busca binária se:
- O array ou lista estão ordenados.
- O tamanho do array ou lista é grande.
- Busca frequente de elementos no mesmo conjunto de dados (pode-se ordenar dados previamente uma vez).
- Alta velocidade de busca é importante.
- É aceitável gastar tempo na ordenação prévia dos dados.
4.4 Exemplos de Tarefas para Busca Linear
1. Busca em Lista Não Ordenada
É necessário encontrar o índice de um número específico em uma lista de números não ordenada.
Exemplo:
def linear_search(arr, target):
for index, element in enumerate(arr):
if element == target:
return index
return -1
arr = [4, 2, 7, 1, 9, 3]
target = 7
print(linear_search(arr, target)) # Saída: 2
2. Busca da Primeira Ocorrência no Array
É necessário encontrar a primeira ocorrência de um elemento específico em uma lista de strings.
Exemplo:
def linear_search(arr, target):
for index, element in enumerate(arr):
if element == target:
return index
return -1
words = ["apple", "banana", "cherry", "date", "banana"]
target = "banana"
print(linear_search(words, target)) # Saída: 1
3. Busca em Dados em Tempo Real
Encontrar um elemento em um fluxo de dados recebidos em tempo real.
Exemplo:
import random
def find_in_stream(stream, target):
for index, element in enumerate(stream):
if element == target:
return index
return -1
stream = [random.randint(1, 100) for _ in range(100)]
target = 50
print(find_in_stream(stream, target))
4.5 Exemplos de Tarefas para Busca Binária
1. Busca em Array Ordenado
É necessário encontrar o índice de um número específico em um array de números ordenado.
Exemplo:
def binary_search(arr, target):
left, right = 0, len(arr) - 1
while left <= right:
mid = (left + right) // 2
if arr[mid] == target:
return mid
elif arr[mid] < target:
left = mid + 1
else:
right = mid - 1
return -1
sorted_array = [1, 3, 5, 7, 9, 11, 13]
target = 7
print(binary_search(sorted_array, target)) # Saída: 3
2. Busca Frequente em Grande Conjunto de Dados
Buscar frequentemente elementos em um grande array de números ordenado.
Exemplo:
import random
sorted_large_array = sorted([random.randint(1, 1000000) for _ in range(1000000)])
target = random.choice(sorted_large_array)
print(binary_search(sorted_large_array, target))
3. Busca de Elemento em Base de Dados Ordenada
Encontrar um registro em uma base de dados ordenada por um campo chave.
Exemplo:
database = sorted([{"id": i, "value": f"record_{i}"} for i in range(100000)])
def binary_search_db(db, target_id):
left, right = 0, len(db) - 1
while left <= right:
mid = (left + right) // 2
if db[mid]["id"] == target_id:
return db[mid]
elif db[mid]["id"] < target_id:
left = mid + 1
else:
right = mid - 1
return None
target_id = 54321
print(binary_search_db(database, target_id))
GO TO FULL VERSION