AIUnlimited
🌳

Fundamentos de IA

🌱
AI Seeds

Comece do zero

🌿
AI Sprouts

Construa bases

🌳
AI Branches

Aplique na prática

🏕️
AI Canopy

Aprofunde-se

🌲
AI Forest

Domine a IA

🔨

Mestria em IA

✏️
AI Sketch

Comece do zero

🪨
AI Chisel

Construa bases

⚒️
AI Craft

Aplique na prática

💎
AI Polish

Aprofunde-se

🏆
AI Masterpiece

Domine a IA

📘

Prática de IA

📖
Entendendo modelos open-source

Fundamentos e recursos para modelos open-source

🎯
Do problema à tarefa do modelo

Convertendo problemas de negócio em tarefas de modelo

⚡
Executando seu primeiro modelo

Veja seus primeiros resultados em 30 minutos

🔧
Fine-tuning e avaliação

Ajuste modelos e avalie o desempenho

🚀
Sistemas de aplicação

Construa aplicações IA do mundo real

🎨
IA generativa

Explore modelos AIGC open-source

🤖
Agentes

Aprenda frameworks Agent e ferramentas MCP

📐
Fundamentos complementares

Fundamentos LLM e avaliação

🎓

Claude Academia

🤖
Claude 101

Learn AI basics with Claude

💻
Claude Code 101

Code with Claude as your pair programmer

🤝
Introduction to Claude Cowork

Collaborate with Claude on complex projects

⚙️
Claude Platform 101

Build apps with the Claude API

Laboratório

7 experimentos carregados
🧬Sandbox de Rede Neural🤖IA ou Humano?🥋Dojo de Prompt Engineering🏁Corrida de Algoritmos🧠Trivia de IA🏗️Tela de design de sistemas
🎯Entrevista simuladaEntrar no Laboratório→
🚀

Desenvolvimento de carreira

🚀
Plataforma de Lançamento de Entrevistas

Comece sua jornada

🌟
Domínio Comportamental

Domine habilidades interpessoais

💻
Entrevistas Técnicas

Passe na rodada de programação

🤖
Entrevistas de IA e ML

Domínio em entrevistas de ML

🏆
Oferta e Além

Conquiste a melhor oferta

Começar
AIUnlimited

Licença MIT

沪ICP备18025655号-11

Aprender

  • Fundamentos de IA
  • Prática de IA
  • Claude Academia
  • Laboratório
  • Desenvolvimento de carreira

Comunidade

  • Sobre
  • Perguntas Frequentes

Suporte

  • Termos de Serviço
  • Política de Privacidade
  • Contato
Acadêmicos de IA e Engenharia›✏️ AI Sketch›Aulas›Algoritmos Gulosos
🏃
AI Sketch • Intermediário⏱️ 17 min de leitura

Algoritmos Gulosos

O que torna um algoritmo ganancioso?

Um algoritmo ganancioso constrói uma solução um passo de cada vez, sempre escolhendo a opção que parece melhor agora - sem reconsiderar escolhas anteriores. Sem retrocesso, sem olhar para frente.

Funciona quando duas propriedades são válidas:

  1. Propriedade de escolha gananciosa - uma escolha localmente ótima leva a uma solução globalmente ótima.
  2. Subestrutura ótima - o problema restante após cada escolha é uma instância menor do mesmo problema.

Seleção de atividades - o exemplo clássico

Dado um conjunto de atividades com horários de início e término, selecione o número máximo de atividades não sobrepostas.

Estratégia gananciosa: classifique por horário de término, sempre escolha a atividade que termina mais cedo.

def max_activities(intervals):
    intervals.sort(key=lambda x: x[1])
    count, end = 0, 0
    for s, e in intervals:
        if s >= end:
            count += 1
            end = e
    return count

Por que isso funciona? Escolher a atividade que termina mais cedo deixa mais espaço para atividades futuras. Nenhuma outra escolha pode fazer melhor.

Linha do tempo mostrando a seleção de atividades por horário de término mais próximo
A seleção pelo horário de término mais próximo maximiza o número de atividades não sobrepostas.

Codificação Huffman - Conceito

Crie um código binário ideal sem prefixo mesclando repetidamente os dois símbolos de frequência mais baixa. Isso é ganancioso: a cada passo, junte o par mais barato. O resultado é uma árvore onde símbolos frequentes recebem códigos curtos.

🤯
A codificação Huffman é usada na compactação JPEG, MP3 e ZIP. David Huffman inventou-o quando era estudante em 1952 - era um trabalho de casa!

Jogo de salto

Dado um array onde nums[i] é o comprimento máximo do salto do índice i, determine se você pode alcançar o último índice.

Abordagem gananciosa: rastreie o índice mais distante acessível até o momento. Digitalize da esquerda para a direita - se você ficar para trás, retorne falso.

def can_jump(nums):
    farthest = 0
    for i, jump in enumerate(nums):
        if i > farthest:
            return False
        farthest = max(farthest, i + jump)
    return True
Aula 9 de 100% concluído
←Recursão e Backtracking

Discussão

Entrar participar da discussão

🧠Verificação Rápida

No Jump Game, o que representa a variável gananciosa 'mais distante'?

Posto de gasolina

Percorra uma rota circular com postos de gasolina. Na estação i você ganha gas[i] de combustível e gasta cost[i] para chegar à próxima estação. Encontre a estação inicial que permite completar o circuito ou retorne −1.

Insight ganancioso: se o gás total ≥ custo total, existe uma solução. Acompanhe um excedente corrente; sempre que cair abaixo de zero, a resposta deve começar após esse ponto.

Agendador de tarefas

Agende tarefas com um tempo de espera de n entre tarefas idênticas. Ganancioso: escolha sempre a tarefa restante mais frequente. A resposta depende da frequência máxima e de quantas tarefas a compartilham.

Tasks: A A A B B C, cooldown = 2
Schedule: A B C A B _ A
Total = 7
🤔
Think about it:No agendador de tarefas, por que escolher a tarefa mais frequente primeiro minimiza os slots ociosos? O que daria errado se você escolhesse primeiro o menos frequente?

Mochila Fracionária vs Mochila 0/1

Mochila fracionária: você pode levar frações de itens. Ganancioso funciona - classifique por valor por peso, escolha primeiro a melhor proporção.

0/1 mochila: os itens são tudo ou nada. Ganancioso ** falha ** aqui porque pular um item pesado, mas valioso, pode ser pior do que pegar dois itens mais leves. Isso requer programação dinâmica.

Items: (weight=3, value=4), (weight=2, value=3), (weight=2, value=3)
Capacity: 4

Greedy (best ratio first): takes item 1 (w=3, v=4) → 1 remaining → can't fit rest → value = 4
Optimal: takes items 2+3 (w=4, v=6) → value = 6 ✗ Greedy fails!
🧠Verificação Rápida

Por que a abordagem gananciosa falha no problema da mochila 0/1?

Quando o ganancioso funciona?

✅ Funciona quando você pode provar a propriedade da escolha gananciosa:

  • Programação de intervalo, codificação Huffman, árvores geradoras mínimas, algoritmo de Dijkstra, troca de moedas com denominações padrão

❌ Falha quando os ótimos locais não se compõem nos ótimos globais:

  • Mochila 0/1, caminho mais longo em gráficos gerais, caixeiro viajante

Provando correção gananciosa - argumento de troca

A técnica padrão: assuma uma solução ótima que não use a escolha gananciosa. Mostre que você pode trocar uma de suas escolhas pela escolha gananciosa sem piorar a solução. Isso prova que ganancioso é pelo menos tão bom.

🧠Verificação Rápida

Para que é usado o 'argumento de troca'?

Programação gananciosa vs dinâmica

| Aspecto | Ganancioso | Programação Dinâmica | |--------|--------|---------------------| | Escolhas | Uma melhor escolha por etapa | Explore todos os subproblemas | | Revisita o passado? | Nunca | Sim - armazena subresultados | | Velocidade | Geralmente mais rápido | Depende do espaço de estados | | Correção | Somente se for provável | Sempre (se formulado corretamente) |

Em caso de dúvida, comece ganancioso - se não conseguir provar que funciona, mude para DP.

🤯
O algoritmo de caminho mais curto de Dijkstra é ganancioso – ele sempre processa o nó não visitado mais próximo. Funciona porque os pesos das arestas não são negativos, garantindo que a escolha gananciosa seja segura.
🤔
Think about it:Você recebe denominações de moedas [1, 3, 4] e precisa fazer troco por 6. A abordagem gananciosa escolhe 4+1+1=3 moedas, mas o ideal é 3+3=2 moedas. E essas denominações quebram a propriedade da escolha gananciosa?

📚 Leitura adicional

  • NeetCode - Playlist gananciosa - problemas gananciosos selecionados com explicações
  • Manual de entrevista técnica - Ganancioso - quando usar padrões gananciosos e comuns
  • Algoritmos CP - Algoritmos gananciosos - teoria e provas mais profundas