Heap-datastruktur: Hvad er en heap?

โšก Smart opsummering

Heap-datastruktur er et specialiseret komplet binรฆrt trรฆ, hvor hver overordnet node opretholder et strengt orderingsforhold med sine underordnede noder, hvilket muliggรธr logaritmiske indsรฆttelser, sletninger og prioritetskรธoperationer pรฅ tvรฆrs af sorterings-, planlรฆgnings- og grafarbejdsbelastninger.

  • ???? Trรฆets form: En heap er et komplet binรฆrt trรฆ fyldt fra venstre mod hรธjre med unikke nรธgler ved hver node for hurtig sammenligning.
  • โฌ†๏ธ Max-Heap: Hver forรฆlder er stรธrre end eller lig med sine bรธrn, sรฅ det stรธrste element sidder altid ved roden for O(1)-adgang.
  • โฌ‡๏ธ Min-Heap: Hver forรฆlder er mindre end eller lig med sine bรธrn, keeping det mindste element ved roden for prioriteret hentning.
  • โœ… Core Operationer: Find, Insert, Delete, Heapify og Merge kรธrer i O(log n) tid og understรธtter Heap Sort og Priority Queue-logik.
  • ๐Ÿงช Virkelige anvendelser: Heap Data Structure understรธtter spamfiltrering, grafalgoritmer, OS-planlรฆgning, Huffman-kodning og heuristisk sรธgning med AI.

Hvad er en heap-datastruktur?

En heap er en specialiseret trรฆbaseret datastruktur. Heap-datastrukturen bestรฅr af en รธverste node kaldet roden (forรฆlder). Dens anden node er rodens venstre barn, mens den tredje node er rodens hรธjre barn. De efterfรธlgende noder er udfyldt fra venstre mod hรธjre. Forรฆlder-nodenรธglen sammenlignes med dens afkom, sรฅ der opstรฅr en korrekt arrangement. Trรฆet er let at visualisere, hvor hver enhed kaldes en node, og hver node har en unik nรธgle til identifikation.

Enkelt sagt er en heap et komplet binรฆrt trรฆ, der opfylder heap-egenskaben: hver forรฆlder er ordnet konsistent i forhold til sine underordnede, hvilket gรธr den ideel til prioritetskรธer og heapsortering.

Hvorfor har du brug for Heap Data Structure?

Her er de vigtigste grunde til at bruge en Heap:

  • Heap-datastrukturen tillader sletning og indsรฆttelse i logaritmisk tid โ€“ O(log2ikke).
  • Dataene i trรฆet er arrangeret i en bestemt rรฆkkefรธlge. Udover at opdatere eller forespรธrge pรฅ vรฆrdier sรฅsom et maksimum eller minimum, kan programmรธren finde relationer mellem forรฆlderen og afkommet.
  • Du kan anvende begrebet Dokumentobjektmodel for at hjรฆlpe dig med at forstรฅ heap-datastrukturen visuelt.
  • Heaps understรธtter effektive prioritetskรธoperationer, som er kritiske for grafalgoritmer sรฅsom Dijkstras korteste vej og Prims minimum spanning tree.

Typer af dynger

Heap Data Structure har forskellige algoritmer til hรฅndtering af indsรฆttelser og fjernelse af elementer, herunder Priority Queue, Binary Heap, Binomial Heap og Dynge sortering.

  • Prioritetskรธ: Det er en mavemuskeltracen datastruktur, der indeholder prioriterede objekter. Hvert objekt eller element har en forudbestemt prioritet. Derfor fรฅr det objekt eller element, der har fรฅet tildelt den hรธjeste prioritet, tjenesten fรธr resten.
  • Binรฆr bunke: Binรฆre heaps er velegnede til simple heap-operationer sรฅsom sletninger og indsรฆttelser. De er standardimplementeringen bag de fleste standard biblioteksprioritetskรธer.
  • Binomial bunke: En binomial heap bestรฅr af en rรฆkke samlinger af binomialtrรฆer, der udgรธr heapen. Et binomial heaptrรฆ er ikke et almindeligt trรฆ, da det er strengt defineret. Det samlede antal elementer i et binomialtrรฆ er altid lig med 2.n noder.
  • Sortering i bunke: I modsรฆtning til de fleste sorteringsalgoritmer bruger Heap Sort O(1)-plads til sin sorteringsoperation. Det er en sammenligningsbaseret sorteringsalgoritme, hvor sortering sker i stigende rรฆkkefรธlge ved fรธrst at omdanne inputtet til en Max-Heap. Du kan se Heap Sort som et opgraderet binรฆrt sรธgetrรฆ.

Typisk anvender en heap-datastruktur to strategier. For input 12 โ€“ 8 โ€“ 4 โ€“ 2 og 1:

  • Min-Heap โ€“ mindst vรฆrdi รธverst
  • Max-Heap โ€“ hรธjeste vรฆrdi รธverst

Typer af dynger

Min-Heap

I Min-Heap-strukturen har rodnoden en vรฆrdi, der enten er lig med eller mindre end nodens bรธrn. Roden af โ€‹โ€‹en Min-Heap har derfor minimumsvรฆrdien. Min-Heapen er ogsรฅ et komplet binรฆrt trรฆ.

Nรฅr du har en Min-Heap i et trรฆ, er alle bladene brugbare kandidater til den maksimale vรฆrdi. Du skal dog undersรธge hvert blad for at fรฅ den nรธjagtige Max-Heap-vรฆrdi.

Eksempel pรฅ min-heap

Min bunke eksempel

I diagrammet ovenfor kan du se en tydelig rรฆkkefรธlge fra roden til den laveste knude.

Antag, at du gemmer elementerne i arrayet Array_N[12, 2, 8, 1, 4]. Som du kan se fra arrayet, overtrรฆder rodelementet Min-Heap-prioriteten. For at bevare Min-Heap-egenskaben skal du udfรธre min-heapify-operationerne for at bytte om pรฅ elementerne, indtil Min-Heap-reglerne er opfyldt.

Max-Heap

I Max-Heap-strukturen har den overordnede eller rodnode en vรฆrdi, der er lig med eller stรธrre end dens undernoder. Denne node indeholder den maksimale vรฆrdi. Det er et komplet binรฆrt trรฆ, sรฅ du kan bygge en Max-Heap ud fra en samling af vรฆrdier i O(n) tid.

Her er et par metoder, der ofte bruges, nรฅr man implementerer en Java Max-Heap:

  • Tilfรธj (): Placerer et nyt element i en heap. Hvis du bruger et array, tilfรธjes objekterne i slutningen af โ€‹โ€‹arrayet, mens objekterne i det binรฆre trรฆ tilfรธjes fra top til bund og derefter fra venstre til hรธjre.
  • Fjern (): Denne metode giver dig mulighed for at fjerne det fรธrste element fra arraylisten. Da det nyligt forfremmede element ikke lรฆngere er det stรธrste, skubber Sift-Down-metoden det altid til sin nye placering.
  • Sigt ned (): Denne metode sammenligner et rodobjekt med dets underobjekter og skubber derefter den flyttede node til sin rette position.
  • Sigt op (): Hvis du bruger array-metoden til at tilfรธje et nyligt indsat element til et array, hjรฆlper Sift-Up-metoden den nyligt tilfรธjede node med at flytte sig til sin korrekte position. Det nye element sammenlignes fรธrst med dets overordnede element ved at simulere trรฆets datastruktur.

    Anvend formlen Parent_Index = Child_Index / 2. Du fortsรฆtter med at gรธre dette, indtil det maksimale element er forrest i arrayet.

Basic Heap Operationer

For at finde de hรธjeste og laveste vรฆrdier i et datasรฆt, skal du bruge et par grundlรฆggende heap-operationer sรฅsom find, insert og delete. Fordi elementer konstant kommer og gรฅr, bรธr du vide, hvordan du:

  • Finde โ€“ Se efter en genstand i en bunke.
  • indsatte โ€“ Tilfรธj et nyt barn i dyngen.
  • Slette โ€“ Slet en node fra en heap.

Opret dynger

Processen med at konstruere heaps er kendt som at oprette heaps. Givet en liste over nรธgler opretter programmรธren en tom heap og indsรฆtter derefter de andre nรธgler รฉn ad gangen ved hjรฆlp af de grundlรฆggende heap-operationer.

Sรฅ lad os begynde at bygge en Min-Heap ved hjรฆlp af Williams metode ved at indsรฆtte vรฆrdierne 12, 2, 8, 1 og 4. Du kan bygge heapen med n elementer ved at starte med en tom heap og derefter fylde den successivt med andre elementer ved hjรฆlp af O(n log n) tid.

Opret dynger

  • Heapify: En indsรฆttelsesrutine, der hjรฆlper med at indsรฆtte elementer i en heap, samtidig med at heap-egenskaben bevares.

    For eksempel kontrollerer en max-heapify-operation, at vรฆrdien af โ€‹โ€‹โ€‹โ€‹forรฆlderen er stรธrre end dens afkom. Elementerne kan derefter sorteres ved hjรฆlp af metoder som swapping.

  • Fusionere: Nรฅr du har to heaps, der skal kombineres til รฉn, skal du bruge merge-operationen til at bringe vรฆrdierne fra de to heaps sammen. De oprindelige heaps bevares stadig.

Undersรธg dynger

Inspektion af heaps refererer til at kontrollere antallet af elementer i heap-datastrukturen og validere, om heapen er tom.

Det er vigtigt at inspicere heaps, nรฅr man sorterer eller sรฆtter elementer i kรธ. Det er vigtigt at kontrollere, at der er elementer at behandle ved hjรฆlp af Is-Empty(). Heapstรธrrelsen vil hjรฆlpe med at finde Max-Heap- eller Min-Heap-rรธdderne, sรฅ du skal vide, hvor mange elementer der fรธlger heap-egenskaben.

  • Stรธrrelse โ€“ returnerer stรธrrelsen eller lรฆngden af โ€‹โ€‹heapen. Den fortรฆller dig, hvor mange elementer der er gemt i sorteret rรฆkkefรธlge.
  • Er tom โ€“ returnerer TRUE, hvis heapen er null, ellers returneres FALSE.

Her udskriver du alle elementer i prioritet Q slรธjfe og derefter kontrollere, at priorityQ ikke er tom.

//print head the head values
       While (!priorityQ.isEmpty()) {
        System.out.print(priorityQ.poll()+" ");

Brug af heap-datastruktur

Heap-datastruktur er nyttig i mange programmeringsapplikationer i det virkelige liv, sรฅsom:

  • Hjรฆlper med spamfiltrering.
  • Implementering af grafalgoritmer som Dijkstra og Prim.
  • Operabelastningsbalancering og datakomprimering af systemet.
  • At finde ordensstatistik, sรฅsom det k-te mindste element.
  • Implementering af prioriterede kรธer, hvor du kan sรธge efter elementer pรฅ en liste i logaritmisk tid.
  • Heap-datastruktur bruges ogsรฅ til sortering via Heap Sort.
  • Simulering af kunder i ventekรธ.
  • Afbryd hรฅndtering i Operating System.
  • I Huffman-kodning til datakomprimering.
  • Styrker bedst-fรธrst-sรธgning og A*-heuristikker i AI-stiplanlรฆgning.

Egenskaber for bunkeprioriteret kรธ

Fรธlgende egenskaber beskriver, hvordan prioritetskรธen, der er bygget pรฅ en heap, opfรธrer sig:

  • I prioritetsheaps sammenlignes dataelementerne i listen med hinanden for at bestemme det mindste eller stรธrste element.
  • Et element placeres i en kรธ og fjernes derefter i prioriteret rรฆkkefรธlge.
  • Hvert enkelt element i prioritetskรธen har et unikt nummer relateret til det, der er identificeret som en prioritet.
  • Nรฅr en prioritetskรธ forlades, afsluttes elementet med den hรธjeste prioritet fรธrst.

Trin til implementering af Heap Priority Queue i Java

Den nรฆste sektion bevรฆger sig ind i en beton Java implementering, der omdanner disse regler til fungerende kode.

Trin til implementering af Heap Priority Queue

Heap Sorter i Java med Code Eksempel

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);
        }
    }
}

Produktion

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

Heap Sorter i Python med Code Eksempel

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)

Produktion

[1, 3, 4, 7, 9]

Dernรฆst vil du lรฆre om Bisektionsmetode.

Ofte Stillede Spรธrgsmรฅl

En heap garanterer kun forรฆldre-barn-rรฆkkefรธlge, sรฅ roden er minimum eller maksimum. Et binรฆrt sรธgetrรฆ garanterer venstre-undertrรฆ-mindre-end-rod-mindre-end-hรธjre-undertrรฆ-rรฆkkefรธlge pรฅ tvรฆrs af hver node, hvilket understรธtter hurtig gennemgang af rรฆkkefรธlge og nรธglesรธgning.

Vรฆlg en Max-Heap, nรฅr din applikation gentagne gange har brug for det stรธrste element, f.eks. ved planlรฆgning af opgaven med hรธjest prioritet eller ved kรธrsel af Heap Sort i stigende rรฆkkefรธlge. Vรฆlg en Min-Heap, nรฅr du har brug for det mindste element fรธrst, f.eks. Dijkstra's korteste sti.

Indsรฆttelse og sletning i en Heap Data Structure kรธrer i O(log n) pรฅ grund af heapify-stien fra rod til blad. Det krรฆver O(n) at kigge pรฅ minimums- eller maksimumskรธrselerne i O(1) og opbygge en heap fra n elementer.

Heap Sort er pรฅ plads, fordi den sorterer arrayet ved hjรฆlp af O(1) ekstra hukommelse ud over inputtet. Den er ikke stabil, da lige nรธgler kan bytte relativ rรฆkkefรธlge under heapify og ex.tract-max-trin brugt til at producere det sorterede output.

AI-sรธgealgoritmer som A* og best-first-sรธgning gemmer frontier-noder i en Min-Heap, der er nรธglebaseret pรฅ en heuristisk omkostning. Heapen garanterer, at den billigste kandidat udvides som den nรฆste, hvilket er afgรธrende for hurtig stifinding, spil-AI og robotplanlรฆggere.

Ja. AI-assisterede visualiseringsvรฆrktรธjer kan generere trinvise diagrammer af indsรฆttelser, heapify swaps og extract-max-operationer fra din kode. De markerer ogsรฅ overtrรฆdelser af heap-egenskaber, foreslรฅr rettelser og forklarer den asymptotiske adfรฆrd i et letforstรฅeligt sprog, hvilket fremskynder lรฆring og fejlfinding.

Opsummer dette indlรฆg med: