Tarkennamme geneeristä painamiskorotusalgoritmia

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

Algoritmi on periaatteellisella tasolla seuraava:

TKT20001 Tietorakenteet ja algoritmit Erilliskoe , malliratkaisut (Jyrki Kivinen)

Algoritmit 1. Demot Timo Männikkö

Fibonacci-kasoilla voidaan toteuttaa samat operaatiot kuin binomikasoilla.

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

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

Algoritmit 1. Luento 9 Ti Timo Männikkö

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

Algoritmit 2. Luento 2 To Timo Männikkö

ALGORITMIT 1 DEMOVASTAUKSET KEVÄT 2012

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

Algoritmit 2. Luento 2 Ke Timo Männikkö

Algoritmit 1. Luento 5 Ti Timo Männikkö

Algoritmit 1. Demot Timo Männikkö

Algoritmit 1. Demot Timo Männikkö

811312A Tietorakenteet ja algoritmit , Harjoitus 2 ratkaisu

811312A Tietorakenteet ja algoritmit II Perustietorakenteet

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

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.

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

Algoritmit 2. Luento 13 Ti Timo Männikkö

Algoritmit 1. Luento 4 Ke Timo Männikkö

Algoritmit 2. Luento 7 Ti Timo Männikkö

58131 Tietorakenteet Erilliskoe , ratkaisuja (Jyrki Kivinen)

Algoritmit 1. Luento 10 Ke Timo Männikkö

Algoritmit 1. Demot Timo Männikkö

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

811312A Tietorakenteet ja algoritmit Kertausta kurssin alkuosasta

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

Algoritmit 1. Luento 3 Ti Timo Männikkö

V. V. Vazirani: Approximation Algorithms, luvut 3-4 Matti Kääriäinen

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

Algoritmit 1. Luento 6 Ke Timo Männikkö

4. Joukkojen käsittely

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

IDL - proseduurit. ATK tähtitieteessä. IDL - proseduurit

Tietorakenteet ja algoritmit Johdanto Lauri Malmi / Ari Korhonen

ATK tähtitieteessä. Osa 3 - IDL proseduurit ja rakenteet. 18. syyskuuta 2014

= 5! 2 2!3! = = 10. Edelleen tästä joukosta voidaan valita kolme särmää yhteensä = 10! 3 3!7! = = 120

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

Algoritmit 2. Luento 5 Ti Timo Männikkö

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.

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

Lineaarialgebra ja matriisilaskenta II Syksy 2009 Laskuharjoitus 1 ( ) Ratkaisuehdotuksia Vesa Ala-Mattila

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

Tietorakenteet ja algoritmit - syksy

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

Oikeasta tosi-epätosi -väittämästä saa pisteen, ja hyvästä perustelusta toisen.

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

Hakupuut. tässä luvussa tarkastelemme puita tiedon tallennusrakenteina

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

Kohdissa 2 ja 3 jos lukujen valintaan on useita vaihtoehtoja, valitaan sellaiset luvut, jotka ovat mahdollisimman lähellä listan alkua.

Algoritmit 2. Luento 6 Ke Timo Männikkö

Testaa: Vertaa pinon merkkijono syötteeseen merkki kerrallaan. Jos löytyy ero, hylkää. Jos pino tyhjenee samaan aikaan, kun syöte loppuu, niin

Algoritmit 1. Luento 7 Ti Timo Männikkö

Algoritmit 1. Luento 10 Ke Timo Männikkö

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

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

1 Kertaus. Lineaarinen optimointitehtävä on muotoa:

Kanta ja dimensio 1 / 23

Kehittää ohjelmointitehtävien ratkaisemisessa tarvittavia metakognitioita!

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

Jaetun muistin muuntaminen viestin välitykseksi. 15. lokakuuta 2007

Algoritmit 1. Luento 13 Ti Timo Männikkö

Algoritmit 1. Luento 12 Ti Timo Männikkö

58131 Tietorakenteet ja algoritmit Uusinta- ja erilliskoe malliratkaisut ja arvosteluperusteet

Algoritmit 1. Luento 12 Ke Timo Männikkö

Tarkastelemme ensin konkreettista esimerkkiä ja johdamme sitten yleisen säännön, joilla voidaan tietyissä tapauksissa todeta kielen ei-säännöllisyys.

Pienin virittävä puu (minimum spanning tree)

Äärellisten automaattien ja säännöllisten kielten ekvivalenssi

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

Shorin algoritmin matematiikkaa Edvard Fagerholm

Tietorakenteet, laskuharjoitus 3, ratkaisuja

Esimerkkejä polynomisista ja ei-polynomisista ongelmista

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

11. Javan toistorakenteet 11.1

Datatähti 2019 loppu

13 Lyhimmät painotetut polut

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

Kuljetustehtävä. Materiaalia kuljetetaan m:stä lähtöpaikasta n:ään tarvepaikkaan. Kuljetuskustannukset lähtöpaikasta i tarvepaikkaan j ovat c ij

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

Latinalaiset neliöt ja taikaneliöt

1.4 Funktioiden kertaluokat

4 Tehokkuus ja algoritmien suunnittelu

Algoritmit 2. Luento 8 To Timo Männikkö

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

815338A Ohjelmointikielten periaatteet Harjoitus 7 Vastaukset

2. Perustietorakenteet

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

58131 Tietorakenteet (kevät 2009) Harjoitus 11, ratkaisuja (Topi Musto)

Muistutus aikatauluista

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.

Algoritmit 2. Luento 14 Ke Timo Männikkö

isomeerejä yhteensä yhdeksän kappaletta.

Algoritmit 1. Luento 8 Ke Timo Männikkö

Näytetään nyt relaatioon liittyvien ekvivalenssiluokkien olevan verkon G lohkojen särmäjoukkoja. Olkoon siis f verkon G jokin särmä.

Kombinatorinen optimointi

Lyhin kahden solmun välinen polku

Transkriptio:

Korotus-eteen-algoritmi (relabel-to-front) Tarkennamme geneeristä painamiskorotusalgoritmia kiinnittämällä tarkasti, missä järjestyksessä Push- ja Raise-operaatioita suoritetaan. Algoritmin peruskomponentiksi tulee proseduuri Discharge(u), joka suorittaa operaatioita Push(u, v) ja Raise(u), kunnes u on tasapainossa. Tietysti on mahdollista, että Discharge(u) joudutaan myöhemmin uusimaan, jos jokin Push(v, u) saa sen taas epätasapainoon. Oleelliset kysymykset ovat missä järjestyksessä Discharge-operaation pitää suorittaa ja miten yksittäisessä Discharge-operaatiossa valitaan suoritettavat Push- ja Raise-operaatiot. Kumpaakin kysymystä varten tarvitaan hieman aputietorakenteita. 310

Oletetaan annetuksi esivuo f ja laillinen korkeusfunktio h. Kaari (u, v) on sallittu, jos operaation Push(u, v) esiehdot ovat voimassa, ts. r(u, v) > 0 ja h(v) = h(u) 1. Korkeusehdon takia on ilmeistä, että sallituista kaarista ei muodostu syklejä. Algoritmin perusidea onkin pitää solmut u V järjestetyssä listassa L siten, että jos (v, w) on sallittu niin v on listassa ennen solmua w (siis topologinen järjestys). Algoritmin perusrunkona on iteroida seuraavaa: 1. Valitse listasta L ensimmäinen solmu u, joka vuotaa yli. 2. Tasapainota u suorittamalla Discharge. 3. Jos listan L järjestysehto meni rikki, korjaa. Viimeisen askelen tehokasta toteuttamista varten tarkastellaan, miten Push- ja Raise-operaatiot voivat vaikuttaa sallittuihin kaariin. 311

Propositio A Oletetaan, että u vuotaa ylitse ja kaari (u, v) on sallittu. Nyt Push(u, v) ei luo uusia sallittuja kaaria, mutta saattaa tehdä kaaresta (u, v) ei-sallitun. Todistus Jos painaminen on tukkiva, (u, v) muuttuu ei-sallituksi. Koska Push ei muuta korkeusfunktiota, kaari voi operaatiossa muuttua sallituksi vain, jos vuo sitä pitkin vähenee. Ainoa kaari, jota pitkin vuo vähenee, on (v, u). Tämä ei kuitenkaan tule sallituksi, koska oletuksen mukaan h(u) = h(v) + 1 h(v) 1. 312

Propositio B Oletetaan, että u vuotaa ylitse ja mikään kaari (u, v) ei ole sallittu. Nyt operaation Raise(u) esiehdot ovat voimassa. Operaation Raise(u) jälkeen ainakin jokin kaari (u, v) on sallittu, mutta mikään kaari (v, u) ei ole. Todistus Algoritmin GeneerinenPainamisKorotus analyysin yhteydessä (sivu 303) todettiin, että jos u vuotaa ylitse ja operaation Push(u, v) esiehdot eivät ole voimassa millään v, niin operaation Raise(u) esiehdot ovat voimassa. Operaatio Raise(u) asettaa h(u) := h(v) + 1 missä v on eräs solmu, jolla r(u, v) > 0. Raise ei muuta vuota, joten r(u, v) > 0 pysyy voimassa. Siis kaari (u, v) tulee sallituksi. Jos toisaalta jollain v pätee r(v, u) > 0, on korkeusfunktion määritelmän mukaan h(u) h(v) 1. Koska Raise(u) kasvattaa arvoa h(u), sen jälkeen ei voi päteä h(u) = h(v) 1, joten kaari (v, u) ei voi olla sallittu. 313

Proseduurilla Discharge(u) on seuraavat perusominaisuudet: vuo f ja korkeusfunktio h muuttuvat vain kutsuilla Raise(u) ja Push(u, v), v V, kutsuja Raise(u) ja Push(u, v) tehdään vain, kun niiden esiehdot ovat voimassa ja proseduurin lopuksi u on tasapainossa. Palataan hetken kuluttua siihen, miten tällainen Discharge toteutetaan. Tarkastellaan ensin, miten pääalgoritmi toimii kun Discharge on annettu. 314

Algoritmi on seuraava: RelabelToFront: AlustaEsivuo % kuten sivulla 302 L := V { s, t } (mielivaltaisessa järjestyksessä) u := head[l] while u Nil do prev-h := h[u] Discharge(u) if h[u] prev-h then % Discharge suoritti korotuksen siirrä u listan L alkuun u := next[u] Tässä oletetaan, että head[l] osoittaa listan L alkuun ja next[u] alkiota u seuraavaan alkioon. Listan loppumerkkinä on Nil. Seuraavaksi osoitetaan, että kun u = Nil niin kaikki solmut ovat tasapainossa. Proseduuria Discharge koskevien oletusten nojalla tästä seuraa, että RelabelToFront on eräs totetus algoritmille GeneerinenPainamisKorotus ja siis erityisesti tuottaa maksimivuon. 315

Todistus perustuu siihen, että while-silmukalla on seuraava invariantti: 1. kaikki listan L solmut ennen solmua u ovat tasapainossa ja 2. jos kaari (v, w) on sallittu niin v on listassa L ennen solmua w. Aluksi u osoittaa listan alkuun. Korkeusfunktio on vakio 0, joten sallittuja kaaria ei ole. Siis invariantti pätee triviaalisti. Oletetaan että invariantti pätee ennen kutsua Discharge(u). Jos Discharge(u) ei suorita yhtään Raise(u)-operaatiota, uusia kaaria ei tule sallituksi (propositio A). Koska listan järjestyskään ei muutu, invariantin kohta 2 pysyy voimassa. Koska vuota kasvatetaan vain sallittuja kaaria (u, v) pitkin ja oletuksen mukaan näillä v on listassa solmun u jälkeen, mikään ennen solmua u oleva solmu ei voi vuotaa yli. Siis invariantin kohta 1 pysyy voimassa. Jos Discharge(u) suorittaa ainakin yhden korotuksen, u siirtyy listan alkuun, joten invariantin kohta 1 pysyy voimassa. Kohta 2 pysyy voimassa, koska mahdolliset uudet sallitut kaaret alkavat solmusta u (vrt. propositio B). Siis invariantti pätee koko suorituksen ajan. 316

Siis proseduuri RelabelToFront löytää maksimivuon. Jäljellä on proseduurin Discharge toteutus ja aikavaativuusanalyysi. Proseduuria Discharge varten muodostetaan kullekin solmulle u naapuruslista N[u], jossa on kaikki ne solmut v joilla (u, v) E tai (v, u) E. Listan N[u] järjestys on mielivaltainen, mutta kiinteä koko proseduurin RelabelToFront suorituksen ajan. Lista N[u] esitetään normaalina linkitettynä rakenteena. Kun p on osoitin listan soluun, p.vertex on listassa sillä kohdassa oleva solmu ja p.next osoitin listan seuraavaan soluun. Listan lopussa p.next = Nil. Jokaiselle u pidetään yllä osoitinta current[u] listaan N[u]. Aluksi current[u] := head[u], missä head[u] on osoitin listan N[u] alkuun. Osoittimen current(u) arvo säilyy proseduurin Discharge(u) eri kutsukertojen välillä. 317

Proseduuri on nyt seuraava: Discharge(u) : while e[u] > 0 do % vuotaa yli if current[u] = Nil then (1) Raise(u) current[u] := head[u] else v := current[u].vertex if r[u, v] > 0 and h[u] = h[v] + 1 (2) then Push(u, v) (3) else current[u] := current[u].next Selvästi Push-kutsu tehdään vain, jos sen esiehto on voimassa. Analyysin ei-triviaali osa on osoittaa, että sama pätee Raise-kutsuille; palataan tähän kohta. Aiemmin todetun mukaan jos u vuotaa yli, niin joko Raise(u) tai Push(u, v) jollekin v on sallittu. Siis Discharge(u) johtaa lopulta solmun u tasapainottamiseen. 318

Lemma Proseduurin Discharge(u) aikana kutsu Raise(u) tehdään vain, jos sen esiehdot ovat voimassa. Todistus Aiemmin todetun perusteella esiehto on voimassa ainakin, jos mikään kaari (u, v) ei ole sallittu. Kun current[u] siirtyy solmun v ohi listassa N[u], niin kaari (u, v) ei ole sallittu. Propositioiden A ja B nojalla (u, v) voi muuttua sallituksi vain kutsulla Raise(u), joka samalla siirtää osoittimen current[u] listan alkuun. Siis kun current[u] saavuttaa listan lopun, kaikki kaaret (u, v) on kertaalleen todettu ei-sallituiksi, eikä mikään niistä ole sen jälkeen muuttunut sallituksi. Siis proseduurilla Discharge on aiemmin oletetut ominaisuudet. Jäljellä on kokonaisaikavaativuuden analyysi. 319

Lause Algoritmin RelabelToFront kokonaisaikavaativuus on O( V 3 ). Todistus Sanotaan kutakin suorituksessa kahden Raise-operaation väliin jäävää osuutta vaiheeksi. Aiemmin todetun mukaan Raise-operaatioita on O( V 2 ), joka on siis myös yläraja vaiheiden lukumäärälle. Kunkin vaiheen sisässä osoitin u liikkuu listaa L eteenpäin, joten vaiheen aikana voidaan suorittaa vain listan pituuden verran eli O( V ) Discharge-operaatiota. Siis aikavaativuus lukuunotta proseduurin Discharge sisällä kulutettua aikaa on O( V 3 ). Proseduurin Discharge kuluttama aika selvästi määräytyy riveistä (1), (2) ja (3). Operaation Raise(u) aikavaativuus on O( N[u] ). Koska kutsu Raise(u) voidaan tehdä kullakin u korkeintaan V kertaa, ja u N[u] = O( E ), nähdään, että kaikkien Raise-operaatioiden aikavaativuus koko suorituksen ajalta yhteensä on O( V E ). 320

Rivi (3) voidaan annetulla u suorittaa N[u] kertaa suorittamatta kutsua Raise(u). Koska taas kullakin u kutsu Raise(u) voidaan suorittaa O( V ) kertaa, riviin (3) kuluva kokonaisaika on sekin O( V E ). Kukin Push-operaatio vie vakioajan, ja ne jaetaan tukkiviin ja ei-tukkiviin. Ei-tukkivan operaation Push(u, v) jälkeen solmu u on tasapainossa ja Discharge(u) päättyy. Näitä operaatioita voi siis olla korkeintaan yhtä monta kuin Discharge-kutsuja, eli O( V 3 ). Tukkivia Push-operaatioita puolestaan on aiemman analyysin mukaan O( V E ). Siis kaikkiaan aikavaativuus on O( V 3 + V E ) = O( V 3 ). 321