logo

Inleiding tot Min-Heap – Tutorials voor gegevensstructuur en algoritmen

A Min-hoop wordt gedefinieerd als een soort De heap-gegevensstructuur is een soort binaire boom die in de informatica vaak wordt gebruikt voor verschillende doeleinden, waaronder het sorteren, zoeken en organiseren van gegevens.

Inleiding tot Min-Heap – Tutorials voor gegevensstructuur en algoritmen



Doel en gebruiksscenario's van Min-Heap:

Min-Heap-gegevensstructuur in verschillende talen:

1. Min-heap in C++

Een min-heap kan worden geïmplementeerd met behulp van de prioriteits-rij container uit de standaardsjabloonbibliotheek (STL). De prioriteits-rij container is een type containeradapter die een manier biedt om elementen op te slaan in een wachtrij-achtige gegevensstructuur waarin aan elk element een prioriteit is gekoppeld.

Syntaxis :



C++
priority_queue < int, vector , groter > minH;>

2. Min-heap op Java

In Java kan een min-heap worden geïmplementeerd met behulp van de Prioriteits-rij klasse uit java.util-pakket . De PriorityQueue-klasse is een prioriteitswachtrij die een manier biedt om elementen op te slaan in een wachtrij-achtige gegevensstructuur waarin aan elk element een prioriteit is gekoppeld.

Syntaxis :

Java
PriorityQueue minHeap = nieuwe PriorityQueue ();>

3. Min-Heap in Python

In Python kan een min-heap worden geïmplementeerd met behulp van de hoopq module, die functies biedt voor het implementeren van heaps. In het bijzonder de hoopq module biedt een manier om heap-datastructuren te creëren en te manipuleren.



Syntaxis:

tostring-methode
Python
heap = [] heapify(heap)>

4. Min-heap in C#

In C# kan een min-heap worden geïmplementeerd met behulp van de PriorityQueue-klasse uit de System.Collections.Generieke naamruimte . De PriorityQueue-klasse is een prioriteitswachtrij die een manier biedt om elementen op te slaan in een wachtrij-achtige gegevensstructuur waarin aan elk element een prioriteit is gekoppeld.

Syntaxis:

C#
var minHeap = new PriorityQueue ();>

5. Min-heap in JavaScript

Een min heap is een binaire boom waarin elk knooppunt een waarde heeft die kleiner is dan of gelijk is aan zijn kinderen. In JavaScript kun je een min-heap implementeren met behulp van een array, waarbij het eerste element het hoofdknooppunt vertegenwoordigt, en de onderliggende elementen van een knooppunt op de index i bevinden zich op indices 2i+1 En 2i+2.

Syntaxis:

JavaScript
const minHeap = new MinHeap();>

Verschil tussen Min Heap en Max Heap:

Min hoop

Max Hoop

1.

In een Min-Heap moet de sleutel die aanwezig is op het hoofdknooppunt kleiner zijn dan of gelijk zijn aan de sleutels die aanwezig zijn op alle onderliggende knooppunten.

In een Max-Heap moet de sleutel die aanwezig is op het hoofdknooppunt groter zijn dan of gelijk zijn aan de sleutels die aanwezig zijn op alle onderliggende knooppunten.

2.

In een Min-Heap is het minimale sleutelelement aanwezig in de root.

In een Max-Heap is het maximale sleutelelement aanwezig in de root.

3.

Een Min-Heap gebruikt de oplopende prioriteit.

Een Max-Heap gebruikt de aflopende prioriteit.

4.

Bij de constructie van een Min-Heap heeft het kleinste element prioriteit.

Bij de constructie van een Max-Heap heeft het grootste element prioriteit.

5.

java probeer te vangen

In een Min-Heap wordt het kleinste element als eerste uit de hoop gehaald.

In een Max-Heap wordt het grootste element als eerste uit de hoop gehaald.

Interne implementatie van Min-Heap-gegevensstructuur:

A Min heap wordt doorgaans weergegeven als een array .

  • Het hoofdelement bevindt zich op Arr[0] .
  • Voor elk it-knooppunt Arr[ik] :
    • Arr[(i -1) / 2] retourneert het bovenliggende knooppunt.
    • Arr[(2 * ik) + 1] retourneert het linker kindknooppunt.
    • Arr[(2 * ik) + 2] retourneert het rechter onderliggende knooppunt.

De interne implementatie van de Min-Heap vereist 3 belangrijke stappen:

actress zeenat aman
  1. Plaatsing : Om een ​​element in de min heap in te voegen, voegen we het element eerst aan het einde van de array toe en passen vervolgens de heap-eigenschap aan door het element herhaaldelijk met zijn ouder te verwisselen totdat het op de juiste positie staat.
  2. Verwijdering : Om het minimumelement uit de min heap te verwijderen, verwisselen we eerst het rootknooppunt met het laatste element in de array, verwijderen we het laatste element en passen we vervolgens de heap-eigenschap aan door het element herhaaldelijk met zijn kleinste kind te verwisselen totdat het in de juiste positie.
  3. Heapify : Een heapify-bewerking kan worden gebruikt om een ​​min-heap te maken van een ongesorteerde array.

Bewerkingen op de Min-heap-gegevensstructuur en hun implementatie:

Hier zijn enkele algemene bewerkingen die kunnen worden uitgevoerd op een heap-gegevensstructuur:

1. Invoeging in Min-Heap-gegevensstructuur :

Elementen kunnen in de heap worden ingevoegd volgens een vergelijkbare aanpak als hierboven besproken voor verwijdering. Het idee is om:

  • De invoegbewerking in een min-heap omvat de volgende stappen:
  • Voeg het nieuwe element toe aan het einde van de hoop, op de volgende beschikbare positie in het laatste niveau van de boom.
  • Vergelijk het nieuwe element met het bovenliggende element. Als het bovenliggende element groter is dan het nieuwe element, verwisselt u deze.
  • Herhaal stap 2 totdat het bovenliggende element kleiner is dan of gelijk is aan het nieuwe element, of totdat het nieuwe element de wortel van de boom bereikt.
  • Het nieuwe element bevindt zich nu op de juiste positie in de min heap en er is voldaan aan de heap-eigenschap.

Illustratie:

Stel dat de heap een min-heap is, als:

Inbrengen in Min-Heap

Implementatie van invoegoperatie in Min-Heap:

C++
#include  #include  using namespace std; // Function to insert a new element into the min-heap void insert_min_heap(vector & heap, int value) {// Voeg het nieuwe element toe aan het einde van de heap heap.push_back(value);  // Haal de index van het laatste element op int index = heap.size() - 1;  // Vergelijk het nieuwe element met zijn ouder en wissel indien // nodig while (index> 0 && heap[(index - 1) / 2]> heap[index]) { swap(heap[index], heap[(index - 1) / 2]);  // Ga omhoog in de boom naar de ouder van de huidige // elementindex = (index - 1) / 2;  } } // Hoofdfunctie om de functie insert_min_heap int main() { vector hoop;  int-waarden[] = { 10, 7, 11, 5, 4, 13 };  int n = groottevan(waarden) / groottevan(waarden[0]);  voor (int i = 0; ik< n; i++) {  insert_min_heap(heap, values[i]);  cout << 'Inserted ' << values[i]  << ' into the min-heap: ';  for (int j = 0; j < heap.size(); j++) {  cout << heap[j] << ' ';  }  cout << endl;  }  return 0; }>
Java
import java.util.*; public class GFG {  // Function to insert a new element into the min-heap  public static void insertMinHeap(int[] heap, int size,  int value)  {  // Add the new element to the end of the heap  heap[size] = value;  // Get the index of the last element  int index = size;  // Compare the new element with its parent and swap  // if necessary  while (index>0 && heap[(index - 1) / 2]> heap[index]) { swap(heap, index, (index - 1) / 2);  // Ga omhoog in de boom naar de ouder van de huidige // elementindex = (index - 1) / 2;  } } // Functie om twee elementen in een array te verwisselen public static void swap(int[] arr, int i, int j) { int temp = arr[i];  arr[i] = arr[j];  arr[j] = temperatuur;  } // Hoofdfunctie om de functie insertMinHeap te testen public static void main(String[] args) { int[] heap = new int[6];  int[] waarden = { 10, 7, 11, 5, 4, 13 };  int-grootte = 0;  voor (int i = 0; ik< values.length; i++) {  insertMinHeap(heap, size, values[i]);  size++;  System.out.print('Inserted ' + values[i]  + ' into the min-heap: ');  for (int j = 0; j < size; j++) {  System.out.print(heap[j] + ' ');  }  System.out.println();  }  } }>
Python3
def insert_min_heap(heap, value): # Add the new element to the end of the heap heap.append(value) # Get the index of the last element index = len(heap) - 1 # Compare the new element with its parent and swap if necessary while index>0 en heap[(index - 1) // 2]> heap[index]: heap[index], heap[(index - 1) // 2] = heap[(index - 1) // 2], heap[ index] # Ga omhoog in de boomstructuur naar het bovenliggende element van het huidige element index = (index - 1) // 2 heap = [] waarden = [10, 7, 11, 5, 4, 13] voor waarde in waarden: insert_min_heap( heap, waarde) print(f'Ingevoegde {waarde} in de min-heap: {heap}')>
C#
using System; using System.Collections.Generic; public class Program {  // Function to insert a new element into the min-heap  static void InsertMinHeap(List heap, int value) {// Voeg het nieuwe element toe aan het einde van de heap heap.Add(value);  // Haal de index van het laatste element op int index = heap.Count - 1;  // Vergelijk het nieuwe element met zijn ouder en wissel // indien nodig while (index> 0 && heap[(index - 1) / 2]> heap[index]) { int temp = heap[index];  heap[index] = heap[(index - 1) / 2];  heap[(index - 1) / 2] = temperatuur;  // Ga omhoog in de boom naar de ouder van het huidige // element index = (index - 1) / 2;  } } // Hoofdfunctie om de InsertMinHeap-functie te testen public static void Main() { List heap = nieuwe lijst ();  int[] waarden = { 10, 7, 11, 5, 4, 13 };  foreach(int-waarde in waarden) { InsertMinHeap(heap, waarde);  Console.Write('Ingevoegd' + waarde + ' in de min-heap: ');  foreach(int-element in heap) { Console.Write(element + ' ');  } Console.WriteLine();  } } }>
Javascript
function insertMinHeap(heap, value) {  heap.push(value);  let index = heap.length - 1;  let parentIndex = Math.floor((index - 1) / 2);  while (index>0 && heap[parentIndex]> heap[index]) { [heap[index], heap[parentIndex]] = [heap[parentIndex], heap[index]];  index = ouderIndex;  parentIndex = Math.floor((index - 1) / 2);  } } // Voorbeeldgebruik const heap = []; const-waarden = [10, 7, 11, 5, 4, 13]; for (const waarde van waarden) { insertMinHeap(heap, waarde);  console.log(`${value} ingevoegd in de min-heap: ${heap}`); }>

Uitvoer
Inserted 10 into the min-heap: 10 Inserted 7 into the min-heap: 7 10 Inserted 11 into the min-heap: 7 10 11 Inserted 5 into the min-heap: 5 7 11 10 Inserted 4 into the min-heap: 4 5 11 10 7 Inser...>

Tijdcomplexiteit: O(log(n)) ( waarbij n het aantal elementen in de heap is )
Hulpruimte: Op)

2. Verwijdering in Min-Heap-gegevensstructuur :

Het kleinste element (de root) verwijderen uit de min-heap. De root wordt vervangen door het laatste element in de heap, en vervolgens wordt de heap-eigenschap hersteld door de nieuwe root te verwisselen met het kleinste kind totdat de ouder kleiner is dan beide kinderen of totdat de nieuwe root een bladknooppunt bereikt.

  • Vervang de root of het element dat moet worden verwijderd door het laatste element.
  • Verwijder het laatste element uit de heap.
  • Omdat het laatste element nu op de positie van het rootknooppunt wordt geplaatst. Het volgt dus mogelijk niet de heap-eigenschap. Heap daarom het laatste knooppunt op dat op de positie van de wortel is geplaatst.

Illustratie :

Stel dat de heap een min-heap is, als:

Min-Heap-gegevensstructuur

Min-Heap-gegevensstructuur

Het te verwijderen element is root, d.w.z. 13.

Proces :

Het laatste element is 100.

Stap 1: Vervang het laatste element door root en verwijder het.

Min-Heap-gegevensstructuur

Min-Heap-gegevensstructuur

Stap 2 : Heapify-wortel.

Laatste hoop:

Min-Heap-gegevensstructuur

Min-Heap-gegevensstructuur

Implementatie van verwijderingsbewerking in Min-Heap:

C++
#include  #include  using namespace std; // Function to insert a new element into the min-heap void insert_min_heap(vector & heap, int value) {// Voeg het nieuwe element toe aan het einde van de heap heap.push_back(value);  // Haal de index van het laatste element op int index = heap.size() - 1;  // Vergelijk het nieuwe element met zijn ouder en wissel indien // nodig while (index> 0 && heap[(index - 1) / 2]> heap[index]) { swap(heap[index], heap[(index - 1) / 2]);  // Ga omhoog in de boom naar de ouder van de huidige // elementindex = (index - 1) / 2;  } } // Functie om een ​​knooppunt uit de min-heap void delete_min_heap(vector & heap, int value) {// Zoek de index van het element dat moet worden verwijderd int index = -1;  voor (int i = 0; ik< heap.size(); i++) {  if (heap[i] == value) {  index = i;  break;  }  }  // If the element is not found, return  if (index == -1) {  return;  }  // Replace the element to be deleted with the last  // element  heap[index] = heap[heap.size() - 1];  // Remove the last element  heap.pop_back();  // Heapify the tree starting from the element at the  // deleted index  while (true) {  int left_child = 2 * index + 1;  int right_child = 2 * index + 2;  int smallest = index;  if (left_child < heap.size()  && heap[left_child] < heap[smallest]) {  smallest = left_child;  }  if (right_child < heap.size()  && heap[right_child] < heap[smallest]) {  smallest = right_child;  }  if (smallest != index) {  swap(heap[index], heap[smallest]);  index = smallest;  }  else {  break;  }  } } // Main function to test the insert_min_heap and // delete_min_heap functions int main() {  vector hoop;  int-waarden[] = { 13, 16, 31, 41, 51, 100 };  int n = groottevan(waarden) / groottevan(waarden[0]);  voor (int i = 0; ik< n; i++) {  insert_min_heap(heap, values[i]);  }  cout << 'Initial heap: ';  for (int j = 0; j < heap.size(); j++) {  cout << heap[j] << ' ';  }  cout << endl;  delete_min_heap(heap, 13);  cout << 'Heap after deleting 13: ';  for (int j = 0; j < heap.size(); j++) {  cout << heap[j] << ' ';  }  cout << endl;  return 0; }>
Java
import java.util.*; public class GFG {  // Function to insert a new element into the min-heap  public static void insertMinHeap(List heap, int value) {// Voeg het nieuwe element toe aan het einde van de heap heap.add(value);  // Haal de index van het laatste element op int index = heap.size() - 1;  // Vergelijk het nieuwe element met zijn ouder en ruil // indien nodig while (index> 0 && heap.get((index - 1) / 2)> heap.get(index)) { Collections.swap(heap, index, (index - 1) / 2);  // Ga omhoog in de boom naar de ouder van de huidige // elementindex = (index - 1) / 2;  } } // Functie om een ​​knooppunt te verwijderen uit de min-heap public static void deleteMinHeap(List heap, int value) {// Zoek de index van het element dat moet worden verwijderd int index = -1;  voor (int i = 0; ik< heap.size(); i++) {  if (heap.get(i) == value) {  index = i;  break;  }  }  // If the element is not found, return  if (index == -1) {  return;  }  // Replace the element to be deleted with the last  // element  heap.set(index, heap.get(heap.size() - 1));  // Remove the last element  heap.remove(heap.size() - 1);  // Heapify the tree starting from the element at the  // deleted index  while (true) {  int leftChild = 2 * index + 1;  int rightChild = 2 * index + 2;  int smallest = index;  if (leftChild < heap.size()  && heap.get(leftChild)  < heap.get(smallest)) {  smallest = leftChild;  }  if (rightChild < heap.size()  && heap.get(rightChild)  < heap.get(smallest)) {  smallest = rightChild;  }  if (smallest != index) {  Collections.swap(heap, index, smallest);  index = smallest;  }  else {  break;  }  }  }  // Main function to test the insertMinHeap and  // deleteMinHeap functions  public static void main(String[] args)  {  List heap = nieuwe ArrayList ();  int[] waarden = { 13, 16, 31, 41, 51, 100 };  int n = waarden.lengte;  voor (int i = 0; ik< n; i++) {  insertMinHeap(heap, values[i]);  }  System.out.print('Initial heap: ');  for (int j = 0; j < heap.size(); j++) {  System.out.print(heap.get(j) + ' ');  }  System.out.println();  deleteMinHeap(heap, 13);  System.out.print('Heap after deleting 13: ');  for (int j = 0; j < heap.size(); j++) {  System.out.print(heap.get(j) + ' ');  }  System.out.println();  } }>
Python3
def insert_min_heap(heap, value): heap.append(value) index = len(heap) - 1 while index>0 en heap[(index - 1) // 2]> heap[index]: heap[index], heap[(index - 1) // 2] = heap[(index - 1) // 2], heap[ index] index = (index - 1) // 2 def delete_min_heap(heap, waarde): index = -1 voor i in bereik(len(heap)): if heap[i] == waarde: index = ik break if index == -1: return heap[index] = heap[-1] heap.pop() while True: left_child = 2 * index + 1 right_child = 2 * index + 2 kleinste = index indien left_child< len(heap) and heap[left_child] < heap[smallest]: smallest = left_child if right_child < len(heap) and heap[right_child] < heap[smallest]: smallest = right_child if smallest != index: heap[index], heap[smallest] = heap[smallest], heap[index] index = smallest else: break heap = [] values = [13, 16, 31, 41, 51, 100] for value in values: insert_min_heap(heap, value) print('Initial heap:', heap) delete_min_heap(heap, 13) print('Heap after deleting 13:', heap)>
C#
using System; using System.Collections.Generic; class MinHeap {  private List heap = nieuwe lijst ();  public void Insert(int-waarde) { heap.Add(waarde);  int index = heap.Count - 1;  while (index> 0 && heap[(index - 1) / 2]> heap[index]) { Swap(index, (index - 1) / 2);  index = (index - 1) / 2;  } } public void Verwijderen(int waarde) { int index = heap.IndexOf(waarde);  als (index == -1) { return;  } heap[index] = heap[heap.Count - 1];  heap.RemoveAt(heap.Count - 1);  terwijl (waar) { int leftChild = 2 * index + 1;  int rechtsKind = 2 * index + 2;  int kleinste = index;  if (linkskind< heap.Count  && heap[leftChild] < heap[smallest]) {  smallest = leftChild;  }  if (rightChild < heap.Count  && heap[rightChild] < heap[smallest]) {  smallest = rightChild;  }  if (smallest != index) {  Swap(index, smallest);  index = smallest;  }  else {  break;  }  }  }  private void Swap(int i, int j)  {  int temp = heap[i];  heap[i] = heap[j];  heap[j] = temp;  }  public void Print()  {  for (int i = 0; i < heap.Count; i++) {  Console.Write(heap[i] + ' ');  }  Console.WriteLine();  } } class Program {  static void Main(string[] args)  {  MinHeap heap = new MinHeap();  int[] values = { 13, 16, 31, 41, 51, 100 };  for (int i = 0; i < values.Length; i++) {  heap.Insert(values[i]);  }  Console.Write('Initial heap: ');  heap.Print();  heap.Delete(13);  Console.Write('Heap after deleting 13: ');  heap.Print();  } }>
Javascript
function insertMinHeap(heap, value) {  // Add the new element to the end of the heap  heap.push(value);  // Get the index of the last element  let index = heap.length - 1;  // Compare the new element with its parent and swap if necessary  for (let flr = Math.floor((index - 1) / 2); index>0 && heap[flr]> heap[index]; flr = Math.floor((index - 1) / 2)) { [heap[index], heap[flr]] = [heap[flr], heap[index], ];  // Ga omhoog in de boomstructuur naar het bovenliggende element van de huidige elementindex = Math.floor((index - 1) / 2);  } } function deleteMinHeap(heap, value) {// Zoek de index van het element dat moet worden verwijderd, let index = -1;  voor (laat i = 0; i< heap.length; i++) {  if (heap[i] == value) {  index = i;  break;  }  }  // If the element is not found, return  if (index == -1) {  return;  }  // Replace the element to be deleted with the last element  heap[index] = heap[heap.length - 1];  // Remove the last element  heap.pop();  // Heapify the tree starting from the element at the deleted index  while (true) {  let left_child = 2 * index + 1;  let right_child = 2 * index + 2;  let smallest = index;  if (left_child < heap.length && heap[left_child] < heap[smallest]) {  smallest = left_child;  }  if (right_child < heap.length && heap[right_child] < heap[smallest]) {  smallest = right_child;  }  if (smallest != index) {  [heap[index], heap[smallest]] = [heap[smallest], heap[index]];  index = smallest;  } else {  break;  }  } } // Main function to test the insertMinHeap and deleteMinHeap functions let heap = []; let values = [13, 16, 31, 41, 51, 100]; for (let i = 0; i < values.length; i++) {  insertMinHeap(heap, values[i]); } console.log('Initial heap: ' + heap.join(' ')); deleteMinHeap(heap, 13); console.log('Heap after deleting 13: ' + heap.join(' '));>

Uitvoer
Initial heap: 13 16 31 41 51 100 Heap after deleting 13: 16 41 31 100 51>

Tijdcomplexiteit : O(log n) waarbij n het aantal elementen in de heap is
Hulpruimte: Op)

3. Kijkoperatie op Min-Heap-gegevensstructuur:

Om toegang te krijgen tot het minimumelement (d.w.z. de root van de heap), wordt de waarde van het rootknooppunt geretourneerd. De tijdscomplexiteit van kijkje in een min-heap is O(1).

Min Heap-gegevensstructuur

Min Heap-gegevensstructuur

Implementatie van Peek-bewerking in Min-Heap:

C++
#include  #include  #include  using namespace std; int main() {  // Create a max heap with some elements using a  // priority_queue  priority_queue , groter > minHeap;  minHeap.push(9);  minHeap.push(8);  minHeap.push(7);  minHeap.push(6);  minHeap.push(5);  minHeap.push(4);  minHeap.push(3);  minHeap.push(2);  minHeap.push(1);  // Haal het peak-element op (d.w.z. het grootste element) int peakElement = minHeap.top();  // Druk het piekelement af<< 'Peak element: ' << peakElement << std::endl;  return 0; }>
Java
import java.util.PriorityQueue; public class GFG {  public static void main(String[] args)  {  // Create a max heap with some elements using a  // PriorityQueue  PriorityQueue minHeap = nieuwe PriorityQueue();  minHeap.add(9);  minHeap.add(8);  minHeap.add(7);  minHeap.add(6);  minHeap.add(5);  minHeap.add(4);  minHeap.add(3);  minHeap.add(2);  minHeap.add(1);  // Haal het peak-element op (d.w.z. het grootste element) int peakElement = minHeap.peek();  // Druk het peak-element System.out.println('Peak element: ' + peakElement) af;  } }>
Python3
import heapq # Create a min heap with some elements using a list min_heap = [9, 8, 7, 6, 5, 4, 3, 2, 1] heapq.heapify(min_heap) # Get the peak element (i.e., the smallest element) peak_element = heapq.nsmallest(1, min_heap)[0] # Print the peak element print('Peak element:', peak_element)>
C#
using System; using System.Collections.Generic; public class GFG {  public static void Main()  {  // Create a min heap with some elements using a  // PriorityQueue  var minHeap = new PriorityQueue ();  minHeap.Enqueue(9);  minHeap.Enqueue(8);  minHeap.Enqueue(7);  minHeap.Enqueue(6);  minHeap.Enqueue(5);  minHeap.Enqueue(4);  minHeap.Enqueue(3);  minHeap.Enqueue(2);  minHeap.Enqueue(1);  // Haal het peak-element op (d.w.z. het kleinste element) int peakElement = minHeap.Peek();  // Druk het peak-element Console.WriteLine('Peak element: ' + peakElement) af;  } }>
Javascript
const PriorityQueue = require('fast-priority-queue'); // Create a min heap with some elements using a PriorityQueue const minHeap = new PriorityQueue((a, b) =>a - b); minHeap.add(9); minHeap.add(8); minHeap.add(7); minHeap.add(6); minHeap.add(5); minHeap.add(4); minHeap.add(3); minHeap.add(2); minHeap.add(1); // Haal het peak-element op (d.w.z. het kleinste element) const peakElement = minHeap.peek(); // Druk het peak-element console.log(`Peak element: ${peakElement}`) af;>

Uitvoer
Peak element: 1>

Tijdcomplexiteit : In een min-heap die is geïmplementeerd met behulp van een array of een lijst, is het peak-element in constante tijd toegankelijk, O(1), omdat het zich altijd in de root van de heap bevindt.
In een min heap die is geïmplementeerd met behulp van een binaire boom, is het peak-element ook toegankelijk in O(1) tijd, omdat het zich altijd aan de wortel van de boom bevindt.

Hulpruimte: Op)

4. Heapify-bewerking op Min-Heap-gegevensstructuur:

Een heapify-bewerking kan worden gebruikt om een ​​min-heap te maken van een ongesorteerde array. Dit wordt gedaan door te beginnen bij het laatste niet-bladknooppunt en herhaaldelijk de bubble-down-operatie uit te voeren totdat alle knooppunten voldoen aan de heap-eigenschap.

Heapify-bewerking in Min Heap

Implementatie van Heapify-bewerking in Min-Heap:

C++
#include  #include  using namespace std; void minHeapify(vector &arr, int i, int n) { int kleinste = i;  int l = 2*i + 1;  int r = 2*i + 2;  als (l< n && arr[l] < arr[smallest])  smallest = l;  if (r < n && arr[r] < arr[smallest])  smallest = r;  if (smallest != i) {  swap(arr[i], arr[smallest]);  minHeapify(arr, smallest, n);  } } int main() {  vector arr = {10, 5, 15, 2, 20, 30};  uit<< 'Original array: ';  for (int i = 0; i < arr.size(); i++)  cout << arr[i] << ' ';  // Perform heapify operation on min-heap  for (int i = arr.size()/2 - 1; i>= 0; i--) minHeapify(arr, i, arr.size());  uit<< '
Min-Heap after heapify operation: ';  for (int i = 0; i < arr.size(); i++)  cout << arr[i] << ' ';  return 0; }>
Java
// Java code of Heapify operation in Min-Heap import java.util.Arrays; import java.util.List; public class Main {  // Function to maintain the min-heap property of the heap rooted at index 'i'  public static void minHeapify(List arr, int i, int n) {// Stel dat de wortel het kleinste element is, aanvankelijk int kleinste = i;  // Bereken de indices van het linker- en rechterkind van het huidige knooppunt int l = 2 * i + 1;  int r = 2 * ik + 2;  // Vergelijk het linkerkind met het huidige kleinste als (l< n && arr.get(l) < arr.get(smallest))  smallest = l;  // Compare the right child with the current smallest  if (r < n && arr.get(r) < arr.get(smallest))  smallest = r;  // If the current node is not the smallest, swap it with the smallest child  if (smallest != i) {  int temp = arr.get(i);  arr.set(i, arr.get(smallest));  arr.set(smallest, temp);  // Recursively heapify the subtree rooted at the smallest child  minHeapify(arr, smallest, n);  }  }  public static void main(String[] args) {  // Create a list representing the array  List arr = Arrays.asList(10, 5, 15, 2, 20, 30);  System.out.print('Originele array: ');  // Druk de originele array af voor (int i = 0; i< arr.size(); i++)  System.out.print(arr.get(i) + ' ');  // Perform heapify operation on the min-heap  // Start from the last non-leaf node and go up to the root of the tree  for (int i = arr.size() / 2 - 1; i>= 0; i--) minHeapify(arr, i, arr.size());  System.out.print('
Min-Heap na heapify-bewerking: ');  // Druk de min-heap af na heapify-bewerking voor (int i = 0; i< arr.size(); i++)  System.out.print(arr.get(i) + ' ');  } }>
Python
def minHeapify(arr, i, n): smallest = i left = 2 * i + 1 right = 2 * i + 2 if left < n and arr[left] < arr[smallest]: smallest = left if right < n and arr[right] < arr[smallest]: smallest = right if smallest != i: arr[i], arr[smallest] = arr[smallest], arr[i] minHeapify(arr, smallest, n) if __name__ == '__main__': arr = [10, 5, 15, 2, 20, 30] print('Original array:', arr) # Perform heapify operation on a min-heap for i in range(len(arr) // 2 - 1, -1, -1): minHeapify(arr, i, len(arr)) print('Min-Heap after heapify operation:', arr)>
C#
using System; using System.Collections.Generic; class GFG {  // Function to perform the minHeapify operation on a min-heap.  static void MinHeapify(List arr, int i, int n) { int kleinste = i;  int links = 2 * ik + 1;  int rechts = 2 * ik + 2;  // Vergelijk het linkerkind met het huidige kleinste knooppunt.  als (links< n && arr[left] < arr[smallest])  smallest = left;  // Compare the right child with the current smallest node.  if (right < n && arr[right] < arr[smallest])  smallest = right;  // If the current node is not the smallest  // swap it with the smallest child.  if (smallest != i)  {  int temp = arr[i];  arr[i] = arr[smallest];  arr[smallest] = temp;  // Recursively call minHeapify on the affected subtree.  MinHeapify(arr, smallest, n);  }  }  static void Main(string[] args)  {  List arr = nieuwe lijst { 10, 5, 15, 2, 20, 30 };  Console.Write('Originele array: ');  foreach (int num in arr) Console.Write(num + ' ');  // Voer een heapify-bewerking uit op de min-heap.  for (int i = arr.Count / 2 - 1; i>= 0; i--) MinHeapify(arr, i, arr.Count);  Console.Write('
Min-Heap na heapify-bewerking: ');  foreach (int num in arr) Console.Write(num + ' ');  } }>
Javascript
// Define a function to perform min-heapify operation on an array function minHeapify(arr, i, n) {  let smallest = i;  let l = 2 * i + 1;  let r = 2 * i + 2;  // Check if left child is smaller than the current smallest element  if (l < n && arr[l] < arr[smallest])  smallest = l;  // Check if right child is smaller than the current smallest element  if (r < n && arr[r] < arr[smallest])  smallest = r;  // If the smallest element is not the current element, swap them  if (smallest !== i) {  [arr[i], arr[smallest]] = [arr[smallest], arr[i]];  minHeapify(arr, smallest, n);  } } // Main function function main() {  const arr = [10, 5, 15, 2, 20, 30];  // Print the original array  console.log('Original array: ' + arr.join(' '));  // Perform heapify operation on the min-heap  for (let i = Math.floor(arr.length / 2) - 1; i>= 0; i--) minHeapify(arr, i, arr.lengte);  // Druk de min-heap af na heapify-bewerking console.log('Min-Heap na heapify-bewerking: ' + arr.join(' ')); } // Roep de hoofdfunctie aan om het proces main();>

Uitvoer
Original array: 10 5 15 2 20 30 Min-Heap after heapify operation: 2 5 15 10 20 30>

De tijdscomplexiteit van heapify in een min-heap is O(n).

priemgetal in Java

5. Zoekoperatie op Min-Heap-gegevensstructuur:

Om naar een element in de min-heap te zoeken, kan een lineaire zoekopdracht worden uitgevoerd over de array die de heap vertegenwoordigt. De tijdscomplexiteit van een lineaire zoekopdracht is echter O(n), wat niet efficiënt is. Daarom is zoeken geen veelgebruikte bewerking in een min-heap.

Hier is een voorbeeldcode die laat zien hoe u naar een element in een min-heap kunt zoeken met behulp van std::vind() :

C++
#include  using namespace std; int main() {  priority_queue , groter > min_heap;  // voorbeeld max heap min_heap.push(10);  min_heap.push(9);  min_heap.push(8);  min_heap.push(6);  min_heap.push(4);  int-element = 6; // element om te zoeken naar bool gevonden = false;  // Kopieer de min heap naar een tijdelijke wachtrij en zoek naar // het element std::priority_queue , groter > temp = min_heap;  while (!temp.empty()) { if (temp.top() == element) { gevonden = waar;  pauze;  } temp.pop();  } if (gevonden) { std::cout<< 'Element found in the min heap.'  << std::endl;  }  else {  std::cout << 'Element not found in the min heap.'  << std::endl;  }  return 0; }>
Java
import java.util.PriorityQueue; public class GFG {  public static void main(String[] args)  {  PriorityQueue min_heap = nieuwe PriorityQueue();  min_heap.add(3); // voeg elementen in de prioriteitswachtrij min_heap.offer(1);  min_heap.offer(4);  min_heap.aanbieding(1);  min_heap.offer(6);  int-element = 6; // element om te zoeken naar boolean gevonden = false;  // Kopieer de min heap naar een tijdelijke wachtrij en zoek // naar het element PriorityQueue temp = nieuwe PriorityQueue(min_heap);  while (!temp.isEmpty()) { if (temp.poll() == element) { gevonden = waar;  pauze;  } } if (gevonden) { System.out.println( 'Element gevonden in de min heap.');  } else { System.out.println( 'Element niet gevonden in de minimale heap.');  } } }>
Python3
import heapq min_heap = [1, 2, 3, 5, 6, 7, 8, 10] # example min heap heapq.heapify(min_heap) element = 6 # element to search for found = False # Copy the min heap to a temporary list and search for the element temp = list(min_heap) while temp: if heapq.heappop(temp) == element: found = True break if found: print('Element found in the min heap.') else: print('Element not found in the min heap.')>
C#
using System; using System.Collections.Generic; public class GFG {  public static void Main()  {  var minHeap = new PriorityQueue ();  // voorbeeld min heap minHeap.Enqueue(4);  minHeap.Enqueue(6);  minHeap.Enqueue(8);  minHeap.Enqueue(9);  minHeap.Enqueue(10);  int-element = 6; // element om te zoeken naar bool gevonden = false;  // Kopieer de min heap naar een tijdelijke wachtrij en zoek // naar het element var temp = new PriorityQueue (minHeap);  while (temp.Count> 0) { if (temp.Peek() == element) { gevonden = waar;  pauze;  } temp.Dequeue();  } if (gevonden) { Console.WriteLine( 'Element gevonden in de minimale heap.');  } else { Console.WriteLine( 'Element niet gevonden in de minimale heap.');  } } }>
Javascript
// Example min heap let minHeap = new PriorityQueue(); minHeap.enqueue(4); minHeap.enqueue(6); minHeap.enqueue(8); minHeap.enqueue(9); minHeap.enqueue(10); let element = 6; // Element to search for let found = false; // Copy the min heap to a temporary queue and search for the element let temp = new PriorityQueue(minHeap); while (temp.size()>0) { if (temp.peek() == element) { gevonden = waar;  pauze;  } temp.dequeue(); } if (gevonden) { console.log('Element gevonden in de min heap.'); } else { console.log('Element niet gevonden in de minimale heap.'); }>

Uitvoer
Element found in the min heap.>

Complexiteitsanalyse :

De tijd complexiteit van dit programma is O(n logboek n) , waar N is het aantal elementen in de prioriteitswachtrij.

De invoegoperatie heeft een tijdscomplexiteit van O(logboek n) in het ergste geval omdat de heap-eigenschap behouden moet blijven. De zoekbewerking omvat het kopiëren van de prioriteitswachtrij naar een tijdelijke wachtrij en het vervolgens doorkruisen van de tijdelijke wachtrij O(n logboek n) In het ergste geval duurt het langer, omdat elk element moet worden gekopieerd en uit de wachtrij moet worden gehaald, en de prioriteitswachtrij voor elke bewerking opnieuw moet worden opgebouwd.

De complexiteit van de ruimte van het programma is Op) omdat het opslaat N elementen in de prioriteitswachtrij en creëert een tijdelijke wachtrij N elementen.

Toepassingen van Min-Heap-gegevensstructuur:

  • Heap-sortering: Min heap wordt gebruikt als een sleutelcomponent in het heap sorteeralgoritme, een efficiënt sorteeralgoritme met een tijdscomplexiteit van O(nlogn).
  • Prioriteits-rij: Een prioriteitswachtrij kan worden geïmplementeerd met behulp van een min-heap-gegevensstructuur waarbij het element met de minimumwaarde altijd in de root staat.
  • Dijkstra’s algoritme: In het algoritme van Dijkstra wordt een min heap gebruikt om de hoekpunten van de grafiek op te slaan met de minimale afstand tot het startpunt. Het hoekpunt met de minimale afstand bevindt zich altijd aan de wortel van de hoop.
  • Huffman-codering: Bij Huffman-codering wordt een min-heap gebruikt om een ​​prioriteitswachtrij te implementeren om een ​​optimale prefixcode voor een gegeven set tekens te bouwen.
  • K-gesorteerde arrays samenvoegen: Gegeven K-gesorteerde arrays, kunnen we ze efficiënt samenvoegen tot een enkele gesorteerde array met behulp van een min-heap-gegevensstructuur.

Voordelen van Min-heap-gegevensstructuur:

  • Efficiënt inbrengen en verwijderen : Min heap maakt het snel invoegen en verwijderen van elementen mogelijk met een tijdscomplexiteit van O(log n), waarbij n het aantal elementen in de heap is.
  • Efficiënt ophalen van minimaal element: Het minimumelement in een min-heap bevindt zich altijd in de root van de heap, en kan in O(1)-tijd worden opgehaald.
  • Ruimtebesparend: Min heap is een compacte datastructuur die kan worden geïmplementeerd met behulp van een array of een binaire boom, waardoor deze ruimte-efficiënt is.
  • Sorteren: Min heap kan worden gebruikt om een ​​efficiënt sorteeralgoritme te implementeren, zoals heap sort met een tijdscomplexiteit van O(n log n).
  • Prioriteits-rij: Min heap kan worden gebruikt om een ​​prioriteitswachtrij te implementeren, waarbij het element met de minimale prioriteit efficiënt in O(1) tijd kan worden opgehaald.
  • Veelzijdigheid: Min heap heeft verschillende toepassingen in de informatica, waaronder grafiekalgoritmen, datacompressie en databasesystemen.

Over het geheel genomen is min heap een nuttige en veelzijdige datastructuur die efficiënte werking en ruimte-efficiëntie biedt en verschillende toepassingen heeft in de informatica.