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.

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




