Junior
Mi az a priority_queue adatstruktúra?
sobes.tech MI
Válasz az MI-től
priority_queue — egy konténeradapter a C++ standard könyvtárból, amely prioritási sor funkciót nyújt. A elemek a prioritásuk szerint kerülnek kivételre (alapértelmezés szerint a legnagyobb elem a legmagasabb prioritású). Lényegében ez egy másik konténer (alapértelmezés szerint std::vector) fölött működő burkolat, amely heap algoritmusokat (std::make_heap, std::push_heap, std::pop_heap) használ a heap struktúra fenntartására a belső konténerben.
Fő jellemzők:
- Prioritás: Az elemek a prioritásuk szerint kerülnek kivételre. Alapértelmezés szerint a
std::lessvan használatban, ami azt jelenti, hogy a legnagyobb elem a legmagasabb prioritású (max-heap). Más összehasonlítót is meg lehet adni, példáulstd::greater-t a min-heaphez. - Adapter: A
priority_queuenem önálló konténer, hanem egy másik alapkonténert (általábanstd::vector, de lehet más is, példáulstd::deque) adaptál, és prioritási sor interfészt biztosít. - Heap: Belsőleg heap-ként van megvalósítva, ami logaritmikus komplexitást biztosít beszúrás és kivétel műveleteknél.
- Nem rendezett hozzáférés: Nem biztosít véletlenszerű hozzáférést az elemekhez. Csak beszúrás (
push), a legmagasabb prioritású elem kivétele (pop) és a legmagasabb prioritású elem megtekintése (top) érhető el.
Fő műveletek:
| Művelet | Leírás | Átlagos/legrosszabb esetbeli komplexitás |
|---|---|---|
push |
Egy elem beszúrása adott prioritással. | O(log N) |
pop |
A legmagasabb prioritású elem eltávolítása. | O(log N) |
top |
Állandó referencia visszaadása a legmagasabb prioritású elemre. | O(1) |
empty |
Ellenőrzi, hogy üres-e a sor. | O(1) |
size |
A sor elemeinek száma. | O(1) |
Használati példa:
#include <queue>
#include <vector>
#include <iostream>
#include <functional> // std::greater számára
int main() {
// Max-heap (alapértelmezett)
std::priority_queue<int> max_pq;
max_pq.push(10);
max_pq.push(30);
max_pq.push(20);
std::cout << "Max-heap elemei (top): ";
while (!max_pq.empty()) {
std::cout << max_pq.top() << " ";
max_pq.pop();
}
std::cout << std::endl;
// Min-heap (std::greater<int> használatával)
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 << "Min-heap elemei (top): ";
while (!min_pq.empty()) {
std::cout << min_pq.top() << " ";
min_pq.pop();
}
std::cout << std::endl;
return 0;
}
Olyan algoritmusokban használják, ahol folyamatosan a legmagasabb (vagy legalacsonyabb) prioritású elemet kell kivonni, például Dijkstra, Prim algoritmusokban vagy esemény szimulációkban.