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 5 op Alkioita voidaan vertailla avainten perusteella käyttäen jotain vertailusääntöä Vertailu 5 op 80 op 5 op 80 op voidaan määritellä melko vapaasti: usein muu kuin lukujen tavanomainen suuruusjärjestys, esim.: aakkosjärjestys: Lahtinen Nieminen edeltävyyssuhde: Tiistai Perjantai, Lausekielinen ohjelmointi Olio-ohjelmoinnin perusteet käänteinen: 0 m 85 m (keihäskisan sijat) Tietorakenteet, syksy 007 Tietorakenteet, syksy 007 Täydellinen järjestys Tarkastellaan vertailusääntöä, joka määrittää avaimille täydellisen järjestyksen refleksiivisyys: k k (missä k on avain) antisymmetrisyys: jos k k ja k k, niin k = k transitiivisuus: jos k k ja k k, niin k k vertailtavuus: kaikille k,k pätee joko k k tai k k Lineaarinen järjestys, pienin alkio hyvin määritelty Tietorakenteet, syksy 007 Täydellinen järjestys Kurssien edeltävyys: täydellinen järjestys? Ohjelmoinnin tekniikka Lausekielinen ohjelmointi Olio-ohjelmoinnin perusteet Tietorakenteet ei: Ohjelmoinnin tekniikka ja Tietorakenteet eivät vertailtavissa Tietorakenteet, syksy 007
Täydellinen järjestys Avainten järjestys yksikäsitteinen, mutta vastaavien alkioiden välttämättä ei saman avaimen omaavat alkiot 5 op 5 op 80 op 80 op järjestys ratkaistava muulla tavoin (esim. toinen avain-tyyppi, tai ei välitetä) Tietorakenteet, syksy 007 5 Vertailu (Javassa) Yleinen (esim. helposti päivitettävä) vertailutapa? Javassa: objektien vertailtavuus Comparable ja Comparator-rajapintojen kautta public interface Comparable<T> { public int compareto( T obj ); } metodin compareto palautusarvo: < 0, jos olio itse < obj = 0, jos olio itse = obj > 0, jos olio itse > obj Tietorakenteet, syksy 007 Vertailu (Javassa) public interface Comparator<T> { public int compare( T obj, T obj );... } metodin compare palautusarvo: < 0, jos obj < obj = 0, jos obj = obj > 0, jos obj > obj Hieman vastaava tapa (esim. C/C++): alkioiden vertailu esim. parametrina saadulla vertailufunktiolla Tietorakenteet, syksy 007 7 Prioriteettijono (priority queue) Prioriteettijono: jono, jossa järjestys avainten perusteella esim. kurssin jonolaki: avain = opintopisteet valitaan kurssille, jos tilaa kolmelle 80 op 5 op Prioriteettijonon perusoperaatiot: avaimen omaavan alkion lisäys jonoon korkeimman prioriteetin omaavan alkion poisto Tietorakenteet, syksy 007 8
Prioriteettijonon tarkempi määrittely Prioriteettijono P on abstrakti tietotyyppi, jolla on ainakin perusmetodit: InsertItem(k,x): lisää avaimen k omaavan tietoalkion x prioriteettijonoon P RemoveMinElem(): palauttaa ja poistaa jonosta P sellaisen alkion x, jolla on pienin avain k pienin k vertailusäännön suhteen yhtäsuuret avaimet? toteutusyksityiskohta tapahtuu virhe, jos jono on tyhjä Tietorakenteet, syksy 007 Prioriteettijonon metodit Pitkälti vastaavat apumetodit kuin tavallisella jonolla Size(): palauttaa kokonaislukuarvon, joka kertoo kuinka monta alkiota jonossa P on IsEmpty(): palauttaa arvon true, jos prioriteettijono on tyhjä, ja muuten arvon false MinElem(): palauttaa pienimmän avaimen k omaavan alkion poistamatta sitä jonosta P MinKey(): palauttaa pienimmän avaimen k, joka esiintyy jonossa P Tietorakenteet, syksy 007 0 Prioriteettijonon metodit Esimerkki: InsertItem(500$, ) InsertItem(00$, Asiakas B) InsertItem(550$, ) RemoveMinElem(): Asiakas B MinElem(): MinKey(): InsertItem(550$, Asiakas D) MinElem(): (tai D) MinKey(): Asiakas B 00 $ Asiakas D toteuttaja ( sovelluskohde) päättää, missä järjestyksessä saman avaimen omaavia alkioita käsitellään Tietorakenteet, syksy 007 Prioriteettijonon toteutus Prioriteettijonon toteutus käytännössä? Perusvaihtoehto: kuin sekvenssi linkitetyssä listassa tai taulukossa InsertItem(k,x) = InsertFirst((k,x)), missä (k, x) on avaimen k ja alkion x yhdistelmä-alkio työmäärä O() RemoveMinElem(), MinElem(), MinKey(): minimiavain (sen alkio) haetaan lineaarisesti työmäärä Θ(n) Tietorakenteet, syksy 007
Prioriteettijonon toteutus Perusvaihtoehto : järjestetty sekvenssi (listassa tai taulukossa) ylläpidetään sekvenssin alkiot suuruusjärjestyksessä InsertItem(500$, ) InsertItem(00$, Asiakas B) InsertItem(550$, ) Asiakas B 00 $ Asiakas B 00 $ Prioriteettijonon toteutus InsertItem(k,x): alkio (k, x) sellaiseen kohtaan, jossa edeltävän alkion avain k, ja k seuraavan alkion avain työmäärä O(n) sekä taulukossa että listassa RemoveMinElem(), MinElem(), MinKey(): minimiavain (sen alkio) sekvenssin ensimmmäisessä paikassa työmäärä O() Tietorakenteet, syksy 007 Tietorakenteet, syksy 007 Lajittelu Prioriteettijonolla on vahva yhteys lajitteluun annetaan n alkiota sekä niiden vertailusääntö tehtävä: järjestä alkiot suuruusjärjestykseen Paljon erilaisia lajittelualgoritmeja tarkastellaan aluksi kolmea (hieman tehotonta) perus-esimerkkiä: kuplalajittelu valintalajittelu lisäyslajittelu Kuplalajittelu Kuplalajittelu (bubble sort): kulje lajiteltava sekvenssi alusta loppuun järjestä aina vierekkäinen alkiopari toista tällainen järjestävä läpikäynti (korkeintaan) n kertaa Tietorakenteet, syksy 007 5 Tietorakenteet, syksy 007
Kuplalajittelu 5 5 5 5 5 5 Työmäärä? pahimmillaan n kierrosta i. kierroksella n i + askelta 5 5 5 5 5...ja niin edelleen yhteensä Σ n i= (n i + ) = Σn i= i = O(n ) Tietorakenteet, syksy 007 7 Prioriteettijono lajittelussa Yleisluontoinen lajittelu prioriteettijonolla: PriorityQueueSort(lajiteltava sekvenssi S) alusta prioriteettijono P while S.IsEmpty() = false do x S.RemoveFirst() P.InsertItem(x, x) while P.IsEpmty() = false do x P.RemoveMinElem() S.InsertLast(x) Työmäärä? riippuu prioriteettijonon operaatioiden InsertItem ja RemoveMinElem tehokkuudesta Tietorakenteet, syksy 007 8 Valintalajittelu Lajittelussa käytetty prioriteettijono järjestämättömänä sekvenssinä valintalajittelu kulje lajiteltava (yhä lajittelematon) sekvenssi (prioriteettijono) alusta loppuun etsi pienin alkio ja siirrä se lajitellun sekvenssin loppuun toista täsmälleen n kertaa Tietorakenteet, syksy 007 Valintalajittelu lajittelematon 7 7 7 lajiteltu 7 7 7 7 Työmäärä? n kierrosta, i. kierroksella n i+ askelta yhteensä Σ n i= (n i + ) = Σn i= i = O(n ) Tietorakenteet, syksy 007 0
Lisäyslajittelu Lajittelussa käytetty prioriteettijono järjestettynä (lajiteltuna) sekvenssinä lisäyslajittelu ota seuraava alkio (yhä lajittelemattomasta) sekvenssistä vie se lajitellun sekvenssin (prioriteettijono) kohtaan, jossa edeltävä alkio ei ole suurempi tai seuraava alkio pienempi toista täsmälleen n kertaa Lisäyslajittelu lajittelematon 7 7 7 7 7 lajiteltu 7 7 Työmäärä? n kierrosta, i. kierroksella max. i askelta yhteensä Σ n i= i = O(n ) Tietorakenteet, syksy 007 Tietorakenteet, syksy 007