Un algorithme glouton construit une solution étape par étape, en choisissant toujours l'option qui semble la meilleure sur le moment - sans revenir sur ses choix passés. Pas de retour sur trace, pas d'anticipation.
Il fonctionne quand deux propriétés sont réunies :
Étant donné un ensemble d'activités avec des heures de début et de fin, sélectionnez le nombre maximum d'activités non chevauchantes.
Stratégie gloutonne : trier par heure de fin, toujours choisir l'activité qui se termine le plus tôt.
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
Pourquoi ça marche ? Choisir l'activité qui finit le plus tôt laisse le plus de place pour les activités suivantes.
On construit un code binaire préfixe optimal en fusionnant répétitivement les deux symboles de plus basse fréquence. C'est glouton : à chaque étape, on fusionne la paire la moins coûteuse. Le résultat est un arbre où les symboles fréquents reçoivent des codes courts.
Étant donné un tableau où nums[i] est la longueur maximale du saut depuis l'index i, déterminez si vous pouvez atteindre le dernier index.
Approche gloutonne : suivre l'index le plus loin atteignable. Parcourir de gauche à droite - si on reste bloqué, retourner false.
def can_jump(nums):
farthest = 0
for i, jump in enumerate(nums):
if i > farthest:
return False
farthest = max(farthest, i + jump)
return True
Sign in to join the discussion
Dans le Jump Game, que représente la variable gloutonne 'farthest' ?
Parcourir un circuit avec des stations-service. À la station i, on gagne gas[i] de carburant et on dépense cost[i] pour atteindre la station suivante. Trouvez la station de départ qui permet de boucler le circuit, ou retournez −1.
Intuition gloutonne : si le total de carburant ≥ le coût total, une solution existe. On suit un surplus cumulé ; dès qu'il passe en négatif, la réponse doit commencer après ce point.
Planifier des tâches avec un délai de refroidissement de n entre les tâches identiques. Glouton : toujours choisir la tâche restante la plus fréquente.
Tasks: A A A B B C, cooldown = 2
Schedule: A B C A B _ A
Total = 7
Sac à dos fractionnaire : on peut prendre des fractions d'objets. L'approche gloutonne fonctionne - trier par ratio valeur/poids, prendre le meilleur ratio d'abord.
Sac à dos 0/1 : les objets sont tout-ou-rien. L'approche gloutonne échoue car ignorer un objet lourd mais précieux peut être pire que d'en prendre deux plus légers. Il faut la programmation dynamique.
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!
Pourquoi l'approche gloutonne échoue-t-elle pour le sac à dos 0/1 ?
✅ Fonctionne quand on peut prouver la propriété de choix glouton :
❌ Échoue quand les optima locaux ne composent pas un optimum global :
La technique standard : supposer une solution optimale qui n'utilise pas le choix glouton. Montrer qu'on peut échanger un de ses choix contre le choix glouton sans dégrader la solution. Cela prouve que le glouton est au moins aussi bon.
À quoi sert l'argument d'échange ?
| Aspect | Glouton | Programmation dynamique | |--------|---------|-------------------------| | Choix | Un meilleur choix par étape | Explorer tous les sous-problèmes | | Revient en arrière ? | Jamais | Oui - stocke les sous-résultats | | Vitesse | Généralement plus rapide | Dépend de l'espace d'états | | Correction | Seulement si prouvable | Toujours (si bien formulé) |
En cas de doute, commencez par le glouton - si vous ne pouvez pas prouver que ça marche, passez à la programmation dynamique.