Каква е структурата данни priority_queue?
sobes.tech AI
Отговор от AI
priority_queue — това е адаптер за контейнер от стандартната библиотека на C++, който предоставя функционалност на опашка с приоритети. Елементите се извличат според тяхната приоритетност (по подразбиране, най-големият елемент има най-висок приоритет). По същество, това е обвивка над друг контейнер (по подразбиране std::vector), който използва алгоритми за купа (std::make_heap, std::push_heap, std::pop_heap) за поддържане на структурата на купа вътре в базовия контейнер.
Основни характеристики:
- Приоритет: Елементите се извличат според тяхната приоритетност. По подразбиране се използва
std::less, което означава, че най-големият елемент се счита за с най-висок приоритет (макс-купа). Може да се промени редът, като се предостави друг компаратор, напримерstd::greaterза мин-купа. - Адаптер:
priority_queueне е самостоятелен контейнер, а адаптира друг базов контейнер (обикновеноstd::vector, но може и друг, напримерstd::deque), предоставяйки интерфейс на опашка с приоритети. - Купа: Вътрешно реализирана е с използване на купа, което осигурява логаритмична сложност за операциите по вмъкване и извличане.
- Несортиран достъп: Не предоставя произволен достъп до елементите. Достъпни са само операциите за вмъкване (
push), извличане на елемент с най-висок приоритет (pop) и преглед на елемента с най-висок приоритет (top).
Основни операции:
| Операция | Описание | Сложност (средна/най-лоша) |
|---|---|---|
push |
Вмъква елемент с даден приоритет. | O(log N) |
pop |
Премахва елемент с най-висок приоритет. | O(log N) |
top |
Връща константна препратка към елемента с най-висок приоритет. | O(1) |
empty |
Проверява дали опашката е празна. | O(1) |
size |
Получава броя на елементите в опашката. | O(1) |
Пример за използване:
#include <queue>
#include <vector>
#include <iostream>
#include <functional> // за std::greater
int main() {
// Макс-купа (по подразбиране)
std::priority_queue<int> max_pq;
max_pq.push(10);
max_pq.push(30);
max_pq.push(20);
std::cout << "Елементи на макс-купа (top): ";
while (!max_pq.empty()) {
std::cout << max_pq.top() << " ";
max_pq.pop();
}
std::cout << std::endl;
// Мин-купа (използвайки 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 << "Елементи на мин-купа (top): ";
while (!min_pq.empty()) {
std::cout << min_pq.top() << " ";
min_pq.pop();
}
std::cout << std::endl;
return 0;
}
Използва се в алгоритми, където е необходимо постоянно извличане на елемент с най-висок (или най-нисък) приоритет, например алгоритъма на Дейкстра, алгоритъма на Прим и в моделиране на събития.