Programming lesson
Binär-Heaps in CSCI 570: Raumplanung, Datenfusion und interstellare Navigation
Lerne, wie Binär-Heaps in drei klassischen CSCI-570-Aufgaben eingesetzt werden: minimale Hörsäle, Zusammenführen sortierter Listen und minimale Tankstopps. Mit aktuellen Beispielen aus dem Campusleben und der Raumfahrt.
Binär-Heaps: Das Schweizer Taschenmesser der Algorithmen
Binär-Heaps sind eine fundamentale Datenstruktur, die in vielen Optimierungsproblemen zum Einsatz kommt. In diesem Tutorial zeigen wir dir, wie du Binär-Heaps in drei typischen Aufgaben aus CSCI 570 (Homework 2) einsetzt: die Minimierung der Anzahl benötigter Hörsäle, das effiziente Zusammenführen mehrerer sortierter Listen und die Berechnung minimaler Tankstopps für eine interstellare Reise. Diese Konzepte sind nicht nur für die Klausur relevant, sondern auch für reale Anwendungen – von der Terminplanung an der USC Viterbi bis zur Routenoptimierung bei SpaceX.
1. Minimale Anzahl von Hörsälen: Das Intervallplanungsproblem
Stell dir vor, du bist für die Raumplanung im SGM Building zuständig. Es gibt n Kurse, die jeweils eine Start- und Endzeit haben. Jeder Kurs braucht einen eigenen Hörsaal. Wie viele Hörsäle brauchst du mindestens, damit sich keine Kurse überschneiden?
Ein naiver Ansatz wäre, alle Paare von Kursen auf Überschneidungen zu prüfen – das wäre O(n²) und viel zu langsam. Mit einem Min-Heap schaffst du es in O(n log n).
Algorithmus (mit Min-Heap):
- Sortiere alle Kurse nach Startzeit (aufsteigend).
- Erstelle einen leeren Min-Heap, der die Endzeiten der belegten Hörsäle speichert.
- Für jeden Kurs in der sortierten Reihenfolge:
- Wenn der Heap nicht leer ist und die kleinste Endzeit im Heap ≤ der Startzeit des aktuellen Kurses ist, dann wird dieser Hörsaal frei: Entferne die Endzeit aus dem Heap (extract-min).
- Füge die Endzeit des aktuellen Kurses in den Heap ein.
- Die Größe des Heaps am Ende ist die minimale Anzahl benötigter Hörsäle.
Beispiel: Kurse: [9:00,10:30], [9:30,11:00], [10:00,11:30]. Sortiert nach Start: [9:00,10:30], [9:30,11:00], [10:00,11:30]. Heap: erst 10:30, dann 11:00 (da 9:30 ≥ 10:30? Nein, also neuer Saal), dann 10:30 wird durch 11:30 ersetzt (da 10:00 ≥ 10:30). Heap-Größe am Ende = 2 → 2 Hörsäle.
Der Algorithmus ist eine typische greedy Strategie mit Heap-Unterstützung. Die Laufzeit: Sortieren O(n log n), jede Heap-Operation O(log n), insgesamt O(n log n).
2. Mehrere sortierte Listen zusammenführen (Multiway Merge)
Das Thomas Lord Department of Computer Science sammelt Forschungsarbeiten aus verschiedenen Departments. Jedes Department hat eine nach Datum sortierte Liste. Ziel: eine einzige sortierte Liste aller Arbeiten. Wie macht man das schnell?
Mit einem Min-Heap der Größe n (Anzahl Departments) geht es in O(m log n), wobei m die Gesamtzahl der Arbeiten ist.
Algorithmus:
- Erstelle einen Min-Heap, der Tupel (Wert, Listenindex) speichert.
- Füge das erste Element jeder Liste in den Heap ein.
- Solange der Heap nicht leer ist:
- Entferne das minimale Element (extract-min).
- Füge es in die Ergebnisliste ein.
- Wenn die Liste, aus der dieses Element stammt, noch weitere Elemente hat, füge das nächste Element dieser Liste in den Heap ein.
Dieser Algorithmus ist extrem effizient und wird auch in großen Datenbanken verwendet. Stell dir vor, du kombinierst die neuesten Paper aus KI, Robotik und Quantencomputing – mit diesem Heap-basierten Merge schaffst du das im Handumdrehen.
3. Minimale Tankstopps: Das interstellare Problem
Ein Raumschiff fliegt von der Erde zu einem fernen Stern. Es hat eine bestimmte Treibstoffmenge und kann an Stationen nachtanken. Jede Station hat eine Entfernung vom Start und eine Treibstoffkapazität. Ziel: minimale Anzahl von Stopps, um das Ziel zu erreichen.
Dieses Problem ist ein Klassiker der greedy Algorithmen und wird mit einem Max-Heap gelöst.
Algorithmus:
- Sortiere die Stationen nach Entfernung (aufsteigend).
- Initialisiere: currentFuel = Starttreibstoff, Stopps = 0, Heap = leer (Max-Heap).
- Füge einen fiktiven Zielpunkt mit Entfernung = targetDistance hinzu.
- Für jede Station (oder Ziel) in der Reihenfolge:
- Berechne die Distanz zur nächsten Station/ Ziel.
- Solange currentFuel < Distanz und Heap nicht leer:
- currentFuel += extract-max (größte verfügbare Treibstoffmenge aus dem Heap).
- Stopps++.
- Wenn currentFuel < Distanz, gib -1 zurück (unmöglich).
- currentFuel -= Distanz.
- Wenn es eine Station ist, füge ihre Treibstoffkapazität in den Heap ein.
- Gib Stopps zurück.
Dieser Algorithmus ist verwandt mit dem Dijkstra-Algorithmus und wird auch in der Logistik eingesetzt. Stell dir vor, du planst eine Marsmission – hier kommt der Heap ins Spiel.
Fazit
Binär-Heaps sind mächtige Werkzeuge für Optimierungsprobleme. Ob du Hörsäle planst, Paper listen oder Raumschiffe tankst – der Heap hilft dir, effiziente Lösungen zu finden. Übe diese Algorithmen, denn sie sind der Schlüssel zu vielen CSCI-570-Aufgaben und echten Anwendungen. Viel Erfolg im Studium an der USC Viterbi!