Heap-Datenstruktur: Was ist ein Heap?
โก Intelligente Zusammenfassung
Die Heap-Datenstruktur ist ein spezialisierter vollstรคndiger Binรคrbaum, bei dem jeder Elternknoten eine strikte Ordnungsbeziehung zu seinen Kindern aufrechterhรคlt, was logarithmische Einfรผgungen, Lรถschungen und Prioritรคtswarteschlangenoperationen bei Sortier-, Planungs- und Graph-Workloads ermรถglicht.

Was ist eine Heap-Datenstruktur?
Ein Heap ist eine spezielle baumbasierte Datenstruktur. Er besteht aus einem obersten Knoten, der Wurzel (Elternknoten). Der zweite Knoten ist das linke Kind der Wurzel, der dritte das rechte. Die nachfolgenden Knoten werden von links nach rechts befรผllt. Der Schlรผssel jedes Elternknotens wird mit dem Schlรผssel seiner Kinder verglichen, um eine korrekte Anordnung zu gewรคhrleisten. Der Baum ist leicht zu visualisieren: Jede Einheit wird als Knoten bezeichnet, und jeder Knoten besitzt einen eindeutigen Schlรผssel zur Identifizierung.
Vereinfacht ausgedrรผckt ist ein Heap ein vollstรคndiger Binรคrbaum, der die Heap-Eigenschaft erfรผllt: Jeder Elternknoten ist konsistent mit seinen Kindern geordnet, was ihn ideal fรผr Prioritรคtswarteschlangen und Heapsort macht.
Warum benรถtigen Sie eine Heap-Datenstruktur?
Hier sind die Hauptgrรผnde fรผr die Verwendung eines Heaps:
- Die Heap-Datenstruktur ermรถglicht das Lรถschen und Einfรผgen in logarithmischer Zeit โ O(log2n.).
- Die Daten im Baum sind in einer bestimmten Reihenfolge angeordnet. Neben dem Aktualisieren oder Abfragen von Werten wie Maximum oder Minimum kann der Programmierer auch Beziehungen zwischen Eltern- und Tochterknoten ermitteln.
- Sie kรถnnen das Konzept des anwenden Dokumentobjektmodell um Ihnen das visuelle Verstรคndnis der Heap-Datenstruktur zu erleichtern.
- Heaps unterstรผtzen effiziente Prioritรคtswarteschlangenoperationen, die fรผr Graphalgorithmen wie Dijkstras kรผrzesten Pfad und Prims minimalen Spannbaum von entscheidender Bedeutung sind.
Arten von Haufen
Die Heap-Datenstruktur verfรผgt รผber verschiedene Algorithmen zum Einfรผgen und Entfernen von Elementen, darunter Prioritรคtswarteschlange, Binรคr-Heap, Binomial-Heap und Haufen sortieren.
- Prioritรคtswarteschlange: Es ist ein AbstracDie Datenstruktur enthรคlt priorisierte Objekte. Jedem Objekt oder Element ist eine Prioritรคt zugewiesen. Daher wird das Objekt oder Element mit der hรถheren Prioritรคt vor den รผbrigen bedient.
- Binรคrer Heap: Binรคre Heaps eignen sich fรผr einfache Heap-Operationen wie Lรถschungen und Einfรผgungen. Sie sind die Standardimplementierung der meisten Prioritรคtswarteschlangen der Standardbibliothek.
- Binomialhaufen: Ein Binomial-Heap besteht aus einer Reihe von Binomialbรคumen, die den Heap bilden. Ein Binomial-Heap-Baum ist kein gewรถhnlicher Baum, da er streng definiert ist. Die Gesamtzahl der Elemente in einem Binomialbaum betrรคgt immer 2<sup>n</sup>.n Knoten.
- Heap-Sortierung: Im Gegensatz zu den meisten Sortieralgorithmen benรถtigt Heap Sort O(1) Speicherplatz fรผr seine Sortieroperation. Es handelt sich um einen vergleichsbasierten Sortieralgorithmus, bei dem die Sortierung in aufsteigender Reihenfolge erfolgt, indem die Eingabe zunรคchst in einen Max-Heap umgewandelt wird. Man kann Heap Sort als eine erweiterte Version eines binรคren Suchbaums betrachten.
Typischerweise verwendet eine Heap-Datenstruktur zwei Strategien. Fรผr die Eingabe 12 โ 8 โ 4 โ 2 und 1:
- Min-Heap โ geringster Wert oben
- Max-Heap โ hรถchster Wert oben
Min-Heap
In der Min-Heap-Struktur hat der Wurzelknoten einen Wert, der gleich oder kleiner als der Wert seiner Kinderknoten ist. Die Wurzel eines Min-Heaps enthรคlt somit den Minimalwert. Der Min-Heap ist auรerdem ein vollstรคndiger Binรคrbaum.
Sobald ein Min-Heap in einem Baum existiert, kommen alle Blรคtter als Kandidaten fรผr den Maximalwert in Frage. Um jedoch den exakten Max-Heap-Wert zu ermitteln, muss jedes Blatt untersucht werden.
Min-Heap-Beispiel
Im obigen Diagramm ist eine klare Sequenz von der Wurzel bis zum untersten Knoten erkennbar.
Angenommen, Sie speichern die Elemente im Array Array_N[12, 2, 8, 1, 4]. Wie Sie dem Array entnehmen kรถnnen, verstรถรt das Wurzelelement gegen die Min-Heap-Prioritรคt. Um die Min-Heap-Eigenschaft zu erhalten, mรผssen Sie die Min-Heapify-Operationen durchfรผhren, um die Elemente so lange zu vertauschen, bis die Min-Heap-Regeln erfรผllt sind.
Max-Heap
In der Max-Heap-Struktur besitzt der Elternknoten (Wurzelknoten) einen Wert, der gleich oder grรถรer als der Wert seiner Kinder ist. Dieser Knoten enthรคlt den Maximalwert. Da es sich um einen vollstรคndigen Binรคrbaum handelt, lรคsst sich ein Max-Heap aus einer Menge von Werten in O(n) Zeit aufbauen.
Hier sind einige Methoden, die รผblicherweise bei der Implementierung von Java Max-Heap:
- Hinzufรผgen (): Fรผgt ein neues Element in einen Heap ein. Bei Verwendung eines Arrays werden die Objekte am Ende des Arrays hinzugefรผgt, wรคhrend sie im Binรคrbaum von oben nach unten und dann von links nach rechts eingefรผgt werden.
- Entfernen (): Diese Methode ermรถglicht es Ihnen, das erste Element aus der Array-Liste zu entfernen. Da das neu verschobene Element nicht mehr das grรถรte ist, verschiebt die Sift-Down-Methode es immer an seine neue Position.
- Sift-Down (): Diese Methode vergleicht ein Wurzelobjekt mit seinen Kindobjekten und verschiebt dann den verschobenen Knoten an seine richtige Position.
- Sift-Up (): Wenn Sie die Array-Methode verwenden, um ein neues Element zu einem Array hinzuzufรผgen, hilft die Sift-Up-Methode dem neu hinzugefรผgten Knoten dabei, an die richtige Position zu gelangen. Das neue Element wird zunรคchst mit seinem รผbergeordneten Element verglichen, indem die Baumstruktur simuliert wird.
Wende die Formel Parent_Index = Child_Index / 2 an. Fahre damit fort, bis sich das grรถรte Element am Anfang des Arrays befindet.
Grundlegender Heap Operations
Um die hรถchsten und niedrigsten Werte in einem Datensatz zu finden, benรถtigen Sie einige grundlegende Heap-Operationen wie Suchen, Einfรผgen und Lรถschen. Da Elemente stรคndig hinzugefรผgt und entfernt werden, sollten Sie Folgendes wissen:
- Finde โ Suchen Sie nach einem Gegenstand auf einem Haufen.
- Insert โ Fรผgen Sie dem Heap ein neues Kind hinzu.
- Lรถschen โ Lรถschen Sie einen Knoten aus einem Heap.
Erstellen Sie Haufen
Der Prozess des Aufbaus von Heaps wird als Heap-Erstellung bezeichnet. Ausgehend von einer Liste von Schlรผsseln erstellt der Programmierer einen leeren Heap und fรผgt dann die รผbrigen Schlรผssel nacheinander mithilfe der grundlegenden Heap-Operationen ein.
Beginnen wir also mit dem Aufbau eines Min-Heaps nach Williams Methode, indem wir die Werte 12, 2, 8, 1 und 4 einfรผgen. Man kann den Heap mit n Elementen aufbauen, indem man mit einem leeren Heap beginnt und ihn dann sukzessive mit anderen Elementen fรผllt. Die Laufzeit betrรคgt O(n log n).
- Heapify: Eine Einfรผgeroutine, die dabei hilft, Elemente in einen Heap einzufรผgen und gleichzeitig die Heap-Eigenschaften zu erhalten.
Eine Max-Heapify-Operation prรผft beispielsweise, ob der Wert des Elternelements grรถรer ist als der seiner Nachkommen. Die Elemente kรถnnen dann mithilfe von Methoden wie `swap` sortiert werden.ping.
- Verschmelzen: Wenn Sie zwei Heaps zu einem einzigen zusammenfรผhren mรถchten, verwenden Sie die Merge-Operation, um die Werte der beiden Heaps zusammenzufรผhren. Die ursprรผnglichen Heaps bleiben dabei erhalten.
Inspizieren Sie Haufen
Bei der Heap-Inspektion geht es darum, die Anzahl der Elemente in der Heap-Datenstruktur zu รผberprรผfen und festzustellen, ob der Heap leer ist.
Beim Sortieren oder Einreihen von Elementen ist es wichtig, den Heap zu รผberprรผfen. Die Prรผfung, ob Elemente zur Verarbeitung vorhanden sind, ist mit `Is-Empty()` wichtig. Die Heap-Grรถรe hilft, die Wurzeln des Max-Heaps bzw. Min-Heaps zu finden. Daher muss bekannt sein, wie viele Elemente der Heap-Eigenschaft folgen.
- Grรถรe โ Gibt die Grรถรe oder Lรคnge des Heaps zurรผck. Sie gibt an, wie viele Elemente in sortierter Reihenfolge gespeichert sind.
- Ist-Leer โ gibt TRUE zurรผck, wenn der Heap null ist, andernfalls gibt er FALSE zurรผck.
Hier drucken Sie alle Elemente im PrioritรคtQ Schleife ausfรผhren und dann รผberprรผfen, ob PriorityQ nicht leer ist.
//print head the head values While (!priorityQ.isEmpty()) { System.out.print(priorityQ.poll()+" ");
Verwendung der Heap-Datenstruktur
Die Heap-Datenstruktur ist in vielen Programmieranwendungen im realen Leben nรผtzlich, zum Beispiel:
- Hilft bei der Spamfilterung.
- Implementierung von Graphalgorithmen wie Dijkstra und Prim.
- OperaLastverteilung und Datenkomprimierung des Ting-Systems.
- Bestimmung von Ordnungsstatistiken wie dem k-kleinsten Element.
- Implementierung von Prioritรคtswarteschlangen, mit denen man Elemente in einer Liste in logarithmischer Zeit suchen kann.
- Die Heap-Datenstruktur wird auch zum Sortieren mittels Heap Sort verwendet.
- Simulation von Kunden in einer Warteschlange.
- Interruptbehandlung in der Betriebssystem.
- Bei der Huffman-Codierung zur Datenkomprimierung.
- Unterstรผtzung der Best-First-Suche und der A*-Heuristik in der KI-Pfadplanung.
Eigenschaften der Heap-Prioritรคtswarteschlange
Die folgenden Eigenschaften beschreiben das Verhalten der auf einem Heap aufgebauten Prioritรคtswarteschlange:
- Bei Prioritรคts-Heaps werden die Datenelemente in der Liste miteinander verglichen, um das kleinere oder grรถรere Element zu bestimmen.
- Ein Element wird in eine Warteschlange gestellt und anschlieรend in der Reihenfolge seiner Prioritรคt entfernt.
- Jedem einzelnen Element in der Prioritรคtswarteschlange ist eine eindeutige Nummer zugeordnet, die seine Prioritรคt angibt.
- Beim Verlassen einer Prioritรคtswarteschlange wird das Element mit der hรถchsten Prioritรคt zuerst verlassen.
Schritte zur Implementierung der Heap-Prioritรคtswarteschlange in Java
Der nรคchste Abschnitt fรผhrt in einen Beton Java Implementierung, die diese Regeln in funktionierenden Code umsetzt.
Heapsort in Java und Code Beispiel
import java.util.Arrays; public class HeapSort { public static void main(String[] args) { int[] arr = {5, 9, 3, 1, 8, 6}; // Sort the array using heap sort heapSort(arr); // Print the sorted array System.out.println(Arrays.toString(arr)); } public static void heapSort(int[] arr) { // Convert the array into a heap for (int i = arr.length / 2 - 1; i >= 0; i--) { heapify(arr, arr.length, i); } // Extract the maximum element from the heap and place it at the end of the array for (int i = arr.length - 1; i >= 0; i--) { int temp = arr[0]; arr[0] = arr[i]; arr[i] = temp; heapify(arr, i, 0); } } public static void heapify(int[] arr, int n, int i) { int largest = i; int left = 2 * i + 1; int right = 2 * i + 2; // Find the largest element among the root, left child, and right child if (left < n && arr[left] > arr[largest]) { largest = left; } if (right < n && arr[right] > arr[largest]) { largest = right; } // If the largest element is not the root, swap and heapify the sub-tree if (largest != i) { int temp = arr[i]; arr[i] = arr[largest]; arr[largest] = temp; heapify(arr, n, largest); } } }
Ausgang
Original Array: 5 9 3 1 8 6 Heap after insertion: 9 8 6 1 5 3 Heap after sorting: 1 3 5 6 8 9
Heapsort in Python und Code Beispiel
def heap_sort(arr): """ Sorts an array in ascending order using heap sort algorithm. Parameters: arr (list): The array to be sorted. Returns: list: The sorted array. """ n = len(arr) # Build a max heap from the array for i in range(n // 2 - 1, -1, -1): heapify(arr, n, i) # Extract elements from the heap one by one for i in range(n - 1, 0, -1): arr[0], arr[i] = arr[i], arr[0] # swap the root with the last element heapify(arr, i, 0) # heapify the reduced heap return arr def heapify(arr, n, i): """ Heapifies a subtree with the root at index i in the given array. Parameters: arr (list): The array containing the subtree to be heapified. n (int): The size of the subtree. i (int): The root index of the subtree. """ largest = i # initialize largest as the root left = 2 * i + 1 # left child index right = 2 * i + 2 # right child index # If left child is larger than root if left < n and arr[left] > arr[largest]: largest = left # If right child is larger than largest so far if right < n and arr[right] > arr[largest]: largest = right # If largest is not root if largest != i: arr[i], arr[largest] = ( arr[largest], arr[i], ) # swap the root with the largest element heapify(arr, n, largest) # recursively heapify the affected subtree arr = [4, 1, 3, 9, 7] sorted_arr = heap_sort(arr) print(sorted_arr)
Ausgang
[1, 3, 4, 7, 9]
Als Nรคchstes erfahren Sie mehr รผber die Bisektionsmethode.




