In deze zelfstudie leert u wat heap-gegevensstructuur is. Ook vindt u werkende voorbeelden van heap-bewerkingen in C, C ++, Java en Python.
Heap-gegevensstructuur is een complete binaire boom die voldoet aan de heap-eigenschap . Het wordt ook wel een binaire heap genoemd .
Een complete binaire boom is een speciale binaire boom waarin
- elk niveau, behalve mogelijk het laatste, is gevuld
- alle knooppunten zijn zo ver mogelijk links
Heap-eigenschap is de eigenschap van een knooppunt waarin
- (voor max heap) sleutel van elk knooppunt is altijd groter dan zijn kindknooppunt (en) en de sleutel van het hoofdknooppunt is de grootste van alle andere knooppunten;
- (voor min heap) sleutel van elk knooppunt is altijd kleiner dan de onderliggende knooppunt (en) en de sleutel van het hoofdknooppunt is de kleinste van alle andere knooppunten.
Heap-operaties
Enkele van de belangrijke bewerkingen die op een heap worden uitgevoerd, worden hieronder samen met hun algoritmen beschreven.
Heapify
Heapify is het proces waarbij een heap-gegevensstructuur wordt gemaakt op basis van een binaire boom. Het wordt gebruikt om een Min-Heap of een Max-Heap te maken.
- Laat de invoerarray zijn
- Maak een volledige binaire boom van de array
- Begin met de eerste index van niet-bladknooppunten waarvan de index wordt gegeven door
n/2 - 1
. - Stel het huidige element in
i
alslargest
. - De index van het linkerkind wordt gegeven door
2i + 1
en het rechterkind wordt gegeven door2i + 2
.
AlsleftChild
groter is dancurrentElement
(dwz element bijith
index), stel dan inleftChildIndex
als grootste.
AlsrightChild
groter is dan element inlargest
, stelt u inrightChildIndex
alslargest
. - Wissel
largest
metcurrentElement
- Herhaal stap 3-7 totdat de substructuren ook zijn opgehoopt.
Algoritme
Heapify(array, size, i) set i as largest leftChild = 2i + 1 rightChild = 2i + 2 if leftChild > array(largest) set leftChildIndex as largest if rightChild > array(largest) set rightChildIndex as largest swap array(i) and array(largest)
Om een Max-Heap te maken:
MaxHeap(array, size) loop from the first index of non-leaf node down to zero call heapify
Voor Min-Heap moeten beide leftChild
en rightChild
kleiner zijn dan de bovenliggende waarde voor alle knooppunten.
Element invoegen in Heap
Algoritme voor invoeging in Max Heap
If there is no node, create a newNode. else (a node is already present) insert the newNode at the end (last node from left to right.) heapify the array
- Voeg het nieuwe element aan het einde van de boom toe.
- Heapify de boom.
Voor Min Heap is het bovenstaande algoritme aangepast zodat het parentNode
altijd kleiner is dan newNode
.
Element verwijderen uit heap
Algoritme voor verwijdering in Max Heap
If nodeToBeDeleted is the leafNode remove the node Else swap nodeToBeDeleted with the lastLeafNode remove noteToBeDeleted heapify the array
- Selecteer het element dat u wilt verwijderen.
- Verwissel het met het laatste element.
- Verwijder het laatste element.
- Heapify de boom.
Voor Min Heap is het bovenstaande algoritme aangepast zodat beide childNodes
groter zijn dan currentNode
.
Peek (zoek max / min)
De Peek-bewerking retourneert het maximumelement uit Max Heap of minimumelement uit Min Heap zonder het knooppunt te verwijderen.
Voor zowel Max heap als Min Heap
retourneer rootNode
Extract-Max / Min
Extract-Max retourneert het knooppunt met de maximale waarde nadat het uit een Max Heap is verwijderd, terwijl Extract-Min het knooppunt met een minimum retourneert nadat het uit de Min Heap is verwijderd.
Python, Java, C / C ++ voorbeelden
Python Java C C ++ # Max-Heap data structure in Python def heapify(arr, n, i): largest = i l = 2 * i + 1 r = 2 * i + 2 if l < n and arr(i) < arr(l): largest = l if r < n and arr(largest) < arr(r): largest = r if largest != i: arr(i),arr(largest) = arr(largest),arr(i) heapify(arr, n, largest) def insert(array, newNum): size = len(array) if size == 0: array.append(newNum) else: array.append(newNum); for i in range((size//2)-1, -1, -1): heapify(array, size, i) def deleteNode(array, num): size = len(array) i = 0 for i in range(0, size): if num == array(i): break array(i), array(size-1) = array(size-1), array(i) array.remove(num) for i in range((len(array)//2)-1, -1, -1): heapify(array, len(array), i) arr = () insert(arr, 3) insert(arr, 4) insert(arr, 9) insert(arr, 5) insert(arr, 2) print ("Max-Heap array: " + str(arr)) deleteNode(arr, 4) print("After deleting an element: " + str(arr))
// Max-Heap data structure in Java import java.util.ArrayList; class Heap ( void heapify(ArrayList hT, int i) ( int size = hT.size(); int largest = i; int l = 2 * i + 1; int r = 2 * i + 2; if (l hT.get(largest)) largest = l; if (r hT.get(largest)) largest = r; if (largest != i) ( int temp = hT.get(largest); hT.set(largest, hT.get(i)); hT.set(i, temp); heapify(hT, largest); ) ) void insert(ArrayList hT, int newNum) ( int size = hT.size(); if (size == 0) ( hT.add(newNum); ) else ( hT.add(newNum); for (int i = size / 2 - 1; i>= 0; i--) ( heapify(hT, i); ) ) ) void deleteNode(ArrayList hT, int num) ( int size = hT.size(); int i; for (i = 0; i = 0; j--) ( heapify(hT, j); ) ) void printArray(ArrayList array, int size) ( for (Integer i : array) ( System.out.print(i + " "); ) System.out.println(); ) public static void main(String args()) ( ArrayList array = new ArrayList(); int size = array.size(); Heap h = new Heap(); h.insert(array, 3); h.insert(array, 4); h.insert(array, 9); h.insert(array, 5); h.insert(array, 2); System.out.println("Max-Heap array: "); h.printArray(array, size); h.deleteNode(array, 4); System.out.println("After deleting an element: "); h.printArray(array, size); ) )
// Max-Heap data structure in C #include int size = 0; void swap(int *a, int *b) ( int temp = *b; *b = *a; *a = temp; ) void heapify(int array(), int size, int i) ( if (size == 1) ( printf("Single element in the heap"); ) else ( int largest = i; int l = 2 * i + 1; int r = 2 * i + 2; if (l array(largest)) largest = l; if (r array(largest)) largest = r; if (largest != i) ( swap(&array(i), &array(largest)); heapify(array, size, largest); ) ) ) void insert(int array(), int newNum) ( if (size == 0) ( array(0) = newNum; size += 1; ) else ( array(size) = newNum; size += 1; for (int i = size / 2 - 1; i>= 0; i--) ( heapify(array, size, i); ) ) ) void deleteRoot(int array(), int num) ( int i; for (i = 0; i = 0; i--) ( heapify(array, size, i); ) ) void printArray(int array(), int size) ( for (int i = 0; i < size; ++i) printf("%d ", array(i)); printf(""); ) int main() ( int array(10); insert(array, 3); insert(array, 4); insert(array, 9); insert(array, 5); insert(array, 2); printf("Max-Heap array: "); printArray(array, size); deleteRoot(array, 4); printf("After deleting an element: "); printArray(array, size); )
// Max-Heap data structure in C++ #include #include using namespace std; void swap(int *a, int *b) ( int temp = *b; *b = *a; *a = temp; ) void heapify(vector &hT, int i) ( int size = hT.size(); int largest = i; int l = 2 * i + 1; int r = 2 * i + 2; if (l hT(largest)) largest = l; if (r hT(largest)) largest = r; if (largest != i) ( swap(&hT(i), &hT(largest)); heapify(hT, largest); ) ) void insert(vector &hT, int newNum) ( int size = hT.size(); if (size == 0) ( hT.push_back(newNum); ) else ( hT.push_back(newNum); for (int i = size / 2 - 1; i>= 0; i--) ( heapify(hT, i); ) ) ) void deleteNode(vector &hT, int num) ( int size = hT.size(); int i; for (i = 0; i = 0; i--) ( heapify(hT, i); ) ) void printArray(vector &hT) ( for (int i = 0; i < hT.size(); ++i) cout << hT(i) << " "; cout << ""; ) int main() ( vector heapTree; insert(heapTree, 3); insert(heapTree, 4); insert(heapTree, 9); insert(heapTree, 5); insert(heapTree, 2); cout << "Max-Heap array: "; printArray(heapTree); deleteNode(heapTree, 4); cout << "After deleting an element: "; printArray(heapTree); )
Heap-gegevensstructuurapplicaties
- Heap wordt gebruikt tijdens het implementeren van een prioriteitswachtrij.
- Dijkstra's algoritme
- Heap Sorteren