5. Prioriteettijonot. 5. luku 236
|
|
- Kaija Hakola
- 7 vuotta sitten
- Katselukertoja:
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 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ätiedotuseampi 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ätiedotlä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ätiedotAlgoritmit 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ätiedotAlgoritmit 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ätiedotPinot, 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ätiedotAlgoritmit 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ätiedotAlgoritmit 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ätiedotAlgoritmit 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ätiedotHakupuut. 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ätiedotAlgoritmit 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ätiedotAVL-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ätiedotA274101 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ätiedotAlgoritmit 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ätiedotAlgoritmit 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ätiedot811312A 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ätiedot8. 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ätiedotTehtä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ätiedot58131 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ätiedotAlgoritmit 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ätiedotAlgoritmit 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ätiedotTKT20001 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ätiedot4. 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ätiedotPino 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ätiedotv 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ätiedot58131 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ätiedotAlgoritmit 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ätiedotKaksiloppuinen 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ätiedotBinää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ätiedot7. 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ätiedot1 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ätiedotAlgoritmit 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ätiedotTietorakenteet 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ätiedotprivate 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ätiedot811312A 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ätiedotAlgoritmit 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ätiedot18. 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ätiedotTietorakenteet 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ätiedotTietorakenteet, 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ätiedotSisä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ätiedot10. 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ätiedotAlgoritmit 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ätiedot2. 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ätiedotTietorakenteet, 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ätiedotAlgoritmit 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ätiedotA274101 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ätiedotLuku 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ätiedotAlgoritmit 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ätiedot4. 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ätiedotTietorakenteet, 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ätiedot811312A 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ätiedotAlgoritmi 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ätiedotAlgoritmit 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ätiedot6. 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ätiedotAlgoritmit 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(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ä.
Loppu seuraa suoralla laskulla: n n Tave TR = p j (1 + b (i, j)) j=1 = 1 + 1 i
LisätiedotAlgoritmit 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ätiedotTaulukot. 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ätiedotHarjoitustyö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ätiedot3. 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ätiedotAlgoritmit 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ätiedotAlgoritmit 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ätiedot1. (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ätiedot58131 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ätiedot811312A 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ätiedotMiten 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ätiedot58131 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ätiedotOhjelmoinnin 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ätiedot3. Binääripuu, Java-toteutus
3. Binääripuu, Java-toteutus /*-------------------------------------------------------------/ / Rajapinta SearchTree: binäärisen hakupuun käsittelyrajapinta / / Metodit: / / void insert( Comparable x );
LisätiedotTarkennamme 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:
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ätiedot5. 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ätiedotA 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ätiedotRelaation 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ätiedotJoukossa 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ätiedotAlgoritmit 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ätiedotALGORITMIT 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ätiedot4 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ätiedot811312A 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ätiedotKää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ätiedot13. 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ätiedotAnna 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ätiedotAlgoritmit 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ätiedotpuuta 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ätiedotOhjelmoinnin 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ätiedotAlgoritmit 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ätiedotAlgoritmit 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ätiedotPikalajittelu: 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ätiedot58131 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ätiedotOlio-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ätiedot13 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ätiedotSekvenssi: 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ätiedotAlgoritmit 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ätiedotAlgoritmit 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ätiedotInformaatioteknologian 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ätiedot11. 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ätiedotB + -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ätiedot12. 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ätiedot815338A 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ätiedotListarakenne (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