5. Prioriteettijonot. 5. luku 236

Koko: px
Aloita esitys sivulta:

Download "5. Prioriteettijonot. 5. luku 236"

Transkriptio

1 5. Prioriteettijonot Esimerkkinä prioriteetin käytöstä voisi olla lentoasemalle saapuva matkustaja, joka haluaa saada lentolipun ensimmäiselle Timbuktuun menevälle lennolle. Lentokone oli kuitenkin varattu täyteen etukäteen, mutta yleensä peruutuksia esiintyy, jolloin ennen lentoa voi saada peruutuspaikan. Kyseinen matkustaja tuli siis jonottamaan paikkaa, mutta myöhemmin tuleva saattaakin saada paikan ennen häntä, koska tällä myöhäisemmällä oli korkeampi prioriteetti, esim. aiemman ollessa alennetulla lipun hinnalla matkustava ja myöhemmän liikemieshintaan. 5. luku 236

2 Prioriteettijono tai etuoikeusjono (priority queue) on abstrakti tietotyyppi priorisoitujen alkioiden kokoelman tallettamista varten. Se tukee alkion lisäystä mielivaltaisesti valittuun kohtaan rakenteessa, mutta ainoastaan sellaisen alkion poistamista, jonka prioriteetti on järjestyksessä ensin. Tämä abstrakti tietotyyppi on täten täysin erilainen kuin tähän mennessä esitetyt pinot, jonot, kaksiloppuiset jonot, sekvenssit ja myös puut. Nämä perustuvat alkioiden tallettamiseen määrättyihin paikkoihin, jotka ovat yleensä lineaarisessa järjestyksessä ja tätä järjestystä käyttävät lisäys- ja poistotoiminnot. Prioriteettijonon yhteydessä ei ole ollenkaan sellaista paikkakäsitettä, vaan se tallettaa alkiot prioriteetin mukaan. Seuraavassa esitellään aluksi prioriteettijonon abstrakti tietotyyppi, sitten käsitellään sekvenssipohjaista toteutusta ja lopuksi binääripuuperusteista toteutusta, kekoa tai kasaa (heap), joka johtaa myös tehokkaaseen lajittelumenetelmään. 5. luku 237

3 5.1. Prioriteettijonon abstrakti tietotyyppi Tässä luvussa esitetään prioriteettijonon käsite avaimeen ja vertaimeen perustuen. Määritellään myös sen metodit. Avaimet, prioriteetit ja täydellisen järjestyksen relaatiot Tyypillisiä ovat tehtävät, joissa pitää laskea olioiden joukoille jotakin perustuen johonkin näille olioille määriteltyyn parametriin tai muuttujaan. Tällainen parametri on alkion avain (key) tai vertailuavain. Sen ei tarvitse välttämättä olla yksikäsitteinen sovelluksesta riippuen. Esim. yrityksiä voitaisiin verrata mm. työntekijöiden määrillä tai näiden palkkojen mukaan. Em. lentomatkustajan kohdalla prioriteetti voisi käsittää useita seikkoja, kuten usein lentävän kanta-asiakkaan edut, lipun hinnan ja matkustajan sisäänkirjausajan. 5. luku 238

4 Avain-käsite on luonteeltaan sangen yleinen eikä aina edes suoraan olion jokin ominaisuus, vaan ehkä sovelluksen asettama arvo, esim. lentomatkustajalle virkailijan antama prioriteetti. Kaikesta huolimatta pitää olla määriteltynä menettely, kuinka verrataan avaimia toisiinsa. Prioriteettijonon vertailut vaativat ristiriidattoman säännön. Jotta vertailusääntö, jota merkitään nyt symbolilla, olisi voimakas tässä mielessä, sen tulee olla täydellisen järjestyksen (total order) relaatio, ts. se on määritelty jokaiselle avainparille ja sen pitää toteuttaa ominaisuudet: Refleksiivisyysominaisuus (reflexive property): k k. Antisymmetrisyysominaisuus (antisymmetric property): jos k 1 k 2 ja k 2 k 1, niin k 1 = k 2. Transitiivisyysominaisuus (transitive property): jos k 1 k 2 ja k 2 k 3, niin k 1 k luku 239

5 Mikä tahansa sääntö, joka toteuttaa nämä ominaisuudet, ei koskaan johda ristiriitaan vertailussa. Sääntö määrittelee itse asiassa lineaarisen järjestyksen avainten joukossa. Jos alkiokokoelmalle on määritelty täydellinen järjestys, pienimmän avaimen käsite, k min, on hyvin määritelty, jolloin k min < k kaikille kokoelman avaimille k. Prioriteettijono P on alkioiden säiliö, jossa kullakin on avaimensa. Prioriteetti-nimitys tulee siitä, että avaimet määräävät prioriteetin, jolla alkioita haetaan ja poistetaan. Kyseeseen tulevat kaksi perusmetodia: insertitem(k,e): lisää alkion e avainta k käyttäen prioriteettijonoon P. removeminelement(): palauttaa ja poistaa prioriteettijonosta P alkion, jonka avain on pienin (pienempi tai yhtä suuri kuin minkä tahansa muun alkion avain rakenteessa P). 5. luku 240

6 Esim Tarkastellaan jälleen lentomatkustajan tilannetta. Mahdollisten peruutusten tähden lentoyhtiö ylläpitää prioriteettijonoa niille hieman ennen lentoa ilmestyville matkustajille, joille ei heti järjestynyt paikkaa lentokoneen täyttymisen vuoksi. Jokaisen matkustajan prioriteetti määrätään lipun hinnan, matkustajan statuksen ja sisäänkirjausajan mukaan. Viittaus matkustajaan asetetaan prioriteettijonoon hänelle annetun prioriteetin mukaan. Kun jokin paikka vapautuu peruutuksen vuoksi, prioriteettijonosta otetaan pois prioriteetiltaan ensimmäisenä oleva, jolle paikka annetaan. Jonoa päivitetään tilanteen mukaan niin kauan, kunnes sisäänkirjaus lopetetaan vähän ennen lentoa tai jono tyhjenee. 5. luku 241

7 Lajittelu prioriteettijonoa käyttäen Muuan tärkeä prioriteettijonon sovellus on lajittelu. Siinä on sekvenssi S ja n alkiota, joita verrataan toisiinsa täydellisen järjestyksen mielessä ja järjestetään uudelleen kasvavaan järjestykseen (ei-vähenevään ainakin). Algoritmi on varsin yksinkertainen, ja siinä on sekvenssin S lisäksi prioriteettijono P. Vaiheita on kaksi: 1. Ensiksi sekvenssin S alkiot asetetaan alunperin tyhjään prioriteettijonoon P operaation insertitem n perättäisellä käytöllä, yksi kullekin alkiolle. 2. Toiseksi otetaan olioita P:stä kasvavassa eli ei-vähenevässä järjestyksessä operaation removeminelement n kutsulla ja asetetaan alkiot takaisin järjestykseen sekvenssiin S. 5. luku 242

8 Koodissa 5.1. on esitetty algoritmin luonnos prioriteettijonoa käyttävää lajittelua varten. Varsinainen algoritmi se ei ole, koska siinä ei ole puututtu operaatioiden insertitem ja removeminelement toteutuksiin. Menetelmän kompleksisuuskin riippuu niistä, joten niiden ollessa vielä ilman täsmällistä määrittelyä koko menetelmän tehokkuus jää toistaiseksi auki. Menetelmä on toisaalta yleinen. Se toimii mille tahansa prioriteettijonolle P. Tämä algoritmin luonnos on paradigma usealle suositulle algoritmille, nimittäin valintalajittelu, lisäyslajittelu ja kekolajittelu, joita puidaan tuonnempana. 5. luku 243

9 Algorithm PriorityQueueSort(S,P): Input: Sekvenssi S, jossa on n alkiota ja näille on määritelty täydellisen järjestyksen relaatio, sekä prioriteettijono P, joka vertaa avaimia soveltaen samaa järjestysrelaatiota. Output: S lajiteltuna järjestysrelaation mukaisesti. while S ei ole tyhjä do e S.removeFirst() { poista alkio e sekvenssistä S } P.insertItem(e,e) { avain on tässä samalla itse alkio } while P ei ole tyhjä do e P.removeMinElement() { poista pienin alkio P:sta } S.insertLast(e) { lisää alkio S:n loppuun } Koodi 5.1. Luonnos algoritmiksi lajittelua varten sovellettaessa prioriteettijonoa. 5. luku 244

10 Prioriteettijonon metodit Kun on kuvailtu intuitiivisesti prioriteettijonon abstrakti tietotyyppi, voidaan nyt perehtyä siihen yksityiskohtaisesti. Tarvitaan oheiset metodit: size(): Palauttaa prioriteettijonon P alkioiden lukumäärän. Tulos: kokonaisluku isempty(): Testaa, onko P tyhjä. Tulos: totuusarvo insertitem(k,e): Lisää uuden alkion e avaimella k P:hen. Syöte: Oliot k (avain) ja e (alkio). minelement(): Palauttaa (mutta ei poista) P:n alkion, jolla on pienin avain. Virhe esiintyy prioriteettijonon ollessa tyhjä. Tulos: olio (alkio) 5. luku 245

11 minkey(): Palauttaa P:n pienimmän avaimen. Virhe esiintyy prioriteettijonon ollessa tyhjä. Tulos: olio (avain) removeminelement(): Palauttaa ja poistaa P:stä alkion, jolla on pienin avain. Virhe esiintyy prioriteettijonon ollessa tyhjä. Tulos: olio (alkio) Kuten havaittiin, prioriteettijono on käsitteellisesti hyvin yksinkertainen, koska lisäykset ja poistot tehdään ainoastaan avaimen perusteella, kun taas sekvenssin tapauksessa pitää olla useita erilaisia metodeja lisäyksiä ja poistoja varten käytettäessä eri toteutuksia. Pohditaan vielä esimerkin kautta prioriteettijonon olemusta. Esim Seuraava taulukko esittää operaatioiden sarjan ja näiden vaikutuksen alunperin tyhjään prioriteettijonoon P, jossa alkio e ja tämän avain k osoitetaan parilla (k,e). 5. luku 246

12 Sarake P:n sisältö on lähinnä viitteellinen, koska siinä alkiot on järjestetty avaintensa mukaan, mutta todellisuudessa kulloinkin on välittömästi saatavissa vain minimiavaimen alkio ja parit talletetaan toteutuksesta riippuen. operaatio tulos P:n sisältö insertitem(5,a) - {(5,A)} insertitem(9,c) - { (5,A),(9,C) } insertitem(3,b) - { (3,B),(5,A),(9,C) } insertitem(7,d) - { (3,B),(5,A),(7,D),(9,C) } minelement() B { (3,B),(5,A),(7,D),(9,C) } minkey() 3 { (3,B),(5,A),(7,D),(9,C) } removeminelement() B { (5,A),(7,D),(9,C) } size() 3 { (5,A),(7,D),(9,C) } removeminelement() A { (7,D),(9,C) } 5. luku 247

13 removeminelement() D { (9,C) } removeminelement() C { } removeminelement() virhe { } isempty tosi { } Jää vielä mietittäviksi kaksi keskeistä seikkaa: Miten pidetään tietoa yllä avainten ja alkioiden välisistä yhteyksistä? Miten verrataan avaimia pienimmän avaimen määräämiseksi? Näihin vastauksen saamiseksi pohditaan kahta mielenkiintoista suunnittelumallia. 5. luku 248

14 Kompositiot ja vertaimet Prioriteettijono käyttää kahta suunnittelumallia, kompositioita ja vertaimia, joita tarkastellaan seuraavaksi. Kompositio Kompositiomallissa (composition pattern) määritellään yksittäinen olio e, joka on muiden olioiden kompositio. Tätä mallia hyödynnetään määriteltäessä oliot, jotka on määrä tallettaa prioriteettijonoon pareina. Pari (pair) (k,e) on yksinkertaisin kompositio, sillä se yhdistää kaksi oliota yhdeksi oliopariksi. Tämän toteuttamiseksi määritellään luokka, joka tallettaa kaksi oliota muuttujiinsa ja joka antaa muuttujien saantija päivitysmetodit. Koodissa 5.2. on tällainen toteutus avainalkio-pareille. Muut kompositiot voivat olla kolmikkoja, joissa on kolme oliota, nelikköjä vastaavasti tai yleisiä kompositioita, joissa on mielivaltaisesti valittu määrä olioita (esim. sekvenssissä). 5. luku 249

15 public class Item { private Object key, elem; protected Item ( Object k, Object e) { key = k; elem = e; } public Object key() { return key; } public Object element() { return elem; } public void setkey(object k) { key = k; } public void setelement(object e) { elem = e } } Koodi 5.2. Avain-alkio-parien tallettamista varten luokka prioriteettijonolle. Kompositio-oliot voisivat puolestaan sisältää muita kompositioolioita, jolloin syntyisi puumainen hierarkia, mutta näihin ei tässä puututa. 5. luku 250

16 Vertain On määriteltävä, kuinka avaimia verrataan toisiinsa. Jos lähdettäisiin toteuttamaan kullekin avaintyypille oma prioriteettijononsa ja tälle omat vertailuoperaationsa, menettely ei olisi kovinkaan yleinen ja olisi paljon melko samankaltaista koodia. Parempi ratkaisu on tehdä yleinen prioriteettijonoluokka, joka tallettaa avainluokan ilmentymät toteuttaen soveliaan vertailurajapinnan ja kapseloiden tarpeelliset, tavanomaiset vertailumetodit. Tällöin on mahdollista tehdä yksittäinen prioriteettijono, joka voi käsitellä useita erityyppisiä avaimia. Toisinaan tässä on kuitenkin vaadittu liikaa avaimilta, sillä on avaimia, joista ei välittömästi tiedä, kuinka niitä pitäisi verrata oheisen esimerkin tapaan. Esim Olkoon annettu avaimet 4 ja 11. Kun nämä ovat tavanomaiseen tapaan verrattavissa olevia kokonaislukuja, on 4 < 11. Jos ne ovat merkkijonoja, on 11 < 4 vertailun ollessa leksikograafinen. 5. luku 251

17 Päästäksemme yleiseen ja uudelleenkäytettävään ratkaisuun prioriteettijonolle ei pidä luottaa vain avaimiin ja niiden vartailusääntöihin. Sen sijaan käytetään erityisiä vertainolioita, jotka on ulkoistettu avaimiin nähden. Vertain on olio, joka vertaa kahta avainta. Oletetaan, että prioriteettijonolle P on toteutettu vertain, joka on päivitettävissä tarvittaessa. Prioriteettijono P käyttää vertainta verratakseen kahta avainta. Vertainolio käsittää seuraavat metodit: islessthan(a,b): Tosi, jos ja vain jos a on pienempi kuin b. Syöte: olioiden pari Tulos: totuusarvo islessthanorequal(a,b): Tosi, jos ja vain jos a on pienempi tai yhtä suuri kuin b. Syöte: olioiden pari Tulos: totuusarvo isequalto(a,b): Tosi, jos ja vain jos a on yhtä suuri kuin b. Syöte: olioiden pari Tulos: totuusarvo 5. luku 252

18 isgreaterthan (a,b): Tosi, jos ja vain jos a on suurempi kuin b. Syöte: olioiden pari Tulos: totuusarvo isgreaterthanorequal (a,b): Tosi, jos ja vain jos a on suurempi tai yhtä suuri kuin b. Syöte: olioiden pari Tulos: totuusarvo iscomparable(a): Tosi, jos ja vain jos a on vertailtavissa. Syöte: olio Tulos: totuusarvo Vertain tarjoaa yleisen ja uudelleenkäytettävän tavan verrata olioita toisiinsa. Saadaan geneerinen tehokas väline prioriteettijonon rakentamista varten, josta voidaan tarvittaessa löytää tai poistaa minimialkio. Lisäksi käsittely voidaan ikään kuin kääntää määrittelemällä vertaimessa mm. operaatioiden sijasta operaatiot. Tällöin voidaan saada ja poistaa maksimialkio minimin sijasta, kun prioriteettijono on vastaavasti rakennettu käänteisenä. 5. luku 253

19 5.2. Prioriteettijonon toteutus sekvenssiä käyttäen Tässä luvussa esitetään prioriteettijonon sekvenssiä alkioiden tallettamiseen käyttävä toteutus. Annetaan kaksi vaihtoehtoista toteutustapaa sen mukaan, pidetäänkö sekvenssiä lajiteltuna vai ei. Toteutus lajittelemattomalla sekvenssillä Talletetaan alkiot prioriteettijonoon P ja niiden avaimet sekvenssiin S. S:n alkiot ovat siis pareja (k,e), missä e on alkio ja k sen avain. Yksinkertainen tapa toteuttaa metodi insertitem(k,e) on lisätä uusi olio p =(k,e) sekvenssin S loppuun suorittamalla metodi insertlast(p) siinä. Tämä operaatio vaatii O(1) aikaa riippumatta siitä, onko sekvenssi toteutettu taulukkona tai linkitettynä listana (luku 3.5.). 5. luku 254

20 Näin lisäämällä ei oteta huomioon avainten järjestystä. Niinpä operaatioiden minelement, minkey ja removeminelement suorittaminen edellyttää sekvenssin S kaikkien alkioiden läpikäyntiä olion p = (k,e) hakemiseksi, missä k on minimi. Sekvenssin toteutustavasta riippumatta tämä tarvitsee ajan O(n), missä n on olioiden määrä P:ssä tuolla hetkellä. Nämä metodit vaativat myös (n) pahimmassa tapauksessa, koska pitää etsiä kaikki alkiot läpi. Näistä tulee niin ikään (n). Näin ollen lisäys on suoritettavissa vakioajassa, mutta operaatio removeminelement tarvitsee lineaarisen ajan. Huomattakoon, että käytännön tilanteessa tulos on varsin kelvollinen, jos avainten määrä on pieni. Toteutus käyttäen lajiteltua sekvenssiä Luonnollinen vaihtoehto edelliselle on käyttää prioriteettijonoa P sekvenssin S muodossa, missä S:n sisältö eli avaimet on lajiteltuna. Sekvenssin ensimmäinen avain on pienin. 5. luku 255

21 Metodit minelement ja minkey voidaan siis toteuttaa hakemalla sekvenssin ensimmäinen avain S:n metodilla first. Samoin metodi prioriteettijonon P removeminelement toteutetaan S:n metodilla remove metodin first avulla saadusta paikasta. Jos S on toteutettu taulukon tai linkitetyn listan avulla ja ensimmäisen alkion poisto (luku 3.5.) on mahdollista vakioajassa siinä, niin prioriteettijonon P minimin löytäminen ja poisto tapahtuu ajassa O(1). Tämä on näin ollen nopeampaa kuin lajittelemattomassa versiossa. Hyötyä ei ole kuitenkaan kaikille metodeille, sillä nyt P:n metodi insertitem vaatii sekvenssin S selaamisen kokonaisuudessaan pahimmassa tapauksessa, jotta oikea lisäyskohta löydetään avainten ollessa lajiteltuina. Täten tämän suoritusaika on O(n), kun n on alkioiden määrä P:ssä lisäystä tehtäessä. Taulukko 5.1. esittää aikakompleksisuudet molempien lähestymistapojen osalta. Edellinen sallii nopean lisäyksen, mutta hitaan kyselyn ja poiston. Jälkimmäinen antaa vastakkaisen tilanteen. 5. luku 256

22 Taulukko 5.1. Prioriteettijonojen metodien suoritusaikojen vertailu, kun sekvenssi on lajittelematon tai lajiteltu. Sekvenssi on toteutettu taulukkona tai kahteen suuntaan linkitettynä listana. Alkioita olkoon n prioriteettijonossa metodia suoritettaessa. Tilavaatimus on O(n), kun rakenne on toteutettu listana, mutta O(N), jos taulukkona, missä N n. 5. luku 257

23 Valintalajittelu ja lisäyslajittelu Tämän 5. luvun alussa mainittiin prioriteettijonoon perustuva lajittelu. Siinä prioriteettijonon sisältö lajiteltiin kahdessa vaiheessa, ensin lisättiin alkio alkiolta ja toiseksi poistettiin alkioittain operaatiolla removeminelement. Nyt tarkastellaan tästä kahta variaatiota. Valintalajittelu Kun prioriteettijono P toteutetaan lajittelemattomana sekvenssinä, ensimmäinen mainituista vaiheista vaatii ajan O(n), sillä jokainen alkio lisätään vakioajassa. Toisessa vaiheessa - edellyttäen kahden avaimen vertaamisen vievän vakioajan - jokaisen operaation removeminelement suoritus kestää suhteessa P:n senhetkiseen alkioiden määrään. 5. luku 258

24 Niin muodoin laskennan pullonkaula esiintyy tämän toistetun minimialkion valinnan toteutuksessa lajittelemattomasta sekvenssistä (kuva 5.1.) Tästä johtuen algoritmia kutsutaan valintalajitteluksi (selection-sort). sekvenssi S prioriteettijono P syöte (7,4,8,2,5,3,9) () 1. vaihe (a) (4,8,2,5,3,9) (7) (b) (8,2,5,3,9) (7,4) (g) () (7,4,8,2,5,3,9) Kuva 5.1. (alkuosa) Valintalajittelusta esimerkki, jossa algoritmi on esitetty kaksivaiheisena. Ensimmäisessä vaiheessa poistetaan alkio kerrallaan sekvenssistä ja lisätään se prioriteettijonoon (ensimmäisen vaiheen jälkeen P on itse asiassa kopio lähtötilanteen S:stä). 5. luku 259

25 2. vaihe (a) (2) (7,4,8,5,3,9) (b) (2,3) (7,4,8,5,9) (c) (2,3,4) (7,8,5,9) (d) (2,3,4,5) (7,8,9) (e) (2,3,4,5,7) (8,9) (f) (2,3,4,5,7,8) (9) (g) (2,3,4,5,7,8,9) () Kuva 5.1. (loppuosa) Toisessa vaiheessa suoritetaan toistuvasti removeminelement P:lle (selataan joka kerta P) ja lisätään palautetut alkiot sekvenssin S loppuun. 5. luku 260

26 Analysoidaan nyt valintalajittelua. Kuten sanottu, ongelmana on toinen vaihe, jossa toistuvasti poistetaan pienimmän avaimen alkio prioriteettijonosta P. Aluksi tämän koko on n ja vähenee yhdellä kullakin operaation removeminelement suorituksella. Näin ollen ensimmäinen suorituskerta vaatii O(n), toinen O(n-1) jne., kunnes viimeisellä (n:s) vaatii ajan O(1). Kokonaisaika toiselle vaiheelle on täten Tästä saadaan Toinen vaihe tarvitsee siis O(n 2 ) ja samoin koko algoritmi. 5. luku 261

27 Lisäyslajittelu Jos prioriteettijono P toteutetaan lajitellulla sekvenssillä, toisen vaiheen suoritusaikaa parannetaan lineaariseksi, O(n), kunkin operaation removeminelement tapauksen tarvitessa O(1). Epäonneksi ensimmäinen vaihe tulee nyt pullonkaulaksi. Pahimmassa tapauksessa jokaisen operaation insertitem suorituskerta on suhteessa alkioiden määrään kyseisellä hetkellä prioriteettijonossa. Tämä määrä on aluksi nolla ja kasvaa n:ään. Näin ensimmäinen lisäys vaatii O(1), toinen O(2) jne., kunnes viimeinen (n:s) vaatii O(n) pahimmassa tapauksessa. Tämä lajittelumenetelmä (kuva 5.2.) on nimeltään lisäyslajittelu (insertion-sort). Lisäyslajittelun ensimmäisen vaiheen analyysi antaa samalla tavalla kuin valintalajittelun toinen vaihe pahimmassa tapauksessa O(n 2 ) ja lopuksi samoin koko lisäyslajittelu. Niinpä nämä ovat luonteeltaan samanlaisia yksinkertaisia, mutta asymptoottisesti melko tehottomia kuin kuplalajittelu. 5. luku 262

28 sekvenssi S prioriteettijono P syöte (7,4,8,2,5,3,9) () 1. vaihe (a) (4,8,2,5,3,9) (7) (b) (8,2,5,3,9) (4,7) (c) (2,5,3,9) (4,7,8) (d) (5,3,9) (2,4,7,8) (e) (3,9) (2,4,5,7,8) (f) (9) (2,3,4,5,7,8) (g) () (2,3,4,5,7,8,9) Kuva 5.2. (alkuosa) Kaavamainen esitys lisäyslajittelusta, jossa algoritmi noudattaa kaksivaiheista menettelyä sekvenssinä toteutetulle prioriteettijonolle P. Ensimmäisessä vaiheessa poistetaan toistuvasti ensimmäinen alkio S:stä ja lisätään se P:hen selaamalla P, kunnes löydetään oikea paikka alkiolle. 5. luku 263

29 2. vaihe (a) (2) (3,4,5,7,8,9) (b) (2,3) (4,5,7,8,9)... (g) (2,3,4,5,7,8,9) () Kuva 5.2. (loppuosa) Toisessa vaiheessa toistuvasti suoritetaan operaatiota removeminelement P:lle. Kustakin saadaan ensimmäinen alkio, joka lisätään sekvenssin S loppuun. Kuvatuista lähestymistavoista valintalajittelu antoi nopean ensimmäisen vaiheen prioriteettijonolajittelun mielessä, kun taas sen toinen vaihe oli hidas. Lisäyslajittelulla tilanne oli päinvastainen. Jos voitaisiin jotenkin tasapainottaa näiden vaiheiden suoritusaikoja, voitaisiin samalla nopeuttaa kokonaissuoritusaikaa. Tästä on kysymys seuraavassa luvussa. 5. luku 264

30 5.3. Keot Prioriteettijono voidaan toteuttaa tehokkaasti rakenteella nimeltä keko tai kasa (heap). Tässä sekä lisäys että poisto pystytään tekemään logaritmisessa ajassa, joka on huomattava parannus edeltäviin sekvenssipohjaisiin toteutuksiin. Keossa talletetaan alkiot määrätyntyyppiseen binääripuurakenteeseen, joka on tehokkuuden lähtökohta. Kekotietorakenne Keko (kuva 5.3.) on binääripuu T, joka tallettaa kokoelman avaimia solmuihinsa ja täyttää kaksi ehtoa: relaatio, joka on määritelty sen suhteen, miten avaimet on talletettu puuhun T, ja rakenne, joka on määritelty puun T solmujen suhteen. Avainten täydellisen järjestyksen relaatio on esim. vertaimella tuotettu. Tässä määritelmässä keon lehtiinkin on talletettu avaimia ( paikanpitäjilehdistä on nyt luovuttu). 5. luku 265

31 Kuva 5.3. Esimerkki keosta, jossa on 13 kokonaislukuavainta ja viimeisen solmun avain on 8. Huomaa, että nyt on paikanpitäjälehdistä luovuttu. 5. luku 266

32 Keon T avaintenvälinen relaatio on seuraava: Kekojärjestysominaisuus (heap-order property): Keon T jokaisella solmulla v juurta lukuunottamatta solmuun talletettu avain on suurempi tai yhtä suuri kuin avain, joka on talletettu solmun v vanhempaan. Tästä ominaisuudesta johtuen (käytetään myös nimitystä osittainen järjestys, koska avaimilla saman tason sisällä ei ole keskinäistä järjestystä määritelty) polulla juuresta lehteen kohdattavat avaimet ovat kasvavassa eli ei-vähenevässä järjestyksessä. Minimiavain on aina juuressa. Tämä onkin tärkein avain ja on keon huipulla. (Tätä kekorakennetta ei pidä sekoittaa 3. luvussa mainittuun Javan muistinhallinnan heapkäsitteeseen.) 5. luku 267

33 Jos määritellään käytettävä vertain vastakkaisella tavalla kuin tavallisesti (kuten luvun 5.1. lopussa esitettiin), saadaan juureen maksimiavain ja avaimet pienenevät lehtiä kohti siirryttäessä. Jatkossa pitäydytään kuitenkin tavanomaisessa lähestymistavassa, jossa juuri käsittää minimiavaimen alkion. Tehokkuuden takia halutaan keon olevan mahdollisimman pieni, so. matala. Tämä saadaan aikaan vaatimalla, että keon T tulee olla täydellinen (complete). Kun binääripuun T taso i sisältää syvyydellä i olevat solmut, tämä rakenne voidaan määritellä näin: Täydellinen binääripuu (complete binary tree): Binääripuu T, jonka korkeus on h, on täydellinen, jos tasoilla 0, 1, 2,, h-1 on maksimimäärä solmuja (tasolla i, 0 i h-1, on 2 i solmua) ja tasolla h-1 kaikki sisäsolmut ovat lehtien vasemmalla puolella. 5. luku 268

34 Kuvan 5.3. puu edeltä on täydellinen. Sillä, että sisäsolmut tasolla h-1 ovat lehtien vasemmalla puolella, tarkoitetaan tavanomaista tapaa, jolla binääripuut kuvataan. Tällöin nuo sisäsolmut käydään läpi ensiksi - esim. kuljettaessa välijärjestyksessä - ja vasta sitten saman tason lehdet. Tällöin voidaan määritellä myös keon viimeinen solmu, joka on keon T oikeanpuolimmainen, syvin solmu. Siitä, että T on täydellinen, seuraa keskeinen ominaisuus oheisen lauseen mukaisesti. Lause 5.1. Keko T, jossa on n solmua, on korkeudeltaan h = log n. Perustelu: Kun T on täydellinen, sen solmujen lukumäärä on vähintään h-1 +1=2 h -1+1=2 h. 5. luku 269

35 Tämä alaraja saadaan, kun on olemassa ainoastaan yksi solmu tasolla h. Vastaavasti saadaan keon T ollessa täydellinen yläraja solmujen lukumäärälle eli h =2 h+1-1. Tämä yläraja tulee tasolla h ollessa täydet 2 h solmua. Koska solmujen määrä on yhtä kuin avainten määrä n, saadaan 2 h n ja n 2 h+1-1. Ottamalla logaritmit molemmin puolin epäyhtälöistä saadaan log(n+1)-1 h log n, joka merkitsee, että h = log n. 5. luku 270

36 Lauseella 5.1. on mitä tärkein seuraus. Jos päivitysoperaatiot voidaan tehdä keossa ajassa, joka on suhteessa sen korkeuteen, niin nuo operaatiot toimivat logaritmisessa ajassa. Täten prioriteettijonon toteuttaminen kekona on hyvin tehokasta. Prioriteettijonon toteuttaminen kekona Esitetään prioriteettijonon abstraktin tietotyypin toteutus kekona (kuva 5.4. ja koodi 5.3.). Se käsittää keon T, jota merkitään merkinnällä k(v) ja jossa ovat solmuissa talletettuina prioriteettijonon alkiot ja avaimet (koodi 5.2. edeltä), viittauksen keon T viimeisen solmun paikkaan ja vertaimen, joka määrittelee avainten täydellisen järjestyksen relaation. 5. luku 271

37 keko viimeinen vertain (4,C) (5,A) (6,Z) < = > (15,K) (9,F) (7,Q) (20,B) (16,X) (25,J) (14,E) (12,H) (11,S) (8,W) Kuva 5.4. Kokonaislukuavainten ja merkkialkioiden prioriteettijono toteutettuna kekona. Solmut käsittävät avain-alkio-parin. Keon rakentuminen perustuu ainoastaan avaimiin. 5. luku 272

38 public class HeapSimplePriorityQueue implements SimplePriorityQueue BinaryTree T; Position last; Comparator comparator; Koodi 5.3. Keon toteuttamisesta. Oletetaan keko toteutetun binääripuun rakenteilla (luku 4.4.), joko linkitettynä rakenteena tai sekvenssinä. Lisäksi alkiot on talletettu binääripuuhun avain-alkio-pareina, kuten koodissa 5.2. esitettiin. Koska T on täydellinen binääripuu, kekoon T liittyvä sekvenssi sekvenssiperusteisen toteutuksen tapauksessa käsittää n alkiota eikä siinä ole yhtään tyhjiä solmuja. 5. luku 273

39 Lisäys Tarkastellaan metodin insertitem suorittamista keossa T. Tämä on esitetty kuvassa 5.5. Uuden avain-alkio-parin (k,e) lisäämiseksi kekoon T pitää lisätä uusi solmu kekoon. Jotta T pysyisi täydellisenä binääripuuna, uusi solmu on lisättävä uudeksi viimeiseksi solmuksi. Tätä varten pitää ensin etsiä oikea paikka z, jolle voidaan lisätä uusi alkio solmuun z samalla säilyttäen keon T täydellisenä (kuva 5.5.(a)-(b)). Solmua z kutsutaan lisäyspaikaksi (insertion position). 5. luku 274

40 (4,C) (4,C) (5,A) (6,Z) (5,A) (6,Z) (15,K) (9,F) (7,Q) (20,B) (15,K) (9,F) (7,Q) (20,B) (16,X) (25,J) (14,E) (12,H) (11,S) (8,W) (16,X) (25,J) (14,E) (12,H) (11,S) (8,W) (2,T) z (a) (b) Kuva 5.5. (alku) Uuden alkion lisääminen kuvan 5.4. kekoon avaimen ollessa 2: (a) alkutilanne, (b) uuden alkion lisääminen vanhan viimeisen solmun oikealle puolelle. (Kun paikanpitäjälehtiä ei käytetä, binääripuu ei aina ole täysin aito, kuten tässä lisäyspaikassa). 5. luku 275

41 Tavallisesti solmu z on valittömästi viimeisen solmun, lehti w, oikealla puolella (kuva 5.6.(b)). On silti kaksi erikoistapausta, joissa tämä sääntö ei päde: Jos nykyinen viimeinen solmu w on määritelty ja on oikeanpuolimmainen tasollaan, niin z on alimman tason vasemmanpuolimmainen (kuva 5.6.(a)). Jos keolla T ei ole solmuja (prioriteettijono on tyhjä ja keon viimeistä solmua ei ole määritelty), niin z on keon T juuri. Selvitetään hiukan myöhemmin, miten löydetään lisäyspaikka z lähdettäessä viimeisestä solmusta w. Joka tapauksessa lisäysoperaation parille (k,e) suorittamisen jälkeen solmusta z tulee uusi viimeinen solmu ja siihen talletetaan uusi avain-alkiopari (k,e), jolloin k(z)=k. 5. luku 276

42 Sitten puu T on täydellinen, mutta se voi rikkoa kekojärjestysominaisuuden. Jollei solmu z ole juuri (prioriteettijono oli tyhjä ennen lisäystä), verrataan avainta k(z) avaimeen k(u), joka on talletettu solmun z vanhempaan u. Jos on k(u) > k(z), niin pitää korjata kekojärjestysominaisuus vallitsevaksi, mikä tehdään lokaalisesti vaihtamalla avain-alkio-parit solmujen z ja u välillä (kuva 5.5.(c)-(d)). Edellinen vaihto aiheuttaa uuden avain-alkio-parin (k,e) siirtymisen yhden tason verran ylöspäin. Vieläkään kekojärjestysominaisuus ei ole voimassa, joten vaihtamista on jatkettava ylöspäin, kunnes ominaisuus on voimassa (kuva 5.5.(e)-(h)). 5. luku 277

43 (4,C) (4,C) (5,A) (6,Z) (5,A) (6,Z) (15,K) (9,F) (7,Q) (15,K) (9,F) (7,Q) (2,T) (20,B) (2,T) (16,X) (25,J) (14,E) (12,H) (11,S) (8,W) (16,X) (25,J) (14,E) (12,H) (11,S) (8,W) (20,B) (c) (d) Kuva 5.5. (jatkoa) Uuden alkion lisääminen kuvan 5.4. kekoon avaimen ollessa 2: (c) vaihto, (d) vaihdon jälkeen. 5. luku 278

44 (4,C) (4,C) (5,A) (2,T) (5,A) (2,T) (15,K) (9,F) (7,Q) (6,Z) (15,K) (9,F) (7,Q) (6,Z) (16,X) (25,J) (14,E) (12,H) (11,S) (8,W) (20,B) (16,X) (25,J) (14,E) (12,H) (11,S) (8,W) (20,B) (e) (f) Kuva 5.5. (jatkoa) Uuden alkion lisääminen kuvan 5.4. kekoon avaimen ollessa 2: (e) toinen vaihto, (f) vaihdon jälkeen. 5. luku 279

45 (2,T) (2,T) (5,A) (4,C) (5,A) (4,C) (15,K) (9,F) (7,Q) (6,Z) (15,K) (9,F) (7,Q) (6,Z) (16,X) (25,J) (14,E) (12,H) (11,S) (8,W) (20,B) (16,X) (25,J) (14,E) (12,H) (11,S) (8,W) (20,B) (g) (h) Kuva 5.5. (jatkoa) Uuden alkion lisääminen kuvan 5.4. kekoon avaimen ollessa 2: (g) kolmas eli viimeinen vaihto, (h) vaihdon jälkeen. 5. luku 280

46 Vaihtoja ylöspäin kutsutaan keon ylöskuplimiseksi (up-heap bubbling). Vaihto joko korjaa kekojärjestysominaisuuden vallitsevaksi tai siirtää säännön rikkovan kohdan taso kerrallaan ylemmäksi. Pahimmassa tapauksessa ylöskupliminen vie avainalkio-parin koko polun lehdestä juureen asti, kuten kuvassa 5.5. Täten pahimman tapauksen suoritusaika metodille insertitem on suhteessa puun T korkeuteen, so. O(log n), koska T on täydellinen. Lisäyspaikan löytäminen Lisäysmetodin käyttämiseksi on ensiksi löydettävä lisäyspaikka z, johon solmu lisätään ja talletetaan uusi avain-alkio-pari. Jos keko T on toteutettu sekvenssinä (luku 4.4.), niin lisäyspaikan z löytäminen on suoraviivaista, koska z on solmu, johon on liitetty numero n+1 (ks. kuva s. 220). Tämä toimii yleisesti ja myös em. kahdessa erikoistapauksessa. 5. luku 281

47 Kun T toteutetaan linkitettynä rakenteena (luku 4.4.) tai jos ei tiedettäisi toteutusta ja päästäisiin siihen käsiksi ainoastaan binääripuun abstraktin tietotyypin metodeilla, niin lisäyspaikan z löytäminen ei ole yhtä helppoa. Erikoistapauksessa, jossa T on aivan aluksi tyhjä, z on juuri. Muuten aloitetaan keon T nykyisestä viimeisestä solmusta w ja etsitään lisäyspaikka z seuraavaan tapaan (kuva 5.6.): 1. Aloittaen viimeisestä solmusta w mene ylös puuta toistuvasti kutsuen metodia parent, kunnes juuri tai vasen lapsi saavutetaan. (a) Jos on saavutettu juuri, olkoon se u. Tämä on erikoistapaus, jossa viimeinen solmu on tasonsa oikeanpuolimmainen solmu. (b) Muuten (vasen lapsi on saavutettu) olkoon u saavutetun solmun sisar. (Huom. Solmu w itse voi olla vasen lapsi, jolloin uusi solmu tulee suoraan sen oikeaksi sisareksi. Näin tulisi toinen lisäys kuvassa 5.6.(b).) 2. Aloittaen solmusta u mene alas puuta toistuvasti kutsuen metodia leftchild, kunnes paikka z saavutetaan. 5. luku 282

48 (2,T) (2,T) (5,A) (4,C) (5,A) (4,C) (15,K) (9,F) (7,Q) (6,Z) (15,K) (9,F) (7,Q) (6,Z) (16,X) (25,J) (14,E) (12,H) (11,S) (8,W) (20,B) (10,L) w (16,X) (25,J) (14,E) (12,H) w z z (a) (b) Kuva 5.6. Lisäyspaikan z löytäminen keosta: (a) siirtyminen ylöspäin, kunnes saavutetaan juuri, ja sitten siirtyminen alas sekä (b) siirtyminen ylöspäin, kunnes vasen lapsi saavutetaan, sitten siirtyminen sisarukseen ja lopulta siirtyminen alas vasemmalle. 5. luku 283

49 Jos T on toteutettu taulukkopohjaisena sekvenssinä, uusi viimeinen solmu on saatavissa suoraan ajassa O(1). Jos T on toteutettu linkitettynä rakenteena, z löydetään siirtymisellä ensin ylös ja toisella alas, mikä vaatii ajan O(log n). Koodissa 5.4. on metodin insertitem toteutus. public void insertitem(object k, Object e) throws InvalidKeyException { if (!comparator.iscomparable(k)) throw new InvalidKeyException( Invalid Key ); Position z; // insertion position if (isempty()) z = T.root(); else { Koodi 5.4. (alku) Metodi insertitem apumetodeineen. 5. luku 284

50 z = last; while (!T.isRoot(z) &&!isleftchild(z)) z = T.parent(z); if (!T.isRoot(z)) z = T.rightChild(T.parent(z)); while (!T.isExternal(z)) z = T.leftChild(z); } T.expandExternal(z); // inserting a leaf T.replace(z, new KeyElementPair(k,e)); last = z; Position u; Koodi 5.4. (jatkoa) Metodi insertitem apumetodeineen. 5. luku 285

51 while (!T.isRoot(z)) { // up-heap bubbling } } u = T.parent(z); if (comparator.islessthanorequalto(keyofposition(u), T.swap(u,z); z = u; private Object keyofposition(position p) throws InvalidPositionException { } keyofposition(z))) break; return ((KeyElementPair) p.element()).key(); //cast shouldn t fail Koodi 5.4. (jatkoa) Metodi insertitem apumetodeineen. 5. luku 286

52 private boolean isleftchild(position p) throws InvalidPositionException { } try { return T.leftChild(T.parent(p)).equals(p); } catch (boundaryviolationexception e) { } return false; // happens when p is the root Koodi 5.4. (loppu) Metodi insertitem apumetodeineen. Kääntämällä edellä kuvattu menettely uuden viimeisen solmun löytämiseksi lisäyksessä viimeinen solmu on päivitettävissä poiston jälkeen, jota pohditaan seuraavaksi. 5. luku 287

53 Poisto Silmäillään nyt metodia removeminelement. Tätä havainnollistaa kuva 5.7. Pienimmän avaimen alkio on tunnetusti juuressa r. Jos se ei kuitenkaan ole ainoa keon T solmu, ei voida poistaa yksinkertaisesti solmua r, koska tämä rikkoisi binääripuurakenteen. Sen sijaan haetaan viimeinen solmu w, siirretään sen avain-alkio-pari juureen r ja sitten poistetaan viimeinen solmu. Operaatiossa poistetaan solmu w (kuva 5.7.(a)-(b)). Tämän jälkeen viittaus viimeiseen solmuun on päivitettävä, mikä tehdään käänteisesti edellä kuvattuun, lisäyksen yhteydessä nähtyyn. 5. luku 288

54 (4,C) (13,W) (13,W) (5,A) (6,Z) (5,A) (6,Z) (15,K) (9,F) (7,Q) (20,B) (15,K) (9,F) (7,Q) (20,B) (16,X) (25,J) (14,E) (12,H) (11,S) w (16,X) (25,J) (14,E) (12,H) (11,S) (a) (b) Kuva 5.7. (alku) Pienimmän avaimen alkion poistaminen keosta: (a) viimeisen solmun poiston aloittaminen siirtämällä avain-alkio-pari juureen ja (b) poiston alkuvaiheen jälkeen. 5. luku 289

55 Vaikka T on nyt täydellinen binääripuu, se saattaa rikkoa kekojärjestysominaisuutta. Tämän selvittämiseksi tutkitaan T:n juurta r. Jos juuri r on lehti, kekojärjestys-ominaisuuden voimassaolo on triviaali asia. Muussa tapauksessa erotetaan kaksi tapausta: Jos juuren r vasen lapsi on sen ainoa lapsisolmu, olkoon s juuren r vasen lapsi. Muuten (molemmat lapset olemassa) olkoon s juuren r se lapsi, jonka avain on pienempi. Jos on k(r) > k(s), pitää kekojärjestysominaisuus palauttaa, mikä tehdään lokaalisti vaihtamalla solmuihin r ja s talletetut avainalkio-parit (kuva 5.7.(c)-(d)). Tämä siirtää kekojärjestysrikkomuksen seuraavalle tasolle ja sitä seuraavallekin, joten tarvitaan vielä kaksi vaihtoa (kuva 5.7.(e)-(h)). Kysymys on keon alaskuplimisesta (down-heap bubbling). Vaihto joko korjaa kekojärjestyksen kuntoon tai siirtää ongelman tason kerrallaan alaspäin. Pahimmassa tapauksessa poisto vie aikaa O(log n). 5. luku 290

56 (13,W) (5,A) (5,A) (6,Z) (13,W) (6,Z) (15,K) (9,F) (7,Q) (20,B) (15,K) (9,F) (7,Q) (20,B) (16,X) (25,J) (14,E) (12,H) (11,S) (16,X) (25,J) (14,E) (12,H) (11,S) (c) (d) Kuva 5.7. (jatkoa) (c) Vaihto kekojärjestysominaisuuden palauttamiseksi lokaalisti (valittiin pienempi lapsista tilanteessa, kun juuren alkio ko. hetkellä oli suurempi kuin molemmat lapset) ja (d) vaihdon jälkeen. 5. luku 291

57 (5,A) (5,A) (9,F) (6,Z) (9,F) (6,Z) (15,K) (13,W) (7,Q) (20,B) (15,K) (13,W) (7,Q) (20,B) (16,X) (25,J) (14,E) (12,H) (11,S) (16,X) (25,J) (14,E) (12,H) (11,S) (e) (f) Kuva 5.7. (jatkoa) (e) Toinen vaihto (pienempi lapsista) kekojärjestysominaisuuden palauttamiseksi lokaalisti ja (f) vaihdon jälkeen. 5. luku 292

58 (5,A) (5,A) (9,F) (6,Z) (9,F) (6,Z) (15,K) (12,H) (7,Q) (20,B) (15,K) (12,H) (7,Q) (20,B) (13,W) (16,X) (25,J) (14,E) (11,S) (16,X) (25,J) (14,E) (13,W) (11,S) (g) (h) Kuva 5.7. (loppu) (g) Kolmas eli viimeinen vaihto (pienempi lapsista) kekojärjestysominaisuuden palauttamiseksi lokaalisti ja (h) vaihdon jälkeen. 5. luku 293

59 Analyysi Taulukossa 5.2. on prioriteettijonon abstraktin tietotyypin suoritusajat kekototeutuksen tapauksessa, kun keko on tehty binääripuuna perustuen tämän abstraktin tietotyypin metodeihin (paitsi elements()), jotka toimivat ajassa O(1). Luvun 4.4. linkitetty rakenne ja sekvenssipohjainen rakenne toteuttavat nämä vaatimukset. Taulukko 5.2. Kekototeutukseen perustuvan prioriteeettijonon suorituskyky, kun keko on tehty linkitetyn rakenteen tai sekvenssipohjaisena binääripuuna. Suoritettaessa metodia on alkioiden määrä prioriteettijonossa n. Linkitetyn binääripuun toteutuksessa tilantarve on O(n) ja sekvenssin tapauksessa O(N), missä N n on sekvenssin taulukon koko. 5. luku 294

60 Jokainen prioriteettijonon metodi on näin ollen suoritettavissa tehokkaasti eli ajassa O(log n) tai O(1) seuraavista syistä: Keon T korkeus on O(log n), kun T on täydellinen. Pahimmassa tapauksessa ylös- ja alaskuplimiset vaativat aikaa suhteessa keon T korkeuteen. Pahimmassa tapauksessa lisäyspaikan löytäminen metodin insertitem suorituksessa ja viimeisen solmun päivittäminen metodissa removeminelement vaativat aikaa suhteessa kaksi kertaa keon T korkeus. Jälkimmäisessä solmun avainta pitää näet verrata kumpaankin lapseen, jos nämä ovat olemassa. Keossa T on n solmua, joista jokainen viittaa avaimeen ja alkioon. Kaiken kaikkiaan keko on hyvin tehokas prioriteettijonon yhteydessä, kummallakin esitetyllä toteutusvaihtoehdolla. Se on nopeampi kuin sekvenssiin perustuva prioriteettijono. Myös tärkeää on, että se nopeuttaa olennaisesti prioriteettijonolajittelua verrattuna aiempaan sekvenssilähestymistapaan siinä. 5. luku 295

61 Kekolajittelu Kuten äsken havaittiin, prioriteettijonon toteuttaminen kekona suo hyvin tehokkaat menetelmät, so. logaritmiset tai vakiolliset suoritusajat. Palataan hetkeksi lukuun 5.1., jossa esitettiin prioriteettilajittelun idea. Kun prioriteettijono P toteutetaan kekona, niin sekä ensimmäinen vaihe(n insertitem-operaatiota) ja toinen vaihe (n removemin- Element-operaatiota) vaativat ajan O(log k), missä k on keon alkioiden lukumäärä ao. hetkellä. Kun aina on k n, jokainen sellainen operaatio toimii ajassa O(log n) pahimmassa tapauksessa. Siten kumpikin vaihe vaatii O(n log n) ja samoin koko algoritmi. Kysymys on kekolajittelusta (heap-sort), jonka suorituskyky on todettu seuraavassa lauseessa. Lause 5.2. Kekolajittelualgoritmi lajittelee n vertailtavissa olevan alkion sekvenssin ajassa O(n log n). 5. luku 296

62 Saatu tulos on paljon parempi kuin neliöllinen aika. Erikoistapauksia on olemassa, missä kekolajittelua voidaan tehostaa tästä yleisestä tuloksesta. Tällainen on tilanne, jossa kaikki avaimet ovat etukäteen tunnetut, jolloin päästään lineaariseen suoritusaikaan. 5. luku 297

5. Prioriteettijonot Prioriteettijonon abstrakti tietotyyppi

5. Prioriteettijonot Prioriteettijonon abstrakti tietotyyppi 5. Prioriteettijonot Esimerkkinä prioriteetin käytöstä voisi olla lentoasemalle saapuva matkustaja, joka haluaa saada lentolipun ensimmäiselle Timbuktuun menevälle lennolle. Lentokone oli kuitenkin varattu

Lisätiedot

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

useampi ns. avain (tai vertailuavain) esim. opiskelijaa kuvaavassa alkiossa vaikkapa opintopistemäärä tai opiskelijanumero Alkioiden avaimet Usein tietoalkioille on mielekästä määrittää yksi tai useampi ns. avain (tai vertailuavain) esim. opiskelijaa kuvaavassa alkiossa vaikkapa opintopistemäärä tai opiskelijanumero 80 op

Lisätiedot

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

lähtokohta: kahden O(h) korkuisen keon yhdistäminen uudella juurella vie O(h) operaatiota vrt. RemoveMinElem() keossa Kekolajittelu Prioriteettijonolla toteutettu keko InsertItem ja RemoveMinElem: O(log(n)) Lajittelu prioriteettijonolla: PriorityQueueSort(lajiteltava sekvenssi S) alusta prioriteettijono P while S.IsEmpty()

Lisätiedot

Algoritmit 2. Luento 2 Ke Timo Männikkö

Algoritmit 2. Luento 2 Ke Timo Männikkö Algoritmit 2 Luento 2 Ke 15.3.2017 Timo Männikkö Luento 2 Tietorakenteet Lineaarinen lista, binääripuu Prioriteettijono Kekorakenne Keko-operaatiot Keon toteutus taulukolla Algoritmit 2 Kevät 2017 Luento

Lisätiedot

Algoritmit 2. Luento 2 To Timo Männikkö

Algoritmit 2. Luento 2 To Timo Männikkö Algoritmit 2 Luento 2 To 14.3.2019 Timo Männikkö Luento 2 Tietorakenteet Lineaarinen lista, binääripuu Prioriteettijono Kekorakenne Keko-operaatiot Keon toteutus taulukolla Algoritmit 2 Kevät 2019 Luento

Lisätiedot

Pinot, jonot, yleisemmin sekvenssit: kokoelma peräkkäisiä alkioita (lineaarinen järjestys) Yleisempi tilanne: alkioiden hierarkia

Pinot, jonot, yleisemmin sekvenssit: kokoelma peräkkäisiä alkioita (lineaarinen järjestys) Yleisempi tilanne: alkioiden hierarkia Pinot, jonot, yleisemmin sekvenssit: kokoelma peräkkäisiä alkioita (lineaarinen järjestys) Yleisempi tilanne: alkioiden hierarkia Kukin alkio (viite) talletettuna solmuun (node) vastaa paikan käsitettä

Lisätiedot

Algoritmit 2. Luento 3 Ti Timo Männikkö

Algoritmit 2. Luento 3 Ti Timo Männikkö Algoritmit 2 Luento 3 Ti 20.3.2018 Timo Männikkö Luento 3 Järjestäminen eli lajittelu Kekorakenne Kekolajittelu Hajautus Yhteentörmäysten käsittely Ketjutus Algoritmit 2 Kevät 2018 Luento 3 Ti 20.3.2018

Lisätiedot

Algoritmit 2. Luento 3 Ti Timo Männikkö

Algoritmit 2. Luento 3 Ti Timo Männikkö Algoritmit 2 Luento 3 Ti 21.3.2017 Timo Männikkö Luento 3 Järjestäminen eli lajittelu Kekorakenne Kekolajittelu Hajautus Yhteentörmäysten käsittely Ketjutus Algoritmit 2 Kevät 2017 Luento 3 Ti 21.3.2017

Lisätiedot

Algoritmit 1. Luento 7 Ti Timo Männikkö

Algoritmit 1. Luento 7 Ti Timo Männikkö Algoritmit 1 Luento 7 Ti 31.1.2017 Timo Männikkö Luento 7 Järjestetty binääripuu Binääripuiden termejä Binääripuiden operaatiot Solmun haku, lisäys, poisto Algoritmit 1 Kevät 2017 Luento 7 Ti 31.1.2017

Lisätiedot

Hakupuut. tässä luvussa tarkastelemme puita tiedon tallennusrakenteina

Hakupuut. tässä luvussa tarkastelemme puita tiedon tallennusrakenteina Hakupuut tässä luvussa tarkastelemme puita tiedon tallennusrakenteina hakupuun avulla voidaan toteuttaa kaikki joukko-tietotyypin operaatiot (myös succ ja pred) pahimman tapauksen aikavaativuus on tavallisella

Lisätiedot

Algoritmit 1. Luento 10 Ke Timo Männikkö

Algoritmit 1. Luento 10 Ke Timo Männikkö Algoritmit 1 Luento 10 Ke 14.2.2018 Timo Männikkö Luento 10 Algoritminen ongelmanratkaisu Suunnittelumenetelmät Raaka voima Järjestäminen eli lajittelu Kuplalajittelu Lisäyslajittelu Valintalajittelu Permutaatiot

Lisätiedot

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

AVL-puut. eräs tapa tasapainottaa binäärihakupuu siten, että korkeus on O(log n) kun puussa on n avainta AVL-puut eräs tapa tasapainottaa binäärihakupuu siten, että korkeus on O(log n) kun puussa on n avainta pohjana jo esitetyt binäärihakupuiden operaatiot tasapainotus vie pahimmillaan lisäajan lisäys- ja

Lisätiedot

A274101 TIETORAKENTEET JA ALGORITMIT

A274101 TIETORAKENTEET JA ALGORITMIT A274101 TIETORAKENTEET JA ALGORITMIT PUURAKENTEET, BINÄÄRIPUU, TASAPAINOTETUT PUUT MIKÄ ON PUUTIETORAKENNE? Esim. Viereinen kuva esittää erästä puuta. Tietojenkäsittelytieteessä puut kasvavat alaspäin.

Lisätiedot

Algoritmit 1. Luento 3 Ti Timo Männikkö

Algoritmit 1. Luento 3 Ti Timo Männikkö Algoritmit 1 Luento 3 Ti 17.1.2017 Timo Männikkö Luento 3 Algoritmin analysointi Rekursio Lomituslajittelu Aikavaativuus Tietorakenteet Pino Algoritmit 1 Kevät 2017 Luento 3 Ti 17.1.2017 2/27 Algoritmien

Lisätiedot

Algoritmit 1. Luento 12 Ke Timo Männikkö

Algoritmit 1. Luento 12 Ke Timo Männikkö Algoritmit 1 Luento 12 Ke 15.2.2017 Timo Männikkö Luento 12 Pikalajittelu Pikalajittelun vaativuus Osittamisen tasapainoisuus Lajittelumenetelmien vaativuus Laskentalajittelu Lokerolajittelu Kantalukulajittelu

Lisätiedot

811312A Tietorakenteet ja algoritmit III Lajittelualgoritmeista

811312A Tietorakenteet ja algoritmit III Lajittelualgoritmeista 811312A Tietorakenteet ja algoritmit 2016-2017 III Lajittelualgoritmeista Sisältö 1. Johdanto 2. Pikalajittelu 3. Kekolajittelu 4. Lajittelualgoritmien suorituskyvyn rajoista 811312A TRA, Lajittelualgoritmeista

Lisätiedot

8. Lajittelu, joukot ja valinta

8. Lajittelu, joukot ja valinta 8. Lajittelu, joukot ja valinta Yksi tietojenkäsittelyn klassisista tehtävistä on lajittelu (järjestäminen) (sorting) jo mekaanisten tietojenkäsittelylaitteiden ajalta. Lajiteltua tietoa tarvitaan lukemattomissa

Lisätiedot

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

Tehtävän V.1 ratkaisuehdotus Tietorakenteet, syksy 2003 Tehtävän V.1 ratkaisuehdotus Tietorakenteet, syksy 2003 Matti Nykänen 5. joulukuuta 2003 1 Satelliitit Muunnetaan luennoilla luonnosteltua toteutusta seuraavaksi: Korvataan puusolmun p kentät p. key ja

Lisätiedot

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

58131 Tietorakenteet ja algoritmit (kevät 2016) Ensimmäinen välikoe, malliratkaisut 58131 Tietorakenteet ja algoritmit (kevät 2016) Ensimmäinen välikoe, malliratkaisut 1. Palautetaan vielä mieleen O-notaation määritelmä. Olkoon f ja g funktioita luonnollisilta luvuilta positiivisille

Lisätiedot

Algoritmit 2. Luento 7 Ti Timo Männikkö

Algoritmit 2. Luento 7 Ti Timo Männikkö Algoritmit 2 Luento 7 Ti 4.4.2017 Timo Männikkö Luento 7 Joukot Joukko-operaatioita Joukkojen esitystapoja Alkiovieraat osajoukot Toteutus puurakenteena Algoritmit 2 Kevät 2017 Luento 7 Ti 4.4.2017 2/26

Lisätiedot

Algoritmit 1. Luento 12 Ti Timo Männikkö

Algoritmit 1. Luento 12 Ti Timo Männikkö Algoritmit 1 Luento 12 Ti 19.2.2019 Timo Männikkö Luento 12 Osittamisen tasapainoisuus Pikalajittelun vaativuus Lajittelumenetelmien vaativuus Laskentalajittelu Lokerolajittelu Kantalukulajittelu Algoritmit

Lisätiedot

TKT20001 Tietorakenteet ja algoritmit Erilliskoe , malliratkaisut (Jyrki Kivinen)

TKT20001 Tietorakenteet ja algoritmit Erilliskoe , malliratkaisut (Jyrki Kivinen) TKT0001 Tietorakenteet ja algoritmit Erilliskoe 5.1.01, malliratkaisut (Jyrki Kivinen) 1. [1 pistettä] (a) Esitä algoritmi, joka poistaa kahteen suuntaan linkitetystä järjestämättömästä tunnussolmullisesta

Lisätiedot

4. Sekvenssit Astetta soveltavat sekvenssit

4. Sekvenssit Astetta soveltavat sekvenssit 4. Sekvenssit Sekvenssit edustavat lineaarisesti järjestettyä alkioiden kokoelmaa, jolle on määritelty metodit alkion saantia, lisäystä ja poistoa varten. Täten sen jokaisella alkiolla on edeltäjä, paitsi

Lisätiedot

Pino S on abstrakti tietotyyppi, jolla on ainakin perusmetodit:

Pino S on abstrakti tietotyyppi, jolla on ainakin perusmetodit: Pino (stack) Pino: viimeisenä sisään, ensimmäisenä ulos (LIFO, Last In, First Out) -tietorakenne kaksi perusoperaatiota: alkion lisäys pinon päälle (push), ja päällimmäisen alkion poisto (pop) Push(alkio)

Lisätiedot

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.

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. Yleiset hakupuut 4 Monitiehakupuu: Binäärihakupuu 0 1 3 5 6 7 8 v k 1 k k 3 v v 3 v 4 k 1 k 3 k 1 k k k 3 d lapsisolmua d 1 avainta Yleinen hakupuu? Tietorakenteet, syksy 007 1 Esimerkki monitiehakupuusta

Lisätiedot

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

58131 Tietorakenteet ja algoritmit (syksy 2015) Toinen välikoe, malliratkaisut Tietorakenteet ja algoritmit (syksy 0) Toinen välikoe, malliratkaisut. (a) Alussa puu näyttää tältä: Lisätään 4: 4 Tasapaino rikkoutuu solmussa. Tehdään kaksoiskierto ensin oikealle solmusta ja sitten

Lisätiedot

Algoritmit 2. Luento 5 Ti Timo Männikkö

Algoritmit 2. Luento 5 Ti Timo Männikkö Algoritmit 2 Luento 5 Ti 26.3.2019 Timo Männikkö Luento 5 Puurakenteet B-puu B-puun korkeus B-puun operaatiot B-puun muunnelmia Algoritmit 2 Kevät 2019 Luento 5 Ti 26.3.2019 2/34 B-puu B-puut ovat tasapainoisia

Lisätiedot

Kaksiloppuinen jono D on abstrakti tietotyyppi, jolla on ainakin seuraavat 4 perusmetodia... PushFront(x): lisää tietoalkion x jonon eteen

Kaksiloppuinen jono D on abstrakti tietotyyppi, jolla on ainakin seuraavat 4 perusmetodia... PushFront(x): lisää tietoalkion x jonon eteen Viimeksi käsiteltiin pino: lisäys ja poisto lopusta jono: lisäys loppuun, poisto alusta Pinon ja jonon yleistävä tietorakenne: kaksiloppuinen jono alkion lisäys/poisto voidaan kohdistaa jonon alkuun tai

Lisätiedot

Binäärihaun vertailujärjestys

Binäärihaun vertailujärjestys Järjestetyn sanakirjan tehokas toteutus: binäärihaku Binäärihaku (esimerkkikuassa aain = nimi) op Eea 5 op 5 op op 8 op 5 6 7 8 op Eea 5 op 5 op op 8 op 5 6 7 8 op Eea 5 op 5 op op 8 op 5 6 7 8 op Eea

Lisätiedot

7. Tasapainoitetut hakupuut

7. Tasapainoitetut hakupuut 7. Tasapainoitetut hakupuut Tässä luvussa jatketaan järjestetyn sanakirjan tarkastelua esittämällä kehittynyt puutietorakenne. Luvussa 7.1. esitetään monitiehakupuun käsite. Se on järjestetty puu, jonka

Lisätiedot

1 Puu, Keko ja Prioriteettijono

1 Puu, Keko ja Prioriteettijono TIE-20100 Tietorakenteet ja algoritmit 1 1 Puu, Keko ja Prioriteettijono Tässä luvussa käsitellään algoritmien suunnitteluperiaatetta muunna ja hallitse (transform and conquer) Lisäksi esitellään binääripuun

Lisätiedot

Algoritmit 2. Luento 4 To Timo Männikkö

Algoritmit 2. Luento 4 To Timo Männikkö Algoritmit 2 Luento 4 To 21.3.2019 Timo Männikkö Luento 4 Hajautus Yhteentörmäysten käsittely Avoin osoitteenmuodostus Hajautusfunktiot Puurakenteet Solmujen läpikäynti Algoritmit 2 Kevät 2019 Luento 4

Lisätiedot

Tietorakenteet ja algoritmit Johdanto Lauri Malmi / Ari Korhonen

Tietorakenteet ja algoritmit Johdanto Lauri Malmi / Ari Korhonen Tietorakenteet ja algoritmit Johdanto Lauri Malmi / Ari 1 1. JOHDANTO 1.1 Määritelmiä 1.2 Tietorakenteen ja algoritmin valinta 1.3 Algoritmit ja tiedon määrä 1.4 Tietorakenteet ja toiminnot 1.5 Esimerkki:

Lisätiedot

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

private TreeMap<String, Opiskelija> nimella; private TreeMap<String, Opiskelija> numerolla; Tietorakenteet, laskuharjoitus 7, ratkaisuja 1. Opiskelijarekisteri-luokka saadaan toteutetuksi käyttämällä kahta tasapainotettua binäärihakupuuta. Toisen binäärihakupuun avaimina pidetään opiskelijoiden

Lisätiedot

811312A Tietorakenteet ja algoritmit Kertausta kurssin alkuosasta

811312A Tietorakenteet ja algoritmit Kertausta kurssin alkuosasta 811312A Tietorakenteet ja algoritmit 2017-2018 Kertausta kurssin alkuosasta II Perustietorakenteet Pino, jono ja listat tunnettava Osattava soveltaa rakenteita algoritmeissa Osattava päätellä operaatioiden

Lisätiedot

Algoritmit 2. Demot Timo Männikkö

Algoritmit 2. Demot Timo Männikkö Algoritmit 2 Demot 1 27.-28.3.2019 Timo Männikkö Tehtävä 1 (a) 4n 2 + n + 4 = O(n 2 ) c, n 0 > 0 : 0 4n 2 + n + 4 cn 2 n n 0 Vasen aina tosi Oikea tosi, jos (c 4)n 2 n 4 0, joten oltava c > 4 Kokeillaan

Lisätiedot

18. Abstraktit tietotyypit 18.1

18. Abstraktit tietotyypit 18.1 18. Abstraktit tietotyypit 18.1 Sisällys Johdanto abstrakteihin tietotyyppeihin. Pino ja jono. Linkitetty lista. Pino linkitetyllä listalla toteutettuna. 18.2 Johdanto Javan omat tietotyypit ovat jo tuttuja:

Lisätiedot

Tietorakenteet ja algoritmit - syksy 2015 1

Tietorakenteet ja algoritmit - syksy 2015 1 Tietorakenteet ja algoritmit - syksy 2015 1 Tietorakenteet ja algoritmit - syksy 2015 2 Tietorakenteet ja algoritmit Johdanto Ari Korhonen Tietorakenteet ja algoritmit - syksy 2015 1. JOHDANTO 1.1 Määritelmiä

Lisätiedot

Tietorakenteet, laskuharjoitus 7, ratkaisuja

Tietorakenteet, laskuharjoitus 7, ratkaisuja Tietorakenteet, laskuharjoitus, ratkaisuja. Seuraava kuvasarja näyttää B + -puun muutokset lisäysten jälkeen. Avaimet ja 5 mahtuvat lehtisolmuihin, joten niiden lisäys ei muuta puun rakennetta. Avain 9

Lisätiedot

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

Sisällys. 18. Abstraktit tietotyypit. Johdanto. Johdanto Sisällys 18. bstraktit tietotyypit Johdanto abstrakteihin tietotyyppeihin. Pino ja jono. Linkitetty lista. Pino linkitetyllä listalla toteutettuna. 18.1 18.2 Johdanto Javan omat tietotyypit ovat jo tuttuja:

Lisätiedot

10. Painotetut graafit

10. Painotetut graafit 10. Painotetut graafit Esiintyy monesti sovelluksia, joita on kätevä esittää graafeina. Tällaisia ovat esim. tietoverkko tai maantieverkko. Näihin liittyy erinäisiä tekijöitä. Tietoverkkoja käytettäessä

Lisätiedot

Algoritmit 2. Luento 14 Ke Timo Männikkö

Algoritmit 2. Luento 14 Ke Timo Männikkö Algoritmit 2 Luento 14 Ke 3.5.2017 Timo Männikkö Luento 14 Ositus ja rekursio Rekursion toteutus Kertaus ja tenttivinkit Algoritmit 2 Kevät 2017 Luento 14 Ke 3.5.2017 2/30 Ositus Tehtävän esiintymä ositetaan

Lisätiedot

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.

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. Tietorakenteet, laskuharjoitus 11, ratkaisuja 1. Leveyssuuntaisen läpikäynnin voi toteuttaa rekursiivisesti käsittelemällä jokaisella rekursiivisella kutsulla kaikki tietyllä tasolla olevat solmut. Rekursiivinen

Lisätiedot

Tietorakenteet, laskuharjoitus 3, ratkaisuja

Tietorakenteet, laskuharjoitus 3, ratkaisuja Tietorakenteet, laskuharjoitus 3, ratkaisuja 1. (a) Toistolauseen runko-osassa tehdään yksi laskuoperaatio, runko on siis vakioaikainen. Jos syöte on n, suoritetaan runko n kertaa, eli aikavaativuus kokonaisuudessaan

Lisätiedot

Algoritmit 1. Luento 5 Ti Timo Männikkö

Algoritmit 1. Luento 5 Ti Timo Männikkö Algoritmit 1 Luento 5 Ti 24.1.2017 Timo Männikkö Luento 5 Järjestetty lista Järjestetyn listan operaatiot Listan toteutus taulukolla Binäärihaku Binäärihaun vaativuus Algoritmit 1 Kevät 2017 Luento 5 Ti

Lisätiedot

A274101 TIETORAKENTEET JA ALGORITMIT

A274101 TIETORAKENTEET JA ALGORITMIT A274101 TIETORAKENTEET JA ALGORITMIT PERUSTIETORAKENTEET LISTA, PINO, JONO, PAKKA ABSTRAKTI TIETOTYYPPI Tietotyyppi on abstrakti, kun se on määritelty (esim. matemaattisesti) ottamatta kantaa varsinaiseen

Lisätiedot

Luku 8. Aluekyselyt. 8.1 Summataulukko

Luku 8. Aluekyselyt. 8.1 Summataulukko Luku 8 Aluekyselyt Aluekysely on tiettyä taulukon väliä koskeva kysely. Tyypillisiä aluekyselyitä ovat, mikä on taulukon välin lukujen summa tai pienin luku välillä. Esimerkiksi seuraavassa taulukossa

Lisätiedot

Algoritmit 1. Luento 6 Ke Timo Männikkö

Algoritmit 1. Luento 6 Ke Timo Männikkö Algoritmit 1 Luento 6 Ke 25.1.2017 Timo Männikkö Luento 6 Järjestetty lista Listan toteutus dynaamisesti Linkitetyn listan operaatiot Vaihtoehtoisia listarakenteita Puurakenteet Binääripuu Järjestetty

Lisätiedot

4. Joukkojen käsittely

4. Joukkojen käsittely 4 Joukkojen käsittely Tämän luvun jälkeen opiskelija osaa soveltaa lomittuvien kasojen operaatioita tuntee lomittuvien kasojen toteutuksen binomi- ja Fibonacci-kasoina sekä näiden totetutusten analyysiperiaatteet

Lisätiedot

Tietorakenteet, laskuharjoitus 6,

Tietorakenteet, laskuharjoitus 6, Tietorakenteet, laskuharjoitus, 23.-2.1 1. (a) Kuvassa 1 on esitetty eräät pienimmistä AVL-puista, joiden korkeus on 3 ja 4. Pienin h:n korkuinen AVL-puu ei ole yksikäsitteinen juuren alipuiden keskinäisen

Lisätiedot

811312A Tietorakenteet ja algoritmit II Perustietorakenteet

811312A Tietorakenteet ja algoritmit II Perustietorakenteet 811312A Tietorakenteet ja algoritmit 2017-2018 II Perustietorakenteet Sisältö 1. Johdanto 2. Pino 3. Jono 4. Lista 811312A TRA, Perustietorakenteet 2 II.1. Johdanto Tietorakenne on tapa, jolla algoritmi

Lisätiedot

Algoritmi on periaatteellisella tasolla seuraava:

Algoritmi on periaatteellisella tasolla seuraava: Algoritmi on periaatteellisella tasolla seuraava: Dijkstra(V, E, l, v 0 ): S := { v 0 } D[v 0 ] := 0 for v V S do D[v] := l(v 0, v) end for while S V do valitse v V S jolle D[v] on minimaalinen S := S

Lisätiedot

Algoritmit 2. Luento 5 Ti Timo Männikkö

Algoritmit 2. Luento 5 Ti Timo Männikkö Algoritmit 2 Luento 5 Ti 28.3.2017 Timo Männikkö Luento 5 Puurakenteet B-puu B-puun korkeus B-puun operaatiot Algoritmit 2 Kevät 2017 Luento 5 Ti 28.3.2017 2/29 B-puu Algoritmit 2 Kevät 2017 Luento 5 Ti

Lisätiedot

6. Sanakirjat. 6. luku 298

6. Sanakirjat. 6. luku 298 6. Sanakirjat Tässä luvussa tarkastellaan käsitettä sanakirja (dictionary). Tällaisen tietorakenteen tehtävä on tallettaa alkioita niin, että tiedonhaku rakenteesta on tehokasta. Nimi vastaa melko hyvin

Lisätiedot

Algoritmit 1. Luento 4 Ke Timo Männikkö

Algoritmit 1. Luento 4 Ke Timo Männikkö Algoritmit 1 Luento 4 Ke 18.1.2017 Timo Männikkö Luento 4 Tietorakenteet Pino Pinon toteutus Jono Jonon toteutus Lista Listaoperaatiot Algoritmit 1 Kevät 2017 Luento 4 Ke 18.1.2017 2/29 Pino Pino, stack,

Lisätiedot

Algoritmit 2. Luento 4 Ke Timo Männikkö

Algoritmit 2. Luento 4 Ke Timo Männikkö Algoritmit 2 Luento 4 Ke 22.3.2017 Timo Männikkö Luento 4 Hajautus Yhteentörmäysten käsittely Avoin osoitteenmuodostus Hajautusfunktiot Puurakenteet Solmujen läpikäynti Algoritmit 2 Kevät 2017 Luento 4

Lisätiedot

Taulukot. Taulukon määrittely ja käyttö. Taulukko metodin parametrina. Taulukon sisällön kopiointi toiseen taulukkoon. Taulukon lajittelu

Taulukot. Taulukon määrittely ja käyttö. Taulukko metodin parametrina. Taulukon sisällön kopiointi toiseen taulukkoon. Taulukon lajittelu Taulukot Taulukon määrittely ja käyttö Taulukko metodin parametrina Taulukon sisällön kopiointi toiseen taulukkoon Taulukon lajittelu esimerkki 2-ulottoisesta taulukosta 1 Mikä on taulukko? Taulukko on

Lisätiedot

Harjoitustyön testaus. Juha Taina

Harjoitustyön testaus. Juha Taina Harjoitustyön testaus Juha Taina 1. Johdanto Ohjelman teko on muutakin kuin koodausta. Oleellinen osa on selvittää, että ohjelma toimii oikein. Tätä sanotaan ohjelman validoinniksi. Eräs keino validoida

Lisätiedot

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

3. Hakupuut. B-puu on hakupuun laji, joka sopii mm. tietokantasovelluksiin, joissa rakenne on talletettu kiintolevylle eikä keskusmuistiin. 3. Hakupuut Hakupuu on listaa tehokkaampi dynaamisen joukon toteutus. Erityisesti suurilla tietomäärillä hakupuu kannattaa tasapainottaa, jolloin päivitysoperaatioista tulee hankalampia toteuttaa mutta

Lisätiedot

Algoritmit 2. Luento 6 Ke Timo Männikkö

Algoritmit 2. Luento 6 Ke Timo Männikkö Algoritmit 2 Luento 6 Ke 29.3.2017 Timo Männikkö Luento 6 B-puun operaatiot B-puun muunnelmia Nelipuu Trie-rakenteet Standarditrie Pakattu trie Algoritmit 2 Kevät 2017 Luento 6 Ke 29.3.2017 2/31 B-puu

Lisätiedot

Algoritmit 2. Luento 13 Ti Timo Männikkö

Algoritmit 2. Luento 13 Ti Timo Männikkö Algoritmit 2 Luento 13 Ti 30.4.2019 Timo Männikkö Luento 13 Simuloitu jäähdytys Merkkijonon sovitus Horspoolin algoritmi Ositus ja rekursio Rekursion toteutus Algoritmit 2 Kevät 2019 Luento 13 Ti 30.4.2019

Lisätiedot

1. (a) Seuraava algoritmi tutkii, onko jokin luku taulukossa monta kertaa:

1. (a) Seuraava algoritmi tutkii, onko jokin luku taulukossa monta kertaa: Tietorakenteet, laskuharjoitus 10, ratkaisuja 1. (a) Seuraava algoritmi tutkii, onko jokin luku taulukossa monta kertaa: SamaLuku(T ) 2 for i = 1 to T.length 1 3 if T [i] == T [i + 1] 4 return True 5 return

Lisätiedot

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

58131 Tietorakenteet (kevät 2009) Harjoitus 6, ratkaisuja (Antti Laaksonen) 58131 Tietorakenteet (kevät 2009) Harjoitus 6, ratkaisuja (Antti Laaksonen) 1. Avaimet 1, 2, 3 ja 4 mahtuvat samaan lehtisolmuun. Tässä tapauksessa puussa on vain yksi solmu, joka on samaan aikaan juurisolmu

Lisätiedot

811312A Tietorakenteet ja algoritmit Kertausta kurssin alkuosasta

811312A Tietorakenteet ja algoritmit Kertausta kurssin alkuosasta 811312A Tietorakenteet ja algoritmit 2016-2017 Kertausta kurssin alkuosasta II Algoritmien analyysi: oikeellisuus Algoritmin täydellinen oikeellisuus = Algoritmi päättyy ja tuottaa määritellyn tuloksen

Lisätiedot

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

Miten käydä läpi puun alkiot (traversal)? inääripuut ieman lisää aidon binääripuun ominaisuuksia lehtisolmuja on yksi enemmän kuin sisäsolmuja inääripuut tasolla d on korkeintaan 2 d solmua pätee myös epäaidolle binääripuulle taso 0: 2 0 = 1 solmu

Lisätiedot

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

58131 Tietorakenteet (kevät 2009) Harjoitus 9, ratkaisuja (Antti Laaksonen) 58131 Tietorakenteet (kevät 2009) Harjoitus 9, ratkaisuja (Antti Laaksonen) 1. Lisäysjärjestämisessä järjestetään ensin taulukon kaksi ensimmäistä lukua, sitten kolme ensimmäistä lukua, sitten neljä ensimmäistä

Lisätiedot

Ohjelmoinnin perusteet Y Python

Ohjelmoinnin perusteet Y Python Ohjelmoinnin perusteet Y Python T-106.1208 25.2.2009 T-106.1208 Ohjelmoinnin perusteet Y 25.2.2009 1 / 34 Syötteessä useita lukuja samalla rivillä Seuraavassa esimerkissä käyttäjä antaa useita lukuja samalla

Lisätiedot

3. Binääripuu, Java-toteutus

3. Binääripuu, Java-toteutus 3. Binääripuu, Java-toteutus /*-------------------------------------------------------------/ / Rajapinta SearchTree: binäärisen hakupuun käsittelyrajapinta / / Metodit: / / void insert( Comparable x );

Lisätiedot

Tarkennamme geneeristä painamiskorotusalgoritmia

Tarkennamme geneeristä painamiskorotusalgoritmia Korotus-eteen-algoritmi (relabel-to-front) Tarkennamme geneeristä painamiskorotusalgoritmia kiinnittämällä tarkasti, missä järjestyksessä Push- ja Raise-operaatioita suoritetaan. Algoritmin peruskomponentiksi

Lisätiedot

(a) L on listan tunnussolmu, joten se ei voi olla null. Algoritmi lisäämiselle loppuun:

(a) L on listan tunnussolmu, joten se ei voi olla null. Algoritmi lisäämiselle loppuun: Tietorakenteet ja algoritmit, kevät 201 Kurssikoe 1, ratkaisuja 1. Tehtävästä sai yhden pisteen per kohta. (a) Invariantteja voidaan käyttää algoritmin oikeellisuustodistuksissa Jokin väittämä osoitetaan

Lisätiedot

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

5. Keko. Tietorakenne keko eli kasa (heap) on tehokas toteutus abstraktille tietotyypille prioriteettijono, jonka operaatiot ovat seuraavat: 5. Keko Tietorakenne keko eli kasa (heap) on tehokas toteutus abstraktille tietotyypille prioriteettijono, jonka operaatiot ovat seuraavat: Insert(S, x): lisää avaimen x prioriteettijonoon S Maximum(S):

Lisätiedot

A ja B pelaavat sarjan pelejä. Sarjan voittaja on se, joka ensin voittaa n peliä.

A ja B pelaavat sarjan pelejä. Sarjan voittaja on se, joka ensin voittaa n peliä. Esimerkki otteluvoiton todennäköisyys A ja B pelaavat sarjan pelejä. Sarjan voittaja on se, joka ensin voittaa n peliä. Yksittäisessä pelissä A voittaa todennäköisyydellä p ja B todennäköisyydellä q =

Lisätiedot

Relaation ominaisuuksia. Ominaisuuksia koskevia lauseita Sulkeumat. Joukossa X määritelty relaatio R on. (ir) irrefleksiivinen, jos x Rx kaikilla x X,

Relaation ominaisuuksia. Ominaisuuksia koskevia lauseita Sulkeumat. Joukossa X määritelty relaatio R on. (ir) irrefleksiivinen, jos x Rx kaikilla x X, Relaation Joukossa X määritelty relaatio R on (r) refleksiivinen, jos xrx kaikilla x X, (ir) irrefleksiivinen, jos x Rx kaikilla x X, Relaation Joukossa X määritelty relaatio R on (r) refleksiivinen, jos

Lisätiedot

Joukossa X määritelty relaatio R on. (ir) irrefleksiivinen, jos x Rx kaikilla x X,

Joukossa X määritelty relaatio R on. (ir) irrefleksiivinen, jos x Rx kaikilla x X, Relaation Joukossa X määritelty relaatio R on (r) refleksiivinen, jos xrx kaikilla x X, (ir) irrefleksiivinen, jos x Rx kaikilla x X, (s) symmetrinen, jos xry yrx, (as) antisymmetrinen, jos xry yrx x =

Lisätiedot

Algoritmit 1. Luento 11 Ti Timo Männikkö

Algoritmit 1. Luento 11 Ti Timo Männikkö Algoritmit 1 Luento 11 Ti 14.2.2017 Timo Männikkö Luento 11 Algoritminen ongelmanratkaisu Osittaminen Lomituslajittelu Lomituslajittelun vaativuus Rekursioyhtälöt Pikalajittelu Algoritmit 1 Kevät 2017

Lisätiedot

ALGORITMIT 1 DEMOVASTAUKSET KEVÄT 2012

ALGORITMIT 1 DEMOVASTAUKSET KEVÄT 2012 ALGORITMIT 1 DEMOVASTAUKSET KEVÄT 2012 1.1. (a) Jaettava m, jakaja n. Vähennetään luku n luvusta m niin kauan kuin m pysyy ei-negatiivisena. Jos jäljelle jää nolla, jaettava oli tasan jaollinen. int m,

Lisätiedot

4 Tehokkuus ja algoritmien suunnittelu

4 Tehokkuus ja algoritmien suunnittelu TIE-20100 Tietorakenteet ja algoritmit 52 4 Tehokkuus ja algoritmien suunnittelu Tässä luvussa pohditaan tehokkuuden käsitettä ja esitellään kurssilla käytetty kertaluokkanotaatio, jolla kuvataan algoritmin

Lisätiedot

811312A Tietorakenteet ja algoritmit, , Harjoitus 3, Ratkaisu

811312A Tietorakenteet ja algoritmit, , Harjoitus 3, Ratkaisu 811312A Tietorakenteet ja algoritmit, 2018-2019, Harjoitus 3, Ratkaisu Harjoituksessa käsitellään algoritmien aikakompleksisuutta. Tehtävä 3.1 Kuvitteelliset algoritmit A ja B lajittelevat syötteenään

Lisätiedot

Kääreluokat (oppikirjan luku 9.4) (Wrapper-classes)

Kääreluokat (oppikirjan luku 9.4) (Wrapper-classes) Kääreluokat (oppikirjan luku 9.4) (Wrapper-classes) Kääreluokista Javan alkeistietotyypit ja vastaavat kääreluokat Autoboxing Integer-luokka Double-luokka Kääreluokista Alkeistietotyyppiset muuttujat (esimerkiksi

Lisätiedot

13. Loogiset operaatiot 13.1

13. Loogiset operaatiot 13.1 13. Loogiset operaatiot 13.1 Sisällys Loogiset operaatiot AND, OR, XOR ja NOT. Operaatioiden ehdollisuus. Bittioperaatiot. Loogiset operaatiot ohjausrakenteissa. Loogiset operaatiot ja laskentajärjestys.

Lisätiedot

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

Anna Kuikka Pyöräkatu 9 B Kuopio GSM: Opiskelijanro: 60219K. Prioriteettijonot 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

Lisätiedot

Algoritmit 1. Luento 10 Ke 11.2.2015. Timo Männikkö

Algoritmit 1. Luento 10 Ke 11.2.2015. Timo Männikkö Algoritmit 1 Luento 10 Ke 11.2.2015 Timo Männikkö Luento 10 Algoritminen ongelman ratkaisu Suunnittelumenetelmät Raaka voima Järjestäminen eli lajittelu Kuplalajittelu Väliinsijoituslajittelu Valintalajittelu

Lisätiedot

puuta tree hierarkkinen hierarchical

puuta tree hierarkkinen hierarchical 4. Puut Seuraavaksi käsitellään yhtä tärkeimmistä tietojenkäsittelytieteen ei-lineaarisista käsitteistä, puuta (tree). Puut ovat olleet keksintönä todellinen läpimurto, koska niissä luotiin tehokas eilineaari

Lisätiedot

Ohjelmoinnin perusteet Y Python

Ohjelmoinnin perusteet Y Python Ohjelmoinnin perusteet Y Python T-106.1208 17.2.2010 T-106.1208 Ohjelmoinnin perusteet Y 17.2.2010 1 / 41 Sanakirja Monissa sovelluksissa on tallennettava rakenteeseen avain arvo-pareja. Myöhemmin rakenteesta

Lisätiedot

Algoritmit 1. Luento 8 Ke Timo Männikkö

Algoritmit 1. Luento 8 Ke Timo Männikkö Algoritmit 1 Luento 8 Ke 1.2.2017 Timo Männikkö Luento 8 Järjestetty binääripuu Solmujen läpikäynti Binääripuun korkeus Binääripuun tasapainottaminen Graafit ja verkot Verkon lyhimmät polut Fordin ja Fulkersonin

Lisätiedot

Algoritmit 2. Luento 9 Ti Timo Männikkö

Algoritmit 2. Luento 9 Ti Timo Männikkö Algoritmit 2 Luento 9 Ti 17.4.2018 Timo Männikkö Luento 9 Merkkitiedon tiivistäminen Huffmanin koodi LZW-menetelmä Taulukointi Editointietäisyys Algoritmit 2 Kevät 2018 Luento 9 Ti 17.4.2018 2/29 Merkkitiedon

Lisätiedot

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

Pikalajittelu: valitaan ns. pivot-alkio esim. pivot = oikeanpuoleisin Pikalajittelu: valitaan ns. pivot-alkio esim. pivot = oikeanpuoleisin jaetaan muut alkiot kahteen ryhmään: L: alkiot, jotka eivät suurempia kuin pivot G : alkiot, jotka suurempia kuin pivot 6 1 4 3 7 2

Lisätiedot

58131 Tietorakenteet Erilliskoe , ratkaisuja (Jyrki Kivinen)

58131 Tietorakenteet Erilliskoe , ratkaisuja (Jyrki Kivinen) 58131 Tietorakenteet Erilliskoe 11.11.2008, ratkaisuja (Jyrki Kivinen) 1. (a) Koska halutaan DELETEMAX mahdollisimman nopeaksi, käytetään järjestettyä linkitettyä listaa, jossa suurin alkio on listan kärjessä.

Lisätiedot

Olio-ohjelmointi Syntaksikokoelma

Olio-ohjelmointi Syntaksikokoelma C++-kielen uusia ominaisuuksia Olio-ohjelmointi Syntaksikokoelma 31.10.2008 Bool-tietotyyppi: Totuusarvo true (1), jos ehto on tosi ja false (0) jos ehto epätosi. Dynaaminen muistinvaraus: Yhden muuttuja

Lisätiedot

13 Lyhimmät painotetut polut

13 Lyhimmät painotetut polut TIE-20100 Tietorakenteet ja algoritmit 297 13 Lyhimmät painotetut polut BFS löytää lyhimmän polun lähtösolmusta graafin saavutettaviin solmuihin. Se ei kuitenkaan enää suoriudu tehtävästä, jos kaarien

Lisätiedot

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

Sekvenssi: kokoelma peräkkäisiä alkioita (lineaarinen Sekvenssi Sekvenssi: kokoelma peräkkäisiä alkioita (lineaarinen järjestys) Timo Esim. pino, jono ja kaksiloppuinen jono ovat sekvenssin erikoistapauksia sekvenssejä, jotka kohdistavat operaationsa ensimmäiseen/viimeiseen

Lisätiedot

Algoritmit 1. Demot Timo Männikkö

Algoritmit 1. Demot Timo Männikkö Algoritmit 1 Demot 2 7.-8.2.2018 Timo Männikkö Tehtävä 1 (a) Ei-rekursiivinen algoritmi: etsipienin(t, n) { pnn = t[0]; for (i = 1; i < n; i++) { pnn = min(pnn, t[i]); return pnn; Silmukka suoritetaan

Lisätiedot

Algoritmit 1. Luento 2 Ke Timo Männikkö

Algoritmit 1. Luento 2 Ke Timo Männikkö Algoritmit 1 Luento 2 Ke 11.1.2017 Timo Männikkö Luento 2 Algoritmin esitys Algoritmien analysointi Suoritusaika Asymptoottinen kertaluokka Peruskertaluokkia NP-täydelliset ongelmat Algoritmit 1 Kevät

Lisätiedot

Informaatioteknologian laitos Olio-ohjelmoinnin perusteet / Salo 15.2.2006

Informaatioteknologian laitos Olio-ohjelmoinnin perusteet / Salo 15.2.2006 TURUN YLIOPISTO DEMO III Informaatioteknologian laitos tehtävät Olio-ohjelmoinnin perusteet / Salo 15.2.2006 1. Tässä tehtävässä tarkastellaan erääntyviä laskuja. Lasku muodostaa oman luokkansa. Laskussa

Lisätiedot

11. Javan toistorakenteet 11.1

11. Javan toistorakenteet 11.1 11. Javan toistorakenteet 11.1 Sisällys Laskuri- ja lippumuuttujat. Sisäkkäiset silmukat. Tyypillisiä ohjelmointivirheitä: Silmukan rajat asetettu kierroksen verran väärin. Ikuinen silmukka. Silmukoinnin

Lisätiedot

B + -puut. Kerttu Pollari-Malmi

B + -puut. Kerttu Pollari-Malmi B + -puut Kerttu Pollari-Malmi Tämä monista on alunperin kirjoitettu sksn 2005 kurssille osittain Luukkaisen ja Nkäsen vanhojen luentokalvojen pohjalta. Maaliskuussa 2010 pseudokoodiesits on muutettu vastaamaan

Lisätiedot

12. Javan toistorakenteet 12.1

12. Javan toistorakenteet 12.1 12. Javan toistorakenteet 12.1 Sisällys Yleistä toistorakenteista. Laskurimuuttujat. While-, do-while- ja for-lauseet. Laskuri- ja lippumuuttujat. Tyypillisiä ohjelmointivirheitä. Silmukan rajat asetettu

Lisätiedot

815338A Ohjelmointikielten periaatteet Harjoitus 2 vastaukset

815338A Ohjelmointikielten periaatteet Harjoitus 2 vastaukset 815338A Ohjelmointikielten periaatteet 2015-2016. Harjoitus 2 vastaukset Harjoituksen aiheena on BNF-merkinnän käyttö ja yhteys rekursiivisesti etenevään jäsentäjään. Tehtävä 1. Mitkä ilmaukset seuraava

Lisätiedot

Listarakenne (ArrayList-luokka)

Listarakenne (ArrayList-luokka) Listarakenne (ArrayList-luokka) Mikä on lista? Listan määrittely ArrayList-luokan metodeita Listan läpikäynti Listan läpikäynti indeksin avulla Listan läpikäynti iteraattorin avulla Listaan lisääminen

Lisätiedot