4. Joukkojen käsittely

Samankaltaiset tiedostot
Fibonacci-kasoilla voidaan toteuttaa samat operaatiot kuin binomikasoilla.

Algoritmit 2. Luento 2 To Timo Männikkö

Algoritmit 2. Luento 2 Ke Timo Männikkö

Algoritmi on periaatteellisella tasolla seuraava:

TKT20001 Tietorakenteet ja algoritmit Erilliskoe , malliratkaisut (Jyrki Kivinen)

Algoritmit 2. Luento 7 Ti Timo Männikkö

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

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

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

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

Hakupuut. tässä luvussa tarkastelemme puita tiedon tallennusrakenteina

Algoritmit 2. Luento 3 Ti Timo Männikkö

Algoritmit 2. Luento 3 Ti Timo Männikkö

Algoritmit 2. Luento 14 Ke Timo Männikkö

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

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

58131 Tietorakenteet (kevät 2008) 1. kurssikoe, ratkaisuja

58131 Tietorakenteet Erilliskoe , ratkaisuja (Jyrki Kivinen)

Tarkennamme geneeristä painamiskorotusalgoritmia

58131 Tietorakenteet ja algoritmit Uusinta- ja erilliskoe ratkaisuja (Jyrki Kivinen)

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

Algoritmit 2. Luento 5 Ti Timo Männikkö

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.

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

Algoritmit 2. Luento 5 Ti Timo Männikkö

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

58131 Tietorakenteet ja algoritmit (kevät 2014) Uusinta- ja erilliskoe, , vastauksia

Algoritmit 2. Luento 6 Ke Timo Männikkö

10. Painotetut graafit

811312A Tietorakenteet ja algoritmit Kertausta kurssin alkuosasta

811312A Tietorakenteet ja algoritmit, , Harjoitus 7, ratkaisu

Luku 8. Aluekyselyt. 8.1 Summataulukko

Algoritmit 2. Luento 6 To Timo Männikkö

Algoritmit 1. Luento 6 Ke Timo Männikkö

HENRI MYLLYOJA BINÄÄRI- JA FIBONACCI-KEOT PRIORITEETTIJONON TO- TEUTUKSEEN. Kandidaatintyö

Binäärihaun vertailujärjestys

A TIETORAKENTEET JA ALGORITMIT

(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ä.

Algoritmit 2. Luento 8 To Timo Männikkö

Algoritmit 1. Luento 12 Ti Timo Männikkö

Algoritmit 1. Luento 5 Ti Timo Männikkö

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

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.

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

f(n) = Ω(g(n)) jos ja vain jos g(n) = O(f(n))

Algoritmit 1. Luento 12 Ke Timo Männikkö

Algoritmit 1. Luento 8 Ke Timo Männikkö

811312A Tietorakenteet ja algoritmit Kertausta jälkiosasta

4 Tehokkuus ja algoritmien suunnittelu

Algoritmit 1. Luento 7 Ti Timo Männikkö

Algoritmit 2. Luento 4 Ke Timo Männikkö

Algoritmit 1. Luento 11 Ti Timo Männikkö

58131 Tietorakenteet ja algoritmit (kevät 2013) Kurssikoe 2, , vastauksia

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

Koe ma 1.3 klo salissa A111, koeaika kuten tavallista 2h 30min

811312A Tietorakenteet ja algoritmit II Perustietorakenteet

Algoritmit 1. Luento 4 Ke Timo Männikkö

13 Lyhimmät painotetut polut

1 Puu, Keko ja Prioriteettijono

Tietorakenteet ja algoritmit Johdanto Lauri Malmi / Ari Korhonen

Algoritmit 2. Luento 9 Ti Timo Männikkö

Vasen johto S AB ab ab esittää jäsennyspuun kasvattamista vasemmalta alkaen:

811312A Tietorakenteet ja algoritmit V Verkkojen algoritmeja Osa 2 : Kruskalin ja Dijkstran algoritmit

Algoritmit 2. Demot Timo Männikkö

Diskreetin matematiikan perusteet Laskuharjoitus 2 / vko 9

Algoritmit 1. Luento 10 Ke Timo Männikkö

1.4 Funktioiden kertaluokat

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

Tietorakenteet, laskuharjoitus 7, ratkaisuja

58131 Tietorakenteet ja algoritmit Uusinta- ja erilliskoe malliratkaisut ja arvosteluperusteet

Olkoon S(n) kutsun merge-sort(a, p, q) tilavaativuus kun p q + 1 = n. Oletetaan merge toteutetuksi vakiotyötilassa (ei-triviaalia mutta mahdollista).

Algoritmit 1. Luento 2 Ke Timo Männikkö

Tietorakenteet ja algoritmit - syksy

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

ALGORITMIT 1 DEMOVASTAUKSET KEVÄT 2012

Olkoon seuraavaksi G 2 sellainen tasan n solmua sisältävä suunnattu verkko,

Valitaan alkio x 1 A B ja merkitään A 1 = A { x 1 }. Perinnöllisyyden nojalla A 1 I.

Pienin virittävä puu (minimum spanning tree)

Algoritmit 1. Luento 14 Ke Timo Männikkö

ja λ 2 = 2x 1r 0 x 2 + 2x 1r 0 x 2

58131 Tietorakenteet ja algoritmit (syksy 2015)

Datatähti 2019 loppu

Algoritmit 2. Luento 4 To Timo Männikkö

811312A Tietorakenteet ja algoritmit Kertausta kurssin alkuosasta

Algoritmit 1. Demot Timo Männikkö

Algoritmit 1. Luento 13 Ti Timo Männikkö

Tietorakenteet, laskuharjoitus 6,

A TIETORAKENTEET JA ALGORITMIT

Nopea kertolasku, Karatsuban algoritmi

58131 Tietorakenteet ja algoritmit (kevät 2013) Kurssikoe 1, , vastauksia

Algoritmien suunnittelu ja analyysi (kevät 2004) 1. välikoe, ratkaisuja

Algoritmit 1. Luento 3 Ti Timo Männikkö

Tietorakenteet ja algoritmit

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

9 Erilaisia tapoja järjestää

811120P Diskreetit rakenteet

Algoritmit 1. Luento 13 Ma Timo Männikkö

Johdatus diskreettiin matematiikkaan Harjoitus 5, Ratkaise rekursioyhtälö

1.1 Pino (stack) Koodiluonnos. Graafinen esitys ...

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

Transkriptio:

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 osaa soveltaa erillisten joukkojen yhdisteitä tuntee erillisten joukkojen yhdisteen puutoteutuksen ja sen analyysiperiaatteet 199

Joukkotietorakenteista yleensä kurssilla Tietorakenteet on käsitelty etsintäpuita ja hajaustusta (hashing), jotka ovat tärkeitä yleisiä joukkotietorakenteita kurssilla Tietorakenteet on myös esitetty prioriteettijonon toteutus tavallisena kasana (jota kutsutaan myös binäärikasaksi tai (binääri)keoksi) tässä luvussa täydennetään näitä tietoja joillain sellaisilla tietorakenteilla, joita tarvitaan esim aiemmin esitettyjen verkkoalgoritmien (Dijkstra, Kruskal) tehokkaaseen toteutukseen tarkastelussa korostuu tasoitettu analyysi 200

41 Binomikeot Binomikeoilla toteutetaan tehokkaasti seuraavat lomitettavien kasojen (mergeable heaps) operaatiot: Make-Heap : luo ja palauttaa tyhjän keon Insert(H, x) : lisää kasaan H alkion x Minimum(H) : palauttaa keon H pienimmän alkion Extract-Min(H) : poistaa keon H pienimmän alkion Union(H 1, H 2 ) : palauttaa keon jossa on kasojen H 1 ja H 2 alkiot; alkuperäiset H 1 ja H 2 tuhoutuvat Myös seuraavat operaatiot ovat nopeita: Decrease-Key(H, x, k) : muuttaa alkion x avaimeksi k, josta oletetaan että se on pienempi kuin avaimen alkuperäinen arvo Delete(H, x) : poistaa alkion x keosta H Decrease-Key ja Delete itse asiassa tarvitsevat argumentikseen osoittimen alkion x sijaintiin keossa; sivuutetaan tällaiset detaljit jatkossa 201

Verrataan operaatioiden suoritusaikoja eri tietorakenteilla: binaarikasa binomikasa Fib-kasa Make-Heap Θ(1) Θ(1) Θ(1) Insert Θ(log n) O(log n) Θ(1) Minimum Θ(1) O(log n) Θ(1) Extract-Min Θ(log n) Θ(log n) O(log n) Union Θ(n) O(log n) Θ(1) Decrease-Key Θ(log n) Θ(log n) Θ(1) Delete Θ(log n) Θ(log n) O(log n) Binaarikeolle ja binomikeolle aikavaativuudet pätevät pahimmassa tapauksessa, Fibonacci-keolle tasoitetusti Siis binaarikasa ei tue Union-operaatiota, ja Fibonacci-kasa on erityisen tehokas operaatioissa jotka eivät poista alkioita 202

Binomipuut Binomipuu B k on järjestetty puu (so kunkin solmun lapset ovat järjestyksessä vasemmalta oikealle), joka määritellään rekursiivisesti: 1 B 0 on yksisolmuinen puu ja 2 B k+1 saadaan lisäämällä puun B k juurelle vasemmanpuolimmaiseksi alipuuksi toinen B k B 0 B 1 B 2 B 3 B k B k B k+1 203

Binomipuiden perusominaisuuksia Seuraavat ominaisuudet nähdään helposti induktiolla: 1 Puussa B k on 2 k solmua 2 Puun B k korkeus on k 3 Puussa B k on tasan ( k i) solmua syvyydellä i, i = 1,, k 4 Puun B k juuren aste (eli lapsien lukumäärä) on k, ja muiden puun B k solmujen aste on pienempi kuin k 5 Puun B k juuren lapset ovat vasemmalta luetellen puiden B k 1, B k 2,, B 0 juuria B k B 0 B k 1 B k 2 B 1 B 2 204

Binomikasa on kokoelma binomipuita, joka toteuttaa seuraavat kaksi ehtoa: 1 Kukin yksittäinen binomipuu on kasajärjestyksessä eli minkään solmun mihinkään lapseen liittyvä avain ei ole suurempi kuin solmun itsensä avain 2 Kullakin k kokoelmassa on korkeintaan yksi muotoa B k oleva puu Ehdon 1 nojalla kunkin puun pienin alkio on juuressa, mutta emme tiedä minkä puun juuressa on koko joukon pienin alkio Tarkastellaan ehtoa 2, kun binomikasassa H on kaikkiaan on n alkiota Olkoon k = log n + 1 ja luvun n binääriesitys b k b k 1 b 0 : n = k b i 2 i i=1 Koska B i sisältää 2 i solmua, nähdään että H sisältää puun B i joss b i = 1 Nähdään myös, että H sisältää korkeintaan log n + 1 puuta ja jokaisen solmun asteluku binomikasassa H on korkeintaan log n 205

Käytämme binomikasoille tavanomaista talletusrakennetta: Kustakin solmusta on linkki vasemmanpuolimmaiseen lapseen (child), oikealla puolella olevaan sisarukseen (sibling) ja vanhempaan (p) Kuhunkin solmuun talletetaan myös sen asteluku (degree) Lisäksi puiden juuret on linkitetty listaan järjestyksessä pienemmistä suurimpaan Binomikasa esitetään osoittimella juurilistan alkuun Jätämme hankalimman operaation Union viimeiseksi ja käsittelemme ensin helpot operaatiot Erotukseksi jatkossa esiteltävään Fibonacci-kasatoteutukseen käytämme nimiä Binomial-Heap-Union jne 206

12 1 2 3 5 17 41 8 33 35 19 Binomikasa 12 1 0 1 2 3 3 0 5 2 17 1 41 0 p key degree sibling child 8 1 19 0 33 35 0 0 Binomikasan linkitetty talletusrakenne 207

Make-Binomial-Heap: tarvitsee vain alustaa tyhjä juurilista; selvästi O(1) Binomial-Heap-Minimum: kasaominaisuuden perusteella riittää tarkastaa kaikki juuret, joita on O(log n) Binomial-Heap-Insert(H, x): Muodostetaan ensin alkiosta x yhden alkion binomikasa H ja suoritetaan sitten Binomial-Heap-Union(H, H ) Aikavaativuus on selvästi O(log n), kunhan osoitetaan miten Binomial-Heap-Union tehdään tässä ajassa Binomial-Heap-Extract-Min(H): 1 Etsi juurilistan pienin alkio x 2 Muodosta solmun x lapsista (oikealta vasemmalle) lista H 3 H := Binomial-Heap-Union(H, H ) Aikavaativuus taas selvästi O(log n) jos Union menee tässä ajassa Binomial-Heap-Decrease-Key(H, x, k): Asetetaan ensin key[x] := k; oletuksen mukaan tässä key[x] ei ainakaan kasva Jos kasaominaisuus edelleen pätee, operaatio on valmis Jos kasaominaisuus meni rikki, tämä voi johtua vain siitä, että k < key[p[x]] Vaihdetaan solmujen x ja p[x] avaimet (ja mahdollinen muu data) ja jatketaan solmusta p[x] kasan korjaamista Aikavaativuus on O(log n), koska tämä on yläraja puun syvyydelle 208

Havainnollistetaan binomikekojen yhdistämistä vertauksella binäärilukujen yhteenlaskuun Lasketaan yhteen luvut 11 = 1 + 2 + 8 = 1011 2 ja 14 = 2 + 4 + 8 = 1110 2 Lomitetaan ensin binääriesityksiin perustuvat summat: 11 + 14 = 1 + 2 + 8 + 2 + 4 + 8 = 1 + 2 + 2 + 4 + 8 + 8 Tästä pitäisi saada binääriesitys, eli kukin kakkosen potenssi saisi esiintyä vain kerran Ruvetaan poistamaan summasta duplikaatteja vasemmalta alkaen Termi 1 = 2 0 esiintyy vain kerran, joten sille ei tarvitse tehdä mitään Termi 2 = 2 1 esiintyy kaksi kertaa, joten sovelletaan sääntöä 2 + 2 = 4: 11 + 14 = 1 + 2 + 2 + 4 + 8 + 8 = 1 + 4 + 4 + 8 + 8 Nyt tuli muistibitti, ja uudessa summassa puolestaan 4 esiintyy kaksi kertaa Korjataan tilanne: 11 + 14 = 1 + 4 + 4 + 8 + 8 = 1 + 8 + 8 + 8 Nyt muistibitin takia 8 esiintyy kolme kertaa Summataan niistä kaksi jälkimmäistä: 11 + 14 = 1 + 8 + 8 + 8 = 1 + 8 + 16 On siis saatu 11 + 14 = 16 + 8 + 1 = 11001 2 = 25 209

Idean sovellus binomikasoihin: n-alkioinen binomikasa vastaa luvun n binääriesitystä B i on mukana kasassa joss luvussa n bitti i on 1 kahden B i -binomimipuun yhdistäminen yhdeksi B i+1 -puuksi vastaa termien yhdistämistä 2 i + 2 i = 2 i+1 Tarvitsemme seuraavaa apuproseduuria, joka linkittää puun y puun z juuren vasemmaksi lapseksi Siis jos y ja z ovat B i -puiden juuria, solmusta y tulee yhdistetyn B k+1 -puun juuri Binomial-Link(x, y): p[y] := z sibling[y] := child[z] child[z] := y degree[z] := degree[z] + 1 210

Toinen tarvittava aliohjelma on Binomial-Heap-Merge, joka lomittaa kaksi juurilistaa ja palauttaa osoittimen lomitetun listan alkuun Lomitetussa listassa on samat binomipuut kuin alkuperäisissä listoissa, ja järjestys on pienimmästä puusta suurimpaan Siis jos kummassakin alkuperäisessä kasassa on puu B k, nämä puut ovat lomitetussa listassa peräkkäin; niiden keskinäisellä järjestyksellä ei ole väliä Lomituksen toteutus jätetään harjoitustehtäväksi Kasojen H 1 ja H 2 yhdistäminen tapahtuu nyt seuraavilla kahdella askelella: 1 Lomita listat; tapahtuu siis kutsulla H := Binomial-Heap-Merge(H 1, H 2 ) 2 Siisti lista: lomitetusta listasta pitää poistaa tapaukset, joissa esiintyy kaksi puuta B k Vaiheen 2 toteuttamiseksi käydään lista H läpi puu kerrallaan Osoittimet curr, next ja next-next osoittavat kolmea peräkkäistä listan puuta (Sivuutetaan tässä vaiheessa listan päissä tulevat erikoistapaukset) Tarkastelu jakaantuu kolmeen tapaukseen näiden puiden kokojen mukaan 211

Tapaus 1: degree[curr] < degree[next] Ei tarvitse tehdä yhdistämisiä tällä kohtaa Siirrytään listassa eteenpäin curr next next-next B i B j i < j curr next next-next B i B j 212

Tapaus 2: degree[curr] = degree[next] = degree[next] Ei tarvitse tehdä yhdistämisiä tällä kohtaa Yhdistäminen jää seuraavalle askelelle (Huom B i voi esiintyä korkeintaan kolmesti: kerran kummastakin alkuperäisestä kasasta ja kerran juuri tehdystä yhdistämisestä) Siirrytään listassa eteenpäin curr next next-next B i B i B i B j i < j curr next next-next B i B i B i B j 213

Tapaus 3: degree[curr] = degree[next] < degree[next] Nyt yhdistetään curr ja next Juureksi tulee kasaehdon säilyttämiseksi se, jolla on pienempi avain Huomaa, että tapauksessa degree[next-next] = degree[curr] + 1 voidaan edelleen joutua yhdistämään tämä uusi puu seuraavaan curr next next-next B i B i B j i < j curr next next-next B i B j B i 214

Esitetään koko toimenpide pseudokoodina (seuraava sivu) Linkkien päivittämiseksi muistetaan vielä solmu prev josta löytyy osoitin curr-solmuun, ja otetaan erikseen huomioon listan alku Algoritmin oikeellisuus: Selvästi yhdisteeseen tulee mukaan tasan ne alkiot, jotka ovat jommassa kummassa alkuperäisistä kasoista (Sovellukset ovat yleensä sellaisia, että kasan alkioilla on olioidentiteetti, joten saman avaimen mahdollisia useita esiintymiä ei pidä karsia) Kun H 1 ja H 2 toteuttavat kasaominaisuuden, selvästi myös niistä lomittamalla saatu ensimmäinen versio listasta H toteuttaa sen Yhdistämiset tehdään aina niin, että kasaominaisuus pysyy voimassa Kun koko lista H on käyty läpi, millään kahdella juurella ei ole samaa astelukua eli mikään B i ei esiinny kuin korkeintaan kerran Siis lopuksi H on binomikasa Aikavaativuus: Selvästi aikavaativuus on lineaarinen lomitetun listan H pituuden suhteen Tämä taas on sama kuin binomikasojen H 1 ja H 2 juurilistojen yhteenlaskettu pituus, joka on korkeintaan 2 log n missä n on alkioiden yhteismäärä 215

Binomial-Heap-Union(H 1, H 2 ): H := Binomial-Heap-Merge(H 1, H 2 ) if H tyhjä then return H prev := Nil curr := H next := sibling[curr] while next Nil do if degree[curr] = degree[next] and (degree[next] < degree[next-next] or next-next = Nil) then % Yhdistetään if key[curr] key[next] then sibling[curr] := next-next Binomial-Link(next, curr) else if prev = Nil then % Listan alku H := next else sibling[prev] := next end if Binomial-Link(curr, next) curr := next end if end if next := next-next next-next := sibling[next-next] end while return H 216