Mudanças entre as edições de "Algoritmos e estrutura de dados"
| Linha 30: | Linha 30: | ||
- Dica: | - Dica: | ||
* Fazer uma busca binária em uma lista ligada é ineficiente | * Fazer uma busca binária em uma lista ligada é ineficiente | ||
| + | |||
| + | =Algoritmos de Busca= | ||
| + | |||
| + | Os '''Algoritmos de Busca''' são métodos usados para verificar se uma dada informação (<code>x</code>) ocorre em uma sequência (<code>seq</code>). O objetivo é implementar a lógica por trás de operações comuns em [[Python]], como o operador <code>in</code> (<code>x in seq</code>) ou o método <code>.index()</code>. | ||
| + | |||
| + | Existem duas estratégias principais: a busca sequencial e a busca binária. | ||
| + | |||
| + | = Busca Sequencial = | ||
| + | |||
| + | * '''Definição:''' Também conhecida como busca linear, é o método de busca mais simples. | ||
| + | * '''Estratégia:''' Percorre a lista elemento por elemento, do índice <code>0</code> até o final (<code>len(seq) - 1</code>), comparando cada item <code>seq[i]</code> com <code>x</code>. | ||
| + | * '''Desvantagem:''' É ineficiente para listas grandes. No pior caso (quando <code>x</code> não está na lista), o algoritmo precisa varrer ''toda'' a sequência. | ||
| + | ==== Código Exemplo (Busca Sequencial) ==== | ||
| + | <syntaxhighlight lang="python"> | ||
| + | def busca_sequencial(x, seq): | ||
| + | '''(float, list) -> bool | ||
| + | Retorna True se x ocorre na lista, ou False caso contrário. | ||
| + | ''' | ||
| + | for i in range(len(seq)): | ||
| + | if seq[i] == x: | ||
| + | return True | ||
| + | return False | ||
| + | </syntaxhighlight> | ||
| + | |||
| + | === Busca Binária === | ||
| + | |||
| + | * '''Definição:''' Um algoritmo de busca muito mais eficiente, que "corta" o problema pela metade a cada passo. | ||
| + | * '''Pré-requisito:''' A sequência '''OBRIGATORIAMENTE''' precisa estar '''ordenada''' (ex: do menor para o maior). | ||
| + | * '''Estratégia (Método do Dicionário):''' | ||
| + | # Considere o elemento <code>M</code> no '''meio''' da lista. | ||
| + | # Se <code>x == M</code>, o elemento foi encontrado. | ||
| + | # Se <code>x < M</code>, o elemento (se existir) só pode estar na primeira metade. A segunda metade é descartada. | ||
| + | # Se <code>x > M</code>, o elemento (se existir) só pode estar na segunda metade. A primeira metade é descartada. | ||
| + | # O processo é repetido na metade restante, cortando a área de busca repetidamente. | ||
| + | |||
| + | * '''Vantagem (Eficiência):''' É extremamente rápido. Em uma lista com 1024 elementos, a busca sequencial faria 1024 testes no pior caso. A busca binária faria no máximo 10 testes (pois log<sub>2</sub>(1024) = 10). | ||
| + | |||
| + | ==== Código Exemplo (Busca Binária) ==== | ||
| + | <syntaxhighlight lang="python"> | ||
| + | def busca_binaria(x, seq): | ||
| + | ''' (float, list) -> int ou None | ||
| + | Retorna a posição (índice) em que x ocorre na lista ORDENADA, | ||
| + | ou None caso contrário. | ||
| + | ''' | ||
| + | inicio = 0 | ||
| + | fim = len(seq) - 1 | ||
| + | |||
| + | while inicio <= fim: | ||
| + | meio = (inicio + fim) // 2 # Divisão inteira para achar o índice do meio | ||
| + | |||
| + | if seq[meio] == x: | ||
| + | return meio # ACHOU! Retorna a posição. | ||
| + | elif seq[meio] > x: | ||
| + | # x é menor, joga fora a metade da direita | ||
| + | fim = meio - 1 | ||
| + | else: # seq[meio] < x | ||
| + | # x é maior, joga fora a metade da esquerda | ||
| + | inicio = meio + 1 | ||
| + | |||
| + | return None # O loop terminou (inicio > fim) e não achou. | ||
| + | </syntaxhighlight> | ||
=Referências Interessantes= | =Referências Interessantes= | ||
Edição das 11h10min de 3 de novembro de 2025
Um algoritmo é uma receita, ou seja, uma sequência finita de passos lógicos e bem definidos, criada para resolver um problema específico ou executar uma tarefa.
• Análise (Eficiência): A "qualidade" de um algoritmo é medida por sua complexidade:
Complexidade de Tempo: Quão rápido o algoritmo executa (quantos passos ele leva) à medida que a quantidade de dados aumenta.
Complexidade de Espaço: Quanta memória o algoritmo consome para rodar.
Estruturas de dados são formas sistemáticas de organizar, armazenar e gerenciar dados no computador, para que possam ser acessados e modificados de forma eficiente. Alguns exemplos:
Tipos Principais (Lineares):
- Array (Vetor/Lista): Uma coleção de itens armazenados em locais de memória contíguos. Ótimo para acesso rápido pelo índice (ex: lista[5]).
- Lista Ligada (Linked List): Uma coleção de itens onde cada um "aponta" para o próximo. Ótimo para inserir e remover itens no meio da lista.
- Pilha (Stack): Segue a regra "Último a Entrar, Primeiro a Sair" (LIFO - Last In, First Out). Pense em uma pilha de pratos.
- Fila (Queue): Segue a regra "Primeiro a Entrar, Primeiro a Sair" (FIFO - First In, First Out). Pense em uma fila de banco.
Tipos Principais (Não-Lineares):
- Árvores (Trees): Estrutura hierárquica. Ótima para buscas rápidas (ex: Árvore Binária de Busca) ou para representar hierarquias (ex: pastas de arquivos).
- Grafos (Graphs): Estrutura que representa conexões (redes). Usado para mapas (GPS), redes sociais, etc.
- Dica:
- Fazer uma busca binária em uma lista ligada é ineficiente
Índice
Algoritmos de Busca
Os Algoritmos de Busca são métodos usados para verificar se uma dada informação (x) ocorre em uma sequência (seq). O objetivo é implementar a lógica por trás de operações comuns em Python, como o operador in (x in seq) ou o método .index().
Existem duas estratégias principais: a busca sequencial e a busca binária.
Busca Sequencial
- Definição: Também conhecida como busca linear, é o método de busca mais simples.
- Estratégia: Percorre a lista elemento por elemento, do índice
0até o final (len(seq) - 1), comparando cada itemseq[i]comx. - Desvantagem: É ineficiente para listas grandes. No pior caso (quando
xnão está na lista), o algoritmo precisa varrer toda a sequência.
Código Exemplo (Busca Sequencial)
<syntaxhighlight lang="python"> def busca_sequencial(x, seq):
(float, list) -> bool
Retorna True se x ocorre na lista, ou False caso contrário.
for i in range(len(seq)):
if seq[i] == x:
return True
return False
</syntaxhighlight>
Busca Binária
- Definição: Um algoritmo de busca muito mais eficiente, que "corta" o problema pela metade a cada passo.
- Pré-requisito: A sequência OBRIGATORIAMENTE precisa estar ordenada (ex: do menor para o maior).
- Estratégia (Método do Dicionário):
- Considere o elemento
Mno meio da lista. - Se
x == M, o elemento foi encontrado. - Se
x < M, o elemento (se existir) só pode estar na primeira metade. A segunda metade é descartada. - Se
x > M, o elemento (se existir) só pode estar na segunda metade. A primeira metade é descartada. - O processo é repetido na metade restante, cortando a área de busca repetidamente.
- Vantagem (Eficiência): É extremamente rápido. Em uma lista com 1024 elementos, a busca sequencial faria 1024 testes no pior caso. A busca binária faria no máximo 10 testes (pois log2(1024) = 10).
Código Exemplo (Busca Binária)
<syntaxhighlight lang="python"> def busca_binaria(x, seq):
(float, list) -> int ou None
Retorna a posição (índice) em que x ocorre na lista ORDENADA,
ou None caso contrário.
inicio = 0
fim = len(seq) - 1
while inicio <= fim:
meio = (inicio + fim) // 2 # Divisão inteira para achar o índice do meio
if seq[meio] == x:
return meio # ACHOU! Retorna a posição.
elif seq[meio] > x:
# x é menor, joga fora a metade da direita
fim = meio - 1
else: # seq[meio] < x
# x é maior, joga fora a metade da esquerda
inicio = meio + 1
return None # O loop terminou (inicio > fim) e não achou.
</syntaxhighlight>