¿Cómo implementar Min Heap usando STL?

En C++ STL, hay prioridad_cola que se puede usar directamente para implementar Max Heap. Para comprender completamente el código, asegúrese de estar familiarizado con los siguientes conceptos en C++ 

Vea el siguiente ejemplo:

C++

// C++ program to show that priority_queue is by
// default a Max Heap
#include <bits/stdc++.h>
using namespace std;
  
// Driver code
int main ()
{
    // Creates a max heap
    priority_queue <int> pq;
    pq.push(5);
    pq.push(1);
    pq.push(10);
    pq.push(30);
    pq.push(20);
  
    // One by one extract items from max heap
    while (pq.empty() == false)
    {
        cout << pq.top() << " ";
        pq.pop();
    }
  
    return 0;
}
Producción

30 20 10 5 1 

 
Dado que los elementos se imprimen en orden descendente, tenemos un montón máximo por defecto.
 
¿Cómo implementar Min Heap?  
Priority_queue admite un constructor que requiere dos argumentos adicionales para convertirlo en un montón mínimo. 

priority_queue <Type, vector<Type>, ComparisonType > min_heap;

`El tercer parámetro, ‘Tipo de comparación’, puede ser una función o un factor (también conocido como objeto de función) que debe tener bool como tipo de retorno y debe tener 2 argumentos.

A continuación se muestra un ejemplo de números enteros.

C++

// C++ program to use priority_queue to implement min heap
#include <bits/stdc++.h>
using namespace std;
  
// Driver code
int main ()
{
    // Creates a min heap
    priority_queue <int, vector<int>, greater<int> > pq;
    pq.push(5);
    pq.push(1);
    pq.push(10);
    pq.push(30);
    pq.push(20);
  
    // One by one extract items from min heap
    while (pq.empty() == false)
    {
        cout << pq.top() << " ";
        pq.pop();
    }
  
    return 0;
}

Producción: 

1 5 10 20 30 

Otro método para hacer un montón mínimo usando la cola de prioridad predeterminada:

Esto se usa con frecuencia en la programación competitiva. Primero multiplicamos todos los elementos con (-1). Luego creamos un montón máximo (el montón máximo es el predeterminado para la cola de prioridad). Cuando accedemos a los datos y queremos imprimirlos simplemente multiplicamos esos elementos por (-1) de nuevo.

CPP-STL-Self-Paced-Course

A continuación se muestra la implementación de la idea anterior:

C++

// C++ Program to implement min heap
// using default priority_queue(max-heap)
  
#include <iostream>
#include <queue>
using namespace std;
  
int main()
{
    // data
    int arr[] = { 25, 7, 9, 15, 20, 36, 50 };
    
      // default priority_queue using max-heap
    priority_queue<int> pq;
    
      // size of the array
    int n = sizeof(arr) / sizeof(arr[0]);
  
    // multiply -1 with all elements while
    // inserting
    for (int i = 0; i < n; i++) {
        pq.push((-1) * arr[i]);
    }
  
    // multiply all elements with -1 while
    // retrieve the elements
    while (!pq.empty()) {
        cout << (pq.top()) * (-1) << " ";
        pq.pop();
    }
  
    return 0;
}
Producción

7 9 15 20 25 36 50 

¿Cómo hacer un montón mínimo de clase definida por el usuario? 

Consideremos el siguiente ejemplo donde construimos un montón mínimo de 2 puntos D ordenados por el eje X.

C++

// C++ program to use priority_queue to implement Min Heap
// for user defined class
#include <bits/stdc++.h>
using namespace std;
  
// User defined class, Point
class Point
{
   int x;
   int y;
public:
   Point(int x, int y)
   {
      this->x = x;
      this->y = y;
   }
   int getX() const { return x; }
   int getY() const { return y; }
};
  
// To compare two points
class myComparator
{
public:
    int operator() (const Point& p1, const Point& p2)
    {
        return p1.getX() > p2.getX();
    }
};
  
// Driver code
int main ()
{
    // Creates a Min heap of points (order by x coordinate)
    priority_queue <Point, vector<Point>, myComparator > pq;
  
    // Insert points into the min heap
    pq.push(Point(10, 2));
    pq.push(Point(2, 1));
    pq.push(Point(1, 5));
  
    // One by one extract items from min heap
    while (pq.empty() == false)
    {
        Point p = pq.top();
        cout << "(" << p.getX() << ", " << p.getY() << ")";
        cout << endl;
        pq.pop();
    }
  
    return 0;
}

Producción: 

(1, 5)
(2, 1)
(10, 2)

Escriba comentarios si encuentra algo incorrecto o si desea compartir más información sobre el tema tratado anteriormente.
 

Publicación traducida automáticamente

Artículo escrito por GeeksforGeeks-1 y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *