Sobes.tech
Junior

Ի՞նչ է տվյալների կառուցվածքը 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;
}

Կիրառվում է ալգորիթմներում, որտեղ անհրաժեշտ է շարունակաբար դուրս բերել բարձր կամ ցածր առաջնահերթությամբ տարր, օրինակ՝ Դեյքստրայի, Պրիմի ալգորիթմներում կամ իրադարձությունների մոդելավորման ժամանակ։