A max-kasa on täydellinen binääripuu, jossa kunkin sisäisen solmun arvo on suurempi tai yhtä suuri kuin kyseisen solmun lapsien arvot. Keon elementtien yhdistäminen taulukkoon on triviaalia: jos solmulle on tallennettu indeksi k, niin sen vasen lapsi tallennetaan indeksiin 2k + 1 ja oikea lapsi indeksiin 2k + 2.
Kuva: Max Heap

Miten Max Heap esitetään?
A-Max Heap on täydellinen binääripuu. A-Max-keko esitetään tyypillisesti taulukkona. Juurielementti on kohdassa Arr[0]. Alla olevassa taulukossa on muiden solmujen indeksit ith solmu, eli Arr[i]:
Arr[(i-1)/2] Palauttaa pääsolmun.
Arr[(2*i)+1] Palauttaa vasemman alisolmun.
Arr[(2*i)+2] Palauttaa oikean lapsisolmun.
Max Heapin toiminnot ovat seuraavat:
- getMax(): Se palauttaa Max Heapin juurielementin. Tämän toiminnon aika monimutkaisuus on O(1) .
- extractMax(): Poistaa maksimielementin MaxHeap . Tämän operaation aika monimutkaisuus on O(Loki n) koska tämän toiminnon on säilytettävä keon omaisuus soittamalla heapify() -menetelmä juuren poistamisen jälkeen.
- insert(): Uuden avaimen asettaminen vie O(Loki n) aika. Lisäämme uuden avaimen puun loppuun. Jos uusi avain on pienempi kuin sen pääavain, meidän ei tarvitse tehdä mitään. Muussa tapauksessa meidän täytyy kulkea ylös korjataksemme rikotun kasan ominaisuuden.
Huomautus: Alla olevassa toteutuksessa indeksoimme indeksistä 1 toteutuksen yksinkertaistamiseksi.
Menetelmät:
On olemassa kaksi tapaa, joilla voimme saavuttaa luetellut tavoitteet:
- Peruslähestymistapa luomalla maxHeapify() menetelmä
- Käyttämällä Collections.reverseOrder() menetelmä kirjaston funktioiden kautta
Tapa 1: Peruslähestymistapa luomalla maxHeapify() menetelmä
Luomme menetelmän olettaen, että vasen ja oikea alipuu on jo kasattu, meidän tarvitsee vain korjata juuri.
Esimerkki
Java
// Java program to implement Max Heap> // Main class> public> class> MaxHeap {> >private> int>[] Heap;> >private> int> size;> >private> int> maxsize;> >// Constructor to initialize an> >// empty max heap with given maximum> >// capacity> >public> MaxHeap(>int> maxsize)> >{> >// This keyword refers to current instance itself> >this>.maxsize = maxsize;> >this>.size =>0>;> >Heap =>new> int>[>this>.maxsize];> >}> >// Method 1> >// Returning position of parent> >private> int> parent(>int> pos) {>return> (pos ->1>) />2>; }> >// Method 2> >// Returning left children> >private> int> leftChild(>int> pos) {>return> (>2> * pos) +>1>; }> >// Method 3> >// Returning right children> >private> int> rightChild(>int> pos)> >{> >return> (>2> * pos) +>2>;> >}> >// Method 4> >// Returning true if given node is leaf> >private> boolean> isLeaf(>int> pos)> >{> >if> (pos>(koko />2>) && pos <= size) {> >return> true>;> >}> >return> false>;> >}> >// Method 5> >// Swapping nodes> >private> void> swap(>int> fpos,>int> spos)> >{> >int> tmp;> >tmp = Heap[fpos];> >Heap[fpos] = Heap[spos];> >Heap[spos] = tmp;> >}> >// Method 6> >// Recursive function to max heapify given subtree> >private> void> maxHeapify(>int> pos)> >{> >if> (isLeaf(pos))> >return>;> >if> (Heap[pos] || Heap[pos] if (Heap[leftChild(pos)]>Kasa[oikeaLapsi(pos)]) { swap(pos, leftChild(pos)); maxHeapify(vasenLapsi(pos)); } else { swap(pos, rightChild(pos)); maxHeapify(oikeaLapsi(pos)); } } } // Tapa 7 // Lisää uuden elementin maksimikekoon public void insert(int element) { Keon[koko] = elementti; // Siirrä ylös ja korjaa rikottu ominaisuus in current = size; while (Keko[nykyinen]> Keko[emo(nykyinen)]) { swap(nykyinen, emo(nykyinen)); nykyinen = vanhempi(nykyinen); } koko++; } // Menetelmä 8 // Keon näyttäminen public void print() { for (int i = 0; i 2; i++) { System.out.print('Parent Node : ' + Keko[i]); if (leftChild(i) // jos lapsi on taulukon System.out.print(' Left Child Node: ' + Heap[leftChild(i)]); if (rightChild(i) ) // oikea lapsiindeksi ei saa // olla taulukon System.out.print(' Oikea lapsisolmu: ' + Heap[rightChild(i)] hakemiston ulkopuolella System.out.println()); ; // uusi rivi } // Menetelmä 9 // Elementin poistaminen max-kekosta. ; return popped; = uusi MaxHeap(15); maxHeap.insert(6); maxHeap.insert(9); arvo pinossa System.out.println('Maksimiarvo on ' + maxHeap.extractMax()); } }> |
>
kulmikas materiaali
>Lähtö
The Max Heap is Parent Node : 84 Left Child Node: 22 Right Child Node: 19 Parent Node : 22 Left Child Node: 17 Right Child Node: 10 Parent Node : 19 Left Child Node: 5 Right Child Node: 6 Parent Node : 17 Left Child Node: 3 Right Child Node: 9 The max val is 84>
Tapa 2: Collections.reverseOrder()-menetelmän käyttäminen kirjastofunktioiden kautta
Käytämme PriorityQueue-luokkaa kekojen toteuttamiseen Javassa. Oletuksena tämä luokka toteuttaa Min Heapin. Max Keapin toteuttamiseksi käytämme Collections.reverseOrder()-menetelmää.
Esimerkki
Java
// Java program to demonstrate working> // of PriorityQueue as a Max Heap> // Using Collections.reverseOrder() method> // Importing all utility classes> import> java.util.*;> // Main class> class> GFG {> >// Main driver method> >public> static> void> main(String args[])> >{> >// Creating empty priority queue> >PriorityQueue pQueue> >=>new> PriorityQueue(> >Collections.reverseOrder());> >// Adding items to our priority queue> >// using add() method> >pQueue.add(>10>);> >pQueue.add(>30>);> >pQueue.add(>20>);> >pQueue.add(>400>);> >// Printing the most priority element> >System.out.println(>'Head value using peek function:'> >+ pQueue.peek());> >// Printing all elements> >System.out.println(>'The queue elements:'>);> >Iterator itr = pQueue.iterator();> >while> (itr.hasNext())> >System.out.println(itr.next());> >// Removing the top priority element (or head) and> >// printing the modified pQueue using poll()> >pQueue.poll();> >System.out.println(>'After removing an element '> >+>'with poll function:'>);> >Iterator itr2 = pQueue.iterator();> >while> (itr2.hasNext())> >System.out.println(itr2.next());> >// Removing 30 using remove() method> >pQueue.remove(>30>);> >System.out.println(>'after removing 30 with'> >+>' remove function:'>);> >Iterator itr3 = pQueue.iterator();> >while> (itr3.hasNext())> >System.out.println(itr3.next());> >// Check if an element is present using contains()> >boolean> b = pQueue.contains(>20>);> >System.out.println(>'Priority queue contains 20 '> >+>'or not?: '> + b);> >// Getting objects from the queue using toArray()> >// in an array and print the array> >Object[] arr = pQueue.toArray();> >System.out.println(>'Value in array: '>);> >for> (>int> i =>0>; i System.out.println('Value: ' + arr[i].toString()); } }> |
>
>Lähtö
Head value using peek function:400 The queue elements: 400 30 20 10 After removing an element with poll function: 30 10 20 after removing 30 with remove function: 20 10 Priority queue contains 20 or not?: true Value in array: Value: 20 Value: 10>