Start · Sprachen · PHP · Referenz · SplMaxHeap

SplMaxHeap

Klasse

Implementiert einen Max-Heap, bei dem das größte Element stets an der Spitze liegt und als erstes entnommen wird.

seit PHP 5.3.0 Kategorie: oop

Signatur

class SplMaxHeap extends SplHeap

Beschreibung

SplMaxHeap ist eine konkrete Implementierung der abstrakten Klasse SplHeap und realisiert einen maximalen Heap: Das Element mit dem höchsten Wert steht immer an der Spitze der Datenstruktur und wird beim Aufruf von extract() als erstes zurückgegeben. Die interne Sortierung erfolgt automatisch beim Einfügen.

Typische Einsatzgebiete sind Prioritätswarteschlangen, bei denen hochpriorisierte Aufgaben zuerst verarbeitet werden sollen, sowie Algorithmen wie Heapsort, Dijkstras kürzeste Pfade oder Scheduling-Aufgaben. Im Vergleich zu einem manuell sortierten Array bietet SplMaxHeap eine effizientere O(log n)-Einfüge- und Entnahme-Komplexität.

Die Klasse überschreibt die abstrakte Methode compare() aus SplHeap so, dass größere Werte bevorzugt werden. Für skalare Typen (Zahlen, Strings) funktioniert dies direkt; für Objekte oder komplexe Vergleiche empfiehlt es sich, SplMaxHeap zu erweitern und compare() selbst zu überschreiben.

Wichtig: SplMaxHeap ist kein Iterator über alle Elemente in der ursprünglichen Einfügereihenfolge – beim Iterieren werden Elemente der Reihe nach extrahiert, d. h. der Heap wird dabei geleert.

Beispiele

Grundlegende Verwendung mit Ganzzahlen

<?php
$heap = new SplMaxHeap();

$heap->insert(10);
$heap->insert(3);
$heap->insert(75);
$heap->insert(42);
$heap->insert(7);

echo 'Größtes Element: ' . $heap->top() . PHP_EOL;

while (!$heap->isEmpty()) {
    echo $heap->extract() . PHP_EOL;
}
Größtes Element: 75 75 42 10 7 3

Prioritätswarteschlange für Aufgaben

<?php
class TaskHeap extends SplMaxHeap
{
    protected function compare(mixed $value1, mixed $value2): int
    {
        return $value1['priority'] <=> $value2['priority'];
    }
}

$queue = new TaskHeap();

$queue->insert(['name' => 'E-Mail versenden',    'priority' => 1]);
$queue->insert(['name' => 'Datenbank-Backup',    'priority' => 3]);
$queue->insert(['name' => 'Cache leeren',        'priority' => 2]);
$queue->insert(['name' => 'Sicherheits-Patch',   'priority' => 5]);
$queue->insert(['name' => 'Log-Dateien rotieren','priority' => 4]);

echo 'Aufgaben nach Priorität (höchste zuerst):' . PHP_EOL;
while (!$queue->isEmpty()) {
    $task = $queue->extract();
    printf("[%d] %s\n", $task['priority'], $task['name']);
}
Aufgaben nach Priorität (höchste zuerst): [5] Sicherheits-Patch [4] Log-Dateien rotieren [3] Datenbank-Backup [2] Cache leeren [1] E-Mail versenden

// Wichtig · Fallstricke

Heap wird beim Iterieren geleert: Das Durchlaufen eines SplMaxHeap via foreach oder wiederholtem extract() entfernt die Elemente dauerhaft. Soll der Heap erhalten bleiben, muss er vorher geklont werden (clone $heap).

Vergleich inkompatibler Typen: Beim Einfügen von Werten unterschiedlicher, nicht direkt vergleichbarer Typen (z. B. gemischte Arrays und Skalare ohne eigene compare()-Implementierung) kann eine RuntimeException geworfen werden.

Kein wahlfreier Zugriff: SplMaxHeap unterstützt keinen Index-basierten Zugriff auf beliebige Elemente – nur top() (Spitze lesen) und extract() (Spitze entnehmen) sind effizient verfügbar.