Prioriteettijono on ohjelmoinnin abstrakti tietotyyppi , joka tukee kahta pakollista toimintoa - lisää elementti ja poimi maksimi [1] (minimi). Oletetaan, että jokaiselle elementille on mahdollista laskea sen prioriteetti - reaaliluku tai yleisessä tapauksessa lineaarisesti järjestetyn joukon alkio [2] .
Tärkeimmät prioriteettijonon toteuttamat menetelmät ovat seuraavat [2] [3] [1] :
Tässä tapauksessa pienempi avainarvo vastaa korkeampaa prioriteettia.
Joissakin tapauksissa on luonnollisempaa, että avain kasvaa prioriteetin mukana. Sitten toista menetelmää voidaan kutsua extract_maximum()[1] .
On olemassa useita toteutuksia, joissa molemmat perustoiminnot suoritetaan pahimmassa tapauksessa rajoitetun ajan (katso "O" suuri ja "o" pieni ), missä on tallennettujen parien määrä.
Esimerkkinä prioriteettijonosta harkitse työntekijän tehtäväluetteloa. Kun hän suorittaa yhden tehtävän, hän siirtyy seuraavaan - korkeimpaan prioriteettiin (avain on prioriteetin käänteisluku) - eli hän suorittaa maksimin poimimisen. Pomo lisää tehtäviä luetteloon ilmoittamalla niiden prioriteetin, eli suorittaa elementin lisäämisen.
Käytännössä prioriteettijonoliitäntää laajennetaan usein muilla toiminnoilla [4] [3] :
Indeksoiduissa prioriteettijonoissa (osoite [5] ) on mahdollista käyttää elementtejä indeksin mukaan. Tällaisia jonoja voidaan käyttää esimerkiksi useiden lajiteltujen sekvenssien yhdistämiseen (multiway merge) [1] .
Myös kaksipäistä prioriteettijonoa (DEPQ ) voidaan harkita , jossa on pääsyoperaatioita sekä minimi- että maksimielementtiin [6] .
Prioriteettijono voidaan toteuttaa eri tietorakenteiden perusteella.
Yksinkertaisimmat (ja ei kovin tehokkaat) toteutukset voivat käyttää järjestämätöntä tai järjestettyä taulukkoa , linkitettyä listaa , joka sopii pieniin jonoihin. Tässä tapauksessa laskelmat voivat olla joko "laiskoja" (laskelmien vakavuus siirtyy elementin poistamiseen) ja varhaisia (innokkaita), kun elementin lisääminen on vaikeampaa kuin sen poistaminen. Toisin sanoen yksi operaatioista voidaan suorittaa ajoissa ja toinen - pahimmassa tapauksessa , missä on jonon pituus [1] .
Tehokkaampia ovat kasapohjaiset toteutukset , joissa molemmat toiminnot voidaan suorittaa pahimmassa tapauksessa ajallaan [1] . Näitä ovat binäärikeko , binomikasa , fibonacci - kasa , parituskeko[6] .
Prioriteettijonon abstrakti tietotyyppi (ATD) johdetaan keon ADT:stä nimeämällä vastaavat funktiot uudelleen. Minimi (maksimi) arvo on aina kasan yläosassa [7] .
Python-standardikirjasto sisältää moduulin heapq[8] , joka toteuttaa prioriteettijonon [9] :
# tuo kaksi jonofunktiota tässä artikkelissa käytetyillä nimillä kohdasta heapq import heappush as insert , heappop muodossa extract_maximum pq = [] # alusta listan lisäys ( pq , ( 4 , 0 , "p" )) # lisää elementti "p" jonoon " indeksillä 0 ja prioriteetilla 4 insert ( pq , ( 2 , 1 , "e" )) insert ( pq , ( 3 , 2 , "a" )) insert ( pq , ( 1 , 3 , "h") ) ) _tärkeysjärjestyksessänousevassaelementtiäneljätulosta# _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _Tämä esimerkki tulostaa sanan "kasa".