Kekolajittelu Prioriteettijonolla toteutettu keko InsertItem ja RemoveMinElem: O(log(n)) 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) Käytetään kekoa kekolajittelu (heap sort) aikavaativuus? O(n log(n)) Tietorakenteet, syksy 7 1 Esim. edellä kekolajittelussa keko muodostettiin alkaen tyhjästä, lisäten kaikki n alkiota yksitellen aikavaativuus: O(n log(n)) Jos n alkiota annettu yhdellä kertaa, keko rakennettavissa ajassa O(n) lähtokohta: kahden O(h) korkuisen keon yhdistäminen uudella juurella vie O(h) operaatiota vrt. RemoveMinElem() keossa keko 1 keko 2 Tietorakenteet, syksy 7 2 Aluksi alkioista täydellinen binääripuu 65 85 120 85 Muunnetaan puu keoksi alhaalta-ylös (bottom-up) alussa kukin lehti (=tason h solmu) on keko 120 tason i 1 keot yhdistetään niiden tasolla i olevan vanhemman kanssa tasot järjestyksessä i = h 1,h 2,...,1 Tietorakenteet, syksy 7 3 65 Aluksi tason h keot yhdistetään niiden tasolla h 1 olevien vanhempien kanssa tason h 1 keoiksi 85 120 65 120 Tietorakenteet, syksy 7 4
Sitten taso h 2... Ja taso h 3 (= tässä 0 eli ylin taso) 120 120 keko valmis! 120 120 Tietorakenteet, syksy 7 5 Tietorakenteet, syksy 7 6 120 Aikavaativuus? solmujen liikkumat askeleet tason i solmu liikkuu korkeintaan h i askelta alas kuplimisissa kullekin korkeuden i solmulle voidaan varata ikiomat h i kaarta kuvassa: yksi lapsikaari oikealle, loput vasemmalle kaaria O(n), joten askelia korkeintaan O(n) Tietorakenteet, syksy 7 7 Sanakirja (dictionary) op Kokoelma alkioita, joilla yksi tai useampia avaimia Prioriteettijono: alkioiden joukosta voi hakea vertaimen suhteen ensimmäisen avaimen k min omaava alkio Sanakirja: tietorakenne, jossa alkioiden joukosta voi hakea tietyn avaimen k omaavan alkion (alkiot) jos alkioilla vertain : sanakirja on järjestetty muuten sanakirja on järjestämätön oltava kuitenkin yhtäsuuruuden testaaja = Tietorakenteet, syksy 7 8
Sanakirjan metodit Sanakirjan tyypilliset perusmetodit: FindElem(k): palauttaa (ei poista) jonkin avaimen k omaavan alkion palauttaa arvon null, jos avainta k ei ole sanakirjassa FindAllElems(k): palauttaa (ei poista) kaikki avaimen k omaavat alkiot esim. sekvenssinä palauttaa arvon null, jos avainta k ei ole sanakirjassa Tietorakenteet, syksy 7 9 Sanakirjan metodit InsertItem(k, x): lisää avaimen k omaavan alkion x sanakirjaan Remove(k): poistaa ja palauttaa jonkin avaimen k omaavan alkion palauttaa arvonnull, jos avainta k ei ollut RemoveAll(k): poistaa ja palauttaa kaikki avaimen k omaavat alkiot palautus esim. sekvenssinä palauttaa arvonnull, jos avainta k ei ollut tutut apumetodit IsEmpty() ja Size() Tietorakenteet, syksy 7 10 Sanakirjan metodit Esimerkki: 112 op 112 op FindElem(): palauttaa jonkin n ( tai ) FindElem(Jori): palauttaa null Remove(): poistaa/palauttaa n RemoveAll(): poistaa ja palauttaa kaikki (molemmat) t InsertItem(112 op, ): lisää alkion avaimella 112 op Remove():poistaa/palauttaa jonkin n ( tai 112 op) Tietorakenteet, syksy 7 11 Sanakirja järjestämättömänä sekvenssinä op Metodien aikavaativuudet: FindElem(k) ja Remove(k) FindAllElems(k) ja RemoveAll(k) alkioiden läpikäynti yksitellen Θ(n) InsertItem(k, x) lisäys esim. sekvenssin eteen O(1) Pätevät sekä linkitetylle että taulukko-toteutukselle Tietorakenteet, syksy 7 12
Järjestetty sanakirja järjestettynä sekvenssinä op Metodien aikavaativuudet: FindElem(k) ja Remove(k) FindAllElems(k) ja RemoveAll(k) InsertItem(k, x) lisäyspaikka haetaan selaamalla O(n) Pätevät linkitetylle toteutukselle, mutta... Tietorakenteet, syksy 7 13 Järjestetty sanakirja järjestetyssä taulukossa op Avain k voidaan etsiä binäärihaulla keskitytään taulukon kiinnostavaan alueeseen indeksit välillä... alussa = 0, = n 1 verrataan avainta k kiinnostavan alueen keskimmäiseen alkioon indeksi = ( + )/2 op? Tietorakenteet, syksy 7 14 Binäärihaku (binary search) op avaimet ovat < k (= ) < k avain k = voi olla täällä jos < k, puolitetaan alue: avain k voi esiintyä ainoastaan indeksien + 1... välissä op avain k =? > k > k = vastaavasti jos > k, avain k voi esiintyä ainoastaan indeksien... 1 välissä Tietorakenteet, syksy 7 15 Binäärihaku (binary search) Jatketaan, kunnes avain k löytyy indeksin kohdalta... op < k? op = k = tai kiinnostava alue häviää (esim.: k = Mira) Tietorakenteet, syksy 7 16
Binäärihaku (binary search) Binäärihaun aikavaativuus? kullakin askeleella O(1) määrä työtä jos alkio ei kohdassa, kiinnostava alue vähintään puolittuu kiinnostavan alueen koko = 1 viimeistään log 2 (n) askeleen jälkeen askeleita korkeintaan log(n), joten binäärihaun aikavaativuus O(log(n)) Sanakirjan sekvenssitoteutusten yhteenveto metodi järjestämätön sekv. järjestetty sekv. taulukko linkitetty taulukko linkitetty FindElem O(n) O(n) O(log(n)) O(n) FindAllElems Θ(n) Θ(n) O(log(n) + s) O(n) InsertItem O(1) O(1) O(n) O(n) Remove O(n) O(n) O(n) O(n) RemoveAll Θ(n) Θ(n) O(n) O(n) Jos halutaan s alkiota, joilla avain k, binäärihaun jälkeen O(s) alkioiden selaus (alkiot peräkkäin) Tietorakenteet, syksy 7 17 Tietorakenteet, syksy 7 18