Was ist der Vorteil von Heaps gegenüber sortierten Arrays?


7

Ich bin ziemlich neu in Heaps und versuche, mich darum zu kümmern, warum Min- und Max-Heaps als Bäume dargestellt werden, wenn ein sortiertes Array standardmäßig beide Min / Max-Eigenschaften bietet.

Und ein Follow-up: Was ist der Vorteil des Umgangs mit der Komplexität des Einfügens in einen Heap, wenn ein Algorithmus wie das schnelle Sortieren sehr gut sortiert wird?

Kontext: Ich arbeite mit CLRS / MIT 6.006 in Python und habe nur ganzzahlige Darstellungen von Blattwerten gesehen. Ist dies in einer Sprache wie C besser anwendbar, in der jedes Blatt eine Struktur enthält, die nicht einfach sortiert werden kann?


2
Beachten Sie, dass Heaps normalerweise als Bäume modelliert , aber als Arrays implementiert werden, wenn nicht so, wie Sie es vorschlagen.
Raphael

Antworten:


14

find-min (bzw. ), (bzw. ) und sind die drei wichtigsten Operationen eines Min-Heaps (bzw. Max-Heap) und haben normalerweise die Komplexität , bzw. wenn Sie einen Min / Max-Heap durch einen Binärbaum implementieren.find-maxdelete-mindelete-maxinsertO(1)O(logn)O(logn)


Angenommen, Sie implementieren stattdessen einen Min-Heap durch ein sortiertes (nicht abnehmendes) Array (der Fall für Max-Heap ist ähnlich). und sind von wenn in Ihrer Anwendung nicht erforderlich ist, da dies möglich ist Behalten Sie einen Zeiger , der immer auf das minimale Element in Ihrem Array zeigt. Wenn das minimale Element entfernt wird, müssen Sie nur einen Schritt zum nächsten Element im Array verschieben.find-mindelete-minO(1)insertpp

Der Umgang mit dem Einfügen in ein sortiertes Array ist nicht trivial. Wenn ein neues Element , können wir die binäre Suche verwenden, um seine Position im Array zu finden und es einzufügen. Der Punkt ist jedoch, dass Sie, wenn Sie es dort einfügen möchten, viele alte Elemente (kann ) verschieben müssen, um eine freie Stelle für das neue Element zu schaffen. Dies ist für die meisten Anwendungen ziemlich ineffizient. Sie können das Array auch nach dem Einfügen eines Elements neu sortieren. Dies erfordert jedoch Zeit.eO(n)O(nlogn)


Der letzte Punkt, wie Sie eine Datenstruktur implementieren, hängt wirklich von Ihrer Anwendung ab. KEINE einzelne Implementierung ist in allen Fällen am besten. Analysieren Sie Ihre Anwendung, ermitteln Sie die häufigsten Vorgänge und entscheiden Sie dann über die geeignete Implementierung.


1
Das Hinzufügen eines neuen Elements kann in einem zusammenhängenden Array nicht schneller als O (n) erfolgen, da sich nur bis zu n Elemente am falschen Ort befinden und an einen anderen Ort verschoben werden müssen , unabhängig davon, was Sie tun.
Gnasher729

Aha. @ NP-hard Der Hauptvorteil der Darstellung eines Heaps eines sortierten Arrays sind die Zugriffszeiten auf Min / Max-Werte. Der Nachteil ist jedoch das Einfügen aufgrund von "Platz schaffen". Umgekehrt hat ein Heap, der als unsortiertes Array dargestellt wird, den Vorteil des Einfügens, da er nur Elemente austauschen muss, bis die Heap-Eigenschaften wieder erfüllt sind, aber den Nachteil von find-min/ find-maxbei O (log n) hat.
Nick Olinger

1
@ LindHop Ja. Es ist ein Kompromiss. Aber erfordert nur Zeit; Es ist , das Zeit benötigt. find-minO(1)delete-minO(logn)
PSPACEhard

5

Um Ihre Fragen zu beantworten, müssen Sie definieren, welche verschiedenen Aktionen Sie wie oft ausführen werden, und Sie müssen die zeitliche Komplexität jeder Aktion bewerten.

Welche Methode insgesamt besser abschneidet, hängt von der individuellen Komplexität ab und davon, wie oft jede Aktion ausgeführt wird.

Das Sortieren eines Arrays hat eine sehr hohe zeitliche Komplexität. Heap-Operationen sind so billig, dass sie tatsächlich für eine anständige Sortierimplementierung verwendet werden. Die Verwendung eines Heaps zum Auffinden des kleinsten Elements ist definitiv viel schneller als das Sortieren eines Arrays. Zwei Haufen für das kleinste und größte Element sind immer noch viel schneller (aber diese Situation ist ziemlich selten; zum Beispiel möchte bei einem Pferderennen jeder den Sieger wissen, aber es interessiert niemanden, wer zuletzt kommt).

Wenn ein Heap das Sortieren von Arrays absolut übertrifft, werden nur wenige Elemente entfernt oder hinzugefügt, und nach jeder Änderung möchten Sie erneut wissen, welches Element das kleinste ist.


Das hilft sehr. Es scheint, dass eine Implementierung, die viele Suchvorgänge / minimale Einfügungen erfordert, am besten als sortierter Array-Heap implementiert werden kann. Ein Szenario mit vielen Einfügungen eignet sich jedoch am besten für einen unsortierten Array-Heap / Binärbaum.
Nick Olinger
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.