Tässä opetusohjelmassa opit, mikä on kasan tietorakenne. Löydät myös toimivia esimerkkejä kasanoperaatioista C, C ++, Java ja Python.
Heap-tietorakenne on täydellinen binääripuu, joka täyttää kasan ominaisuuden . Sitä kutsutaan myös binääriseksi kasaksi .
Täydellinen binääripuu on erityinen binääripuu, jossa
- jokainen taso, mahdollisesti viimeistä lukuun ottamatta, on täytetty
- kaikki solmut ovat mahdollisimman vasemmalla
Heap Property on solmun ominaisuus, jossa
- jokaisen solmun (maks. kasaan) avain on aina suurempi kuin sen alisolmu / s ja juurisolmun avain on kaikkien muiden solmujen suurin;
- Kunkin solmun (min. kasaan) avain on aina pienempi kuin lapsisolmu / s ja juurisolmun avain on pienin kaikista muista solmuista.
Kasaoperaatiot
Jotkut kasalle suoritetuista tärkeistä operaatioista on kuvattu alla yhdessä niiden algoritmien kanssa.
Heapify
Heapify on kasan tietorakenteen luominen binääripuusta. Sitä käytetään luomaan Min-Heap tai Max-Heap.
- Olkoon syöttötaulukko
- Luo taulukosta täydellinen binääripuu
- Aloita ei-lehtisolmun ensimmäisestä indeksistä, jonka indeksin antaa
n/2 - 1
. - Aseta nykyinen elementti
i
arvoksilargest
. - Vasemman lapsen indeksin antaa
2i + 1
ja oikean lapsen antaa2i + 2
.
JosleftChild
on suurempi kuincurrentElement
(eli elementtiith
indeksissä), asetaleftChildIndex
suurin.
JosrightChild
on suurempi kuin osalargest
, asetetaanrightChildIndex
niinlargest
. - Vaihda
largest
kanssacurrentElement
- Toista vaiheet 3-7, kunnes myös alipuut kasautuvat.
Algoritmi
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)
Suuren kasan luominen:
MaxHeap(array, size) loop from the first index of non-leaf node down to zero call heapify
Min-Heapin molempien leftChild
ja niiden rightChild
on oltava pienempiä kuin kaikkien solmujen vanhempi.
Aseta elementti kasaan
Algoritmi lisäykseen Max Heapiin
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
- Lisää uusi elementti puun päähän.
- Kasvata puuta.
Min Heapia varten yllä olevaa algoritmia muokataan siten, että se parentNode
on aina pienempi kuin newNode
.
Poista elementti kasasta
Poistamisalgoritmi Max Heapissa
If nodeToBeDeleted is the leafNode remove the node Else swap nodeToBeDeleted with the lastLeafNode remove noteToBeDeleted heapify the array
- Valitse poistettava elementti.
- Vaihda se viimeisen elementin kanssa.
- Poista viimeinen elementti.
- Kasvata puuta.
Min Heapille yllä olevaa algoritmia muokataan niin, että molemmat childNodes
ovat pienempiä kuin currentNode
.
Kurkistaa (Etsi max / min)
Peek-toiminto palauttaa enimmäiselementin Max Heapista tai minimielementin Min Heapista poistamatta solmua.
Sekä Max-kasalle että Min-kasalle
palauta rootNode
Pura-Max / Min
Extract-Max palauttaa solmun suurimmalla arvolla sen jälkeen, kun se on poistettu Max-kasasta, kun taas Extract-Min palauttaa solmun minimillä sen poistamisen jälkeen Min-kasasta.
Python, Java, C / C ++ Esimerkkejä
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); )
Kasan tietorakennesovellukset
- Kasaa käytetään prioriteettijonoa toteutettaessa.
- Dijkstran algoritmi
- Kasa Lajittele