cola de prioridad
Las colas de prioridad son un tipo de adaptadores de contenedores, específicamente diseñados de tal manera que el primer elemento de la cola es el mayor de todos los elementos de la cola y los elementos están en orden no creciente (por lo tanto, podemos ver que cada elemento de la cola tiene una prioridad {fija ordenar}).
Funciones asociadas a una cola de prioridad:
- vacío(): esta función devuelve si la cola está vacía.
- size(): Esta función devuelve el tamaño de la cola.
- top(): Devuelve una referencia al elemento superior de la cola.
- push(x): esta función agrega el elemento ‘ x ‘ al final de la cola.
tupla
Una tupla es un objeto que puede contener varios elementos. Los elementos pueden ser de diferentes tipos de datos. Los elementos de las tuplas se inicializan como argumentos en el orden en que se accederá a ellos.
Funciones asociadas a una tupla:
- get(): get() se utiliza para acceder a los valores de la tupla y modificarlos, acepta el índice y el nombre de la tupla como argumentos para acceder a un elemento de la tupla en particular.
- make_tuple(): make_tuple() se usa para asignar tupla con valores. Los valores pasados deben estar en orden con los valores declarados en la tupla.
Este artículo se centra en cómo se puede usar la cola de prioridad de tuplas en C++. La cola de prioridad de tuplas puede ser bastante útil al diseñar estructuras de datos complejas.
Syntax 1: Max-heap priority queue of tuples: priority_queue<tuple<data_type1, data_type2, data_type3>> priorityQueue; Syntax 2: Min-heap priority queue of tuples: priority_queue<tuple<data_type1, data_type2, data_type3>, vector<tuple<data_type1, data_type2, data_type3>>, greater<tuple<data_type1, data_type2, data_type3>>> priorityQueue; Syntax 3: Customized priority queue of tuples (using comparator): priority_queue<tuple<data_type1, data_type2, data_type3>, vector<tuple<data_type1, data_type2, data_type3>>, comparator> priorityQueue;
Cola de tuplas de prioridad de pila máxima:
Por defecto, las colas de prioridad son max-heap. Entonces, en el caso de un par de tuplas en la cola de prioridad, se compara su primer elemento, y si el primer elemento de ambas tuplas es igual, entonces se compara su segundo elemento y si el segundo elemento también es igual, entonces el tercer elemento es comparado. La tupla que tiene el elemento más grande se convierte en el elemento superior de la cola de prioridad.
Ejemplo 1: a continuación se muestra el programa C++ para implementar colas de tuplas con prioridad máxima de almacenamiento dinámico.
C++
// C++ program to implement // the above approach #include <bits/stdc++.h> using namespace std; // Function to print priority queue // contents. Deliberately passing it // call by value since we don't want // to remove elements from the priority // queue void print(priority_queue<tuple<int, int, char> > priorityQueue) { while (!priorityQueue.empty()) { // Each element of the priority // queue is a tuple itself tuple<int, int, char> Tuple = priorityQueue.top(); cout << "[ "; cout << get<0>(Tuple) << ' ' << get<1>(Tuple) << ' ' << get<2>(Tuple); cout << ']'; cout << '\n'; // Pop out the topmost tuple priorityQueue.pop(); } } // Driver code int main() { // Declaring a priority queue of // tuple priority_queue<tuple<int, int, char> > priorityQueue; // Declaring a tuple tuple<int, int, char> tuple1; // Initializing the tuple tuple1 = make_tuple(1, 1, 'G'); // Pushing the tuple in the // priority queue priorityQueue.push(tuple1); // Declaring another tuple tuple<int, int, char> tuple2; // Initializing the tuple tuple2 = make_tuple(2, 2, 'e'); // Pushing the tuple in the // priority queue priorityQueue.push(tuple2); // Declaring another tuple tuple<int, int, char> tuple3; // Initializing the tuple tuple3 = make_tuple(3, 3, 'e'); // Pushing the tuple in the // priority queue priorityQueue.push(tuple3); // Declaring another tuple tuple<int, int, char> tuple4; // Initializing the tuple tuple4 = make_tuple(4, 4, 'k'); // Pushing the tuple in the // priority queue priorityQueue.push(tuple4); // Calling print function print(priorityQueue); return 0; }
[ 4 4 k] [ 3 3 e] [ 2 2 e] [ 1 1 G]
Ejemplo 2: a continuación se muestra el programa C++ para demostrar el funcionamiento de la cola de tuplas de prioridad máxima del montón.
C++
// C++ program to implement // the above approach #include <bits/stdc++.h> using namespace std; // Function to print priority queue // contents. Deliberately passing it // call by value since we don't want // to remove elements from the priority // queue void print(priority_queue<tuple<int, int, string> > priorityQueue) { while (!priorityQueue.empty()) { // Each element of the priority // queue is a tuple itself tuple<int, int, string> Tuple = priorityQueue.top(); cout << "[ "; cout << get<0>(Tuple) << ' ' << get<1>(Tuple) << ' ' << get<2>(Tuple); cout << ']'; cout << '\n'; // Pop out the topmost tuple priorityQueue.pop(); } } // Driver code int main() { // Declaring a priority queue // of tuple priority_queue<tuple<int, int, string> > priorityQueue; // Declaring a tuple tuple<int, int, string> tuple1; // Initializing the tuple tuple1 = make_tuple(0, 0, "Geeks"); // Pushing the tuple in the // priority queue priorityQueue.push(tuple1); // Declaring a tuple tuple<int, int, string> tuple2; // Initializing the tuple tuple2 = make_tuple(0, 0, "Programming"); // Pushing the tuple in the // priority queue priorityQueue.push(tuple2); // Declaring a tuple tuple<int, int, string> tuple3; // Initializing the tuple tuple3 = make_tuple(1, 2, "Geeks"); // Pushing the tuple in the // priority queue priorityQueue.push(tuple3); // Declaring a tuple tuple<int, int, string> tuple4; // Initializing the tuple tuple4 = make_tuple(1, 3, "Programming"); // Pushing the tuple in the // priority queue priorityQueue.push(tuple4); // Calling print function print(priorityQueue); return 0; }
[ 1 3 Programming] [ 1 2 Geeks] [ 0 0 Programming] [ 0 0 Geeks]
Cola de prioridad de montón mínimo de tuplas:
En el caso de un par de tuplas en la cola de prioridad min-heap, se compara su primer elemento, y si el primer elemento de ambas tuplas es igual, entonces se compara su segundo elemento y si el segundo elemento también es igual, entonces el tercer elemento se compara. La tupla que tiene el elemento más pequeño se convierte en el elemento superior de la cola de prioridad.
Ejemplo 1: a continuación se muestra el programa C++ para implementar el funcionamiento de la cola de tuplas de prioridad min-heap.
C++
// C++ program to implement // the above approach #include <bits/stdc++.h> using namespace std; // Function to print priority queue // contents. Deliberately passing it // call by value since we don't want // to remove elements from the priority // queue void print(priority_queue<tuple<int, int, char>, vector<tuple<int, int, char> >, greater<tuple<int, int, char> > > priorityQueue) { while (!priorityQueue.empty()) { // Each element of the priority // queue is a tuple itself tuple<int, int, char> Tuple = priorityQueue.top(); cout << "[ "; cout << get<0>(Tuple) << ' ' << get<1>(Tuple) << ' ' << get<2>(Tuple); cout << ']'; cout << '\n'; // Pop out the topmost tuple priorityQueue.pop(); } } // Driver code int main() { // Declaring a min-heap priority // queue of tuple priority_queue<tuple<int, int, char>, vector<tuple<int, int, char> >, greater<tuple<int, int, char> > > priorityQueue; // Declaring a tuple tuple<int, int, char> tuple1; // Initializing the tuple tuple1 = make_tuple(1, 1, 'G'); // Pushing the tuple in the // priority queue priorityQueue.push(tuple1); // Declaring another tuple tuple<int, int, char> tuple2; // Initializing the tuple tuple2 = make_tuple(2, 2, 'e'); // pushing the tuple in the // priority queue priorityQueue.push(tuple2); // Declaring another tuple tuple<int, int, char> tuple3; // Initializing the tuple tuple3 = make_tuple(3, 3, 'e'); // Pushing the tuple in the // priority queue priorityQueue.push(tuple3); // Declaring another tuple tuple<int, int, char> tuple4; // Initializing the tuple tuple4 = make_tuple(4, 4, 'k'); // Pushing the tuple in the // priority queue priorityQueue.push(tuple4); // Calling print function print(priorityQueue); return 0; }
[ 1 1 G] [ 2 2 e] [ 3 3 e] [ 4 4 k]
Ejemplo 2: a continuación se muestra el programa C++ para implementar el funcionamiento de la cola de tuplas de prioridad min-heap.
C++
// C++ program to implement // the above approach #include <bits/stdc++.h> using namespace std; // Function to print priority queue // contents. Deliberately passing it // call by value since we don't want // to remove elements from the priority // queue void print(priority_queue<tuple<int, int, string>, vector<tuple<int, int, string> >, greater<tuple<int, int, string> > > priorityQueue) { while (!priorityQueue.empty()) { // Each element of the priority // queue is a tuple itself tuple<int, int, string> Tuple = priorityQueue.top(); cout << "[ "; cout << get<0>(Tuple) << ' ' << get<1>(Tuple) << ' ' << get<2>(Tuple); cout << ']'; cout << '\n'; // Pop out the topmost tuple priorityQueue.pop(); } } // Driver code int main() { // Declaring a priority queue of // tuple priority_queue<tuple<int, int, string>, vector<tuple<int, int, string> >, greater<tuple<int, int, string> > > priorityQueue; // Declaring a tuple tuple<int, int, string> tuple1; // Initializing the tuple tuple1 = make_tuple(0, 0, "Geeks"); // Pushing the tuple in the // priority queue priorityQueue.push(tuple1); // Declaring a tuple tuple<int, int, string> tuple2; // Initializing the tuple tuple2 = make_tuple(0, 0, "Programming"); // Pushing the tuple in the // priority queue priorityQueue.push(tuple2); // Declaring a tuple tuple<int, int, string> tuple3; // Initializing the tuple tuple3 = make_tuple(1, 2, "Geeks"); // Pushing the tuple in the // priority queue priorityQueue.push(tuple3); // Declaring a tuple tuple<int, int, string> tuple4; // Initializing the tuple tuple4 = make_tuple(1, 3, "Programming"); // Pushing the tuple in the // priority queue priorityQueue.push(tuple4); // Calling print function print(priorityQueue); return 0; }
[ 0 0 Geeks] [ 0 0 Programming] [ 1 2 Geeks] [ 1 3 Programming]
Cola de prioridad personalizada de tuplas:
Continuando ¿Cómo implementar Min Heap usando STL? es un requisito previo obligatorio para ir donde aquí aprenderemos cómo podemos personalizar la cola de prioridad de tuplas pasando un comparador a la cola de prioridad como argumento.
Ejemplo 1: a continuación se muestra el programa C++ para implementar la cola de prioridad personalizada de tuplas.
C++
// C++ program to implement // the above approach #include <bits/stdc++.h> using namespace std; // Comparator // we can use class also but then // we will need to make the function // public as class is by default // private struct myComparator { int operator()(const tuple<int, int, string>& tuple1, const tuple<int, int, string>& tuple2) { // Second element of tuples is equal if (get<1>(tuple1) == get<1>(tuple2)) { if (get<0>(tuple1) == get<0>(tuple2)) { if (get<2>(tuple1) >= get<2>(tuple2)) return true; return false; } return get<0>(tuple1) >= get<0>(tuple2); } return get<1>(tuple1) >= get<1>(tuple2); } }; // Function to print priority queue // contents. Deliberately passing it // call by value since we don't want // to remove elements from the priority // queue void print(priority_queue<tuple<int, int, string>, vector<tuple<int, int, string> >, myComparator> priorityQueue) { while (!priorityQueue.empty()) { // Each element of the priority // queue is a tuple itself tuple<int, int, string> Tuple = priorityQueue.top(); cout << "[ "; cout << get<0>(Tuple) << ' ' << get<1>(Tuple) << ' ' << get<2>(Tuple); cout << ']'; cout << '\n'; // Pop out the topmost tuple priorityQueue.pop(); } } // Driver code int main() { // Declaring a priority queue // of tuple priority_queue<tuple<int, int, string>, vector<tuple<int, int, string> >, myComparator> priorityQueue; // Declaring a tuple tuple<int, int, string> tuple1; // Initializing the tuple tuple1 = make_tuple(0, 0, "Geeks"); // Pushing the tuple in the // priority queue priorityQueue.push(tuple1); // Declaring a tuple tuple<int, int, string> tuple2; // Initializing the tuple tuple2 = make_tuple(0, 1, "Programming"); // Pushing the tuple in the // priority queue priorityQueue.push(tuple2); // Declaring a tuple tuple<int, int, string> tuple3; // Initializing the tuple tuple3 = make_tuple(1, 2, "Geeks"); // Pushing the tuple in the // priority queue priorityQueue.push(tuple3); // Declaring a tuple tuple<int, int, string> tuple4; // Initializing the tuple tuple4 = make_tuple(1, 3, "Programming"); // Pushing the tuple in the // priority queue priorityQueue.push(tuple4); // Calling print function print(priorityQueue); return 0; }
[ 0 0 Geeks] [ 0 1 Programming] [ 1 2 Geeks] [ 1 3 Programming]
En el programa anterior, para un par de tuplas, primero se compara el segundo elemento de las tuplas y si este valor es igual, se compara el primer elemento y si el primer elemento de ambas tuplas es igual, se compara el tercer elemento. De lo contrario, la tupla que tenga un elemento más pequeño se convertirá en el elemento superior.
Ejemplo 2: a continuación se muestra el programa C++ para demostrar el funcionamiento de la cola de prioridad personalizada de tuplas.
C++
// C++ program to implement // the above approach #include <bits/stdc++.h> using namespace std; // Comparator // we can use class also but then // we will need to make the function // public as class is by default private struct myComparator { int operator()(const tuple<int, int, string>& tuple1, const tuple<int, int, string>& tuple2) { // Second element of tuples is equal if (get<1>(tuple1) == get<1>(tuple2)) { // first element of tuples is equal if (get<0>(tuple1) == get<0>(tuple2)) { if (get<2>(tuple1) <= get<2>(tuple2)) return true; return false; } return get<0>(tuple1) <= get<0>(tuple2); } return get<1>(tuple1) <= get<1>(tuple2); } }; // Function to print priority queue // contents. Deliberately passing it // call by value since we don't want // to remove elements from the priority // queue void print(priority_queue<tuple<int, int, string>, vector<tuple<int, int, string> >, myComparator> priorityQueue) { while (!priorityQueue.empty()) { // Each element of the priority // queue is a tuple itself tuple<int, int, string> Tuple = priorityQueue.top(); cout << "[ "; cout << get<0>(Tuple) << ' ' << get<1>(Tuple) << ' ' << get<2>(Tuple); cout << ']'; cout << '\n'; // Pop out the topmost tuple priorityQueue.pop(); } } // Driver code int main() { // Declaring a priority queue of // tuples by passing a custom comparator priority_queue<tuple<int, int, string>, vector<tuple<int, int, string> >, myComparator> priorityQueue; // Declaring a tuple tuple<int, int, string> tuple1; // Initializing the tuple tuple1 = make_tuple(0, 0, "Geeks"); // Pushing the tuple in the // priority queue priorityQueue.push(tuple1); // Declaring a tuple tuple<int, int, string> tuple2; // Initializing the tuple tuple2 = make_tuple(0, 1, "Programming"); // Pushing the tuple in the // priority queue priorityQueue.push(tuple2); // Declaring a tuple tuple<int, int, string> tuple3; // Initializing the tuple tuple3 = make_tuple(1, 2, "Geeks"); // Pushing the tuple in the // priority queue priorityQueue.push(tuple3); // Declaring a tuple tuple<int, int, string> tuple4; // Initializing the tuple tuple4 = make_tuple(1, 3, "Programming"); // Pushing the tuple in the // priority queue priorityQueue.push(tuple4); // Calling print function print(priorityQueue); return 0; }
[ 1 3 Programming] [ 1 2 Geeks] [ 0 1 Programming] [ 0 0 Geeks]
En el programa anterior, para un par de tuplas, primero se compara el segundo elemento de las tuplas y si este valor es igual, se compara el primer elemento y si el primer elemento de ambas tuplas es igual, se compara el tercer elemento. De lo contrario, la tupla que tenga un elemento más grande se convertirá en el elemento superior.