O coadă de prioritate este un tip abstract de date în programare care acceptă două operații obligatorii - adăugați un element și extrageți maximul [1] (minimum). Se presupune că pentru fiecare element este posibil să se calculeze prioritatea acestuia - un număr real sau, în cazul general, un element al unei mulțimi ordonate liniar [2] .
Principalele metode implementate de coada de prioritate sunt următoarele [2] [3] [1] :
În acest caz, o valoare a cheii mai mică corespunde unei priorități mai mari.
În unele cazuri, este mai natural ca cheia să crească împreună cu prioritatea. Atunci a doua metodă poate fi numită extract_maximum()[1] .
Există o serie de implementări în care ambele operații de bază sunt efectuate în cel mai rău caz în timp limitat (vezi „O” mare și „o” mic ), unde este numărul de perechi stocate.
Ca exemplu de coadă de prioritate, luați în considerare lista de sarcini a unui lucrător. Când termină o sarcină, trece la următoarea - cea mai mare prioritate (cheia va fi reciproca priorității) - adică efectuează operația de extragere a maximului. Șeful adaugă sarcini la listă, indicând prioritatea acestora, adică efectuează operația de adăugare a unui element.
În practică, interfața de coadă prioritară este adesea extinsă cu alte operațiuni [4] [3] :
În cozile de prioritate indexate (adresate [5] ), este posibilă accesarea elementelor prin index. Astfel de cozi pot fi folosite, de exemplu, pentru a îmbina mai multe secvențe sortate (multiway merge) [1] .
Poate fi luată în considerare și coada cu prioritate dublă (DEPQ ) , în care există operații de acces atât la elementul minim, cât și la cel maxim [6] .
Coada de prioritate poate fi implementată pe baza diferitelor structuri de date.
Cele mai simple (și nu foarte eficiente) implementări pot folosi o matrice neordonată sau ordonată , o listă legată , potrivită pentru cozi mici. În acest caz, calculele pot fi fie „leneșe” (severitatea calculelor se transferă la extragerea elementului) și timpurii (dornici), când introducerea elementului este mai dificilă decât extragerea acestuia. Adică, una dintre operații poate fi efectuată în timp , iar cealaltă - în cel mai rău caz pentru , unde este lungimea cozii [1] .
Mai eficiente sunt implementările bazate pe heap , unde ambele operații pot fi efectuate în cel mai rău caz în timp [1] . Acestea includ grămada binar , grămada binomială , grămada Fibonacci , grămada de împerechere[6] .
Tipul de date abstracte (ATD) pentru coada de prioritate este derivat din heap ADT prin redenumirea funcțiilor corespunzătoare. Valoarea minimă (maximă) este întotdeauna în partea de sus a heap-ului [7] .
Biblioteca standard Python conține un modul heapq[8] care implementează o coadă de prioritate [9] :
# import două funcții de coadă cu numele folosite în acest articol din heapq import heappush ca insert , heappop ca extract_maximum pq = [] # inițializați inserarea listei ( pq , ( 4 , 0 , "p" )) # inserați elementul "p" în coadă " cu index 0 și prioritate 4 inserați ( pq , ( 2 , 1 , " e " ) ) inserați ( pq , ( 3 , 2 , " a " ) ) inserați ( pq , ( 1 , 3 , " h ") )) # decrescătoareordineînelementepatruceleimprimați _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _Acest exemplu va scoate cuvântul „heap”.