Abbildung von Haufen Datenstrukturen
Es gibt zwei Arten von Haufen: einen max-heap und einen min-heap. Bei einer Max-HEAP-Struktur ist der Maximalwert die Wurzel, und die Werte werden kleiner, wenn der Baum abstammt. Jeder Elternteil ist entweder gleich oder größer als eines seiner unmittelbaren Kinder. In einer Min-H-Kap-Struktur ist der Mindestwert die Wurzel, und die Werte werden größer, wenn der Baum abstammt. Jeder Elternteil ist entweder gleich oder kleiner als einer seiner unmittelbaren Kinder. In den folgenden Diagrammen ist das erste ein Max-heap und der zweite ist ein Min-heap:
Beachten Sie für beide Haufen, dass es für ein Paar Kinder keine Rolle spielt, ob das links der größere Wert ist. Eine Reihe in einer Ebene im Baum darf nicht unbedingt von links von minimal bis maximal gefüllt werden. Es ist auch nicht unbedingt von maximal bis mindestens von links gefüllt.
Darstellen einen Haufen in einem Array
Damit Software leicht einen Heap benutzt, muss der Heap in einem Array dargestellt werden. Der in einem Array dargestellte Max-heap ist:
89, 85, 87, 84, 82, 79, 73, 80, 81,, 65, 69Dies geschieht mit dem Stammwert als erster Wert für das Array. Die Werte werden kontinuierlich platziert, indem der Baum von links nach rechts von oben nach unten gelesen wird. Wenn ein Element fehlt, wird seine Position im Array übersprungen. Jeder Knoten hat zwei Kinder. Wenn sich ein Knoten am Index (Position) n befindet, befindet sich sein erstes Kind im Array am Index 2n+1 und sein nächstes Kind ist in Index 2n+2. 89 ist am Index 0; Sein erstes Kind, 85, befindet sich am Index 2 (0)+1 = 1, während sein zweites Kind in Index 2 (0)+2 = 2 ist. 85 ist am Index 1; Sein erstes Kind, 84, befindet sich bei Index 2 (1)+1 = 3, während sein zweites Kind 82 in Index 2 (1)+2 = 4 ist. 79 ist am Index 5; Sein erstes Kind, 65, befindet sich am Index 2 (5)+1 = 11, während sein zweites Kind in Index 2 (5)+2 = 12 ist. Die Formeln werden auf den Rest der Elemente im Array angewendet.
Ein solches Array, bei dem die Bedeutung eines Elements und die Beziehung zwischen den Elementen durch die Position des Elements impliziert wird, wird als implizite Datenstruktur bezeichnet.
Die implizite Datenstruktur für die oben genannten Mine-heap lautet:
65, 68, 70, 73, 71, 83, 84,, 79, 80,, 85, 89Das obige Max-heap ist ein kompletter binärer Baum, aber kein voller binärer Baum. Deshalb sind einige Orte (Positionen) im Array leer. Für einen vollen Binärbaum ist in der Array kein Ort leer.
Wenn der Haufen nun ein fast vollständiger Baum wäre, wenn der Wert 82 fehlt, wäre das Array:
89, 85, 87, 84, 79, 73, 80, 81,, 65, 69In dieser Situation sind drei Standorte leer. Die Formeln sind jedoch noch anwendbar.
Operationen
Eine Datenstruktur ist ein Datenformat (e.G. ein Baum) plus die Beziehung zwischen den Werten sowie die Operationen (Funktionen) der Werte erfolgen. Für einen Haufen ist die Beziehung, die den gesamten Haufen durchläuft, für einen Max-HEAP gleich oder höher als die Kinder. und der Elternteil muss für einen Min-Heap gleich oder weniger als die Kinder sein als die Kinder. Diese Beziehung wird als Heap -Eigenschaft bezeichnet. Die Operationen eines Haufen. Eine Zusammenfassung der Operationen des Haufens folgt:
Haufen Operationen Zusammenfassung
Es gibt bestimmte Softwareoperationen, die bei Haufen gemeinsam sind, wie folgt:
Schaffung eines Haufens
Create_heap: Erstellen eines Haufens bedeutet, ein Objekt zu bilden, das den Haufen darstellt. In der C -Sprache können Sie einen Haufen mit dem Strukturobjekttyp erstellen. Eines der Mitglieder der Struktur ist das Haufen -Array. Der Rest der Mitglieder ist Funktionen (Operationen) für den Haufen. Create_heap bedeutet, einen leeren Haufen zu erstellen.
Heapify: Das Heap -Array ist ein teilweise sortiertes (bestelltes) Array. Heapify -Mittelwerte und ein Heap -Array aus einem ungeortierten Array angeben - siehe Details unten.
Merge: Dies bedeutet, einen Gewerkschaftshaufen aus zwei verschiedenen Haufen zu bilden - siehe Details unten. Die beiden Haufen sollten sowohl max-heap als auch beide Min-heap sein. Der neue Haufen entspricht der Haufen Eigenschaft, während die ursprünglichen Haufen erhalten bleiben (nicht gelöscht).
MELD: Dies bedeutet, zwei Haufen desselben Typs zu einer neuen zu bilden, die Duplikate pflegen - siehe Details unten. Der neue Haufen entspricht der Haufen Eigenschaft, während die ursprünglichen Haufen zerstört werden (gelöscht). Der Hauptunterschied zwischen Zusammenführung und Verschmelzung besteht darin, dass ein Baum für die Verschmelzung als Subtree zur Wurzel des anderen Baums passt, wodurch doppelte Werte im neuen Baum ermöglicht werden, während für das Zusammenführen ein neuer Haufenbaum gebildet wird, wobei Duplikate entfernt werden, um Duplikate zu entfernen. Es ist nicht erforderlich, die beiden ursprünglichen Haufen mit der Verschmelzung aufrechtzuerhalten.
Grundlegende Haufen Operationen
find_max (find_min): Suchen Sie den Maximalwert im Max-HEAP-Array und geben.
Einfügen: Fügen Sie dem Haufen Array ein neues Element hinzu und ordnen Sie das Array neu an, damit die Haufen Eigenschaft des Diagramms beibehalten wird.
extract_max (extract_min): Suchen Sie den Maximalwert im Max-HEAP-Array, entfernen und geben Sie ihn zurück. oder finden Sie den Mindestwert im Min-HEAP-Array, entfernen und geben Sie ihn zurück.
Delete_max (Delete_Min): Suchen Sie den Stammknoten eines Max-HEAP, das das erste Element des Max-HEAP-Arrays ist, ohne es unbedingt zurückzugeben. oder lokalisieren Sie den Wurzelknoten eines Min-Hakens, das das erste Element des Min-H-Kaps-Arrays ist, ohne es unbedingt zurückzugeben
Ersetzen. Es spielt keine Rolle, ob die alte Wurzel zurückgegeben wird.
Interne Haufen Operationen
erhöhen_key (mecrease_key): Erhöhen Sie den Wert eines beliebigen Knotens für einen Max-heap und ordnen Sie sie neu an, damit die Heap-Eigenschaft erhalten bleibt, oder verringern Sie den Wert eines jeden Knoten.
Löschen: Löschen Sie jeden Knoten und ordnen Sie sie dann neu an.
SHIFT_UP: Bewegen.
SHIFT_DOWN: Bewegen.
Häufigkeitsprüfung
Größe: Dies gibt die Anzahl der Schlüssel (Werte) in einem Haufen zurück; Es enthält nicht die leeren Standorte des Haufens -Arrays. Ein Haufen kann durch Code, wie im Diagramm oder mit einem Array dargestellt werden.
ist leer: Dies gibt boolean wahr, wenn es keinen Knoten in einem Haufen oder boolean falsch gibt, wenn der Haufen mindestens einen Knoten hat.
Sieben in einem Haufen
Es gibt Sift-up und Sift nach unten:
Sieben: Dies bedeutet, einen Knoten mit seinem Elternteil auszutauschen. Wenn das Heap -Eigentum nicht erfüllt ist, tauschen Sie den Elternteil mit seinem eigenen Elternteil aus. Fahren Sie auf dem Weg fort, bis das Heap -Eigentum erfüllt ist. Das Verfahren könnte die Wurzel erreichen.
Sieben: Dies bedeutet, einen Knoten mit großem Wert mit dem kleineren seiner beiden Kinder (oder einem Kind gegen einen fast vollständigen Haufen) auszutauschen. Wenn die Heap -Eigenschaft nicht erfüllt ist, tauschen Sie den unteren Knoten mit dem kleineren Knoten ihrer eigenen beiden Kinder aus. Fahren Sie auf dem Weg fort, bis das Heap -Eigentum erfüllt ist. Das Verfahren könnte ein Blatt erreichen.
Häufbar
Heapify bedeutet, ein ungeortes Array zu sortieren, damit das Heap-Eigentum für Max-heap oder Min-heap zufrieden ist. Dies bedeutet. Der grundlegende Algorithmus zum Heapifizieren eines max-heap oder min-heap ist wie folgt:
- Wenn der Wurzelknoten extremer ist als jeder der Knoten seines Kindes, tauschen Sie die Wurzel mit dem weniger extremen Kinderknoten aus.
- Wiederholen Sie diesen Schritt mit den Kinderknoten in einem Vorbestellungsbaum, das durchquert wird.
Der letzte Baum ist ein Haufenbaum, der die Haufen Eigenschaft erfüllt. Ein Haufen kann als Baumdiagramm oder in einem Array dargestellt werden. Der resultierende Haufen ist ein teilweise sortierter Baum, ich.e. ein teilweise sortiertes Array.
Heap -Betriebsdetails
In diesem Abschnitt des Artikels werden die Details der Heap -Operationen angezeigt.
Schaffung eines Haufensdetails
Create_heap
Siehe oben!
hüpfen
Siehe oben
verschmelzen
Wenn sich die Haufen anordnen,
89, 85, 87, 84, 82, 79, 73, 80, 81,, 65, 69Und
89, 85, 84, 73, 79, 80, 83, 65, 68, 70, 71werden verschmolzen, das Ergebnis ohne Duplikate kann sein,
89, 85, 87, 84, 82, 83, 81, 80, 79, 73, 68, 65, 69, 70, 71Nach einiger Sieben. Beachten Sie, dass im ersten Array 82 keine Kinder hat. In dem resultierenden Array befindet es sich in Index 4; und seine Standorte am Index 2 (4)+1 = 9 und 2 (4)+2 = 10 sind frei. Dies bedeutet, dass es auch keine Kinder im neuen Baumdiagramm hat. Die ursprünglichen zwei Haufen sollten nicht gelöscht werden, da ihre Informationen nicht wirklich im neuen Heap (Neuarray) enthalten sind. Der grundlegende Algorithmus zum Zusammenführen von Haufen desselben Typs lautet wie folgt:
- Schließen Sie ein Array zum Ende des anderen Arrays an.
- Heapify beseitigt Duplikate und sorgt dafür, dass Knoten, die keine Kinder in den ursprünglichen Haufen hatten, immer noch keine Kinder auf dem neuen Haufen haben.
verschmelzen
Der Algorithmus zur Verschmelzung von zwei Haufen desselben Typs (entweder zwei maximale oder zwei min) ist wie folgt:
- Vergleichen Sie die beiden Wurzelknoten.
- Machen Sie die weniger extreme Wurzel und den Rest seines Baumes (Subtree), das zweite Kind der extremen Wurzel.
- Sieben Sie das streunende Kind der Wurzel des jetzt extremen Teilbaums nach unten im extremen Subtree.
Der resultierende Haufen entspricht immer noch mit der Haufen Eigenschaft, während die ursprünglichen Haufen zerstört werden (gelöscht). Die ursprünglichen Haufen können zerstört werden, da alle Informationen, die sie besaßen.
Grundlegende Haufen Operationen
find_max (find_min)
Dies bedeutet, den Maximalwert im Max-HEAP-Array zu lokalisieren und eine Kopie zurückzugeben oder den Mindestwert im Min-HEAP-Array zu finden und eine Kopie zurückzugeben. Ein Heap -Array erfüllt die Heap -Eigenschaft im Definition bereits. Geben Sie also einfach eine Kopie des ersten Elements des Arrays zurück.
Einfügung
Dies bedeutet, dem Haufen Array ein neues Element hinzuzufügen und das Array neu zu ordnen, damit die Haufen Eigenschaft des Diagramms beibehalten wird (zufrieden). Der Algorithmus, um dies für beide Arten von Haufen zu tun, lautet wie folgt:
- Nehmen Sie einen vollen binären Baum an. Dies bedeutet, dass das Array bei Bedarf am Ende mit leeren Stellen gefüllt werden muss. Die Gesamtzahl der Knoten eines vollständigen Haufens beträgt 1 oder 3 oder 7 oder 15 oder 31 usw.; Verdoppeln Sie weiter und fügen Sie 1 hinzu.
- Setzen Sie den Knoten in der am besten geeigneten leeren Stelle nach Größe gegen Ende des Haufens (gegen Ende des Haufens -Arrays). Wenn es keinen leeren Ort gibt, starten Sie eine neue Reihe von unten nach links.
- Geben Sie bei Bedarf an, bis das Haufen Eigentum erfüllt ist.
extract_max (extract_min)
Suchen Sie den Maximalwert im Max-HEAP-Array, entfernen und geben Sie ihn zurück. oder finden Sie den Mindestwert im Min-HEAP-Array, entfernen und geben Sie ihn zurück. Der Algorithmus zum Extract_max (extract_min) lautet wie folgt:
- Entfernen Sie den Wurzelknoten.
- Nehmen Sie (entfernen) den unteren Knoten am rechten Platz (letzter Knoten im Array) und an die Wurzel legen.
- Geben Sie gegebenenfalls nach unten, bis das Heap -Eigentum erfüllt ist.
Delete_max (Delete_Min)
Suchen Sie den Wurzelknoten eines Max-HEAP, der das erste Element des Max-HEAP-Arrays ist, und entfernen Sie es, ohne es unbedingt zurückzugeben. oder lokalisieren. Der Algorithmus zum Löschen des Stammknotens lautet wie folgt:
- Entfernen Sie den Wurzelknoten.
- Nehmen Sie (entfernen) den unteren Knoten am rechten Platz (letzter Knoten im Array) und an die Wurzel legen.
- Geben Sie gegebenenfalls nach unten, bis das Heap -Eigentum erfüllt ist.
ersetzen
Suchen Sie den Wurzelknoten eines Heaps, entfernen Sie ihn und ersetzen Sie ihn durch den neuen. Es spielt keine Rolle, ob die alte Wurzel zurückgegeben wird. Geben Sie gegebenenfalls nach unten, bis das Heap -Eigentum erfüllt ist.
Interne Haufen Operationen
erhöhen_key (mecrease_key)
Erhöhen Sie den Wert eines Knotens für einen Max-HEAP und eine neu ordnungsgemäß. Sieben Sie gegebenenfalls nach oben oder unten, bis das Haufen Eigentum erfüllt ist.
löschen
Entfernen Sie den interessierenden Knoten und ordnen Sie sie dann neu an. Der Algorithmus zum Löschen eines Knotens lautet wie folgt:
- Entfernen Sie den interessierenden Knoten.
- Nehmen Sie (entfernen) den unteren Knoten am rechten Platz (letzter Knoten im Array) und platzieren Sie am Index des entfernt entfernten Knotens. Wenn der gelöschte Knoten in der letzten Zeile ist, ist dies möglicherweise nicht erforderlich.
- Sieben Sie gegebenenfalls nach oben oder unten, bis das Haufen Eigentum erfüllt ist.
Hochschalten
Bewegen.
Herunterschalten
Bewegen.
Häufigkeitsprüfung
Größe
Siehe oben!
ist leer
Siehe oben!
Andere Klassen von Haufen
Der in diesem Artikel beschriebene Heap kann als Haupt- (allgemeiner) Haufen angesehen werden. Es gibt andere Klassen von Haufen. Die beiden, die Sie darüber hinaus wissen sollten, sind der binäre Haufen und der D-Ary-Haufen.
Binärhaufen
Der binäre Haufen ähnelt diesem Haupthaufen, jedoch mit mehr Einschränkungen. Insbesondere muss der binäre Haufen ein vollständiger Baum sein. Verwechseln Sie nicht zwischen einem vollständigen Baum und einem vollen Baum.
D-Ary Heap
Ein binärer Haufen ist ein 2-Ary-Haufen. Ein Haufen, bei dem jeder Knoten 3 Kinder hat, ist ein 3-Ary-Haufen. Ein Haufen, bei dem jeder Knoten 4 Kinder hat, ist ein 4-Ary-Haufen und so weiter. Ein D-Ary-Heap hat andere Einschränkungen.
Abschluss
Ein Haufen ist ein vollständiger oder fast vollständiger binärer Baum, der das Haufen Eigentum erfüllt. Die Heap-Eigenschaft hat 2 Alternativen: Für einen Max-heap muss ein Elternteil einen gleichen oder höheren Wert haben als die unmittelbaren Kinder; Für einen Miner-HEAP muss ein Elternteil gleich oder weniger Wert haben als die unmittelbaren Kinder. Ein Haufen kann als Baum oder in einem Array dargestellt werden. Wenn der Stammknoten in einem Array dargestellt wird, ist er der erste Knoten des Arrays; und wenn ein Knoten bei Index N ist, befindet sich sein erstes Kind im Array am Index 2n+1 und sein nächstes Kind ist in Index 2n+2. Ein Haufen hat bestimmte Operationen, die auf dem Array durchgeführt werden.
Chrys