Prioritní fronta je abstraktní datový typ v programování , který podporuje dvě povinné operace – přidat prvek a extrahovat maximum [ 1] (minimum). Předpokládá se, že pro každý prvek je možné vypočítat jeho prioritu - reálné číslo nebo v obecném případě prvek lineárně uspořádané množiny [2] .
Hlavní metody implementované prioritní frontou jsou následující [2] [3] [1] :
V tomto případě menší hodnota klíče odpovídá vyšší prioritě.
V některých případech je přirozenější, že klíč roste spolu s prioritou. Pak lze druhou metodu nazvat extract_maximum()[1] .
Existuje řada implementací, ve kterých se obě základní operace provádějí v nejhorším případě v omezeném čase (viz "O" velké a "o" malé ), kde je počet uložených párů.
Jako příklad prioritní fronty zvažte seznam úkolů pracovníka. Když dokončí jeden úkol, přejde na další - nejvyšší prioritu (klíč bude převrácená hodnota priority) - to znamená, že provede operaci vytěžení maxima. Šéf přidá úkoly do seznamu s uvedením jejich priority, to znamená, že provede operaci přidání prvku.
V praxi je rozhraní prioritní fronty často rozšířeno o další operace [4] [3] :
V indexovaných prioritních frontách (adresovaných [5] ) je možné přistupovat k prvkům podle indexu. Takové fronty lze použít například ke sloučení několika seřazených sekvencí (multiway merge) [1] .
V úvahu připadá i fronta s dvojitou prioritou ( DEPQ ) , ve které jsou přístupové operace jak k minimálnímu, tak k maximálnímu prvku [6] .
Prioritní fronta může být implementována na základě různých datových struktur.
Nejjednodušší (a nepříliš efektivní) implementace mohou používat neuspořádané nebo uspořádané pole , propojený seznam , vhodné pro malé fronty. V tomto případě mohou být výpočty buď „líné“ (závažnost výpočtů se přenáší na extrakci prvku), nebo rané (horlivé), kdy je vložení prvku obtížnější než jeho extrakce. To znamená, že jedna z operací může být provedena v čase , a druhá - v nejhorším případě pro , kde je délka fronty [1] .
Efektivnější jsou implementace založené na haldě , kde lze obě operace provést v nejhorším případě včas [1] . Patří sem binární halda , binomická halda , Fibonacciho halda , párovací halda[6] .
Abstraktní datový typ (ATD) pro prioritní frontu je odvozen z haldy ADT přejmenováním odpovídajících funkcí. Minimální (maximální) hodnota je vždy v horní části haldy [7] .
Standardní knihovna Pythonu obsahuje modul heapq[8] , který implementuje prioritní frontu [9] :
# import dvou funkcí fronty s názvy použitými v tomto článku z heapq import heappush jako insert , heappop jako extract_maximum pq = [] # inicializace vložení seznamu ( pq , ( 4 , 0 , "p" )) # vložení prvku "p" do fronty " s indexem 0 a prioritou 4 vložit ( pq , ( 2 , 1 , "e" )) vložit ( pq , ( 3 , 2 , "a" )) vložit ( pq , ( 1 , 3 , "h" )) # prioritypořadívzestupnémveprvkyčtyřivytiskněte _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _Tento příklad vypíše slovo "halda".