Datenstrukturen & Algorithmen

Tutorial zur Heap-Datenstruktur

Tutorial zur Heap-Datenstruktur
Daten sind eine Reihe von Werten. Daten können gesammelt und in eine Reihe oder in eine Spalte oder in eine Tabelle oder in Form eines Baumes gebracht werden. Die Struktur von Daten ist nicht nur die Platzierung von Daten in einer dieser Formen. Bei der Datenverarbeitung ist die Datenstruktur eines dieser Formate plus die Beziehung zwischen den Werten plus die Operationen (Funktionen), die mit den Werten ausgeführt werden. Sie sollten bereits Grundkenntnisse über die Baumdatenstruktur haben, bevor Sie hierher kommen, da die dortigen Konzepte hier ohne oder ohne Erklärung verwendet werden. Wenn Sie nicht über diese Kenntnisse verfügen, lesen Sie das Tutorial mit dem Titel Tree Data Structure Tutorial for Beginners unter dem Link https://linuxhint.com/tree_data_structure_tutorial_beginners/. Lesen Sie danach dieses Tutorial weiter.Eine Heap-Datenstruktur ist ein vollständiger oder fast vollständiger binärer Baum, bei dem der untergeordnete Wert jedes Knotens gleich oder kleiner als der Wert seines übergeordneten Knotens ist. Alternativ ist es ein solcher Baum, bei dem der Wert eines Elternteils gleich oder kleiner als der Wert eines seiner Kinder ist. Der Wert (Datum) eines Baumes wird auch als Schlüssel bezeichnet.

Illustration von Heap-Datenstrukturen

Es gibt zwei Arten von Heaps: 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 abwärts geht. jedes Elternteil ist entweder gleich oder größer im Wert als eines seiner unmittelbaren Kinder. Bei einer Min-Heap-Struktur ist der minimale Wert die Wurzel, und die Werte werden größer, wenn der Baum abgestiegen wird; jedes Elternteil ist entweder gleich oder kleiner im Wert als eines seiner unmittelbaren Kinder. In den folgenden Diagrammen ist das erste ein Max-Heap und das zweite ein Min-Heap:

Beachten Sie bei beiden Haufen, dass es für ein Paar Kinder keine Rolle spielt, ob der linke der größere Wert ist. Eine Zeile in einer Ebene im Baum muss nicht unbedingt von links nach unten gefüllt werden; es wird auch nicht unbedingt von Maximum nach Minimum gefüllt, von links.

Darstellung eines Heaps in einem Array

Damit Software einen Heap einfach verwenden kann, muss der Heap in einem Array dargestellt werden. Der obige Max-Heap, dargestellt in einem Array, ist:

89,  85,  87,  84,  82,  79, 73,  80,  81,    ,    ,  65,  69

Dies geschieht beginnend mit dem Wurzelwert als ersten Wert für das Array. Die Werte werden fortlaufend 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 an Index (Position) n befindet, befindet sich sein erstes Kind im Array an Index 2n+1 und sein nächstes Kind an Index 2n+2. 89 ist bei Index 0; sein erstes Kind, 85 ist am Index 2(0)+1=1, während sein zweites Kind am Index 2(0)+2=2 . liegt. 85 ist bei Index 1; sein erstes Kind, 84, befindet sich bei Index 2(1)+1=3, während sein zweites Kind, 82, bei Index 2(1)+2=4 . ist. 79 ist bei Index 5; sein erstes Kind, 65 ist bei Index 2(5)+1=11, während sein zweites Kind bei Index 2(5)+2=12 liegt. 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 den obigen Min-Heap ist:

65,  68,  70,  73,  71,  83,  84,    ,    ,  79,  80,   ,    ,  85,  89

Der obige Max-Heap ist ein vollständiger Binärbaum, aber kein vollständiger Binärbaum. Deshalb sind einige Orte (Positionen) im Array leer. Bei einem vollständigen Binärbaum ist kein Ort im Array leer empty.

Wenn der Heap nun ein fast vollständiger Baum wäre, wenn beispielsweise der Wert 82 fehlt, dann wäre das Array:

89,                                                                                                                                                                                                                                  

In dieser Situation sind drei Standorte leer. Die Formeln gelten jedoch weiterhin.

Betrieb

Eine Datenstruktur ist ein Datenformat (z.G. ein Baum), plus die Beziehung zwischen den Werten, plus die Operationen (Funktionen), die mit den Werten ausgeführt werden. Für einen Heap gilt die Beziehung, die durch den gesamten Heap geht, dass der Wert des Elternteils gleich oder größer als der der Kinder sein muss, für einen Max-Heap; und der Wert des Elternteils muss gleich oder kleiner als der der Kinder sein, für einen Min-Heap. Diese Beziehung wird als Heap-Eigenschaft bezeichnet. Die Operationen eines Heaps sind unter den Überschriften Creation, Basic, Internal und Inspection gruppiert. Es folgt eine Zusammenfassung der Operationen des Heaps:

Zusammenfassung der Heap-Operationen

Es gibt bestimmte Softwareoperationen, die bei Heaps üblich sind, wie folgt:

Erstellung eines Haufens

create_heap: Einen Heap zu erstellen bedeutet, ein Objekt zu bilden, das den Heap repräsentiert. In der Sprache C können Sie einen Heap mit dem Objekttyp struct erstellen. Eines der Mitglieder der Struktur ist das Heap-Array. Der Rest der Mitglieder sind Funktionen (Operationen) für den Heap. Create_heap bedeutet, einen leeren Heap zu erstellen.

Heapify: Das Heap-Array ist ein teilweise sortiertes (geordnetes) Array. Heapify bedeutet, ein Heap-Array aus einem unsortierten Array bereitzustellen - siehe Details unten.

Zusammenführen:  Das bedeutet, einen Union-Heap aus zwei verschiedenen Heaps zu bilden – Details siehe unten. Die beiden Heaps sollten beide max-heap oder beide min-heap sein. Der neue Heap entspricht der Heap-Eigenschaft, während die ursprünglichen Heaps erhalten (nicht gelöscht) werden.

Verschmelzen:  Das bedeutet, dass du zwei Haufen desselben Typs zu einem neuen zusammenfügst und Duplikate beibehältst – Details siehe unten. Der neue Heap entspricht der Heap-Eigenschaft, während die ursprünglichen Heaps zerstört (gelöscht) werden. Der Hauptunterschied zwischen Zusammenführen und Zusammenführen besteht darin, dass beim Zusammenführen ein Baum als Unterbaum an die Wurzel des anderen Baums passt, wodurch doppelte Werte im neuen Baum möglich sind, während beim Zusammenführen ein neuer Heap-Baum gebildet wird, der Duplikate entfernt. Es besteht keine Notwendigkeit, die beiden ursprünglichen Haufen beim Verschmelzen zu erhalten.

Grundlegende Heap-Operationen

find_max (find_min): Suchen Sie den maximalen Wert im Array max-heap und geben Sie eine Kopie zurück, oder suchen Sie den minimalen Wert im Array min-heap und geben Sie eine Kopie zurück.

Einfügen: Fügen Sie dem Heap-Array ein neues Element hinzu und ordnen Sie das Array neu an, damit die Heap-Eigenschaft des Diagramms beibehalten wird.

extract_max (extract_min): Suchen Sie den maximalen Wert im Array max-heap, entfernen Sie ihn und geben Sie ihn zurück; oder suchen Sie den Mindestwert im min-heap-Array, entfernen Sie ihn und geben Sie ihn zurück.

delete_max (delete_min): Lokalisiere den Wurzelknoten eines max-heap, der das erste Element des max-heap-Arrays ist, entferne ihn, ohne ihn unbedingt zurückzugeben; oder suchen Sie den Wurzelknoten eines Min-Heap, der das erste Element des Min-Heap-Arrays ist, entfernen Sie ihn, ohne ihn unbedingt zurückzugeben;

Ersetzen: Suchen Sie den Wurzelknoten eines der beiden Heaps, entfernen Sie ihn und ersetzen Sie ihn durch einen neuen. Es spielt keine Rolle, ob die alte Wurzel zurückgegeben wird.

Interne Heap-Operationen

raise_key (decrease_key): Erhöhen Sie den Wert eines beliebigen Knotens für einen Max-Heap und ordnen Sie ihn neu an, damit die Heap-Eigenschaft beibehalten wird, oder verringern Sie den Wert eines beliebigen Knotens für einen Min-Heap und ordnen Sie ihn neu an, sodass die Heap-Eigenschaft beibehalten wird.

Löschen: Löschen Sie einen beliebigen Knoten und ordnen Sie ihn dann neu an, sodass die Heap-Eigenschaft für den Max-Heap oder einen Min-Heap beibehalten wird.

shift_up: Verschieben Sie einen Knoten in einem Max-Heap oder Min-Heap so lange wie nötig nach oben und ordnen Sie ihn neu an, um die Heap-Eigenschaft beizubehalten.

shift_down: Verschieben Sie einen Knoten in einem Max-Heap oder Min-Heap so lange wie nötig nach unten und ordnen Sie ihn neu an, um die Heap-Eigenschaft beizubehalten.

Inspektion eines Haufens

Größe: Dies gibt die Anzahl der Schlüssel (Werte) in einem Heap zurück; es enthält nicht die leeren Speicherorte des Heap-Arrays. Ein Heap kann durch Code dargestellt werden, wie im Diagramm, oder mit einem Array.

ist leer: Dies gibt Boolean true zurück, wenn kein Knoten in einem Heap vorhanden ist, oder Boolean false, wenn der Heap mindestens einen Knoten hat.

Sieben in einem Haufen

Es gibt Auf- und Absieben:

Sichtung: Dies bedeutet, einen Knoten mit seinem Elternteil auszutauschen. Wenn die Heap-Eigenschaft nicht erfüllt ist, tauschen Sie das übergeordnete Element mit seinem eigenen übergeordneten Element aus. Fahren Sie auf diese Weise im Pfad fort, bis die Heap-Eigenschaft erfüllt ist. Das Verfahren könnte die Wurzel erreichen.

Absieben: Dies bedeutet, dass ein Knoten mit großem Wert mit dem kleineren seiner beiden Kinder (oder einem Kind gegen einen fast vollständigen Heap) ausgetauscht wird. Wenn die Heap-Eigenschaft nicht erfüllt ist, vertauschen Sie den unteren Knoten mit dem kleineren Knoten seiner eigenen beiden Kinder. Fahren Sie auf diese Weise im Pfad fort, bis die Heap-Eigenschaft erfüllt ist. Das Verfahren könnte ein Blatt erreichen.

Häufung

Heapify bedeutet, ein unsortiertes Array zu sortieren, um die Heap-Eigenschaft für max-heap oder min-heap zu erfüllen. Dies bedeutet, dass im neuen Array möglicherweise einige leere Speicherorte vorhanden sind. Der grundlegende Algorithmus zum Heapifizieren eines Max-Heaps oder Min-Heaps ist wie folgt:

- Wenn der Wurzelknoten extremer ist als einer der untergeordneten Knoten, dann vertausche die Wurzel mit dem weniger extremen untergeordneten Knoten.

- Wiederholen Sie diesen Schritt mit den untergeordneten Knoten in einem Pre-Order Tree Traversing Scheme.

Der letzte Baum ist ein Heap-Baum, der die Heap-Eigenschaft erfüllt. Ein Heap kann als Baumdiagramm oder in einem Array dargestellt werden. Der resultierende Haufen ist ein teilweise sortierter Baum, d.e. ein teilweise sortiertes Array.

Details zum Heap-Vorgang

Dieser Abschnitt des Artikels enthält die Details der Heap-Operationen.

Erstellung eines Heap-Details

create_heap

Siehe oben!

aufhäufen

Siehe oben

verschmelzen

Wenn die Heap-Arrays,

89,  85,  87,  84,  82,  79, 73,  80,  81,    ,    ,  65,  69

und

89,  85,  84,  73,  79,  80,  83,  65,  68,  70,  71

zusammengeführt werden, kann das Ergebnis ohne Duplikate sein,

89,  85,  87,  84,  82,  83,  81,  80,  79,    ,    73,  68,  65,  69,  70,  71

Nach einigem Sieben. Beachten Sie, dass 82 im ersten Array keine Kinder hat. Im resultierenden Array befindet es sich bei Index 4; und seine Positionen am Index 2(4)+1=9 und 2(4)+2=10 sind frei. Das bedeutet, dass es im neuen Baumdiagramm auch keine Kinder hat. Die ursprünglichen beiden Heaps sollten nicht gelöscht werden, da sich ihre Informationen nicht wirklich im neuen Heap (neues Array) befinden. Der grundlegende Algorithmus zum Zusammenführen von Heaps des gleichen Typs ist wie folgt:

- Verbinden Sie ein Array mit dem unteren Ende des anderen Arrays.

- Heapify entfernt Duplikate und stellt sicher, dass Knoten, die keine Kinder in den ursprünglichen Heaps hatten, auch im neuen Heap keine Kinder haben.

verschmelzen

Der Algorithmus zum Verschmelzen von zwei Heaps des gleichen Typs (entweder zwei Max- oder zwei Min-) ist wie folgt:

- Vergleichen Sie die beiden Wurzelknoten.

- Machen Sie die weniger extreme Wurzel und den Rest ihres Baumes (Unterbaum) zum zweiten Kind der extremen Wurzel.

- Siebe das streunende Kind der Wurzel des jetzt extremen Teilbaums nach unten im extremen Teilbaum.

Der resultierende Heap entspricht immer noch der Heap-Eigenschaft, während die ursprünglichen Heaps zerstört (gelöscht) werden. Die ursprünglichen Haufen können zerstört werden, da sich alle Informationen, die sie besaßen, noch auf dem neuen Haufen befinden is.

Grundlegende Heap-Operationen

find_max (find_min)

Dies bedeutet, den maximalen Wert im Array max-heap zu finden und eine Kopie zurückzugeben, oder den minimalen Wert im Array min-heap zu suchen und eine Kopie zurückzugeben. Ein Heap-Array erfüllt per Definition bereits die Heap-Eigenschaft. Geben Sie also einfach eine Kopie des ersten Elements des Arrays zurück.

einfügen

Dies bedeutet, dass Sie dem Heap-Array ein neues Element hinzufügen und das Array neu anordnen, damit die Heap-Eigenschaft des Diagramms erhalten bleibt (erfüllt). Der Algorithmus dafür ist für beide Arten von Heaps wie folgt:

- Angenommen, ein vollständiger Binärbaum. Das bedeutet, dass das Array ggf. am Ende mit leeren Plätzen gefüllt werden muss. Die Gesamtzahl der Knoten eines vollständigen Heaps beträgt 1, oder 3 oder 7 oder 15 oder 31 usw.; weiter verdoppeln und 1 . hinzufügen.

- Platzieren Sie den Knoten an der nach Größe am besten geeigneten leeren Position, gegen Ende des Heaps (zum Ende des Heap-Arrays). Wenn es keinen leeren Platz gibt, dann beginnen Sie eine neue Zeile von unten links.

- Bei Bedarf nachsieben, bis die Heap-Eigenschaft erfüllt ist.

Auszug_max (Auszug_min)

Suchen Sie den maximalen Wert im Array max-heap, entfernen Sie ihn und geben Sie ihn zurück. oder suchen Sie den Mindestwert im min-heap-Array, entfernen Sie ihn und geben Sie ihn zurück. Der Algorithmus zu extrahieren_max (extract_min) ist wie folgt:

- Entfernen Sie den Wurzelknoten.

- Nimm (entferne) den unteren rechten Knoten (letzter Knoten im Array) und platziere ihn an der Wurzel.

- Sieben Sie nach Bedarf, bis die Heap-Eigenschaft erfüllt ist.

delete_max (delete_min)

Suchen Sie den Wurzelknoten eines max-heap, der das erste Element des max-heap-Arrays ist, entfernen Sie ihn, ohne ihn unbedingt zurückzugeben; oder suchen Sie den Wurzelknoten eines Min-Heap, der das erste Element des Min-Heap-Arrays ist, entfernen Sie ihn, ohne ihn unbedingt zurückzugeben. Der Algorithmus zum Löschen des Wurzelknotens lautet wie folgt:

- Entfernen Sie den Wurzelknoten.

- Nimm (entferne) den unteren rechten Knoten (letzter Knoten im Array) und platziere ihn an der Wurzel.

- Sieben Sie nach Bedarf, bis die Heap-Eigenschaft erfüllt ist.

ersetzen

Suchen Sie den Wurzelknoten eines der beiden Heaps, entfernen Sie ihn und ersetzen Sie ihn durch den neuen. Es spielt keine Rolle, ob die alte Wurzel zurückgegeben wird. Sieben Sie ggf. nach unten, bis die Heap-Eigenschaft erfüllt ist.

Interne Heap-Operationen

raise_key (decrease_key)

Erhöhen Sie den Wert eines beliebigen Knotens für einen Max-Heap und ordnen Sie ihn neu an, sodass die Heap-Eigenschaft beibehalten wird, oder verringern Sie den Wert eines beliebigen Knotens für einen Min-Heap und ordnen Sie ihn neu an, sodass die Heap-Eigenschaft beibehalten wird. Sieben Sie nach Bedarf nach oben oder unten, bis die Heap-Eigenschaft erfüllt ist.

löschen

Entfernen Sie den interessierenden Knoten und ordnen Sie ihn dann neu an, sodass die Heap-Eigenschaft für den Max-Heap oder einen Min-Heap beibehalten wird. Der Algorithmus zum Löschen eines Knotens lautet wie folgt:

- Entfernen Sie den interessierenden Knoten.

- Nehmen (entfernen) Sie den Knoten ganz unten rechts (letzter Knoten im Array) und platzieren Sie ihn am Index des entfernten Knotens. Wenn sich der gelöschte Knoten in der letzten Zeile befindet, ist dies möglicherweise nicht erforderlich.

- Sieben Sie nach Bedarf nach oben oder unten, bis die Heap-Eigenschaft erfüllt ist.

Hochschalten

Verschieben Sie einen Knoten in einem Max-Heap oder Min-Heap so lange wie nötig nach oben, und ordnen Sie ihn neu an, um die Heap-Eigenschaft beizubehalten - Sift up.

Herunterschalten

Verschieben Sie einen Knoten in einem Max-Heap oder Min-Heap so lange wie nötig nach unten, und ordnen Sie ihn neu an, um die Heap-Eigenschaft beizubehalten - nach unten durchsieben.

Inspektion eines Haufens

Größe

Siehe oben!

ist leer

Siehe oben!

Andere Klassen von Haufen

Der in diesem Artikel beschriebene Heap kann als der wichtigste (allgemeine) Heap betrachtet werden. Es gibt andere Klassen von Haufen. Die beiden, die Sie darüber hinaus kennen sollten, sind jedoch der Binary Heap und der D-ary Heap.

Binärer Heap

Der binäre Heap ähnelt diesem Hauptheap, jedoch mit mehr Einschränkungen. Insbesondere muss der binäre Heap ein vollständiger Baum sein. Verwechseln Sie nicht zwischen einem vollständigen Baum und einem vollständigen Baum.

d-ary Haufen

Ein binärer Heap ist ein 2-ärer Heap. Ein Heap, bei dem jeder Knoten 3 Kinder hat, ist ein 3-ärer Heap. Ein Heap, bei dem jeder Knoten 4 Kinder hat, ist ein 4-ärer Heap und so weiter. Ein d-ary-Heap hat andere Einschränkungen.

Fazit

Ein Heap ist ein vollständiger oder fast vollständiger Binärbaum, der die Heap-Eigenschaft erfüllt. Die Eigenschaft heap hat zwei Alternativen: Für einen max-heap muss ein Elternteil gleich oder größer im Wert als die unmittelbaren Kinder sein; für einen Min-Heap muss ein Elternteil den gleichen oder einen geringeren Wert haben wie die unmittelbaren Kinder. Ein Heap kann als Baum oder in einem Array dargestellt werden. Bei Darstellung in einem Array ist der Wurzelknoten der erste Knoten des Arrays; und wenn ein Knoten bei Index n liegt, befindet sich sein erstes Kind im Array bei Index 2n+1 und sein nächstes Kind ist bei Index 2n+2. Ein Heap hat bestimmte Operationen, die auf dem Array ausgeführt werden.

Chrys

HD-Remastered-Spiele für Linux, die noch nie zuvor eine Linux-Version hatten
Viele Spieleentwickler und -herausgeber entwickeln HD-Remaster alter Spiele, um die Lebensdauer des Franchise zu verlängern. Bitte Fans, die Kompatibi...
So verwenden Sie AutoKey zur Automatisierung von Linux-Spielen
AutoKey ist ein Desktop-Automatisierungsdienstprogramm für Linux und X11, programmiert in Python 3, GTK und Qt. Mithilfe der Skript- und MACRO-Funktio...
So zeigen Sie den FPS-Zähler in Linux-Spielen an
Linux-Gaming bekam einen großen Schub, als Valve 2012 die Linux-Unterstützung für den Steam-Client und seine Spiele ankündigte. Seitdem haben viele AA...