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.

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




