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.

  • ๐ŸŒณ Baumform: Ein Heap ist ein vollstรคndiger Binรคrbaum, der von links nach rechts gefรผllt wird und an jedem Knoten eindeutige Schlรผssel fรผr einen schnellen Vergleich besitzt.
  • โฌ†๏ธ Max-Heap: Jedes Elternelement ist grรถรŸer oder gleich seinen Kindern, sodass das grรถรŸte Element immer an der Wurzel steht und somit ein Zugriff in konstanter Zeit (O(1)) mรถglich ist.
  • โฌ‡๏ธ Min-Heap: Jeder Elternteil ist seinen Kindern gleich oder kleiner, keeping Das kleinste Element an der Wurzel fรผr den prioritรคren Abruf.
  • โœ… Core Operanationen: Suchen, Einfรผgen, Lรถschen, Heapifizieren und Zusammenfรผhren werden in O(log n) Zeit ausgefรผhrt und unterstรผtzen Heap-Sortierung und Prioritรคtswarteschlangenlogik.
  • ๐Ÿงช Reale Anwendungsfรคlle: Die Heap-Datenstruktur ist die Grundlage fรผr Spamfilter, Graphalgorithmen, Betriebssystemplanung, Huffman-Codierung und heuristische KI-Suche.

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

Arten von Haufen

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

Beispiel fรผr einen minimalen Heap

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).

Erstellen Sie Haufen

  • 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.

Schritte zum Implementieren der Heap-Prioritรคtswarteschlange

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.

Hรคufig gestellte Fragen

Ein Heap garantiert lediglich die Eltern-Kind-Reihenfolge, sodass die Wurzel das Minimum oder Maximum darstellt. Ein binรคrer Suchbaum hingegen garantiert die Reihenfolge โ€žlinker Teilbaum kleiner als Wurzel kleiner als rechter Teilbaumโ€œ รผber alle Knoten hinweg und unterstรผtzt so schnelles In-Order-Traversieren und die Suche nach Schlรผsseln.

Wรคhlen Sie einen Max-Heap, wenn Ihre Anwendung wiederholt das grรถรŸte Element benรถtigt, beispielsweise um die Aufgabe mit der hรถchsten Prioritรคt einzuplanen oder Heap Sort in aufsteigender Reihenfolge auszufรผhren. Wรคhlen Sie einen Min-Heap, wenn Sie zuerst das kleinste Element benรถtigen, wie beispielsweise fรผr den kรผrzesten Pfad nach Dijkstra.

Das Einfรผgen und Lรถschen in einer Heap-Datenstruktur erfolgt in O(log n), da der Pfad von der Wurzel zum Blatt heapify ist. Das Prรผfen des Minimums oder Maximums erfolgt in O(1), und das Erstellen eines Heaps aus n Elementen benรถtigt O(n).

Heapsort ist ein In-Place-Verfahren, da es das Array mit O(1) zusรคtzlichem Speicher รผber den Eingabespeicher hinaus sortiert. Es ist jedoch nicht stabil, da gleiche Schlรผssel wรคhrend der Heapify- und Exit-Operationen ihre relative Reihenfolge รคndern kรถnnen.tract-max Schritte, die zur Erzeugung der sortierten Ausgabe verwendet wurden.

KI-Suchalgorithmen wie A* und Best-First-Suche speichern die Grenzknoten in einem Min-Heap, dessen Schlรผssel eine heuristische Kostenfunktion ist. Der Heap garantiert, dass der gรผnstigste Kandidat als nรคchstes expandiert wird, was fรผr schnelle Pfadfindung, Spiel-KI und Roboterplanung entscheidend ist.

Ja. KI-gestรผtzte Visualisierungstools kรถnnen schrittweise Diagramme von Einfรผgungen, Heapify-Swaps und Exit-Operationen generieren.tracSie erkennen t-Max-Operationen in Ihrem Code. AuรŸerdem weisen sie auf Verletzungen von Heap-Eigenschaften hin, schlagen Korrekturen vor und erklรคren das asymptotische Verhalten in einfacher Sprache, was das Lernen und Debuggen beschleunigt.

Fassen Sie diesen Beitrag mit folgenden Worten zusammen: