Heap-Datenstruktur: Was ist Heap? Min. und Max. Heap (Beispiel)

Was ist ein Heap?

Heap ist eine spezialisierte Baumdatenstruktur. Der Heap besteht aus dem obersten Knoten, der als Wurzel (รผbergeordnet) bezeichnet wird. Sein zweites Kind ist das linke Kind der Wurzel, wรคhrend der dritte Knoten das rechte Kind der Wurzel ist. Die aufeinanderfolgenden Knoten werden von links nach rechts gefรผllt. Der Schlรผssel des รผbergeordneten Knotens wird mit dem seines untergeordneten Knotens verglichen, und es entsteht eine ordnungsgemรครŸe Anordnung. Der Baum lรคsst sich leicht visualisieren, wobei jede Entitรคt als Knoten bezeichnet wird. Der Knoten verfรผgt รผber eindeutige Schlรผssel zur Identifizierung.

Warum benรถtigen Sie eine Heap-Datenstruktur?

Hier sind die Hauptgrรผnde fรผr die Verwendung der Heap-Datenstruktur:

  • 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 Dingen wie einem Maximum oder Minimum kann der Programmierer Beziehungen zwischen dem Elternteil und dem Nachkommen finden.
  • Sie kรถnnen das Konzept des anwenden Dokumentobjektmodell um Ihnen beim Verstรคndnis der Heap-Datenstruktur zu helfen.

Arten von Haufen

Die Heap-Datenstruktur verfรผgt รผber verschiedene Algorithmen zum Verarbeiten von Einfรผgungen und Entfernen von Elementen in einer Heap-Datenstruktur, darunter Priority-Queue, Binary-Heap, Binomial Heap und Heap-Sortierung.

  • Prioritรคtswarteschlange: Es handelt sich um eine abstrakte Datenstruktur, die priorisierte Objekte enthรคlt. Fรผr jedes Objekt oder Element ist eine Prioritรคt festgelegt. Daher erhรคlt das Objekt oder Element, dem die hรถhere Prioritรคt zugewiesen wurde, den Service vor den anderen.
  • Binรคr-Heap: Binรคre Heaps eignen sich fรผr einfache Heap-Operationen wie Lรถschungen und Einfรผgungen.
  • Binomial-Heap: Ein Binomial-Heap besteht aus einer Reihe von Sammlungen von Binomialbรคumen, aus denen der Heap besteht. Binomial-Heap-Baum ist kein gewรถhnlicher Baum, wie er streng definiert ist. Die Gesamtzahl der Elemente in einem Binomialbaum betrรคgt immer 2n Knoten.
  • Heap-Sortierung: Im Gegensatz zu den meisten Sortieralgorithmen verwendet Heapsort fรผr seine Sortieroperation O(1) Speicherplatz. Es handelt sich um einen vergleichsbasierten Sortieralgorithmus, bei dem die Sortierung in aufsteigender Reihenfolge erfolgt, indem zunรคchst ein maximaler Heap erstellt wird. Sie kรถnnen Heapsort als einen qualitativ verbesserten binรคren Suchbaum betrachten.

Typischerweise verwendet eine Heap-Datenstruktur zwei Strategien. Fรผr Eingang 12 โ€“ 8 โ€“ 4 โ€“ 2 und 1

  • Min. Heap โ€“ kleinster Wert oben
  • Max Heap โ€“ hรถchster Wert oben

Arten von Haufen

Min. Haufen

In der Min-Heap-Struktur hat der Wurzelknoten einen Wert, der entweder gleich oder kleiner als der Wert der untergeordneten Knoten auf diesem Knoten ist. Dieser Heap-Knoten eines Min-Heaps enthรคlt den Mindestwert. Alles in allem ist seine Min-Heap-Struktur vollstรคndig binรคrer Baum.

Sobald Sie einen Min-Haufen in einem Baum haben, sind alle Blรคtter brauchbare Kandidaten. Sie mรผssen jedoch jedes Blatt untersuchen, um den genauen Max-Heap-Wert zu erhalten.

Beispiel fรผr einen minimalen Heap

Beispiel fรผr einen minimalen Heap

In den obigen Diagrammen kรถnnen Sie eine klare Reihenfolge von der Wurzel bis zum untersten Knoten erkennen.

Angenommen, Sie speichern die Elemente im Array Array_N[12,2,8,1,4]. Wie Sie dem Array entnehmen kรถnnen, verletzt das Stammelement die Min-Heap-Prioritรคt. Um die Min-Heap-Eigenschaft beizubehalten, mรผssen Sie die Min-Heapify-Operationen ausfรผhren, um die Elemente auszutauschen, bis die Min-Heap-Eigenschaften erfรผllt sind.

Max. Haufen

In der Struktur von Max Heap hat der รผbergeordnete oder Wurzelknoten einen Wert, der gleich oder grรถรŸer als der Wert seiner untergeordneten Knoten im Knoten ist. Dieser Knoten enthรคlt den Maximalwert. Darรผber hinaus handelt es sich um einen vollstรคndigen Binรคrbaum, sodass Sie aus einer Sammlung von Werten einen maximalen Heap erstellen und diesen mit O(n)-Zeit ausfรผhren kรถnnen.

Hier sind einige Methoden zum Implementieren eines Java-Max-Heaps

  • Hinzufรผgen (): Platzieren Sie ein neues Element in einem Heap. Wenn Sie ein Array verwenden, werden die Objekte am Ende des Arrays hinzugefรผgt, wรคhrend im Binรคrbaum die Objekte von oben nach unten und dann von links nach rechts hinzugefรผgt werden.
  • Entfernen (): Mit dieser Methode kรถnnen Sie das erste Element aus der Array-Liste entfernen. Da das neu hinzugefรผgte Element nicht mehr das grรถรŸte ist, verschiebt es die Sift-Down-Methode immer an seine neue Position.
  • Heruntersieben (): Diese Methode vergleicht ein Stammobjekt mit seinem untergeordneten Objekt und verschiebt dann den neu hinzugefรผgten Knoten an seine rechtmรครŸige Position.
  • Sift-Up (): Wenn Sie die Array-Methode verwenden, um ein neu eingefรผgtes Element zu einem Array hinzuzufรผgen, hilft die Sift-Up-Methode dabei, den neu hinzugefรผgten Knoten an seine neue Position zu verschieben. Das neu eingefรผgte Element wird zunรคchst durch Simulation der Baumdatenstruktur mit dem รผbergeordneten Element verglichen.

    Wenden Sie die Formel Parent_Index=Child_Index/2 an. Dies machen Sie so lange, bis sich das maximale Element am Anfang des Arrays befindet.

Grundlegender Heap Operations

Um die hรถchsten und niedrigsten Werte in einem Datensatz zu finden, benรถtigen Sie viele grundlegende Heap-Operationen wie Suchen, Lรถschen und Einfรผgen. Da Elemente stรคndig kommen und gehen, mรผssen Sie:

  • 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 der Heap-Konstruktion wird als Heap-Erstellung bezeichnet. Aus einer gegebenen Liste von Schlรผsseln erstellt der Programmierer einen leeren Heap und fรผgt dann mithilfe grundlegender Heap-Operationen nacheinander weitere Schlรผssel ein.

Beginnen wir also mit dem Aufbau eines Min-Heaps mit der Methode von Willaim, indem wir die Werte 12,2,8,1 und 4 in einen Heap einfรผgen. Sie kรถnnen den Heap mit n Elementen aufbauen, indem Sie mit einem leeren Heap beginnen und ihn dann nacheinander mit O (nlogn) Zeit mit anderen Elementen fรผllen.

Erstellen Sie Haufen

  • Heapify: Einfรผgealgorithmus, der beim Einfรผgen von Elementen in einen Heap hilft. Dabei wird geprรผft, ob die Eigenschaft โ€žHeap-Datenstruktur hervorgehobenโ€œ ist.

    Beispielsweise wรผrde ein Max-Heapify prรผfen, ob der Wert des รผbergeordneten Elements grรถรŸer ist als der des untergeordneten Elements. Die Elemente kรถnnen dann mit Methoden wie Swapping sortiert werden.

  • Zusammenfรผhren: Wenn Sie davon ausgehen, dass Sie zwei Heaps zu einem zusammenfassen mรผssen, verwenden Sie Merge-Heaps, um die Werte der beiden Heaps zusammenzufรผhren. Die ursprรผnglichen Halden sind jedoch noch erhalten.

Inspizieren Sie Haufen

Beim Untersuchen von Heaps geht es darum, die Anzahl der Elemente in der Heap-Datenstruktur zu รผberprรผfen und zu validieren, ob der Heap leer ist.

Es ist wichtig, Heaps beim Sortieren oder Einreihen von Elementen zu รผberprรผfen. Es ist wichtig, mit Is-Empty() zu prรผfen, ob Sie Elemente zum Verarbeiten haben. Die Heap-GrรถรŸe hilft dabei, den Max-Heap oder Min-Heap zu finden. Sie mรผssen also die Elemente kennen, die der Heap-Eigenschaft folgen.

  • GrรถรŸe โ€“ gibt die GrรถรŸe oder Lรคnge des Heaps zurรผck. Sie kรถnnen erkennen, wie viele Elemente in sortierter Reihenfolge vorhanden sind.
  • Ist leer โ€“ Wenn der Heap NULL ist, wird TRUE zurรผckgegeben, andernfalls FALSE.

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 wirklichen Leben nรผtzlich, wie zum Beispiel:

  • Hilft bei der Spam-Filterung.
  • Implementieren von Graphenalgorithmen.
  • OperaSystemlastausgleich und Datenkomprimierung.
  • Finden Sie die Reihenfolge in der Statistik.
  • Implementieren Sie Prioritรคtswarteschlangen, mit denen Sie in logarithmischer Zeit nach Elementen in einer Liste suchen kรถnnen.
  • Heap-Datenstruktur wird auch zum Sortieren verwendet.
  • Simulation von Kunden an einer Leitung.
  • Behandlung unterbrechen Betriebssystem.
  • In Huffmans Codierung zur Datenkomprimierung.

Eigenschaften der Heap-Prioritรคtswarteschlange

  • Bei Prioritรคtsheaps werden die Datenelemente in der Liste miteinander verglichen, um das kleinere Element zu bestimmen.
  • Ein Element wird in eine Warteschlange gestellt und anschlieรŸend entfernt.
  • Jedes einzelne Element in der Prioritรคtswarteschlange verfรผgt รผber eine eindeutige Nummer, die als Prioritรคt gekennzeichnet ist.
  • 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

Schritte zum Implementieren der Heap-Prioritรคtswarteschlange

Heap-Sortierung in JAVA mit Codebeispiel

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 the root and the largest element 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 mit Codebeispiel

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 darรผber Bisektionsmethode

Zusammenfassung

  • Heap ist eine spezielle Baumdatenstruktur. Stellen wir uns einen Stammbaum mit seinen Eltern und Kindern vor.
  • Die Heaps-Datenstruktur in Java ermรถglicht das Lรถschen und Einfรผgen in logarithmischer Zeit โ€“ O(log2n.).
  • Haufenweise rein Python verfรผgt รผber verschiedene Algorithmen zum Verarbeiten von Einfรผgungen und Entfernen von Elementen in einer Heap-Datenstruktur, darunter Priority-Queue, Binary-Heap, Binomial Heap und Heapsort.
  • In der Min-Heap-Struktur hat der Wurzelknoten einen Wert, der gleich oder kleiner als der Wert der untergeordneten Knoten auf diesem Knoten ist.
  • In der Struktur von Max Heap hat der Wurzelknoten (รผbergeordneter Knoten) einen Wert, der gleich oder grรถรŸer als der Wert seiner untergeordneten Knoten im Knoten ist.
  • Beim Untersuchen von Heaps geht es darum, die Anzahl der Elemente in der Heap-Datenstruktur zu รผberprรผfen und zu validieren, ob der Heap leer ist.

Fassen Sie diesen Beitrag mit folgenden Worten zusammen: