Junior
Čo je dátová štruktúra priority_queue?
sobes.tech AI
Odpoveď od AI
priority_queue — adaptér kontajnera zo štandardnej knižnice C++, ktorý poskytuje funkcionalitu fronty s prioritami. Prvky sú vyberané podľa ich priority (predvolene, najväčší prvok má najvyššiu prioritu). V podstate je to obal nad iným kontajnerom (predvolene std::vector), ktorý používa algoritmy haldy (std::make_heap, std::push_heap, std::pop_heap) na udržiavanie štruktúry haldy vo vnútri základného kontajnera.
Kľúčové vlastnosti:
- Priorita: Prvky sú vyberané podľa ich priority. Predvolene sa používa
std::less, čo znamená, že najväčší prvok sa považuje za s najvyššou prioritou (max-heap). Môže byť zmenené poradie, poskytnutím iného porovnávača, napr.std::greaterpre min-heap. - Adapter:
priority_queuenie je samostatný kontajner, ale adaptér nad iným základným kontajnerom (zvyčajnestd::vector, ale môže byť aj iný, napr.std::deque), ktorý poskytuje rozhranie fronty s prioritami. - Hlava: Interné je implementované pomocou haldy, čo zabezpečuje logaritmickú zložitosť pre operácie vkladania a vyberania.
- Nerovnomerný prístup: Neumožňuje náhodný prístup k prvkom. Sú dostupné iba operácie vkladania (
push), odstránenia prvku s najvyššou prioritou (pop) a zobrazenia prvku s najvyššou prioritou (top).
Hlavné operácie:
| Operácia | Popis | Zložitosť (priemer/horší prípad) |
|---|---|---|
push |
Vloží prvok s danou prioritou. | O(log N) |
pop |
Odstráni prvok s najvyššou prioritou. | O(log N) |
top |
Vráti konštantnú referenciu na prvok s najvyššou prioritou. | O(1) |
empty |
Skontroluje, či je fronta prázdna. | O(1) |
size |
Získa počet prvkov vo fronte. | O(1) |
Príklad použitia:
#include <queue>
#include <vector>
#include <iostream>
#include <functional> // pre std::greater
int main() {
// Max-heap (predvolené)
std::priority_queue<int> max_pq;
max_pq.push(10);
max_pq.push(30);
max_pq.push(20);
std::cout << "Prvky max-heapu (top): ";
while (!max_pq.empty()) {
std::cout << max_pq.top() << " ";
max_pq.pop();
}
std::cout << std::endl;
// Min-heap (použitím std::greater<int>)
std::priority_queue<int, std::vector<int>, std::greater<int>> min_pq;
min_pq.push(10);
min_pq.push(30);
min_pq.push(20);
std::cout << "Prvky min-heapu (top): ";
while (!min_pq.empty()) {
std::cout << min_pq.top() << " ";
min_pq.pop();
}
std::cout << std::endl;
return 0;
}
Používa sa v algoritmoch, kde je potrebné neustále vyberať prvok s najvyšším (alebo najnižším) priorítom, napr. Dijkstrův algoritmus, Primov algoritmus alebo v simuláciách udalostí.