O que é um algoritmo?
Algoritmos estão em todo lugar
Um algoritmo é uma sequência precisa e finita de passos bem definidos que resolve um problema específico ou executa uma tarefa específica.
Você já usa algoritmos todos os dias sem chamá-los assim:
- Uma receita é um algoritmo: ingredientes (entrada), passos (processo), prato (saída)
- Direções para dirigir são um algoritmo: ponto de partida, instruções curva a curva, destino
- Procurar uma palavra em um dicionário físico: abrir no meio, comparar, ir para esquerda ou direita: isso é busca binária!
Um algoritmo não é código. Código é meramente uma forma de expressar um algoritmo.
As três propriedades
Para algo se qualificar como algoritmo, deve ter três propriedades:
1. Finitude
Deve terminar após um número finito de passos. Um loop infinito não é um algoritmo: é um bug.
# Isso NÃO é um algoritmo — nunca para
ENQUANTO verdadeiro
IMPRIMIR "olá"
FIM ENQUANTO
# Isso É um algoritmo — para após 5 iterações
contador ← 0
ENQUANTO contador < 5
IMPRIMIR "olá"
contador ← contador + 1
FIM ENQUANTO
2. Definitude
Cada passo deve ser não ambíguo. Deve haver uma interpretação.
# RUIM: ambíguo
"Adicione um pouco de sal" → Quanto é "um pouco"?
# BOM: definido
"Adicione 5 gramas de sal" → Exatamente uma interpretação
3. Efetividade
Cada passo deve ser executável: algo que pode ser realizado.
# RUIM: não efetivo
"Encontre o sentido da vida" → Não pode ser computado
# BOM: efetivo
"Encontre o maior número no array" → Claro, executável
Entrada, processo, saída
Todo algoritmo segue a mesma estrutura fundamental:
flowchart LR
I["Entrada<br/>(dados)"] --> P["Processo<br/>(passos)"] --> O["Saída<br/>(resultado)"]
Exemplo: encontrar o valor máximo
- Entrada: Uma lista de números
[42, 17, 93, 5, 68] - Processo: Comparar cada número, rastrear o maior visto até agora
- Saída:
93
FUNÇÃO encontrar_max(numeros)
max ← primeiro elemento de numeros
PARA CADA numero EM numeros
SE numero > max
max ← numero
FIM SE
FIM PARA
RETORNAR max
FIM FUNÇÃO
Este algoritmo tem todas as três propriedades:
- Finito: Processa cada elemento uma vez, depois para
- Definido: Cada comparação tem um resultado claro
- Efetivo: Comparar dois números é uma operação básica que qualquer computador pode fazer
Algoritmos no Rails
Rails está cheio de algoritmos trabalhando nos bastidores:
| Operação | Algoritmo em Ação |
|---|---|
User.find(42) |
Algoritmo de busca (lookup por índice) |
Course.order(:position) |
Algoritmo de ordenação (sort do banco) |
params.permit(:name, :email) |
Algoritmo de filtragem (whitelist) |
has_secure_password |
Algoritmo de hashing (bcrypt) |
| Correspondência de rotas | Algoritmo de pattern matching |
Quando você escreve User.find(42), o PostgreSQL usa um índice B-tree para localizar o registro: um algoritmo de busca sofisticado que encontra qualquer registro entre milhões em apenas alguns passos.
Por que estudar algoritmos?
Você pode pensar: "Rails faz tudo por mim: por que aprender algoritmos?"
Porque entender algoritmos ajuda você a:
- Escolher a abordagem certa: Devo usar
findouwhere?eachoufind_each? A resposta depende do algoritmo subjacente. - Debugar problemas de performance: "Por que esta página está lenta?" frequentemente se resume a um algoritmo O(n²) escondido no seu código.
- Projetar features melhores: Motores de recomendação, funcionalidades de busca e sistemas de ranking todos requerem pensamento algorítmico.
- Passar em entrevistas técnicas: Muitas entrevistas para vagas Rails incluem perguntas sobre algoritmos.
Algoritmos vs. heurísticas
Nem todo problema tem um algoritmo que garante a resposta perfeita:
| Algoritmo | Heurística | |
|---|---|---|
| Garantia | Sempre correto | Geralmente bom o suficiente |
| Velocidade | Pode ser lento para resultados perfeitos | Rápido, troca precisão por velocidade |
| Exemplo | Verificar toda rota para achar a mais curta | "Sempre vá em direção ao destino" |
| Exemplo Rails | Course.order(:position) |
"Mostrar mais populares primeiro" (aproximação) |
Saber quando você precisa de um algoritmo preciso vs. uma heurística boa o suficiente é uma habilidade profissional.
Resumo
| Conceito | Definição |
|---|---|
| Algoritmo | Sequência finita, definida e efetiva de passos |
| Finitude | Deve terminar |
| Definitude | Cada passo é não ambíguo |
| Efetividade | Cada passo é executável |
| Estrutura | Entrada → Processo → Saída |
| Heurística | Um atalho "bom o suficiente" quando respostas perfeitas são muito caras |
Continue com a aula 2
Fundamentos de pseudocódigo
Apresenta convenções de pseudocódigo, a anatomia de uma função, quatro padrões comuns e uma tabela de tradução para Ruby.
Com uma conta grátis você também tem os quizzes, seu progresso e suas anotações, e a discussão.