A prioritási sor egy absztrakt adattípus a programozásban , amely két kötelező műveletet támogat - adjon hozzá egy elemet, és vegye ki a maximumot [1] (minimális). Feltételezzük, hogy minden elemhez ki lehet számítani a prioritását - egy valós számot, vagy általános esetben egy lineárisan rendezett halmaz elemét [2] .
A prioritási sor által megvalósított fő módszerek a következők [2] [3] [1] :
Ebben az esetben egy kisebb kulcsérték magasabb prioritásnak felel meg.
Bizonyos esetekben természetesebb, hogy a kulcs a prioritással együtt nő. Ekkor a második módszert nevezhetjük extract_maximum()[1] -nek .
Számos olyan implementáció létezik, amelyben mindkét alapművelet a legrosszabb esetben korlátozott időn belül történik (lásd "O" nagy és "o" kicsi ), ahol a tárolt párok száma.
Példaként egy prioritási sorra vegye figyelembe a dolgozó feladatlistáját. Amikor befejez egy feladatot, áttér a következőre - a legmagasabb prioritásúra (a kulcs a prioritás reciprokja lesz) -, vagyis végrehajtja a maximum kivonásának műveletét. A főnök hozzáadja a feladatokat a listához, jelezve azok prioritását, azaz elvégzi az elem hozzáadásának műveletét.
A gyakorlatban a prioritási sor interfészt gyakran kibővítik más műveletekkel [4] [3] :
Az indexelt prioritású sorokban (cím : [5] ) lehetőség van az elemekhez index szerint hozzáférni. Az ilyen sorok használhatók például több rendezett sorozat egyesítésére (multiway merge) [1] .
Szintén szóba jöhet a kétvégű prioritási sor (DEPQ ) , amelyben mind a minimális, mind a maximális elemhez vannak hozzáférési műveletek [6] .
A prioritási sor különféle adatstruktúrák alapján implementálható.
A legegyszerűbb (és nem túl hatékony) megvalósítások használhatnak rendezetlen vagy rendezett tömböt , linkelt listát , amely alkalmas kis sorokhoz. Ebben az esetben a számítások lehetnek „lusták” (a számítások súlyossága átkerül az elem kinyerésére), és korai (buzgó), amikor az elem beillesztése nehezebb, mint a kinyerése. Vagyis az egyik művelet időben végrehajtható , a másik pedig - legrosszabb esetben -re , ahol a sor hossza [1] .
Hatékonyabbak a kupac alapú implementációk , ahol mindkét művelet a legrosszabb esetben is elvégezhető időben [1] . Ezek közé tartozik a bináris kupac , a binomiális kupac , a fibonacci kupac , a párosító kupac[6] .
A prioritási sor absztrakt adattípusa (ATD) a halom ADT-ből származik a megfelelő függvények átnevezésével. A minimális (maximális) érték mindig a kupac tetején van [7] .
A Python szabványos könyvtára tartalmaz egy modult heapq[8] , amely egy prioritási sort [9] valósít meg :
# importáljon két sorfüggvényt a cikkben használt névvel a heapq -ből import heappush as insert , heappop as extract_maximum pq = [] # inicializálja a lista beszúrását ( pq , ( 4 , 0 , "p" )) # "p" elem beszúrása sorba " 0 indexű és 4 prioritású beszúrás ( pq , ( 2 , 1 , "e" )) beszúrás ( pq , ( 3 , 2 , "a" )) beszúrás ( pq , ( 1 , 3 , "h") )) # fontosságinövekvőelemetnégyakinyomtatja sorrendben _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _Ez a példa a "heap" szót adja ki.