Ein gieriger Algorithmus erstellt Schritt für Schritt eine Lösung und wählt immer die Option aus, die im Moment am besten aussieht – ohne frühere Entscheidungen zu überdenken. Kein Zurückweichen, kein Blick nach vorne.
Es funktioniert, wenn zwei Eigenschaften gelten:
Wählen Sie anhand einer Reihe von Aktivitäten mit Start- und Endzeiten die maximale Anzahl sich nicht überschneidender Aktivitäten aus.
Gierige Strategie: Sortieren Sie nach Endzeit und wählen Sie immer die Aktivität aus, die am frühesten endet.
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
Warum funktioniert das? Die Auswahl der Aktivität, die am frühesten abgeschlossen wird, lässt den meisten Spielraum für zukünftige Aktivitäten. Keine andere Wahl kann es besser machen.
Erstellen Sie einen optimalen präfixfreien Binärcode, indem Sie die zwei Symbole mit der niedrigsten Häufigkeit wiederholt zusammenführen. Das ist gierig: Bei jedem Schritt wird das günstigste Paar zusammengeführt. Das Ergebnis ist ein Baum, in dem häufige Symbole Kurzcodes erhalten.
Bestimmen Sie anhand eines Arrays, bei dem nums[i] die maximale Sprunglänge vom Index i ist, ob Sie den letzten Index erreichen können.
Gieriger Ansatz: Verfolgen Sie den bisher am weitesten entfernten Index. Von links nach rechts scannen – wenn Sie jemals ins Hintertreffen geraten, geben Sie „false“ zurück.
Anmelden an der Diskussion teilnehmen
def can_jump(nums):
farthest = 0
for i, jump in enumerate(nums):
if i > farthest:
return False
farthest = max(farthest, i + jump)
return True
Was stellt im Sprungspiel die gierige Variable „am weitesten” dar?
Fahren Sie einen Rundweg mit Tankstellen. An der Station i erhältst du gas[i] Treibstoff und gibst cost[i] aus, um die nächste Station zu erreichen. Finden Sie die Startstation, an der Sie die Runde absolvieren können, oder geben Sie −1 zurück.
Gierige Erkenntnis: Wenn Gesamtgas ≥ Gesamtkosten, gibt es eine Lösung. Verfolgen Sie einen laufenden Überschuss; Immer wenn der Wert unter Null fällt, muss die Antwort nach diesem Punkt beginnen.
Planen Sie Aufgaben mit einer Abklingzeit von n zwischen identischen Aufgaben. Gierig: Wählen Sie immer die häufigste verbleibende Aufgabe aus. Die Antwort hängt von der maximalen Häufigkeit ab und davon, wie viele Aufgaben sie teilen.
Tasks: A A A B B C, cooldown = 2
Schedule: A B C A B _ A
Total = 7
Fraktioneller Rucksack: Sie können Bruchteile von Gegenständen mitnehmen. Greedy funktioniert – sortieren Sie nach Wert pro Gewicht und nehmen Sie zuerst das beste Verhältnis.
0/1 Rucksack: Gegenstände sind alles oder nichts. Greedy scheitert hier, weil es schlimmer sein könnte, einen schweren, aber wertvollen Gegenstand auszulassen, als zwei leichtere mitzunehmen. Dies erfordert eine dynamische Programmierung.
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!
Warum schlägt der Greedy-Ansatz für das 0/1-Rucksackproblem fehl?
✅ Funktioniert, wenn Sie die Greedy-Choice-Eigenschaft beweisen können:
❌ Schlägt fehl, wenn sich lokale Optima nicht in globale Optima zusammensetzen:
Die Standardtechnik: Nehmen Sie eine optimale Lösung an, die nicht die Greedy-Choice verwendet. Zeigen Sie, dass Sie eine seiner Optionen gegen die gierige Option austauschen können, ohne die Lösung zu verschlechtern. Dies beweist, dass Greedy mindestens genauso gut ist.
Wofür wird das „Austauschargument” verwendet?
| Aspekt | Gierig | Dynamische Programmierung | |--------|--------|-------| | Auswahlmöglichkeiten | Eine beste Wahl pro Schritt | Erkunden Sie alle Teilprobleme | | Besucht die Vergangenheit noch einmal? | Niemals | Ja – speichert Unterergebnisse | | Geschwindigkeit | Normalerweise schneller | Hängt vom Zustandsraum ab | | Korrektheit | Nur wenn beweisbar | Immer (wenn richtig formuliert) |
Wenn Sie Zweifel haben, beginnen Sie gierig – wenn Sie nicht beweisen können, dass es funktioniert, wechseln Sie zu DP.