En prioritetskö är en abstrakt datatyp i programmering som stöder två obligatoriska operationer - lägg till ett element och extrahera maximalt [1] (minimum). Det antas att det för varje element är möjligt att beräkna dess prioritet - ett reellt tal eller, i det allmänna fallet, ett element i en linjärt ordnad mängd [2] .
De huvudsakliga metoderna som implementeras av prioritetskön är följande [2] [3] [1] :
I detta fall motsvarar ett mindre nyckelvärde en högre prioritet.
I vissa fall är det mer naturligt att nyckeln växer tillsammans med prioriteringen. Då kan den andra metoden kallas extract_maximum()[1] .
Det finns ett antal implementeringar där båda grundläggande operationerna utförs i värsta fall under begränsad tid (se "O" stor och "o" liten ), där är antalet lagrade par.
Som ett exempel på en prioriterad kö, betrakta en arbetares uppgiftslista. När han är klar med en uppgift går han vidare till nästa - högsta prioritet (nyckeln kommer att vara den ömsesidiga prioriteten) - det vill säga han utför operationen att extrahera det maximala. Chefen lägger till uppgifter i listan, anger deras prioritet, det vill säga utför operationen att lägga till ett element.
I praktiken utökas ofta prioritetskögränssnittet med andra operationer [4] [3] :
I indexerade prioritetsköer (adresserade [5] ) är det möjligt att komma åt element via index. Sådana köer kan till exempel användas för att slå samman flera sorterade sekvenser (multiway merge) [1] .
Dubbeländad prioritetskö (DEPQ ) kan också övervägas , där det finns åtkomstoperationer till både minimum- och maximumelementet [6] .
Prioritetskön kan implementeras baserat på olika datastrukturer.
De enklaste (och inte särskilt effektiva) implementeringarna kan använda en oordnad eller ordnad array , en länkad lista , lämplig för små köer. I det här fallet kan beräkningarna vara antingen "lata" (allvarligheten av beräkningarna överförs till utvinningen av elementet) och tidigt (ivrig), när införandet av elementet är svårare än dess utvinning. Det vill säga att en av operationerna kan utföras i tid och den andra - i värsta fall för , var är kölängden [1] .
Mer effektiva är heap -baserade implementeringar , där båda operationerna kan utföras i värsta fall i tid [1] . Dessa inkluderar binär heap , binomial heap , fibonacci heap , parningshög[6] .
Den abstrakta datatypen (ATD) för prioritetskön härleds från heap-ADT genom att byta namn på motsvarande funktioner. Minsta (högsta) värde är alltid överst på högen [7] .
Python-standardbiblioteket innehåller en modul heapq[8] som implementerar en prioritetskö [9] :
# importera två köfunktioner med namnen som används i den här artikeln från heapq import heappush som infoga , heappop som extrakt_maximum pq = [] # initiera listan infogning ( pq , ( 4 , 0 , "p" )) # infoga element "p" in i kön " med index 0 och prioritet 4 infoga ( pq , ( 2 , 1 , "e" )) infoga ( pq , ( 3 , 2 , "a" )) infoga ( pq , ( 1 , 3 , "h" )) # prioritetsordningstigandeielementenfyradeutskriv _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _Detta exempel kommer att mata ut ordet "hög".