Fibonacci-kasoilla voidaan toteuttaa samat operaatiot kuin binomikasoilla.

Samankaltaiset tiedostot
4. Joukkojen käsittely

Algoritmi on periaatteellisella tasolla seuraava:

TKT20001 Tietorakenteet ja algoritmit Erilliskoe , malliratkaisut (Jyrki Kivinen)

Tarkennamme geneeristä painamiskorotusalgoritmia

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

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

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

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

58131 Tietorakenteet Erilliskoe , ratkaisuja (Jyrki Kivinen)

Algoritmit 2. Luento 2 To Timo Männikkö

Algoritmit 2. Luento 7 Ti Timo Männikkö

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

Algoritmit 2. Luento 2 Ke Timo Männikkö

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

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

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

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

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

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.

Algoritmit 1. Luento 5 Ti Timo Männikkö

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

811312A Tietorakenteet ja algoritmit II Perustietorakenteet

4.3. Matemaattinen induktio

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

58131 Tietorakenteet ja algoritmit Uusinta- ja erilliskoe malliratkaisut ja arvosteluperusteet

Algoritmit 2. Luento 5 Ti Timo Männikkö

811312A Tietorakenteet ja algoritmit Kertausta kurssin alkuosasta

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

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

Algoritmit 1. Luento 8 Ke Timo Männikkö

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

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

Algoritmit 1. Luento 7 Ti Timo Männikkö

Eräs keskeinen algoritmien suunnittelutekniikka on. Palauta ongelma johonkin tunnettuun verkko-ongelmaan.

Vaihtoehtoinen tapa määritellä funktioita f : N R on

ALGORITMIT 1 DEMOVASTAUKSET KEVÄT 2012

Rekursio. Funktio f : N R määritellään yleensä antamalla lauseke funktion arvolle f (n). Vaihtoehtoinen tapa määritellä funktioita f : N R on

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

Algoritmit 1. Luento 13 Ti Timo Männikkö

811312A Tietorakenteet ja algoritmit, , Harjoitus 7, ratkaisu

1.4 Funktioiden kertaluokat

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

Diskreetin matematiikan perusteet Laskuharjoitus 2 / vko 9

Pienin virittävä puu (minimum spanning tree)

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

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

13 Lyhimmät painotetut polut

Algoritmit 1. Luento 12 Ke Timo Männikkö

Algoritmit 1. Luento 6 Ke Timo Männikkö

811312A Tietorakenteet ja algoritmit Kertausta jälkiosasta

10. Painotetut graafit

Algoritmit 1. Luento 12 Ti Timo Männikkö

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

1 + b t (i, j). Olkoon b t (i, j) todennäköisyys, että B t (i, j) = 1. Siis operaation access(j) odotusarvoinen kustannus ajanhetkellä t olisi.

Algoritmit 2. Luento 6 Ke Timo Männikkö

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

T Syksy 2004 Logiikka tietotekniikassa: perusteet Laskuharjoitus 7 (opetusmoniste, kappaleet )

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

MS-A0402 Diskreetin matematiikan perusteet Esimerkkejä, todistuksia ym., osa I

Esimerkkejä polynomisista ja ei-polynomisista ongelmista

MS-A0402 Diskreetin matematiikan perusteet Esimerkkejä, todistuksia ym., osa I

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

Algoritmit 1. Luento 13 Ma Timo Männikkö

Johdatus graafiteoriaan

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

Diskreetin matematiikan perusteet Esimerkkiratkaisut 3 / vko 10

Aikavaativuuden perussäännöt

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

Johdatus diskreettiin matematiikkaan Harjoitus 5, Ratkaise rekursioyhtälö

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

A TIETORAKENTEET JA ALGORITMIT

Sekalaiset tehtävät, 11. syyskuuta 2005, sivu 1 / 13. Tehtäviä

4 Tehokkuus ja algoritmien suunnittelu

Algoritmit 1. Luento 9 Ti Timo Männikkö

1. Osoita, että joukon X osajoukoille A ja B on voimassa toinen ns. de Morganin laki (A B) = A B.

Luku 8. Aluekyselyt. 8.1 Summataulukko

Stabiloivat synkronoijat ja nimeäminen

j(j 1) = n(n2 1) 3 + (k + 1)k = (k + 1)(k2 k + 3k) 3 = (k + 1)(k2 + 2k + 1 1)

2.3 Keskimääräisen tapauksen analyysi

Approbatur 3, demo 1, ratkaisut A sanoo: Vähintään yksi meistä on retku. Tehtävänä on päätellä, mitä tyyppiä A ja B ovat.

14 Tasapainotetut puurakenteet

Reaalilukuvälit, leikkaus ja unioni (1/2)

Algoritmit 1. Demot Timo Männikkö

Algoritmit 2. Luento 14 Ke Timo Männikkö

MS-A0402 Diskreetin matematiikan perusteet Esimerkkejä ym., osa I

Algoritmit 1. Luento 4 Ke Timo Männikkö

Epädeterministisen Turingin koneen N laskentaa syötteellä x on usein hyödyllistä ajatella laskentapuuna

Tietorakenteet, laskuharjoitus 6,

Algoritmit 2. Demot Timo Männikkö

MS-A0402 Diskreetin matematiikan perusteet Esimerkkejä ym., osa I

Algoritmit 1. Luento 10 Ke Timo Männikkö

Tietorakenteet, laskuharjoitus 3, ratkaisuja

Miten perustella, että joukossa A = {a, b, c} on yhtä monta alkiota kuin joukossa B = {d, e, f }?

Vastaus 1. Lasketaan joukkojen alkiot, ja todetaan, että niitä on 3 molemmissa.

811312A Tietorakenteet ja algoritmit, , Harjoitus 5, Ratkaisu

Tietorakenteet, laskuharjoitus 1,

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

Yhtälöryhmä matriisimuodossa. MS-A0007 Matriisilaskenta. Tarkastellaan esimerkkinä lineaarista yhtälöparia. 2x1 x 2 = 1 x 1 + x 2 = 5.

Transkriptio:

4.2 Fibonacci-kasat Fibonacci-kasoilla voidaan toteuttaa samat operaatiot kuin binomikasoilla. Pääsiallinen ero on, että paljon Decrease-Key-operaatioita sisältävät jonot nopeutuvat. Primin algoritmi pienimmälle virittävälle puulle nopeutuu ajasta O( E log V ) aikaan O( E + V log V ) (sivuutetaan tällä kurssilla; vrt. Kruskalin algoritmi O( E log V )) samoin Dijkstran algoritmi nopeutuu ajasta O( E log V ) aikaan O( E + V log V ) Fibonacci-kasojen vakiokertoimet ovat suuret, mutta huolellisesti toteutettuna ne nopeuttavat algoritmeja myös käytännössä suurilla aineistoilla. Myös toteuttaminen on hankalaa (mutta valmiita toteutuksia on saatavilla, kuten kaikille muillekin perustietorakenteille). 217

Fibonacci-kasan talletusrakenne on joukko järjestämättömiä puita. puiden juuret linkitetty yhdeksi juurilistaksi kunkin solmun lapset on linkitetty yhdeksi listaksi lapsista on linkki vanhempaansa kukin puu toteuttaa kasaehdon (vanhemman avain ei suurempi kuin lapsen avain) kasa esitetään osoittimella juurilistan pienimpään alkioon (eli koko kasan pienimpään alkioon) Kaikki listat ovat kahteen suuntaan linkitettyjä rengaslistoja. Kussakin solmussa on lisäksi tieto sen lasten lukumäärästä (degree) sekä merkki, joka voi olla tosi tai epätosi. 218

7 5 10 23 13 9 8 15 19 Esimerkki Fibonacci-kasasta; merkityt solmut rengastettu 7 5 10 p 23 13 9 8 H left key right. 15 19 child Fibonacci-kasan linkitetty rakenne 219

Järjestämätön binomipuu on kuin järjestetty binomipuu, mutta solmun lasten järjestys ei ole merkitsevä. Näillä on luonnollisesti vastaavat ominaisuudet kuin järjestetyillä, erityisesti n-alkioisen puun solmun aste on korkeintaan log n. Jos kasan kaikki puut ovat binomipuita, niin operaatiot Insert, Minimum, Extract-Min ja Union pitävät tämän voimassa. Binomipuista poiketen kuitenkin Union ja Insert voivat johtaa tilanteeseen, jossa kasassa on useita saman kokoisia binomipuita. Vasta Extract-Min tiivistää kasan sellaiseksi, että jokaisella juurilistan solmulla on eri asteluku. Operaatiot Decrease-Key ja Delete voivat muuttaa binomipuita ei-binomipuiksi. Solmuissa olevia merkkejä käytetään osoittamaan tällaiset rakennepoikkeamat. Tasoitetussa analyysissa kasan H potentiaali on Φ(H) = at(h) + 2am(H) missä t(h) on juurilistan pituus, m(h) merkittyjen solmujen lukumäärä ja a > 0 sopiva vakio. Siis operaatioita palkitaan juurilistan lyhentämisestä ja merkkien poistamisesta, jotka tekevät rakenteen binomikasamaisemmaksi. Kasajoukon potentiaali on yksittäisten kasojen potentiaalien summa. 220

Binomipuista tiedettiin, että jos solmun x asteluku on k ja sen lapset oikealta vasemmalle y 1,..., y k, niin solmun y i asteluku on i i. Fibonacci-kasoissa on voimassa seuraava heikompi ominaisuus: Propositio Olkoon solmun x asteluku degree[x] = k ja sen lapset y 1,..., y k siinä järjestyksessä, jossa ne on liitetty solmuun x (vanhin lapsi ensin). Nyt degree[y i ] i 2 kaikilla i. Operaatioiden toteutuksen yhteydessä tarkastelemme, miten tämä pidetään voimassa. Perusidea lyhyesti on, että solmujen linkittämisessä yhdistetään aina samanasteisia solmuja (kuten binomikasoissa). Siis kun y i linkitetään solmun x lapseksi, on voimassa degree[y i ] = degree[x] = i 1. Myöhemmin solmun y i sallitaan menettää yksi lapsi. Jos solmu y i menettäisi toisenkin lapsen, rakenne järjestellään uudelleen. Järjestelytarpeen havaitsemiseksi käytetään merkkejä: solmussa y on merkki, jos y on jonkin solmun x lapsi ja y on menettänyt yhden lapsen tultuaan solmun x lapseksi. 221

Olkoon f k k. Fibonaccin luku: f 0 = 0, f 1 = 1, f n+2 = f n+1 + f n. Tunnetusti (helppo induktio) f k+2 1 + k f i. i=0 Olkoon size(x) sen alipuun solmujen lukumäärä, jonka juuri on x, ja olkoon size(k) pienin mahdollinen size(x) kun degree[x] = k. Kun edellinen propositio oletetaan todeksi, saadaan nyt Lause size(k) f k+2 φ k missä φ = (1 + 5)/2. Olkoon D(n) suurin solmun aste n-solmuisessa Fibonacci-kasassa. Korollaari D(n) log φ n = O(log n) Tämä korollaari korvaa Fibonacci-kasoilla binomikasojen tarkemman arvion D(n) = log n. 222

Lauseen todistus Väite ilmeisesti pätee kun k 1. Olkoon nyt x solmu jonka aste on k 2 ja lapset ikäjärjestyksessä y 1,..., y k. Tehdään induktio-oletus size(j) f j+2 kun j < k. Koska size[y 1 ] = 1, saadaan size(x) = 1 + = 2 + 2 + 2 + = f k+2. k size(y i ) i=1 k size(y i ) i=2 k size(i 2) i=2 k i=2 Koska x oli mielivaltainen, pätee size(k) f k+2. Toinen epäyhtälö seuraa aiemmin johdetusta Fibonaccin lukujen suljetusta kaavasta (tai helpolla induktiolla). f i 223

Esitetään nyt itse operaatiot ja niiden tasoitetut aikavaatimukset. Yksinkertaisuuden vuoksi jätämme käsittemättä kasan tyhjenemiset ja muut helpot erikoistapaukset. Jatkossa b merkitsee jotain vakiota, joka on valittu niin suureksi että kaikki vakioajan vievät toimitukset sujuvat ajassa b. (Lisäksi erikseen ei aina mainita, että kysymys on ylärajasta.) Muistetaan, että kasojen H 1,..., H m yhteispotentiaali on m m Φ(H i ) = (at(h i ) + 2am(H i )) i=1 i=1 missä t on juurilistan pituus, m merkittyjen solmujen lukumäärä ja a > 0 myöhemmin valittava vakio. Aluksi ei ole lainkaan kasoja, eli potentiaali on nolla. Selvästi potentiaali on aina ei-negatiivinen, joten tasoitettu aikavaativuus on todellisen aikavaativuuden yläraja. Make-Fib-Heap: Todellinen aikavaativuus on vakio eli kork. b. Luodulla uudella puulla potentiaali on nolla, joten potentiaalissa ei muutosta. Fib-Heap-Insert(H, x): Toteutetaan tekemällä alkiosta x yhden solmun puu ja liittämällä kasan H juurilistaan. Todellinen aikavaativuus b, potentiaalin muutos a, joten tasoitettu aikavaativuus a + b. 224

Fib-Heap-Minimum: Todellinen aika triviaalisti vakio, koska kasa esitetään osoittimena minimialkioon. Potentiaali ei muutu, joten tasoitettu aikavaativuus b. Fib-Heap-Union(H 1, H 2 ): Yhdistetään kasojen H 1 ja H 2 juurilistat (pelkkä konkatenaatio, ei mitään uudelleenjärjestelyjä). Palautetaan osoitin joko H 1 :n tai H 2 :n minimialkioon, sen mukaan kumpi on pienempi. Todellinen aikavaativuus b, yhteenlaskettu potentiaali ei muutu. Fib-Heap-Extract-Min(H): periaate on seuraava: 1. z := min(h) 2. H := solmun z lapsilista 3. poista z kasan H juurilistasta 4. yhdistä H kasan H juurilistaan 5. tiivistä kasa H Kuten edellä, askelessa 4 vain konkatenoidaan listat. Askelessa 5 tiivistetään kasan H uusi juurilista sellaiseksi, että kullakin juurella on eri asteluku (vrt. binomikasa). Tiivistämisessä puita yhdistetään seuraavalla proseduurilla: Fib-Heap-Link(H, y, x): 1. poista y kasan H juurilistasta 2. linkitä y solmun x lapseksi 3. degree[x] := degree[x] + 1 4. mark[y] := False 225

Tiivistäminen tapahtuu seuraavalla proseduurilla: Consolidate(H): 1. for d := 0 to D(n) do A[d] := Nil 2. for kaikilla kasan H juurilistan solmuilla x do 3. d := degree[x] 4. while A[d] Nil do % tallessa on jo yksi d-asteinen juuri 5. if key[x] > key[a[d]] then vaihda x ja A[d] 6. Fib-Heap-Link(H, A[d], x) 7. A[d] := Nil 8. d := d + 1 9. A[d] := x 10. muodosta lista niistä alkoista A[d] jotka eivät ole Nil 11. H := osoitin listan pienimpään alkioon Kullakin x siis katsotaan, onko asteluvun d = degree[x] mukainen paikka A[d] vapaana taulukossa A, joka on aluksi tyhjä. Jos paikka on vapaa, x talletetaan siihen ja siirrytään seuraavaan juurilistan alkioon. Jos paikka ei ole vapaa vaan siellä on juuri y, linkitetään y ja x ja saadaan uusi astetta d + 1 oleva puu. Paikka A[d] vapautuu, ja seuraavaksi katsotaan onko yhdistetylle puulle vapaana paikka A[d + 1]. Huomaa, että linkitettäessä y ja x pätee aina degree[x] = degree[y] (vrt. sivun 221 propositio). 226

Kaikki muu paitsi Consolidate-proseduurin for-silmukka (rivit 2 9) menee selvästi ajassa O(D(n)). Consolidate(H)-kutsun for-silmukan aikavaativuus on O(t(H) + D(n)), koska juurilistassa on aluksi t(h) solmua ja siihen lisätään korkeintaan D(n) solmun z lasta. Siis koko proseduurin Fib-Heap-Extract-Min todellinen aikavaatimus on b(d(n) + t(h)). Juurilistan pituus on aluksi t(h) ja lopuksi korkeintaan D(n) + 1. Merkattuja solmuja ei tule ainakaan lisää. Potentiaalin muutos on siis Φ(H) a(d(n) + 1 + 2m(H)) a(t(h) + 2m(H)) = a(d(n) + 1 t(h)). Tasoitetuksi aikavaativuudeksi tulee siis b(d(n) + t(h)) + a(d(n) + 1 t(h)) (2a + b)d(n) olettaen että valitaan a b (ja D(n) 1). 227

Fib-Heap-Decrease-Key(H,x,k): Tässä siis vaaditaan k < key[x]. Jos avaimen key[x] pienentäminen rikkoo kasaominaisuuden, ratkaistaan ongelma yksinkertaisesti ottamalla x juurilistalle (proseduuri Cut). Tällöin solmun x vanhempi y menettää yhden lapsen. Jos y ei vielä ole merkattu, tilanne korjautuu merkkaamalla y. Jos y on jo merkattu (ts. y on jo menettänyt yhden lapsen), vaaditaan isompi korjaustoimi: solmu y viedään sekin juurilistalle. Nyt solmun y vanhempi puolestaan menettää lapsen, joten korjaamista voidaan joutua jatkamaan rekursiivisesti (proseduuri Cascading-Cut). Perusproseduuri on siis seuraava: Fib-Heap-Decrease-Key(H, x, k): key[x] := k if x ei ole juuri then y := p[x] if key[x] < key[y] then Cut(H, x, y) Cascading-Cut(H, y) if key[x] < key[min(h)] then min(h) := x 228

Apuproseduurit ovat seuraavat: Cut(H, y, x): poista x solmun y lapsilistasta degree[y] := degree[y] 1 liitä x kasan H juurilistaan mark[x] := False Cascading-Cut(H, y): if y ei ole juuri then if mark[y] = False then mark[y] := True else Cut(H, y, z) Cascading-Cut(H, z) Todellinen aikavaativuus on selvästi (Z + 1)b, missä Z on suoritettavien Cascading-Cut-kutsujen lukumäärä. Juurilistan pituus on aluksi t(h) ja lopuksi t(h) + Z, sillä x tulee juureksi ja viimeistä lukuunottamatta jokainen Cascading-Cut lisää yhden juuren. Viimeistä lukuunottamatta jokainen Cascading-Cut poistaa yhden merkin. Viimeinen voi lisätä yhden merkin. Siis lopuksi merkkejä on korkeintaan m(h) Z + 2. Tasoitetuksi kustannukseksi tulee b(z + 1) + az + 2a(2 Z) 4a + b olettaen, että valitaan a b. 229

Huomataan, että merkityn solmun kahdesta potentiaaliyksiköstä toinen maksaa sen leikkaamisesta tulevat kustannukset ja toinen jää solmuun koska siitä tulee juuri. Solmun poistaminen palautuu jo nähtyyn: Fib-Heap-Delete(H, x): Fib-Heap-Decrease-Key(H, x, ) Fib-Heap-Extract-Min(H) Tasoitettu aikavaativuus on siis O(D(n)). Yhteenveto: Olemme saaneet tasoitetuiksi aikavaativuuksiksi O(1) operaatioille Make-Heap, Insert, Union, Minimum ja Decrease-Key, ja O(D(n)) operaatioille Extract-Min ja Delete. Koska potentiaali ei koskaan laske alkuarvonsa ali, nämä ovat ylärajat myös todellisille kustannuksille operaatiota kohti koko operaatiojonon yli yhteenlaskettuna. Kun vielä toteamme, että alussa esitetty propositio tosiaan pitää paikkansa, tiedämme että D(n) = O(log n) eli saamme halutut aikavaativuudet. 230

Propositio Olkoon solmun x asteluku degree[x] = k ja sen lapset y 1,..., y k siinä järjestyksessä, jossa ne on liitetty solmuun x (vanhin lapsi ensin). Nyt degree[y i ] i 2 kaikilla i. Todistus Ainoa tilanne, jossa solmu y liitetään solmun x lapseksi, on proseduurissa Consolidate, ja tällöin aina degree[x] = degree[y]. Siis jos y i on solmun x nykyisistä lapsista aikajärjestykseltään numero i, niin solmua y i solmuun x linkitettäessä solmun y i asteluku oli i 1. Sinä aikana kun y i on ollut solmun x lapsi, y i on voinut menettää korkeintaan yhden lapsen. Nimittäin jos se olisi menettänyt toisenkin lapsen, se olisi leikattu ja siitä olisi tullut juuri. Siis edelleen pätee degree[y i ] i 2. 231