31.01.2015 Views

Luento 6 -Prioriteettijono, keko

Luento 6 -Prioriteettijono, keko

Luento 6 -Prioriteettijono, keko

SHOW MORE
SHOW LESS

Create successful ePaper yourself

Turn your PDF publications into a flip-book with our unique Google optimized e-Paper software.

A274101 TIETORAKENTEET<br />

JA ALGORITMIT<br />

PRIORITEETTIJONO, KEKO<br />

PRIORITEETTIJONO<br />

Etuoikeusjono, prioriteettijono (Priority Queue) -<br />

paljolti tavallisen jonon kaltainen<br />

Jonon keskeiset toimenpiteet ovat<br />

enqueue (lisääminen jonon päähän)<br />

dequeue (jonon ensimmäisen alkion poistaminen)<br />

PQ:n keskeiset toiminnot ovat periaatteeltaan<br />

samat<br />

enqueue on täsmälleen sama – nimeltään insert<br />

dequeue on sen sijaan rajoitettu<br />

Minimi-PQ:sta poistetaan pienin alkio – del_min<br />

Maksimi-PQ:n tapauksessa puolestaan poistetaan<br />

suurin alkio – del_max<br />

11.10.2005 KyAMK - TiRak, syksy 2005 2<br />

PRIORITEETTIJONO<br />

PRIORITEETTIJONO<br />

<br />

<br />

<br />

<br />

<br />

<br />

PQ:lla on lukuisia sovelluksia<br />

Moniajotietokoneessa prosessien jono on PQ:<br />

Käyttöjärjestelmän kriittiset toiminnat pääsevät ensinnä<br />

suoritusvuoroon<br />

Eräissä järjestelmissä vähän CPU-aikaa vievillä prosesseilla<br />

on korkeampi prioriteetti kuin paljon aikaa vievillä<br />

Kirjoitinjonot eivät usein ole PQ:ita, vaikka tästä olisi hyötyä<br />

Eräs keskeinen PQ:itten käyttökohde on aikaan perustuvat<br />

tapahtumapohjaiset todelliset prosessit tai simuloinnit:<br />

Prioriteetti määräytyy suoritushetken perusteella.<br />

Aikaisemmalla on suurempi prioriteetti kuin myöhemmin<br />

tapahtuvalla.<br />

PQ:ita näkee myös muualla kuin tietojenkäsittelyssä:<br />

Esimerkiksi ravintolan jono voi olla PQ, missä prioriteettiarvot<br />

jakaa portsari<br />

<br />

<br />

PQ voidaan toteuttaa muun muassa<br />

taulukkona<br />

linkitettynä listana<br />

BST:nä<br />

Suoritusaikavertailua<br />

Toteutus<br />

Insert<br />

Taulukko, järjestämätön<br />

O(1)<br />

Taulukko, järjestetty<br />

O(n)<br />

Linkitetty lista, järjestämätön O(1)<br />

Linkitetty lista, järjestetty<br />

O(n)<br />

Del_min<br />

O(n)<br />

O(1)<br />

O(n)<br />

O(1)<br />

BST<br />

O(log n)<br />

O(log n)<br />

11.10.2005 KyAMK - TiRak, syksy 2005 3<br />

11.10.2005 KyAMK - TiRak, syksy 2005 4


PRIORITEETTIJONO<br />

KEKO<br />

Tietorakenteita tarvitaan ja käytetään<br />

suurten tietomäärien käsittelyyn<br />

O(n) suoritusaikavaatimus on huono<br />

Paras toteutustapa olisi BST<br />

BST:llä del_min tehdään äärimmäisenä<br />

vasemmalla olevalle lehdelle<br />

BST:stä tulee epätasapainoinen<br />

Voidaan välttää organisoimalla BST<br />

uudelleen hieman eri tavalla<br />

<br />

<br />

<br />

<br />

Keko on binääripuu, joka on <strong>keko</strong>järjestyksessä<br />

(Heaporder):<br />

Minimikeolla (min-heap) jokaisen solmun<br />

avainarvo on < kuin sen kaikkien jälkeläisten<br />

avainarvot<br />

Maksimikeolla järjestys on päinvastainen (solmu<br />

> jälkeläiset)<br />

Minimikeolla pienin avainarvo löytyy aina juuresta<br />

del_min -toimenpide poistaa juuren<br />

puuta pitää muokata siten, että jostakin<br />

toisesta solmusta tulee juuri ja<br />

binääripuuominaisuus säilyy<br />

11.10.2005 KyAMK - TiRak, syksy 2005 5<br />

11.10.2005 KyAMK - TiRak, syksy 2005 6<br />

KEKO<br />

KEKO<br />

insert ja del_min pitää suorittaa ajassa<br />

O(log n) ja puun tasapaino tulee säilyä<br />

Keon muodostaminen ja ylläpito:<br />

Keko on binääripuu, joka on aina täysi<br />

Ainoastaan alimman lehtirivin oikeassa<br />

laidassa saa olla vapaita paikkoja<br />

Jos binääripuun korkeus on h, niin täyden<br />

puun solmujen lukumäärä on<br />

2 h ... 2 h+1 – 1 h = O(log n)<br />

<br />

<br />

<br />

<br />

<br />

<br />

Yllättäen <strong>keko</strong> toteutetaan yleensä taulukkona<br />

Haittana on sama kuin ennenkin eli että koko on<br />

tunnettava etukäteen<br />

Etuja on kuitenkin niin paljon, että<br />

taulukkototeutus kannattaa<br />

Muun muassa taulukon järjestäminen keoksi on<br />

perustana eräälle nopeimmista tunnetuista<br />

järjestämismenetelmistä (heapsort)<br />

Taulukon konstruointiperiaate on yksinkertainen:<br />

paikassa k olevan solmun lapset ovat paikoissa 2k<br />

ja 2k + 1<br />

Indeksointi alkaa 1:stä (C/C++ -toteutuksissa<br />

taulukon 1. alkio jätetään käyttämättä)<br />

11.10.2005 KyAMK - TiRak, syksy 2005 7<br />

11.10.2005 KyAMK - TiRak, syksy 2005 8


KEKO<br />

KEKO<br />

<br />

<br />

Esimerkki: Keon muodostaminen<br />

Muodostetaan <strong>keko</strong> luvuista 4, 2, 5, 3, 1 eli suoritetaan 5 inserttoimenpidettä<br />

peräkkäin<br />

<br />

Esimerkki: Suoritetaan kerran del_min edellisessä<br />

esimerkissä konstruoidulle keolle<br />

Taulukko<br />

4<br />

4 2<br />

Toimenpide<br />

Sijoitetiin ensimmäinen luku paikkaan 1.<br />

Sijoitettiin 2 paikkaan 2. Koska paikassa 2/2 (=1) on luku 4 > 2, vaihdetaan.<br />

Taulukko<br />

1 2 5 4 3<br />

Toimenpide<br />

Taulukko alkuperäisenä.<br />

2 4<br />

2 4 5<br />

2 4 5 3<br />

Sijoitetiin 5 paikkaan 3. Koska paikassa 3/2 (=1) on luku 2 3, vaihdetaan.<br />

3 2 5 4<br />

Ykkönen on poistettu ja viimeinen alkio 3 siirretty paikkaan 1.<br />

Keko-ominaisuus ei ole voimassa, joten muokataan <strong>keko</strong>a.<br />

Pienempi alkioista paikoissa 2*1 (=2) ja 2*1+1 (=3) on<br />

paikassa 2, arvo 2 > 3<br />

2 3 5 4<br />

2 3 5 4 1<br />

1 2 5 4 3<br />

Koska paikassa 2/2 (=1) on luku 2 1, vaihdetaan. Koska<br />

paikassa 2/1 (=1) on luku 2 >= 1, vaihdetaan.<br />

Keko on nyt valmis.<br />

2 3 5 4<br />

2 3 5 4<br />

joten vaihdetaan ne keskenään.<br />

Alkiot paikoissa 2*2 (=4) ja 2*2+1 (=5, ei alkoita) eivät ole<br />

pienempiä kuin 3.<br />

Keko on valmis<br />

11.10.2005 KyAMK - TiRak, syksy 2005 9<br />

11.10.2005 KyAMK - TiRak, syksy 2005 10<br />

SEURAAVALLA KERRALLA…<br />

Hajautus eli hashing<br />

11.10.2005 KyAMK - TiRak, syksy 2005 11

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!