Anna Kuikka Pyöräkatu 9 B Kuopio GSM: Opiskelijanro: 60219K. Prioriteettijonot

Samankaltaiset tiedostot
Algoritmit 2. Luento 2 To Timo Männikkö

Algoritmit 2. Luento 2 Ke Timo Männikkö

Algoritmit 2. Luento 3 Ti Timo Männikkö

lähtokohta: kahden O(h) korkuisen keon yhdistäminen uudella juurella vie O(h) operaatiota vrt. RemoveMinElem() keossa

Algoritmit 2. Luento 3 Ti Timo Männikkö

Tehtävän V.1 ratkaisuehdotus Tietorakenteet, syksy 2003

Hakupuut. tässä luvussa tarkastelemme puita tiedon tallennusrakenteina

1 Puu, Keko ja Prioriteettijono

useampi ns. avain (tai vertailuavain) esim. opiskelijaa kuvaavassa alkiossa vaikkapa opintopistemäärä tai opiskelijanumero

Algoritmit 1. Luento 6 Ke Timo Männikkö

4. Joukkojen käsittely

58131 Tietorakenteet ja algoritmit (syksy 2015) Toinen välikoe, malliratkaisut

Algoritmit 1. Luento 7 Ti Timo Männikkö

Tietorakenteet ja algoritmit - syksy

Tietorakenteet ja algoritmit Johdanto Lauri Malmi / Ari Korhonen

TKT20001 Tietorakenteet ja algoritmit Erilliskoe , malliratkaisut (Jyrki Kivinen)

Algoritmit 1. Luento 5 Ti Timo Männikkö

Algoritmit 2. Luento 4 To Timo Männikkö

Algoritmit 2. Luento 14 Ke Timo Männikkö

18. Abstraktit tietotyypit 18.1

Sisällys. 18. Abstraktit tietotyypit. Johdanto. Johdanto

AVL-puut. eräs tapa tasapainottaa binäärihakupuu siten, että korkeus on O(log n) kun puussa on n avainta

5. Keko. Tietorakenne keko eli kasa (heap) on tehokas toteutus abstraktille tietotyypille prioriteettijono, jonka operaatiot ovat seuraavat:

Tietorakenteet ja algoritmit

A TIETORAKENTEET JA ALGORITMIT

HENRI MYLLYOJA BINÄÄRI- JA FIBONACCI-KEOT PRIORITEETTIJONON TO- TEUTUKSEEN. Kandidaatintyö

Algoritmit 2. Luento 6 To Timo Männikkö

Algoritmit 2. Luento 5 Ti Timo Männikkö

Binäärihaun vertailujärjestys

58131 Tietorakenteet ja algoritmit (kevät 2016) Ensimmäinen välikoe, malliratkaisut

811312A Tietorakenteet ja algoritmit II Perustietorakenteet

811312A Tietorakenteet ja algoritmit III Lajittelualgoritmeista

Algoritmit 1. Luento 3 Ti Timo Männikkö

Algoritmit 2. Luento 4 Ke Timo Männikkö

Algoritmi on periaatteellisella tasolla seuraava:

Algoritmit 1. Luento 10 Ke Timo Männikkö

58131 Tietorakenteet (kevät 2009) Harjoitus 9, ratkaisuja (Antti Laaksonen)

Algoritmit 2. Luento 7 Ti Timo Männikkö

Algoritmit 2. Demot Timo Männikkö

Tietorakenteet, laskuharjoitus 3, ratkaisuja

Algoritmit 1. Luento 4 Ke Timo Männikkö

2. Seuraavassa kuvassa on verkon solmujen topologinen järjestys: x t v q z u s y w r. Kuva 1: Tehtävän 2 solmut järjestettynä topologisesti.

Pikalajittelu: valitaan ns. pivot-alkio esim. pivot = oikeanpuoleisin

ALGORITMIT 1 DEMOVASTAUKSET KEVÄT 2012

A TIETORAKENTEET JA ALGORITMIT

811312A Tietorakenteet ja algoritmit, , Harjoitus 5, Ratkaisu

Tiraka, yhteenveto tenttiinlukua varten

Tietorakenteet, laskuharjoitus 7, ratkaisuja

Algoritmit 2. Luento 5 Ti Timo Männikkö

Liitosesimerkki Tietokannan hallinta, kevät 2006, J.Li 1

Liitosesimerkki. Esim R1 R2 yhteinen attribuutti C. Vaihtoehdot

A TIETORAKENTEET JA ALGORITMIT KORVAAVAT HARJOITUSTEHTÄVÄT 3, DEADLINE KLO 12:00

Tietorakenteet ja algoritmit

4 Tehokkuus ja algoritmien suunnittelu

Algoritmit 1. Luento 8 Ke Timo Männikkö

Algoritmit 2. Luento 6 Ke Timo Männikkö

Algoritmit 1. Luento 10 Ke Timo Männikkö

v 1 v 2 v 3 v 4 d lapsisolmua d 1 avainta lapsen v i alipuun avaimet k i 1 ja k i k 0 =, k d = Sisäsolmuissa vähint. yksi avain vähint.

Tieto- ja tallennusrakenteet

Sekvenssi: kokoelma peräkkäisiä alkioita (lineaarinen

Algoritmit 1. Luento 14 Ke Timo Männikkö

3. Hakupuut. B-puu on hakupuun laji, joka sopii mm. tietokantasovelluksiin, joissa rakenne on talletettu kiintolevylle eikä keskusmuistiin.

Algoritmit 1. Demot Timo Männikkö

Algoritmit 2. Luento 9 Ti Timo Männikkö

Algoritmit 2. Luento 8 To Timo Männikkö

private TreeMap<String, Opiskelija> nimella; private TreeMap<String, Opiskelija> numerolla;

Tämä on helpompi ymmärtää, kun tulkitaan keko täydellisesti tasapainotetuksi binääripuuksi, jonka juuri on talletettu taulukon paikkaan

Algoritmit 1. Demot Timo Männikkö

Kierros 4: Binäärihakupuut

1 Erilaisia tapoja järjestää

58131 Tietorakenteet Erilliskoe , ratkaisuja (Jyrki Kivinen)

CS-A1140 Tietorakenteet ja algoritmit

Tietorakenteet, laskuharjoitus 6,

(p j b (i, j) + p i b (j, i)) (p j b (i, j) + p i (1 b (i, j)) p i. tähän. Palaamme sanakirjaongelmaan vielä tasoitetun analyysin yhteydessä.

1.1 Pino (stack) Koodiluonnos. Graafinen esitys ...

Luku 8. Aluekyselyt. 8.1 Summataulukko

58131 Tietorakenteet ja algoritmit (kevät 2013) Kurssikoe 2, , vastauksia

811312A Tietorakenteet ja algoritmit V Hash-taulukot ja binääriset etsintäpuut

58131 Tietorakenteet ja algoritmit Uusinta- ja erilliskoe ratkaisuja (Jyrki Kivinen)

3. Binääripuu, Java-toteutus

Luku 4. Tietorakenteet funktio-ohjelmoinnissa. 4.1 Äärelliset kuvaukset

Rakenteiset tietotyypit Moniulotteiset taulukot

2. Perustietorakenteet

58131 Tietorakenteet (kevät 2008) 1. kurssikoe, ratkaisuja

811312A Tietorakenteet ja algoritmit, , Harjoitus 5, Ratkaisu

TKHJ:ssä on yleensä komento create index, jolla taululle voidaan luoda hakemisto

Mukautuvat järjestämisalgoritmit

811312A Tietorakenteet ja algoritmit, , Harjoitus 7, ratkaisu

9 Erilaisia tapoja järjestää

Algebralliset tietotyypit ym. TIEA341 Funktio ohjelmointi 1 Syksy 2005

811312A Tietorakenteet ja algoritmit Kertausta jälkiosasta

TIETORAKENTEET JA ALGORITMIT

13 Lyhimmät painotetut polut

1.1 Tavallinen binäärihakupuu

Tarvitaanko adaptoituvia tietorakenteita

58131 Tietorakenteet (kevät 2009) Harjoitus 6, ratkaisuja (Antti Laaksonen)

811312A Tietorakenteet ja algoritmit Kertausta kurssin alkuosasta

Tarkennamme geneeristä painamiskorotusalgoritmia

Fibonacci-kasoilla voidaan toteuttaa samat operaatiot kuin binomikasoilla.

Miten käydä läpi puun alkiot (traversal)?

Transkriptio:

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.