Ի՞նչ է տվյալների կառուցվածքը priority_queue-ը։
sobes.tech AI
Պատասխան AI-ից
priority_queue — դա C++ ստանդարտ գրադարանի կոնտեյների ադապտեր է, որը ապահովում է առաջնահերթության հերթի գործառույթ։ Էլեմենտները դուրս են բերվում ըստ նրանց առաջնահերթության (առաջնականում, ամենաբարձր արժեք ունեցող էլեմենտը ունի բարձրագույն առաջնահերթություն): Իրականում, սա մի շղթա է մյուս կոնտեյների վրա (առաջնականում std::vector), որը օգտագործում է հողերի ալգորիթմներ (std::make_heap, std::push_heap, std::pop_heap)՝ պահելու հողի կառուցվածքը բազային կոնտեյների ներսում:
Հիմնական առանձնահատկություններ՝
- Առաջնահերթություն: Էլեմենտները դուրս են բերվում ըստ նրանց առաջնահերթության։ Առաջնականում օգտագործվում է
std::less, ինչը նշանակում է, որ ամենաբարձր արժեք ունեցող էլեմենտը համարվում է բարձր առաջնահերթությամբ (max-heap): Կարող է փոխվել կարգը՝ տրամադրելով այլ համեմատիչ, օրինակ,std::greater՝ min-heap-ի համար։ - Ադապտեր:
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() {
// Max-heap (առաջնական)
std::priority_queue<int> max_pq;
max_pq.push(10);
max_pq.push(30);
max_pq.push(20);
std::cout << "Max-հողի տարրեր (top): ";
while (!max_pq.empty()) {
std::cout << max_pq.top() << " ";
max_pq.pop();
}
std::cout << std::endl;
// Min-heap (օգտագործելով `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 << "Min-հողի տարրեր (top): ";
while (!min_pq.empty()) {
std::cout << min_pq.top() << " ";
min_pq.pop();
}
std::cout << std::endl;
return 0;
}
Կիրառվում է ալգորիթմներում, որտեղ անհրաժեշտ է շարունակաբար դուրս բերել բարձր կամ ցածր առաջնահերթությամբ տարր, օրինակ՝ Դեյքստրայի, Պրիմի ալգորիթմներում կամ իրադարձությունների մոդելավորման ժամանակ։