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

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

Algoritmit 1. Luento 11 Ti Timo Männikkö

Algoritmit 2. Luento 8 To Timo Männikkö

1.4 Funktioiden kertaluokat

Algoritmit 2. Luento 14 Ke Timo Männikkö

Algoritmit 1. Luento 12 Ti Timo Männikkö

Algoritmit 1. Luento 12 Ke Timo Männikkö

4 Tehokkuus ja algoritmien suunnittelu

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

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

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

On annettu jono lukuja tai muita alkioita, joiden välille on määritelty suuruusjärjestys. Tehtävänä on saattaa alkiot suuruusjärjestykseen.

Nopea kertolasku, Karatsuban algoritmi

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

3. Laskennan vaativuusteoriaa

58131 Tietorakenteet ja algoritmit (syksy 2015)

Algoritmit 1. Luento 13 Ti Timo Männikkö

9 Erilaisia tapoja järjestää

Esimerkkejä polynomisista ja ei-polynomisista ongelmista

Algoritmit 1. Luento 2 Ke Timo Männikkö

Algoritmit 2. Luento 7 Ti Timo Männikkö

Numeeriset menetelmät

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

Algoritmit 2. Luento 13 Ti Timo Männikkö

7.4 Sormenjälkitekniikka

Algoritmit 2. Luento 13 Ti Timo Männikkö

Algoritmit 2. Luento 14 To Timo Männikkö

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

Algoritmit 2. Luento 2 To Timo Männikkö

4. Joukkojen käsittely

Algoritmit 1. Luento 14 Ke Timo Männikkö

811312A Tietorakenteet ja algoritmit, VI Algoritmien suunnitteluparadigmoja

Algoritmi on periaatteellisella tasolla seuraava:

Algoritmit 1. Luento 3 Ti Timo Männikkö

Algoritmit 2. Demot Timo Männikkö

Algoritmit 1. Luento 13 Ma Timo Männikkö

Algoritmit 2. Luento 2 Ke Timo Männikkö

58131 Tietorakenteet Erilliskoe , ratkaisuja (Jyrki Kivinen)

Tutkimusmenetelmät-kurssi, s-2004

5 Kertaluokkamerkinnät

Algoritmit 2. Luento 1 Ti Timo Männikkö

Johdatus diskreettiin matematiikkaan Harjoitus 5, Ratkaise rekursioyhtälö

3.4 Peruutus (backtracking)

Hakupuut. tässä luvussa tarkastelemme puita tiedon tallennusrakenteina

Insinöörimatematiikka D

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

Numeeriset menetelmät

Käänteismatriisin ominaisuuksia

811312A Tietorakenteet ja algoritmit, , Harjoitus 7, ratkaisu

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

Fibonacci-kasoilla voidaan toteuttaa samat operaatiot kuin binomikasoilla.

7. Satunnaisalgoritmit (randomized algorithms)

A TIETORAKENTEET JA ALGORITMIT

Algoritmit 1. Luento 8 Ke Timo Männikkö

811120P Diskreetit rakenteet

Tietorakenteet, laskuharjoitus 1,

Algoritmit 1. Luento 9 Ti Timo Männikkö

Algoritmit 2. Luento 3 Ti Timo Männikkö

4. Algoritmien tehokkuus

TKT20001 Tietorakenteet ja algoritmit Erilliskoe , malliratkaisut (Jyrki Kivinen)

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

Tietorakenteet, laskuharjoitus 3, ratkaisuja

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

Tarkennamme geneeristä painamiskorotusalgoritmia

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

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

Algoritmianalyysin perusteet

Formalisoidaan hieman täsmällisemmin, millaisia suoritustakuita satunnaisalgoritmeilta voidaan vaatia.

Numeeriset menetelmät

Algoritmit 2. Luento 13 Ti Timo Männikkö

Algoritmit 2. Luento 11 Ti Timo Männikkö

1 Erilaisia tapoja järjestää

811120P Diskreetit rakenteet

Algoritmit 2. Luento 4 Ke Timo Männikkö

ImageRecognition toteutus

58131 Tietorakenteet ja algoritmit Uusinta- ja erilliskoe malliratkaisut ja arvosteluperusteet

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

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

Algoritmit 2. Luento 3 Ti Timo Männikkö

8. Lajittelu, joukot ja valinta

2.2.1 Ratkaiseminen arvausta sovittamalla

Algoritmit 1. Demot Timo Männikkö

7. Aikavaativuus. Ohjelmistotekniikan laitos OHJ-2300 Johdatus tietojenkäsittelyteoriaan, syksy

Algoritmit 2. Luento 10 To Timo Männikkö

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

Numeeriset menetelmät

Algoritmit 2. Luento 9 Ti Timo Männikkö

Algoritmit 2. Demot Timo Männikkö

Algoritmien suunnittelu ja analyysi

Matematiikka B2 - Avoin yliopisto

12. Algoritminsuunnittelun perusmenetelmiä

Algoritmit 1. Luento 10 Ke Timo Männikkö

12. Algoritminsuunnittelun perusmenetelmiä

Diskreetin matematiikan perusteet Laskuharjoitus 2 / vko 9

Algoritmit 2. Luento 5 Ti Timo Männikkö

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

1. LINEAARISET YHTÄLÖRYHMÄT JA MATRIISIT. 1.1 Lineaariset yhtälöryhmät

Matematiikka B2 - TUDI

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

Algoritmit 2. Luento 5 Ti Timo Männikkö

Transkriptio:

Esimerkki Lomitusjärjestäminen merge-sort(a, p, q): var k % paikallinen muuttuja, vakiotila 1. if p < q then 2. r := (p + q)/2 3. merge-sort(a, p, r) 4. merge-sort(a, r + 1, q) 5. merge(a, p, r, q) Olkoon S(n) kutsun merge-sort(a, p, q) tilavaativuus kun p q + 1 = n. Oletetaan merge toteutetuksi vakiotyötilassa (ei-triviaalia mutta mahdollista). Saadaan joten S(n) = max { S( n/2 ), S( n/2 ) } + Θ(1) = S( n/2 ) + Θ(1) S(n) = Θ(log n). 121

3. Algoritmien suunnittelutekniikoita Tutustutaan tärkeimpiin algoritmien suunnitteluperiaatteisiin ja tarkastellaan esimerkkien valossa niiden soveltamista. Tämän luvun jälkeen opiskelija osaa 1. laatia ja analysoida osittamiseen ja taulukointiin perustuvia algoritmeja, 2. soveltaa heuristisia ratkaisumenetelmiä (ahneus, paikallinen etsintä) ja tarkastella, milloin nämä johtavat optimaaliseen lopputulokseen sekä 3. ratkaista kombinatorisia ongelmia täydellisellä etsinnällä (peruutus, karsinta). Esimerkkeinä tarkastelluista keskeisistä verkko-ongelmista (lyhimmät polut, virittävät puut) tulisi muistaa niiden ratkaisualgoritmit ja analyysiperiaatteet. 122

3.1 Osittaminen (divide and conquer) Esimerkki Lomitusjärjestäminen edellä Periaate yleisemmin ratkaise(s): if S on pieni then käytä jotain triviaalialgoritmia else hajota(s; S 1,..., S m ) ratkaise(s 1 ) ratkaise(s 2 )... ratkaise(s m ) yhdistä(s 1,..., S m ; S) Yleensä hajotuksessa yritetään saada osat S i mahdollisimman samankokoisiksi. Jos lisäksi S = i S i (eli S i = S /m), saadaan aikavaativuudelle T (n) yhtälö T (n) = Θ(1) kun S pieni T (n) = mt (n/m) + f(n) muuten missä f on hajottamisen ja yhdistämisen aikavaativuus. Jos jako on kovin epätasainen, aikavaativuus yleensä kasvaa: lisäysjärjestäminen : n 1 plus 1 lomitusjärjestäminen : n/2 plus n/2 123

Esimerkki Seuraava funktiokutsu minmax(s) lukujoukolla S = { s 1,..., s n } palauttaa parin (min S, max S): minmax(s) if S = 2 then return (min { s 1, s 2 }, max { s 1, s 2 }) else r := n/2 S 1 := { s 1,..., s r } S 2 := { s r+1,..., s n } (a 1, b 1 ) := minmax(s 1 ) (a 2, b 2 ) := minmax(s 2 ) return (min { a 1, a 2 }, max { b 1, b 2 }) Vertailujen lukumäärälle T ( S ) saadaan T (2) = 1 T (n) = T ( n/2 ) + T ( n/2 ) + 2 kun n > 2 eli (kun n = 2 k jollain k) T (n) = 3 2 n 2. Triviaaliratkaisu vaatii (n 1) + (n 2) = 2n 3 vertailua. Opetus: päällekkäistä työtä kannattaa välttää. 124

Mediaaniongelma ja sen yleistys (order statistics) Annettu: joukko S, S = n, ja luku k n. Oletetaan, että joukon alkioiden välillä on lineaarinen järjestysrelaatio. Yleisemmin voidaan sallia, että S on monijoukko (multiset) eli sama alkio saa esiintyä useita kertoja; joukko-operaatiot yleistyvät ilmeisellä tavalla. Määrättävä: joukon k:nneksi pienin alkio, ts. b k kun S = { b 1,..., b n } missä b 1... b n. (Erityisesti mediaani: k = n/2.) Ilmeisiä ratkaisuja: etsitään pienin, toiseksi pienin,..., k. pienin; aikavaativuus Θ(kn) = O(n 2 ) järjestetään koko joukko; aikavaativuus Θ(n log n) Seuraavassa esitetään kaksi edistyneempää ratkaisua: yksinkertainen satunnaisalgoritmi jonka aikavaativuus on O(n) keskimäärin hieman monimutkaisempi deterministinen algoritmi jonka aikavaativuus on O(n) pahimmassa tapauksessa Ratkaisut perustuvat osittamiseen, ongelmana on löytää riittävän tasainen jako. 125

Satunnaisalgoritmi valintaongelmaan select-r(s, k) if S = { a } then return a % vain yksi alkio else a := random(s) % valitaan satunnainen alkio S 1 := { x S x < a } S 2 := { x S x = a } S 3 := { x S x > a } if k S 1 then return select-r(s 1, k) else if k S 1 + S 2 then return a else return select-r(s 3, k S 1 S 2 ) Algoritmin perusidea: Satunnaisen alkion a pitäisi tyypillisesti osua joukon keskivaiheille, joten keskimäärin saadaan T (n) T (n/2) + O(n) eli T (n) = O(n). Tarkemmin todetaan että kullakin 1 r n saadaan kukin jako ( S 1, S 3 ) = (r 1, n r) todennäköisyydellä 1/n (olettaen että S 2 = 1) joten T (n) 1 n T (max { r 1, r k }) + O(n) n r=1 (yksityiskohdat HT). Huom. odotusarvot ovat yli algoritmin sisäisten satunnaisvalintojen, joten tämä ei ole keskimääräisen tapauksen analyysia aiemmin esitetyssä mielessä. 126

Deterministinen algoritmi valintaongelmaan (Blum, Floyd, Pratt, Rivest, Tarjan 1983) select(s, k) if S 50 then järjestä S ja palauta k. alkio else olkoon n = S ja r = n/5 jaa S viisialkioisiin osiin P 1,..., P r (osa P r jää vajaaksi jos ei mene tasan) for i := 1 to r do Θ(n) m i := select(p i, 3) M := { m 1,..., m r } a := select(m, M/2 ) T (n/5) S 1 := { x S x < a } S 2 := { x S x = a } S 3 := { x S x > a } if k S 1 then return select(s 1, k) Θ( S 1 ) else if k S 1 + S 2 then return a else return select(s 3, k S 1 S 2 ) Θ( S 3 ) Jakoalkion a valintaa lukuunottamatta toimii kuten edellä. Kysymys: joukkojen S 1 ja S 3 kokorajat? 127

Aikavaatimukselle T (n) saadaan T (n) T (n/5) + max { T ( S 1 ), T ( S 3 ) } + Θ(n). Kysymys: takaako jakoalkion valintamenettely, että S 1 ja S 3 ovat riittävän pieniä? Jos m i a, niin joukossa P i on ainakin 3 alkiota p joille p a. Tällaisia m i on ainakin r/2, joten S 1 + S 2 3 r/2 n/4. Vastaavasti jos m i a, niin joukossa P i on ainakin 3 alkiota p joille p a, joten Siis kaiken kaikkiaan 3 S 1 4 n joten saadaan S 3 + S 2 3 r/2 n/4. ja S 3 3 4 n T (n) T ( n/5 ) + T ( 3n/4 ) + Θ(n) mistä voidaan osoittaan T (n) = O(n) (oleellisesti koska n/5 + 3n/4 < n). Tarkemmin voidaan osoittaa vertailujen lukumääräksi 18n + O(1). Tämä voidaan parantaa arvoon 14 1 n + O(1) tarkastelemalla 9-alkioisia osia. 3 Opetus: osatapauksiin jakaminen voi olla ei-triviaalia. 128

a P i a a M Joukon S alkioista ainakin S /4 on korkeintaan jakoalkion a suuruisia (vasen ylänurkka) ja ainakin S /4 vähintään jakoalkion a suuruisia (oikea alanurkka). 129

Kertolaskualgoritmeja Tarkastellaan kahden n-bittisen luvun X 1 ja X 2 kertolaskua. Oletetaan yksinkertaisuuden vuoksi n = 2 k. Peruskoulualgoritmi laskee tulon ajassa Θ(n 2 ). Onko parempaa? Huom. yhteenlasku menee ajassa Θ(n). Osittamisratkaisua varten olkoon A i luku joka saadaan ottamalla luvun X i esityksestä n/2 eniten merkitsevää bittiä ja B i ottamalla n/2 vähiten merkitsevää. Siis X i = A i 2 n/2 + B i, i = 1, 2. Osittava ratkaisu 1 (peruskoulualgoritmin yleistys): X 1 X 2 = (A 1 2 n/2 + B 1 )(A 2 2 n/2 + B 2 ) = A 1 A 2 2 n + (A 1 B 2 + A 2 B 1 )2 n/2 + B 1 B 2. Muotoa Z2 k olevat kertolaskut menevät sivuttaissiirtoina ajassa Θ(k). Siis n-bittinen kertolasku palautuu neljään n/2-bittiseen: T (n) = 4T (n/2) + Θ(n), n = 2 k 2. Kertaluokkaan ei tule parannusta: T (n) = Θ(n log 2 4 ) = Θ(n 2 ). 130

Osittava ratkaisu 2: järjestetään termit uudelleen. X 1 X 2 = (A 1 2 n/2 + B 1 )(A 2 2 n/2 + B 2 ) = A 1 A 2 2 n + B 1 B 2 + ((A 1 B 1 )(B 2 A 2 ) + A 1 A 2 + B 1 B 2 )2 n/2. Nyt kertolaskuja on vain kolme: joten T (n) = 3T (n/2) + Θ(n), n = 2 k 2, T (n) = Θ(n log 2 3 ) = Θ(n 1,59... ). Opetus: osaratkaisujen kokoaminen voi olla epätriviaalia. Huom. vakiotekijöiden takia peruskoulualgoritmi voi olla parempi vielä noin 500-bittisillä luvuilla pitkien lukujen kertolaskua tarvitaan esim. kryptografiassa asymptoottisesti tehokkain tunnettu menetelmä Schönhage-Strassen -algoritmi toimii ajassa O(n(log n)(log log n)) avoin kysymys: onko O(n) mahdollista? 131

Matriisitulo C = AB kahdelle n n matriisille A ja B; taas oletetaan n = 2 k Suoraan kaavasta c ij = n k=1 a ikb kj saadaan aikavaativuus Θ(n 3 ). Osittavaa ratkaisua varten jaetaan A ja B neljään (n/2) (n/2)-alimatriisiin: ( ) ( ) A11 A A = 12 B11 B B = 12. A 21 A 22 B 21 B 22 Tunnetusti nyt ( ) A11 B C = AB = 11 + A 12 B 21 A 11 B 12 + A 12 B 22. A 21 B 11 + A 22 B 21 A 21 B 12 + A 22 B 22 Alimatriisien kertolaskuja on 8, joten ottamalla huomioon ajan Θ(n 2 ) vievät yhteenlaskut saadaan joten parannusta ei synny: T (n) = 8T (n/2) + Θ(n 2 ) T (n) = Θ(n log 2 8 ) = Θ(n 3 ). 132

Strassenin algoritmi: lasketaan ( ) M AB = 2 + M 3 M 1 + M 2 + M 5 + M 6 M 1 + M 2 + M 4 M 7 M 1 + M 2 + M 4 + M 5 missä M 1 = (A 21 + A 22 A 11 )(B 22 B 12 + B 11 ) M 2 = A 11 B 11 M 3 = A 12 B 21 M 4 = (A 11 A 21 )(B 22 B 12 ) M 5 = (A 21 + A 22 )(B 21 B 11 ) M 6 = (A 12 A 21 + A 11 A 22 )B 22 M 7 = A 22 (B 11 + B 22 B 12 B 21 ) Nyt tarvitaan vain 7 kertolaskua, joten mistä saadaan Huomattavaa: T (n) = 7T (n/2) + Θ(n 2 ) T (n) = Θ(n log 2 7 ) = Θ(n 2,807...). Strassenin menetelmä voi tiheillä matriiseilla olla käytännöllinen jo kun n 45 (harvoille matriiseille on omat algoritminsa) asymptoottisesti tehokkain tunnettu algoritmi vaatii ajan Θ(n 2,376... ) paras tunnettu alaraja on triviaali Ω(n 2 ) algoritmi yleistyy muillekin kuin reaalimatriiseille 133

3.2 Taulukointi (dynamic programming) Esimerkki binomikertoimien ( n k) laskeminen palautuskaavasta ( n ( n = = 1 0) ( n) n ( n 1 ) ( n 1 ) = +, 0 < k < n k) k 1 k Naiivilla rekursiivisella algoritmilla b(n, k) if k = 0 or k = n then return 1 else return b(n 1, k 1) + b(n 1, k) aikavaatimus on ilmeisesti Θ( ( n k) ), joka kasvaa eksponentiaalisesti esim. jos k = n/2. (Jos k on vakio niin ( n k) = Θ(n k ).) Algoritmi on tehoton, koska sama asia lasketaan moneen kertaan: b(8, 4) = b(7, 3) + b(7, 4) = b(6, 2) + b(6, 3) + b(6, 3) + b(6, 4) = b(5, 1) + b(5, 2) + b(5, 2) + b(5, 3) + b(5, 2) + b(5, 3) + b(5, 3) + b(5, 4). 134

Tehokkaampaa on tietysti pitää kirjaa jo saavutetuista tuloksista. Ensimmäinen versio on ns. implisiittinen taulukointi: varataan taulukko C[0... n, 0... k] ja alustetaan sen kaikki alkiot nollaksi varsinainen laskenta tehdään edelleen rekursiivisesti: b(m, j) if C[m, j] 0 then return C[m, j] else if j = 0 or j = m then C[m, j] := 1 else C[m, j] := b(m 1, j 1) + b(m 1, j) return C[m, j] 135

Yleensä, kuten tässäkin, pelkkä taulukko kuitenkin riittää. Laskut voidaan helposti järjestää ilman rekursiotakin niin, että tarvittavat arvot ovat valmiina silloin kuin pitääkin. b(n, k) for m := 0 to n do C[m, 0] := 1 C[m, m] := 1 for j := 1 to m 1 do C[m, j] := C[m 1, j 1] + C[m 1, j] end for end for return C[n, k] Tämän naiivin toteutuksen aika- ja tilavaativuus ovat Θ(m 2 ). Algoritmia voidaan vielä tehostaa (HT) huomaamalla että arvoja C[m, j] missä j > k ei tarvita ja taulukosta riittää tallettaa viimeisin rivi. 136