Heap-datastruktur: Hva er Heap?

โšก Smart oppsummering

Heap Data Structure er et spesialisert komplett binรฆrt tre der hver foreldrenode opprettholder et strengt ordnelsesforhold med sine barn, noe som muliggjรธr logaritmiske innsettinger, slettinger og prioritetskรธoperasjoner pรฅ tvers av sorterings-, planleggings- og grafarbeidsbelastninger.

  • ???? Treform: En heap er et komplett binรฆrtre fylt fra venstre til hรธyre, med unike nรธkler pรฅ hver node for rask sammenligning.
  • โฌ†๏ธ Maks-Heap: Hver forelder er stรธrre enn eller lik sine barn, sรฅ det stรธrste elementet sitter alltid ved roten for O(1)-tilgang.
  • โฌ‡๏ธ Min-Heap: Hver forelder er mindre enn eller lik sine barn, keeping det minste elementet ved roten for prioritert henting.
  • โœ… Kjerne Operatjoner: Sรธk, Sett inn, Slett, Heapify og Merge kjรธrer pรฅ O(log n) tid, og stรธtter Heap Sort og Priority Queue-logikk.
  • ๐Ÿงช Reelle bruksomrรฅder: Heap Data Structure driver spamfiltrering, grafalgoritmer, OS-planlegging, Huffman-koding og heuristisk sรธk โ€‹โ€‹med AI.

Hva er en heap-datastruktur?

En heap er en spesialisert trebasert datastruktur. Heap-datastrukturen bestรฅr av en รธverste node kalt roten (forelderen). Den andre noden er rotens venstre barn, mens den tredje noden er rotens hรธyre barn. De pรฅfรธlgende nodene fylles fra venstre til hรธyre. Foreldre-node-nรธkkelen sammenlignes med dens avkom, slik at et riktig arrangement oppstรฅr. Treet er lett รฅ visualisere der hver enhet kalles en node, og hver node har en unik nรธkkel for identifikasjon.

Enkelt sagt er en Heap et komplett binรฆrt tre som tilfredsstiller heap-egenskapen: hver forelder er ordnet konsekvent mot sine barn, noe som gjรธr den ideell for prioritetskรธer og Heap Sort.

Hvorfor trenger du Heap Data Structure?

Her er hovedgrunnene til รฅ bruke en Heap:

  • Heap-datastrukturen tillater sletting og innsetting i logaritmisk tid โ€“ O(log2ikke).
  • Dataene i treet er ordnet i en bestemt rekkefรธlge. I tillegg til รฅ oppdatere eller spรธrre etter verdier som maksimum eller minimum, kan programmereren finne relasjoner mellom forelderen og avkommet.
  • Du kan bruke konseptet Dokumentobjektmodell for รฅ hjelpe deg med รฅ forstรฅ heap-datastrukturen visuelt.
  • Heaps stรธtter effektive prioritetskรธoperasjoner, som er kritiske for grafalgoritmer som Dijkstras korteste sti og Prims minimum spanning tree.

Typer av hauger

Heap Data Structure har forskjellige algoritmer for รฅ hรฅndtere innsettinger og fjerning av elementer, inkludert prioritetskรธ, binรฆr heap, binomial heap og Sortering i bunke.

  • Prioritetskรธ: Det er en magemuskeltract-datastruktur som inneholder prioriterte objekter. Hvert objekt eller element har en forhรฅndsbestemt prioritet. Derfor fรฅr objektet eller elementet som er tildelt hรธyest prioritet tjenesten fรธr resten.
  • Binรฆr heap: Binรฆre heaper er egnet for enkle heap-operasjoner som slettinger og innsettinger. De er standardimplementeringen bak de fleste standard bibliotekprioritetskรธer.
  • Binomialhaug: En binomialhaug bestรฅr av en serie samlinger av binomialtrรฆr som utgjรธr haugen. Et binomialhaugtre er ikke et vanlig tre, da det er strengt definert. Det totale antallet elementer i et binomialtre er alltid lik 2.n noder.
  • Sortering i bunke: I motsetning til de fleste sorteringsalgoritmer bruker Heap Sort O(1)-plass for sorteringsoperasjonen sin. Det er en sammenligningsbasert sorteringsalgoritme der sortering skjer i stigende rekkefรธlge ved fรธrst รฅ gjรธre inputen om til en Max-Heap. Du kan se pรฅ Heap Sort som et oppgradert binรฆrt sรธketre.

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

  • Min-haug โ€“ minst verdi pรฅ toppen
  • Max-Heap โ€“ hรธyeste verdi pรฅ toppen

Typer av hauger

Min-haug

I Min-Heap-strukturen har rotnoden en verdi som enten er lik eller mindre enn nodens barn. Roten til en Min-Heap har derfor minimumsverdien. Min-Heapen er ogsรฅ et komplett binรฆrt tre.

Nรฅr du har en min-haug i et tre, er alle bladene levedyktige kandidater for maksimalverdien. Du mรฅ imidlertid undersรธke hvert blad for รฅ fรฅ den nรธyaktige maks-haugverdien.

Eksempel pรฅ min-heap

Min haug eksempel

I diagrammet ovenfor kan du se en tydelig sekvens fra roten til den laveste noden.

Anta at du lagrer elementene i arrayet Array_N[12, 2, 8, 1, 4]. Som du kan se fra arrayet, bryter rotelementet Min-Heap-prioriteten. For รฅ opprettholde Min-Heap-egenskapen mรฅ du utfรธre min-heapify-operasjonene for รฅ bytte elementene til Min-Heap-reglene er oppfylt.

Max-Heap

I Max-Heap-strukturen har foreldre- eller rotnoden en verdi lik eller stรธrre enn de underordnede nodene. Denne noden har den maksimale verdien. Det er et komplett binรฆrt tre, slik at du kan bygge en Max-Heap fra en samling verdier i O(n) tid.

Her er noen metoder som vanligvis brukes nรฅr man implementerer en Java Maks-Heap:

  • Legg til (): Plasserer et nytt element i en heap. Hvis du bruker en array, legges objektene til pรฅ slutten av arrayet, mens i binรฆrtreet legges objektene til ovenfra og nedenfra og deretter fra venstre til hรธyre.
  • Fjern (): Denne metoden lar deg fjerne det fรธrste elementet fra arraylisten. Siden det nylig forfremmede elementet ikke lenger er det stรธrste, skyver Sift-Down-metoden det alltid til sin nye plassering.
  • Sil ned (): Denne metoden sammenligner et rotobjekt med dets barn og skyver deretter den flyttede noden til sin rettmessige posisjon.
  • Sil opp (): Hvis du bruker array-metoden for รฅ legge til et nylig innsatt element i en array, hjelper Sift-Up-metoden den nylig tillagte noden med รฅ flytte seg til riktig posisjon. Det nye elementet sammenlignes fรธrst med det overordnede elementet ved รฅ simulere tredatastrukturen.

    Bruk formelen Parent_Index = Child_Index / 2. Du fortsetter รฅ gjรธre dette til det stรธrste elementet er foran i tabellen.

Grunnleggende haug Operasjoner

For รฅ finne de hรธyeste og laveste verdiene i et datasett, trenger du noen grunnleggende heap-operasjoner som finn, sett inn og slett. Fordi elementer stadig kommer og gรฅr, bรธr du vite hvordan du:

  • Finn โ€“ Se etter en gjenstand i en haug.
  • innfelt โ€“ Legg til et nytt barn i haugen.
  • Delete โ€“ Slett en node fra en haug.

Lag hauger

Prosessen med รฅ konstruere hauger er kjent som รฅ lage hauger. Gitt en liste med nรธkler, lager programmereren en tom heap og setter deretter inn de andre nรธklene รฉn om gangen ved hjelp av de grunnleggende heap-operasjonene.

Sรฅ la oss begynne รฅ bygge en Min-Heap ved hjelp av Williams metode ved รฅ sette inn verdiene 12, 2, 8, 1 og 4. Du kan bygge haugen med n elementer ved รฅ starte med en tom heap og deretter fylle den suksessivt med andre elementer ved hjelp av O(n log n) tid.

Lag hauger

  • Heapify: En innsettingsrutine som hjelper med รฅ sette inn elementer i en heap samtidig som heap-egenskapen bevares.

    For eksempel sjekker en max-heapify-operasjon at verdien til foreldreelementet er stรธrre enn avkommet. Elementene kan deretter sorteres ved hjelp av metoder som swap.ping.

  • Slรฅ sammen: Nรฅr du har to hauger som skal kombineres til รฉn, bruker du merge-operasjonen for รฅ bringe verdiene fra de to haugene sammen. De opprinnelige haugene bevares fortsatt.

Inspiser hauger

Inspeksjon av heaps refererer til รฅ sjekke antall elementer i heap-datastrukturen og validere om heapen er tom.

Det er viktig รฅ inspisere heaps mens man sorterer eller setter elementer i kรธ. Det er viktig รฅ sjekke at det finnes elementer รฅ behandle ved hjelp av Is-Empty(). Heapstรธrrelsen vil hjelpe med รฅ finne Max-Heap- eller Min-Heap-rรธttene, sรฅ du mรฅ vite hvor mange elementer som fรธlger heap-egenskapen.

  • Stรธrrelse โ€“ returnerer stรธrrelsen eller lengden pรฅ haugen. Den forteller deg hvor mange elementer som er lagret i sortert rekkefรธlge.
  • Er tom โ€“ returnerer SANN hvis heapen er null, ellers returneres USANN.

Her skriver du ut alle elementene i prioritet Q lรธkke og deretter sjekke at priorityQ ikke er tom.

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

Bruk av haugdatastruktur

Heap-datastruktur er nyttig i mange programmeringsapplikasjoner i det virkelige liv, for eksempel:

  • Hjelper med spamfiltrering.
  • Implementering av grafalgoritmer som Dijkstra og Prim.
  • Operalastbalansering og datakomprimering av systemet.
  • Finne ordensstatistikk som det k-te minste elementet.
  • Implementering av prioriterte kรธer der du kan sรธke etter elementer i en liste i logaritmisk tid.
  • Heap-datastruktur brukes ogsรฅ til sortering gjennom Heap Sort.
  • Simulering av kunder i kรธ.
  • Avbryt hรฅndtering i Operating System.
  • I Huffman-koding for datakomprimering.
  • Styrker best-fรธrst-sรธk og A*-heuristikker i AI-baneplanlegging.

Heap Priority Queue Properties

Fรธlgende egenskaper beskriver hvordan prioritetskรธen som er bygget pรฅ en heap oppfรธrer seg:

  • I prioritetshumper sammenlignes dataelementene i listen med hverandre for รฅ bestemme det minste eller stรธrste elementet.
  • Et element plasseres i en kรธ og fjernes deretter i prioritert rekkefรธlge.
  • Hvert enkelt element i prioritetskรธen har et unikt nummer knyttet til seg, identifisert som en prioritet.
  • Nรฅr en prioritetskรธ forlates, forlates elementet med hรธyest prioritet fรธrst.

Fremgangsmรฅte for implementering av Heap Priority Queue i Java

Den neste seksjonen gรฅr over i betong Java implementering som gjรธr disse reglene om til fungerende kode.

Trinn for implementering av Heap Priority Queue

Sorter i haug 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);
        }
    }
}

Produksjon

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

Sorter i haug 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)

Produksjon

[1, 3, 4, 7, 9]

Deretter skal du lรฆre om Biseksjonsmetode.

Spรธrsmรฅl og svar

En heap garanterer kun foreldre-barn-rekkefรธlge, sรฅ roten er minimum eller maksimum. Et binรฆrt sรธketre garanterer venstre-undertre-mindre-enn-rot-mindre-enn-hรธyre-undertre-rekkefรธlge pรฅ tvers av hver node, noe som stรธtter rask rekkefรธlge-gjennomgang og nรธkkelsรธk.

Velg en Max-Heap nรฅr applikasjonen din gjentatte ganger trenger det stรธrste elementet, for eksempel ved planlegging av oppgaven med hรธyest prioritet eller ved kjรธring av Heap Sort i stigende rekkefรธlge. Velg en Min-Heap nรฅr du trenger det minste elementet fรธrst, for eksempel Dijkstras korteste sti.

Innsetting og sletting i en heap-datastruktur kjรธres i O(log n) pรฅ grunn av heapify-banen fra rot til blad. ร… kikke minimums- eller maksimumskjรธringene i O(1), og bygge en heap fra n elementer tar O(n).

Heap Sort er pรฅ plass fordi den sorterer arrayet ved รฅ bruke O(1) ekstra minne utover input. Den er ikke stabil, siden like nรธkler kan bytte relativ rekkefรธlge under heapify og ex.tract-maks-trinnene som brukes til รฅ produsere det sorterte resultatet.

AI-sรธkealgoritmer som A* og best-first-sรธk lagrer grensenoder i en Min-Heap nรธkkelstyrt med en heuristisk kostnad. Heapen garanterer at den billigste kandidaten utvides deretter, noe som er kritisk for rask stifinning, spill-AI og robotplanleggere.

Ja. AI-assisterte visualiseringsverktรธy kan generere trinnvise diagrammer av innsettinger, heapify-bytter og eks.tract-max-operasjoner fra koden din. De flagger ogsรฅ brudd pรฅ heap-egenskaper, foreslรฅr rettelser og forklarer den asymptotiske oppfรธrselen i et enkelt sprรฅk, noe som fremskynder lรฆring og feilsรธking.

Oppsummer dette innlegget med: