Anna Kuikka Pyöräkatu 9 B 68 70600 Kuopio GSM: 040-734 9266 akuikka@cc.hut.fi Opiskelijanro: 60219K Prioriteettijonot
PRIORITEETTIJONOT...1 1. JOHDANTO...3 2. TOTEUTUKSET...3 1.2 Keon toteutus...4 1.3 Prioriteettijonon toteutus osoittimilla...6 3. SOVELTAMINEN...6 4. YHTEENVETO JA JOHTOPÄÄTÖKSET...7 LÄHDELUETTELO...8
1. Johdanto Jono on tietorakenne, joka sallii operaatiot Push(A, x) ja Pop(A), jotka siis lisäävät ja poistavat jonosta yksittäisen alkion. Jonosta poistaminen poistaa vanhimman jonossa olevista alkioista. Prioriteettijono toimii muuten kuin tavallinen jono, mutta siinä oleviin alkioihin on mahdollista liittää prioriteetti, jonka mukaan rakenne on järjestetty. Prioteetti eli alkiot voidaan poistaa jonosta ainoastaan tärkeysjärjestyksessä, joka määräytyy alkioiden prioriteetin, etuoikeusarvon (eli tärkeysjärjestystä kuvaavan lukuarvon) perusteella. Prioriteettijonon alkioilla on oltava jokin ominaisuus ts. avain, jonka perusteella paremmuusjärjestys selviää. Avain voi olla alkion attribuutti, alkion attribuuttien yhdistelmä tai alkioon liitetty keinotekoinen ominaisuus. Avaimia on voitava vertailla eli avaimilla on oltava täydellinen järjestys eli p= -relaatio, jotta paras alkio olisi löydettävissä. Vertailijan menetelmiä ovat mm. a p b, a p = b, a = b, a f b tai a f= b. Jokaiselle prioriteettijonoon lisättävälle alkiolle on lisäysoperaatiota käytettäessä annettava samalla prioriteetti. Kun prioriteettijonosta poistetaan alkio poisto-operaatiolla, poistuu jonosta se alkio, jolla on pienin prioriteetin arvo (pienin/suurin). Suuremman prioriteetin alkio ohittaa aina jonossa pienemmän prioriteetin alkion prioriteettinsa mukaisesti. Jos prioriteettijonossa on useita sellaisia alkioita, joilla on keskenään sama prioriteetti, nämä poistuvat jonosta siinä järjestyksessä kuin ne tavallisessa jonossa poistuisivat: ensimmäisenä jonoon laitettu alkio myös poistuu ensimmäisenä kaikista saman prioriteetin omaavista alkioista. Jos kaikkien prioriteettijonoon lisättävien alkioiden prioriteetti pidetään aina samana, prioriteettijono käyttäytyy kuten tavallinen jono. 2. Toteutukset Prioriteettijono on abstrakti tietotyyppi, joka voidaan toteuttaa monella eri tavalla. Tapojen olennaisin ero on, miten tehokkaasti ne voivat toteuttaa prioriteettijonoissa esiintyviä operaatioita. Näissä jonoissa esiintyviä operaatioita ovat: Construct: Luo uden prioriteettijonon Insert: Lisää alkion prioriteettijonoon DeleteMin/DeleteMax: Poistaa jonosta ensimmäisen alkion, joka on siis prioriteetiltään pienin tai suurin Replace: Korvaa jonon ensimmäisen alkion uudella alkiolla Change: Vaihtaa tietyn alkion prioteettiä Delete: Poistaa tietyn alkio jonosta Merge: Yhdistää kaksi prioriteettijonoa i Järjestämättömässä l stassa insert-operaatio on vakioaikainen eli O(1), jolloin tähän listaan on lisääminen on nopeaa, mutta operaatioihin DeleteMin,
replace ja delete, jotka kohdistuvat pienimpään tai muuten tiettyyn alkioon ovat ajankäytöltään hitaita eli lineaarisia, jolloin operaatioiden nopeus on kertaluokkaa O(N). Järjestetyssä listassa insert-operaatio, samoin kuin replace- ja delete operaatiot, jotka kohdistavat toimintonsa alkion lisäämiseen ja tiettyyn alkioon ovat hitaita eli kertaluokkaa O(N), mutta DeleteMin/DeleteMax operaatiot, jotka kohdistuvat litan ensimmäiseen alkioon ovat vastaavasti nopeita (O(1)). Binäärisessä hakupuussa kaikki operaatiot ovat nopeudeltaan keskimäärin O(logN) ja pahimmassa tapauksessa O(N). Toteuttamalla prioriteettijono tasapainotetulla binäärihakupuulla nopeus on pahimmassa tapauksessa suuruusluokkaa O(log N). Sekä binäärinen että tasapainotettu binääripuu tukevat myös monia muita kuin em. operaatioita ja ovatkin siksi yleensä turhan monimutkaisia prioriteettijonojen toteutukseen. 1.2 Keon toteutus Keko on tavallisen taulukon päälle rakennettava tietorakenne, jonka avulla voidaan toteuttaa prioriteettijono. Kaikki keon operaatiot voidaan suorittaa ajassa O(logN), lukuunottamatta Merge-operaatiota, jotka voidaan suorittaa ajassa O(MlogN). Kun prioriteettijono toteutetaan keon avulla, niin tuntemalla alkion sijainti jonossa, voidaan sen prioriteettia kasvattaa tai vähentää tehokkaasti, jolloin alkio siirtyy jonossa uuden prioriteettinsa mukaiselle paikalle. Annetun alkion sijainnin etsiminen keosta ei kuitenkaan onnistu olennaisesti nopeammin kuin tavallisesta järjestämättömästä taulukosta. Keko on täydellinen binääripuu, jossa tasot, mahdollisesti alimmaista tasoa lukuunottamatta, ovat täynnä ja alimmaisella tasolla kaikki alkiot on sijoitettu puun vasempaan reunaan. Jos keko on tyypiltään MinHeap, kunkin solmun prioriteettiarvo on pienempi kuin sen lasten prioriteettiarvot. Tällöin keon kekoehtona sanotaan olevan isä pienempi kuin lapsi. Vastaavasti jos keko on tyypiltään MaxHeap, niin kekoehto on isä suurempi kuin lapsi. Seuraava esimerkki (esimerkki 1. ja kuva 1.) kuvaa viimeksi mainittua tapausta. Esimerkki 1.: Tapaus, jossa juuri suurin ja kekoehtona isä suurempi kuin lapsi. 1 2 3 4 5 6 7 8 9 10 21 19 16 18 11 11 15 7 3 4
Kuva 1. Tapaus, jossa juuri suurin ja kekoehtona isä suurempi kuin lapsi. Keon operaatiot, kun keko esitetään taulukkona ovat : Insert: 1. Lisää alkio taulukon loppuun ensimmäiseen tyhjään paikkaan 2. Korjaa kekoehto nostamalla alkiota ylemmäs vaihtamalla aina pareittain isän kanssa tai luomalla tyhjä solmu, siirtämällä stiä ylöspäin ja asettamalla uusi alkio lopulta siihen. DeleteMin: 1. Juuri poistetaan 2. Asetetaan viimeinen elementti juuren tilalle ja annetaan jurena olevan elementin sijoittua oikealle paikalleen tai valutetaan tyhjää paikkaa alemmas ja siirretään viimeinen elementti lopulta siihen. 3. Vaihdetaan isä aina pienemmän (kekoehdosta riippuen) pojan kanssa. Muut keon operaatiot ovat: Replace (O(logN)): 1. Korvaa juurena olevan alkion jollakin uudella alkiolla. 2. Järjestää keon uudelleen valuttamalla juurialkiota alemmas puussa, kunnes voimassa oleva kekoehto on tosi. Change (N(logN)): 1. Vaihtaa tietyn alkion prioriteetin 2. Palauttaa kekoehdon voimaan joko siirtämällä alkiota ylemmäs tai alemmas puussa. Delete: 1. Poistaa alkion 2. Sijoittaa poistetun alkion paikalle keon viimeisen alkion.
3. Palauttaa kekoehdon voimaan siirtämällä viimeksi mainittua alkiota keossa ylemmäs tai alemmas. Merge (O(MlogN), jossa M on pienemmän ja N suuremman keon koko): 1. Yhdistää kaksi kekoa yhdeksi (Keot voidaan yhdistää siten, että niiden alkiot asetetaan peräkkäin yhteiseen taulukkoon, joka sitten rakennetaan uudeksi keoksi. Tällöin aikaa kuluu O(M+N) (M ja N kerrottu edellä). 1.3 Prioriteettijonon toteutus osoittimilla Osoittimet ovat monissa ohjelmointikielissä keino viitata tietueisiin siten, että osoittimen kautta voi lukea ja kirjoittaa tietueen arvon. Tietue on vakiokokoinen rakenteinen kokonaisuus, joka koostuu hyötykuormasta ja osoitinkentistä, joita käytetään järjestämään tietueet mielekkääksi kokonaisuudeksi. Toteuttamalla prioriteettijonot sopivilla osoitinrakenteilla, voidaan kahden jonon yhdistäminen suorittaa ajassa O((N+M)), jos alkuperäiset jonot on luvallista hävittää. Myös prioriteettijonon perusoperaatiot saadaan monesti toimimaan näillä tietorakenteilla tehokkaammin kuin taulukoilla toteutetuilla keoilla. Haittoina tässä ovat kuitenkin algoritmien monimutkaistuminen sekä osoittimien vaatima lisämuistin tarve. Tärkeimpiä osoittimilla toteutetuja prioriteettijonoja ovat binomikeot, jotka ovat joukko binomipuita ja niistä edelleen kehitetyt laiskat binomikeot sekä Fibonacci-keot, jotka ovat kokoelma kekojärjestettyjä puita, mutta eivät kuitenkaan ole binomipuita. 3. Soveltaminen Prioriteettijonoa sovelletaan tilanteissa, joissa tavanomainen jonotus ei riitä. Esimerkkitapauksena tällaisesta tilanteesta voisi olla ensiapupoliklinikan potilaat, jolloin jonon potilailla on kiireellisyysjärjestys, jolloin kiireellisin palvellaan ensin jne. Myös prosessit käyttöjärjestelmässä, jolloin prioriteetti määräytyisi iän mukaan tai Huffman:n koodaus, jossa solmun prioriteetti on sen esiintymistodennäköisyys, ovat hyviä esimerkkejä prioriteettisovelluksista. Prioriteettijono esiintyy myös käyttöjärjestelmän kirjoitinjonon yhteydessä. Tällöin prioriteetti voi määräytyä mm. käyttäjän tai tulostettavan tiedoston koon mukaan. Voidaan siis haluta palvella nopeammin pieniä tulostettavia töitä tai henkilöitä, jolla on korkeampi oikeus käyttää kirjoitinta tai muita resursseja.
4. Yhteenveto ja johtopäätökset Prioteettijonon voidaan toteuttaa usealla eri tavalla. Toteutusvaihtoehtoina ovat mm. järjestämätön ja järjestetty lista sekä binääri- ja tasapainotettu binääripuu. Jono voidaan toteuttaa myös keon ja osoittimien avulla. Olennaisin ero eri menetelmien välillä on nopeus ts. miten nopeasti mikin menetelmä voi ratkaista prioriteettijonojen operaatiot. Toiset menetelmät tekevät esimerkiksi jonoon lisäyksen nopeiten O(1), mutta taasen esim. poiston nopeudella O(N), joka on vastaavasti hitaammasta päästä. Keko on luettelemistani menetelmistä nopein, sillä se toteuttaa jonon operaatiot keskimäärin nopeudella O(logN). Keko onkin tärkein ja ehkä myös käytetyin prioriteettijonon toteutusmenetelmä. Prioriteettijonon on sopivin tilanteissa, jossa tietueita on tarpeellista käsitellä lajitellussa järjestyksessä, mutta kaikkien tietueiden ei kuitenkaan tarvitse olla täysin järjestettyjä. Esimerkiksi, jos halutaan käsitellä vain avaimeltaan/prioriteetiltaan suurinta tietuetta muiden, avaimeltaan pienempien käsittelyn jäädessä myöhemmäksi. Tehokkaimmillaan prioriteettijonon käyttö onkin silloin, kun hakukriteerinä on yksi prioriteetti eli tietueista haetaan jotain tiettyä ominaisuutta ja halutaan hakutuloksien tulostuvan järjestyksessä suurimmasta pienempään tai pienemmästä suurimpaan kekoehdon mukaan.
Lähdeluettelo [1] Kokkarinen Ilkka ja Ala-Mutka Kirsi: Tietorakenteet ja algoritmit. 2. uudistettu painos. [2] Weiss, Mark Allen: Data Structures and Algorithm Analysis in C. Second edition. [3] Korhonen A., Malmi L.:Tietorakenteet ja algoritmit, opetusmoniste kappale 7. Prioriteettijonot: http://www.cs.hut.fi/opinnot/t- 106.253/k2003/Luennot/Lv7M_7prioriteettijonot.pdf [4] Tietorakenteet ja algoritmit, opetusmoniste kappale Prioriteetijono, Joensuu: http://www.cs.joensuu.fi/pages/sjuva/trak_dokum2/sivut/prijono.html [5] Räsänen Piia: Tietorakenteet ja algoritmit, opetusmoniste kappale Prioriteettijono, Kuopio.