logo

Max Heap i Java

EN max-bunke er et komplet binært træ, hvor værdien i hver intern node er større end eller lig med værdierne i den pågældende nodes børn. At kortlægge elementerne i en heap til et array er trivielt: Hvis en node er lagret et indeks k, så lagres dens venstre underordnede ved indeks 2k + 1 og dets højre underordnede ved indeks 2k + 2.

Illustration: Max Heap

max-bunke



Hvordan er Max Heap repræsenteret?

A-Max Heap er et komplet binært træ. A-Max heap er typisk repræsenteret som et array. Rodelementet vil være ved Arr[0]. Nedenstående tabel viser indekser for andre noder for ith node, dvs. Arr[i]:

Arr[(i-1)/2] Returnerer den overordnede node.
Arr[(2*i)+1] Returnerer den venstre underordnede node.
Arr[(2*i)+2] Returnerer den rigtige underordnede node.

Operationer på Max Heap er som følger:

  • getMax(): Det returnerer rodelementet af Max Heap. Tidskompleksiteten af ​​denne operation er O(1) .
  • extractMax(): Fjerner det maksimale element fra MaxHeap . Tidskompleksiteten af ​​denne operation er O(Log n) da denne operation skal vedligeholde heap-egenskaben ved at kalde heapify() metode efter at have fjernet roden.
  • indsæt(): Indsættelse af en ny nøgle tager O(Log n) tid. Vi tilføjer en ny nøgle for enden af ​​træet. Hvis den nye nøgle er mindre end dens forælder, behøver vi ikke at gøre noget. Ellers er vi nødt til at krydse op for at reparere den krænkede bunkeejendom.

Bemærk: I nedenstående implementering foretager vi indeksering fra indeks 1 for at forenkle implementeringen.

ipconfig på Ubuntu

Metoder:

Der er 2 metoder, hvormed vi kan nå det anførte mål:

  1. Grundlæggende tilgang ved at skabe maxHeapify() metode
  2. Ved brug af Collections.reverseOrder() metode via biblioteksfunktioner

Metode 1: Grundlæggende tilgang ved at skabe maxHeapify() metode

Vi vil oprette en metode, der antager, at venstre og højre undertræ allerede er ophobet, vi behøver kun at rette roden.

Eksempel

Java




java streng sammenkædning
// 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>(størrelse />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)]>Heap[rightChild(pos)]) { swap(pos, leftChild(pos)); maxHeapify(venstreBarn(pos)); } andet { swap(pos, rightChild(pos)); maxHeapify(rightChild(pos)); } } } // Metode 7 // Indsætter et nyt element til max heap public void insert(int element) { Heap[size] = element; // Kør op og fix krænket egenskab int strøm = størrelse; while (Heap[current]> Heap[parent(current)]) { swap(current, parent(current)); nuværende = forælder(aktuel); } størrelse++; } // Metode 8 // For at vise heap public void print() { for (int i = 0; i 2; i++) { System.out.print('Parent Node : ' + Heap[i]); if (venstreBarn(i) // hvis barnet er uden for bunden // af arrayet System.out.print(' Venstre Child-knudepunkt: ' + Heap[venstreBarn(i)]); if (højreBarn(i) ) // det rigtige underordnede indeks må ikke // være uden for indekset for arrayet System.out.print(' Right Child Node: ' + System.out.println() ; // for new line } } // Metode 9 // Fjern et element fra max heap public int extractMax() { int popped = Heap[0] = maxHeapify(0) ; return poppet; } // Metode 10 // hoveddrivermetode public static void main(String[] arg) { // Vis besked for bedre læsbarhed System.out.println('MaxHeap er '); = new MaxHeap(15); // Indsætning af noder maxHeap.insert(3); maxHeap.insert(19); maxHeap.insert(22); værdi i heap System.out.println('Maksimal værdi er ' + maxHeap.extractMax()); } }>

>

>

Produktion

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>

Metode 2: Brug af metoden Collections.reverseOrder() via biblioteksfunktioner

Vi bruger PriorityQueue-klassen til at implementere Heaps i Java. Min Heap er som standard implementeret af denne klasse. For at implementere Max Heap bruger vi Collections.reverseOrder() metoden.

Eksempel

Java


123 film



// 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()); } }>

>

>

Produktion

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>