6. Algoritmien suunnitteluparadigmoja
|
|
- Eero Elstelä
- 8 vuotta sitten
- Katselukertoja:
Transkriptio
1 6. Algoritmien suunnitteluparadigmoja Tässä osassa käsitellään erilaisia algoritmien suunnitteluperiaatteita esimerkkien valossa. Esimerkkialgoritmeja pyritään myös analysoimaan vaihtelevalla tarkkuudella. Hajota ja hallitsemenetelmää koskevat asiat perustuvat pääasiassa kirjan [Cor] kappaleeseen 2.3 ja lukuun 9. Dynaamista taulukointia käsitellään saman teoksen luvussa 15 ja ahneita algoritmeja puolestaan luvussa 16. Peruuttavia algoritmeja käsitellään mm. Steven Skienan kirjan [Ski] luvussa Hajota ja hallitse-menetelmä Monesti rekursiivinen algoritmi syntyy havaitsemalla, että käsiteltävä tapaus voidaan pilkkoa pienempiin samankaltaisiin tapauksiin, jolloin lopulta päädytään triviaaliin tai muuten helposti ratkaistavaan tapaukseen. Tällaista suunnitteluperiaatetta sanotaan hajota ja hallitsemenetelmäksi (divide-and-conquer approach). Yleisesti hajota ja hallitse-algoritmi koostuu kolmesta osasta: 1. Hajota algoritmi osaongelmiksi. (Divide) 2. Hallitse: Ratkaise osaongelma rekursiivisesti ja kun ongelma on riittävän pieni, ratkaise se suoraan. (Conquer) 3. Yhdistä osaongelmien ratkaisut alkuperäisen ongelman ratkaisuksi. (Combine) Tyypillinen hajota ja hallitse-algoritmi on aiemmin algoritmien analyysi -osassa esitetty lomituslajittelu, jonka algoritmi on seuraava: Syöte: Taulukko A[1,..,n], n >= 1, luvut 1 <= p <= q <= n Tulostus: Taulukon alkiot A[p..q] suuruusjärjestyksessä LOMITUSLAJITTELU(A,p,q) 1. if p < q then 2. r = ( p q) / 2 3. LOMITUSLAJITTELU(A,p,r) 4. LOMITUSLAJITTELU(A,r+1,q) 5. LOMITA(A,p,r,q) 6. return Muistettakoon, että LOMITA on algoritmi, joka lomittaa kaksi järjestyksessä olevaa listaa yhdeksi järjestyksessä olevaksi listaksi. Näin ollen yllä ensimmäinen askel eli hajottaminen on taulukon jakaminen keskeltä kahtia. Mikäli listassa on vain yksi alkio, on päädytty triviaaliin tapaukseen, jolloin lajittelua ei enää tarvita. Toisena askeleena lajitellaan pienemmät listat samalla algoritmilla. Kolmannessa vaiheessa yhdistetään lajitellut taulukot järjestetyksi taulukoksi lomittamalla ne. Aina algoritmissa ei tarvita kolmatta vaihetta. Esimerkiksi binäärisessä haussa järjestetystä taulukosta jaetaan taulukko puoliksi ja tutkitaan, kummassa puolessa haettava luku on. Tätä toistetaan kunnes luku löydetään. Yhdistämisvaihetta ei siis suoriteta lainkaan.
2 Esitetään vielä yksi esimerkki hajota ja hallitse-algoritmista. Oletetaan, että on annettuna n erisuurta lukua järjestämättömänä taulukkona ja näistä on löydettävä suuruusjärjestyksessä k:s alkio. Kuinka monta operaatiota tähän tarvitaan? Jos k=1, eli haetaan minimiä tai maksimia, se löydetään tietysti lineaarisessa ajassa: riittää käydä taulukko kerran läpi ja pitää yllä tietoa siitä, mikä on pienin (tai suurin) luettu. Sama pätee, jos haetaan toiseksi pienintä tai suurinta alkiota; silloin tarvitaan kaksi apumuuttujaa, kuten lukija epäilemättä heti havaitsee. Mutta entä jos haetaan suuruusjärjestyksessä keskimmäistä eli mediaania (tällöin etsitään järjestyksessä ( n 1) / 2 :ttä alkiota)? Tämä on hyvin tavallinen operaatio tilastotieteessä, kun aineistosta halutaan laskea keskilukuja. Luvut voidaan luonnollisesti järjestää algoritmilla, jonka kompleksisuus on luokkaa ( nlg n), kuten aiemmin on havaittu, ja järjestetystä taulukosta voidaan lukea vastaus suoraan. Ongelma voidaan kuitenkin ratkaista nopeamminkin käyttäen pikalajittelusta tuttua ositusalgoritmia. Annetaan tässä versio, joka valitsee sarana-alkion satunnaisesti, jolloin algoritmi ei kärsi jo lajitellun taulukon ongelmasta. Syöte: Taulukko A[1,..,n], n >= 1, ja luvut p ja r, jotka toteuttavat ehdon 1 <= p <= r <= n. Tulostus: Suorituksen jälkeen taulukon alkiot toteuttavat ehdon: On olemassa luku x taulukon osassa A[p,..,r] ja on olemassa p <= k <= r niin, että A[k] = x ja taulukon alkiot A[p,..,k-1] ovat korkeintaan yhtä suuria kuin x ja taulukon alkiot A[k+1,..,r] vähintään yhtä suuria kuin x. Palauttaa luvun k. OSITA(A,p,r) 1. valitse x = A[m] satunnaisesti taulukon osasta A[p,..,r] 2. vaihda A[m] ja A[r] 3. i = p-1 4. for j = p to r-1 5. if A[j] == x 6. vaihda A[j] ja A[r] 7. if A[j] <= x 8. i = i+1 8. vaihda A[i] ja A[j] 10. vaihda A[i+1] ja A[r] 11. return i+1 Koska yksi vaihto-operaatio on vakioaikainen (vaatii kolme sijoitusta) ja taulukon alue käydään vain kertaalleen läpi, on selvää, että algoritmi OSITA on lineaariaikainen (sen kompleksisuus on luokkaa ( r p) ).
3 Nyt voidaan esittää algoritmi, joka etsii taulukosta k:nneksi pienimmän luvun (ja esimerkiksi mediaanin kun asetetaan k ( n 1) / 2 ). Algoritmia kutsutaan siten aluksi seuraavasti: ETSI(A,1,n,k). Syöte: Taulukko A[1,..,n], n >= 1, luvut 1 <= p <= q <= n, ja k, jolle p <= k <= q Tulostus: Palauttaa taulukon osasta A[p,..,q] taulukon k:nneksi pienimmän alkion. ETSI(A,p,q,k) 1. x = OSITA(A,p,q) 2. if x == k 3. return A[x] // Alkio löytyi 4. else if x > k 5. return ETSI(A,p,x-1,k) // Haetaan alemmalta puolelta 6. else 7. return ETSI(A,x+1,q,k) // Haetaan ylemmälta puolelta Algoritmi OSITA jakaa taulukon sarana-alkion suhteen niin, että sen vasemmalla puolella on sarana-alkiota pienempiä ja sen oikealla puolella sarana-alkiota suurempia alkioita, joten k:nneksi pienin alkio sijaitsee valillä A[p..q]. Siten algoritmi on korrekti. Tarkastellaan nyt algoritmin kompleksisuutta. Huonolla onnella ositusalgoritmi löytää jokaisella kerralla pienimmän tai suurimman alkion taulukon osasta, jolloin algoritmin kompleksisuusluokaksi tulee ( n 2 ). Parhaimmassa tapauksessa taulukko jakautuu jokaisessa osituksessa kahteen yhtä suureen osaan, jolloin askelia tulee luokkaa n + n/2 + n/4 + = noin 2*n. Voidaan myös osoittaa, että keskimäärinkin algoritmin suoritusaika on luokkaa (n). Tarkastelu on samantapainen kuin pikalajittelualgoritmin keskimääräisen suoritusajan arviointi eikä siihen paneuduta tässä tarkemmin Dynaaminen taulukointi Kuten yllä tuli ilmi, hajota ja hallitse-algoritmeissa ongelma jaetaan osaongelmiin, jotka sitten ratkaistaan rekursiivisesti ja ratkaisut yhdistetään. Tällainen algoritmi on tehokas, mikäli osaongelmat ovat erilliset; muussa tapauksessa joudutaan rekursiossa ratkaisemaan samoja ongelmia yhä uudelleen. Päällekkäisyyden vuoksi esimerkiksi Fibonaccin lukujen rekursiivinen laskeminen on erittäin tehotonta. Kun rekursio ei pure, voidaan usein soveltaa dynaamista taulukointia (dynamic programming), joka toimii bottom-up -periaatteella: osaongelmien tulokset tallennetaan (yleensä taulukkoon), jolloin kukin osaongelma on ratkaistava ainoastaan kerran. Dynaamista taulukointia käytetään erityisesti optimointiongelmien ratkaisemiseen. Tällöin algoritmin löytämiseksi noudatetaan yleensä seuraavia neljää askelta: 1. Hahmotetaan optimaalisen ratkaisun rakenne. 2. Määritetään rekursio, jolla optimiratkaisu löydetään. 3. Lasketaan optimiarvo ratkaisulle lähtien alhaalta. 4. Konstruoidaan optimiratkaisu edellä saadun tiedon perusteella.
4 Tyypillinen dynaamisen taulukoinnin avulla ratkeava ongelma on kokoonpanolinjan aikatauluongelma. Oletetaan, että autotehtaassa on kaksi kokoonpanolinjaa (linjat 1 ja 2), joilla kummallakin on n kappaletta työpisteitä (merkitään Pi,j, missä i=1,2 ja j = 1,...n). Samalla kohdalla olevilla työpisteillä (ts. pisteillä P1,j ja P2,j) tehdään sama työ ja auton valmistumiseksi tarvitaan kaikki n vaihetta. Pisteellä Pi,j operaation tekemiseen oletetaan kuluvan aika ai,j. Pisteen Pi,j jätettyään auto voi siirtyä välittömästi saman linjan seuraavalla pisteelle tai toisen linjan seuraavalle pisteelle, mihin kuluu aika ti,j. Oletetaan vielä, että linjan i ensimmäiselle pisteelle siirtymiseen kuluu aika ei ja linjalta i poistumiseen kuluu aika xi. Ongelmana on löytää nopein reitti linjaston läpi. Piste P1,1 Piste P1,2 Piste P1,n-1 Piste P1,n Kokoonpanolinja 1 a1,1 a1,2 a1,n-1 a1,n Kori saapuu e1 e2 t1,1 t2,1 t1,2 t2,2 t1,n-1 t2,n-1 x1 x2 Valmis auto Kokoonpanolinja 2 a2,1 a2,2 a2,n-1 a2,n Piste P2,1 Piste P2,2 Piste P2,n-1 Piste P2,n Kuva 6.1. Kaavio kokoonpanolinjoista siirtymäaikoineen. Ongelma voidaan luonnollisesti ratkaista triviaalisti kokeilemalla kaikki reittivaihtoehdot ja valitsemalla niistä lyhin. Koska jokaisessa n:ssä askelessa voidaan valita kahdella tavalla, joudutaan tutkimaan 2 n eri vaihtoehtoa. Vaihtoehtojen lukumäärä kasvaa n:n mukana erittäin voimakkaasti, joten tätä algoritmia ei voi käyttää suurilla n:n arvoilla. Sovelletaan edellä mainittua neljän askeleen menetelmää tehokkaamman algoritmin löytämiseksi. Aluksi on hahmotettava optimiratkaisun rakenne. Tarkastellaan auton nopeinta reittiä linjaston alusta pisteelle Pi,j. Jos kyseessä on ensimmäinen työpiste (j=1), vaihtoehtoja ei ole ja kuluva aika on ei. Jos taas j>1, niin auto on voinut tulla pisteelle Pi,j kahta kautta: joko pisteeltä P1,j-1 tai pisteeltä P2,j-1. Olipa edellinen piste kumpi hyvänsä, on selvää, että auton on täytynyt tulla edelliselle pisteelle mahdollisimman nopeaa reittiä (muutenhan reittiä voitaisiin nopeuttaa). Siksi optimiratkaisu ongelmaan nopein reitti linjaston alusta pisteelle Pi,j sisältää optimiratkaisun osaongelmaan nopein reitti linjaston alusta pisteelle P1,j-1 tai pisteelle P2,j-1. Tämä mahdollistaa dynaamisen taulukoinnin ja optimiratkaisun konstruoinnin bottom-up-periaatteella. Nopein reitti linjaston alusta pisteelle Pi,j on siis toinen seuraavista: nopein reitti linjaston alusta saman
5 linjan edelliselle pisteelle tai nopein reitti linjaston alusta toisen linjan edelliselle pisteelle ja linjan vaihdolla. Toiseksi haetaan rekursiivinen ratkaisu: edellä olevan tarkastelun perusteella luonteviksi osaongelmiksi tarjoutuvat nopeimman reitin määrittämiset kuhunkin työpisteeseen asti. Käytetään kahta taulukkoa: Taulukossa f1 ovat ajat linjan 1 työpisteille ja taulukossa f2 linjan 2 työpisteille. Siis f1[j] on nopein aika alusta pisteeseen P1,j ja f2[j] on nopein aika alusta pisteeseen P2,j. Merkitään vielä fs:llä auton nopeinta aikaa tehtaan läpi, jolloin aiemman päättelyn perusteella fs = min(f1[n]+ x1,f2[n]+x2). Lyhin aika ensimmäiselle pisteelle on helppo laskea, sillä aikaa kuluu ainoastaan linjalle siirtymiseen ja pisteen töihin, joten f1[1] = e1 + a1,1 ja f2[1] = e2 + a2,1. (1) Edelleen, kuten yllä on todettu, nopein reitti pisteelle P1,j voi tulla joko pisteeltä P1,j-1 tai pisteeltä P2,j-1. Mikäli tullaan toiselta linjalta, on otettava huomioon linjan vaihtoon kuluva aika. Näin ollen pisteen työ mukaan lukien nopein aika on joko f1[j-1] + a1,j (ei vaihdeta linjaa) tai f2[j-1] + t2,j-1 + a1,j (vaihdetaan linjaa). Oikea aika on pienempi näistä, eli f1[j] = min(f1[j-1] + a1,j, f2[j-1] + t2,j-1 + a1,j). (2) Vastaavasti saadaan toiselle linjalle f2[j] = min(f2[j-1] + a2,j, f1[j-1] + t1,j-1 + a2,j). (3) Kolmanneksi mietitään, miten optimiarvo kannattaa laskea. Yllä johdettujen ominaisuuksien perusteella voitaisiin kirjoittaa rekursiivinen algoritmi kaavojen (2) ja (3) avulla ja päättää rekursio kaavasta (1) saataviin arvoihin. Käytettäisiin siis kahta rekursiivista funktiota f1 ja f2, jotka kutsuvat toisiaan aina pienenevillä arvoilla, kunnes rekursio päättyy kaavaan (1). Tämä on kuitenkin erittäin tehoton tapa, sillä rekursio haarautuu kahteen osaan joka askelessa ja nähdään että tarvitaan 2 n askelta laskemaan f1[n] ja f2[n]. Näin ollen algoritmin kompleksisuus on ( 2 n ), mikä tekee siitä käyttökelvottoman vähänkään suuremmilla luvun n arvoilla. Sen sijaan aloittamalla taulukkojen arvojen laskenta alkupäästä, saadaan tehokas lineaariaikainen algoritmi.
6 Syöte: Taulukot a1[1,..,n], a2[1,..,n], t1[1,..,n], t2[1,..,n], n >= 1, luvut e1, e2, x1, x2. Taulukoissa a1 ja a2 ovat linjojen 1 ja 2 työpisteiden ajat. Taulukoissa t1 ja t2 ovat linjoilta 1 ja 2 kultakin työpisteeltä linjan vaihtoon kuluva aika. Luvut e1 ja e2 ovat linjojen aloitusajat ja x1 ja x2 lopetusajat. Tulostus: Taulukkoihin f1 ja f2 lasketaan linjojen 1 ja 2 työpisteille nopein mahdollinen alusta kuluva aika. Taulukkoihin l1 ja l2 lasketaan linja, jota pitkin nopeimmassa reittivalinnassa tullaan työpisteelle. Esimerkiksi l1[3] on 1, jos pisteelle P1,3 tullaan nopeimmassa reitissä pisteeltä P1,2 ja 2, jos pisteeltä P2,2. Luku fs on koko linjaston nopein aika ja ls linja, jolta nopeimmassa reitissä tullaan ulos. NOPEINREITTI(a1,a2,t1,t2,e1,e2,x1,x2) 1. f1[1] = e1 + a1[1] 2. f2[1] = e2 + a2[1] 3. for j = 2 to n // Täytetään arvo taulukkoon f1 4. if (f1[j-1]+a1[j]) <= (f2[j-1]+t2[j-1]+a1[j]) 5. f1[j] = f1[j-1]+a1[j] 6. l1[j] = 1 7. else 8. f1[j] = f2[j-1]+t2[j-1]+a1[j] 9. l1[j] = 2 // Täytetään arvo taulukkoon f2 10. if (f2[j-1] + a2[j]) <= (f1[j-1]+t1[j-1]+a2[j]) 11. f2[j] = f2[j-1] + a2[j] 12. l2[j]=2 13. else 14. f2[j] = f1[j-1]+t1[j-1]+a2[j] 15. l2[j]=1 // Lopuksi katsotaan, kummasta linjasta tullaan ulos 16. if (f1[n]+x1) <= (f2[n]+x2) 17. fs = f1[n]+x1 18. ls = else 20. fs = f2[n]+x2 21. ls = return Algoritmissa suoritetaan yksi silmukka, jonka sisällä on ainoastaan vakioaikaisia operaatioita. Siten on selvää, että algoritmin kompleksisuus on luokkaa (n), minkä vuoksi algoritmia voidaan suorittaa myös hyvin suurilla luvun n arvoilla. Nyt on jäljellä enää neljäs askel eli varsinaisen optimiratkaisun konstruointi, mikä tässä tarkoittaa nopeimman reitin etsimistä. Kaikki olennainen informaatio on hankittu suorittamalla edellä oleva algoritmi. Nopeimman reitin aika saadaan suoraan muuttujan fs arvosta. Yllä lasketaan myös taulukkoihin l1 ja l2 sen linjan numero, jolta linjan 1 tai 2 tietylle pisteelle tullaan alusta alkaen nopeinta reittiä. Huomaa, että taulukoihin ei lasketa ensimmäiselle alkiolle arvoa, koska ensimmäistä pistettä ei edellä mikään piste. Lisäksi ls on se linja, jolta optimiratkaisussa poistutaan linjastolta. Taulukot l1 ja l2 sekä muuttuja ls sisältävät kaiken informaation, josta optimireitti voidaan lukea. Muuttujan ls arvo kertoo linjan, jolla viimeinen tehtävä suoritetaan;
7 jos tämä arvo on 1, saadaan sitä edeltävän aseman linja taulukosta l1, muuten se saadaan taulukosta l2 jne. Seuraava algoritmi tulostaa reitin lopusta alkuun: Syöte: Taulukot l1[1,..,n], l2[1,..,n], luku ls Tulostus: Nopein reitti linjastolla lopusta alkuun. TULOSTAREITTI(l1,l2,ls) 1. edellinen = ls 2. for j = n downto 1 do 3. if edellinen == 1 then 4. print linja 1 piste j 5. edellinen = l1[j] 6. else 7. print linja 2 piste j 8. edellinen = l2[j] 9. return Sovelletaan kehiteltyjä algoritmeja seuraavaan konkreettiseen tapaukseen: Piste P1,1 Piste P1,2 Piste P1,3 Piste P1,4 Piste P1,5 Kokoonpanolinja Kori saapuu Valmis auto Kokoonpanolinja Nyt siis e1=2, e2=4, x1=3 ja x2=2, a1 = {7,9,3,4,8}, a2 = {8,5,6,4,5}, t1 = {2,3,1,3} sekä t2 = {2,1,2,2}. Tällöin f1[1] = e1 + a1[1] = 9 f2[1] = e2 + a2[1] = 12 f1[2] = min(f1[1]+a1[2],f2[1]+t2[1]+a1[2]) = min(9+9,12+2+9) = 18 l1[2] = 1 f2[2] = min(f2[1]+a2[2],f1[1]+t1[1]+a2[2]) = min(12+5,9+2+5) = 16 l2[2] = 1 Näin jatkamalla saadaan Piste P2,1 Piste P2,2 Piste P2,3 Piste P2,4 Piste P2,5
8 f1 = f2 = l1 = l2 = sekä nopeimman reitin aika fs = min(f1[5]+x1,f2[5]+x2) = min(32+3,30+2) = 32 ja ls = 2. Algoritmilla TULOSTAREITTI saadaan nopein reitti lopusta alkuun. Aluksi muuttuja edellinen = ls = 2, joten aluksi tulostetaan Linja 2, piste 5 Sitten edellinen = l2[4] = 2, joten seuraavalla kierroksella tulostetaan Linja 2, piste 4 minkä jälkeen edellinen = l2[3] = 1, tulostetaan Linja 1, piste 3 ja näin jatkamalla saadaan nopein reitti tulostettua: Linja 2, piste 2 Linja 1, piste 1. Alusta loppuun reitti on siis: Linja 1; piste 1, Linja 2; piste 2, Linja 1; piste 3, Linja 2, piste 4 ja Linja 2, piste Ahneet algoritmit Ahneita algoritmeja (greedy algorithms) sovelletaan enimmäkseen optimointiongelmiin, kuten dynaamista taulukointiakin. Ahne strategia on erittäin yksinkertainen: kussakin tilanteessa tehdään parhaalta näyttävä ratkaisu. Hämmästyttävää kyllä, tämä menetelmä sopii yllättävän moniin laskennallisiin ongelmiin. Algoritmin luonteesta johtuen sellainen on yleensä helppo suunnitella; sen sijaan voi olla melkoisen hankalaa osoittaa, että algoritmi tuottaa optimaalisen ratkaisun. Monessa tapauksessa ahne strategia ei annakaan oikeaa ratkaisua, mutta silti riittävän hyvän, jotta se kelpaa arvioimaan oikeaa ratkaisua, kun oikeaan ratkaisuun johtava algoritmi on kompleksisuutensa vuoksi käyttökelvoton. Tarkastellaan aluksi yksinkertaista esimerkkiä. Oletetaan, että käytössä on rajoittamaton määrä kaikkia Suomessa käytettäviä eurosenttikolikoita (siis 50, 20, 10 ja 5 sentin) ja ongelmana on kerätä näistä annettu rahasumma käyttäen mahdollisimman pieni määrä kolikoita. Ahne algoritmi ratkaisuksi on valita mahdollisimman arvokas kolikko joka kerran, kunnes rahamäärä on saatu täyteen. Perustellaan seuraavaksi, että tämä algoritmi tuottaa optimaalisen tuloksen. Yleisesti optimaalisessa valinnassa voi olla korkeintaan yksi viisisenttinen, koska kaksi viisisenttistä voidaan korvata yhdellä kymmensenttisellä. Vastaavasti kymmensenttisiä voi olla korkeintaan yksi. 20-senttisiä ei voi olla kahta enempää, koska kolme 20-senttistä voidaan korvata 50- ja 10- senttisillä. Oletetaan nyt, että on olemassa rahasummia, jotka voidaan kerätä vähemmällä
9 määrällä kolikkoja käyttäen jotakin muuta kuin ahnetta menetelmää. Olkoon X senttiä pienin näistä summista. Tällöin X:n parhaassa valinnassa ei esiinny 50-senttistä, koska myös ahneessa esityksessä on tällöin varmasti 50-senttinen. Mutta silloin X-50 olisi pienempi rahasumma, jolle ahne tapa ei tuota parasta esitystä. Näin ollen ainoat periaatteelliset mahdollisuudet X:n valinnalle ovat 5,10,15, 20, 25, 30, 35, 40, 45, 50 ja 55 senttiä. Näistä jokainen summa voidaan kuitenkin kerätä ahneesti mahdollisimman pienellä kolikkomäärällä. Siten ahne algoritmi tuottaa aina optimiratkaisun. Yleisesti näin ei kuitenkaan tämänkaltaisissa ongelmissa käy. Jos kolikkojemme arvot olisivat esimerkiksi 40, 30, 10 ja 5 senttiä, 60 sentin summa kerättäisiin ahneella strategialla , kun optimaalinen tapa muodostaa summa olisi Tutkitaan seuraavaksi toiminnon valitsemisongelmaa. Oletetaan, että joukossa S on n toimintoa, S = {a1,a2,a3,...,an}. Jokaisella toiminnolla on alkamis- ja loppumisaika si ja fi. Ongelmana on löytää mahdollisimman suuri toimintojen joukko, jossa kahta toimintoa ei suoriteta yhtä aikaa. Tällaisia toimintoja sanotaan yhteensopiviksi. Olkoon joukossa S esimerkiksi 11 toimintoa, joiden alkamis- ja loppumisajat ovat seuraavat: i si fi Nyt esimerkiksi toiminnot a1 ja a2 menevät päällekkäin, joten niitä ei voi valita samaan joukkoon. Joukko {a3,a7,a11} on mahdollinen, mutta ei mahdollisimman suuri. Sen sijaan joukko {a1,a4,a9,a11} on mahdollisimman suuri, ei kuitenkaan ainoa sellainen. Etsitään nyt ahne ratkaisu ongelmaan. Oletetaan, että toiminto ak esiintyy jossakin optimiratkaisussa. Tämä toiminto jakaa muut toiminnot kolmeen joukkoon: 1. Ennen ak:n alkamista päättyvät toiminnot. 2. Toiminnon ak päättymisen jälkeen alkavat toiminnot. 3. Toiminnon ak kanssa päällekkäiset toiminnot. Optimiratkaisun ne toiminnot, jotka kuuluvat joukkoon 1 muodostavat optimiratkaisun joukossa 1. Muutenhan optimiratkaisun ennen ak:n alkamista päättyvät toiminnot voitaisiin korvata joukolla, jossa on enemmän toimintoja ja saataisiin suurempi joukko yhteensopivia toimintoja kuin optimiratkaisussa, mikä ei ole mahdollista. Ahne strategia perustuu seuraavaan havaintoon: Olkoon A jokin optimiratkaisu ja olkoon ak sen ajallisesti ensimmäinen toiminto ja olkoon a1 kaikista toiminnoista ensimmäiseksi päättyvä. (Tämä ei siis välttämättä sisälly ratkaisuun.) Koska a1 päättyy viimeistään yhtä aikaa toiminnon ak kanssa, ratkaisussa A toiminto ak voidaan korvata toiminnolla a1. Näinkin saadaan optimiratkaisu ja voidaan päätellä, että ainakin yhdessä optimiratkaisussa ensin päättyvä toiminto on mukana. Siten saadaan algoritmi ongelman ratkaisuksi: 1. Lajitellaan toiminnot päättymisajan mukaan nousevaan järjestykseen. 2. Valitaan ensin päättyvä toiminto 3. Poistetaan valitun toiminnon kanssa päällekkäiset 4. Jos toimintoja jäljellä, mene askeleeseen 2.
10 Sovelletaan tätä algoritmia esimerkkitapaukseen: Annetussa taulukossa toiminnot on jo lajiteltu loppumisajan mukaan. Näin ollen valitaan ensin toiminto a1. Ensimmäinen tämän kanssa yhteensopiva on a4, joka siis valitaan seuraavaksi. Tämän jälkeen seuraava toiminnon a4 loppumisen jälkeen alkava toiminto on a8. Tämän toiminnon valinnan jälkeen ainoa yhteensopiva toiminto on a11, joten se valitaan ja saadaan optimiratkaisu {a1,a4,a8,a11}. Mikä on algoritmin kompleksisuus? Kun toiminnot on järjestetty, askeleet 2, 3 ja 4 voidaan suorittaa käymällä toiminnot kertaalleen läpi, joten tämän osan kompleksisuus on (n). Lajittelua ei voida (vertailemalla) suorittaa nopeammin kuin ajassa ( nlg n), joten askel 1 dominoi algoritmia ja kokonaiskompleksisuus on ( nlg n). Annettu algoritmi on ahne siinä mielessä, että aina valitaan se toiminto, joka kuluttaa jäljellä olevaa aikaa vähiten. Kannattaa huomata, että dynaaminen taulukointi on ahnetta strategiaa yleisempi. Koeta esimerkiksi soveltaa ahnetta strategiaa kokoonpanolinjan tapaukseen. Saatko tällöin optimiratkaisua? Ahneen algoritmin luomisessa noudatetaan yleensä seuraavia kolmea vaihetta: 1. Esitetään optimointiongelma niin, että kun valinta tehdään, jää jäljelle ainoastaan yksi ratkaistava osaongelma. 2. Osoitetaan, että ahne valinta sisältyy aina johonkin alkuperäisongelman optimiratkaisuun. Tämä varmistaa, että ahne valinta on turvallinen. 3. Varmistutaan siitä, että kun ahne valinta yhdistetään osaongelman optimiratkaisuun, saadaan alkuperäisongelman optimiratkaisu. Tarkastellaan vielä lopuksi ns. Huffmanin koodeja, joiden avulla voidaan pakata merkkijonoja varsin tehokkaasti. Huffmanin koodeja käytetään yleisesti ja niiden avulla saavutetaan monissa tapauksissa kymmenien prosenttien tilansäästö. Tarkastellaan aluksi esimerkkiä: Oletetaan, että tiedosto koostuu merkeistä a, b, c, d, e ja f, joita on yhteensä kappaletta. Oletetaan vielä, että kirjainten esiintymismäärät ovat seuraavat: a b c d e f Tehtävänä on esittää tiedosto mahdollisimman pienellä bittimäärällä. Jos kaikkien merkkien koodaamiseen käytetään sama määrä bittejä, tarvitaan kolme bittiä kirjainten esittämiseen ja tiedosto saadaan esitettyä bitillä. Entä, jos käytetään tiheimmin esiintyville merkeille pienempää bittimäärää esimerkiksi seuraavasti: a b c d e f Tällöin tiedoston sisältö voidaan esittää * * * * *800 = bitillä. Tällä koodauksella on toinenkin etu: mikään koodisana ei ole alkuosana toisessa sanassa, joten merkkien dekoodaus on helppoa. Esimerkiksi jono esitetään muodossa ja se dekoodautuu seuraavasti: aacdbb. Tällaista koodia sanotaan etuliitekoodiksi (prefix code).
11 Binäärinen etuliitekoodi voidaan aina esittää puuna, jossa puun lehdillä ovat koodattavat merkit ja puun vasemman haaran valitseminen tarkoittaa nollabittiä ja oikean haaran valitseminen ykkösbittiä. Polku juuresta lehteen antaa tällöin lehdellä sijaitsevan merkin koodin. Edellä oleva koodi esitettäisiin puuna a c e f d b Koodin laatiminen on siis yhtäpitävää puun muodostamisen kanssa. Huffman keksi ahneen strategian, jolla voidaan löytää optimaalinen etuliitekoodi. Oletetaan, että tiedosto koostuu joukon C merkeistä ja että jokaisen merkin c suhteellista osuutta merkitään f[c]:lla. Esimerkkimme tapauksessa C = {a,b,c,d,e,f} ja suhteelliset osuudet käyvät ilmi taulukosta Merkki a b c d e f Lukumäärä f[]
12 Huffmanin algoritmi on seuraava Syöte: Taulukko C[1,..,n], jossa käytettävät merkit ja taulukko f[1,..,n], jossa merkkien suhteelliset osuudet. Tulostus: Muodostaa puun, joka esittäää optimaalista etuliitekoodia. HUFFMAN(C,f) 1. Tee merkeistä n kappaletta pelkästä juuresta koostuvia binääripuita. Solmun datana merkki ja suhteellinen osuus, joka on avain. 2. Järjestä puut avainkentän mukaan nousevaan järjestykseen 3. for j = 1 to n-1 do 4. Yhdistä kaksi juuriarvoltaan pienintä puuta lisäämällä ne vasemmaksi ja oikeaksi haaraksi puuhun, jonka juuren avainkenttä on lisättävien puiden juuriarvojen summa. 5. Siirrä muodostettu puu järjestyksessä oikeaan kohtaan 6. return Algoritmin lopputuloksena on koodia esittävä binääripuu. Algoritmi on ahne, sillä se valitsee aina kaksi juuriarvoltaan pienintä puuta yhdistettäväksi. Ensimmäisen vaiheen kompleksisuusluokka on (n), koska yhden puun muodostaminen on vakioaikainen operaatio ja se on tehtävä n kertaa. Järjestäminen (vaihe 2) voidaan tunnetusti suorittaa kompleksisuusluokkaa ( nlg n) olevalla algoritmilla. Askelia 4 ja 5 suoritetaan n-1 kertaa. Askel 4 on vakioaikainen, koska siinä valitaan järjestetystä listasta kaksi pienintä eli ensimmäiset ja muodostetaan uusi juuri puuhun. Askelessa 5 haetaan paikka alkiolle järjestetystä listasta; tämän operaation kompleksisuusluokka on (lg n), koska se voidaan tehdä binäärihaulla. Näin ollen silmukan kompleksisuusluokka on ( nlg n) ja siten koko algoritmin kompleksisuusluokka on ( nlg n). Vielä ei ole kuitenkaan takeita siitä, että algoritmi tuottaisi hyvän koodin. Seuraavaksi perustellaan, miksi algoritmi toimii. Tarkastellaan aluksi algoritmin toimintaa annetussa esimerkkitapauksessa.
13 VAIHE I d:5 f:8 b:10 e:12 c:25 a:40 VAIHE II b:10 e:12 13 c:25 a:40 d:5 f:8 VAIHE III c:25 a:40 d:5 f:8 b:10 e:12 VAIHE IV c:25 35 a:40 13 d:5 f:8 22 b:10 e:12 VAIHE V a:40 60 c: d:5 f:8 22 b:10 e:12
14 VAIHE VI: Valmis koodi 100 a:40 60 c: d:5 f:8 22 b:10 e:12 Näin saatiin kirjaimille seuraavat esitykset: a c d F b e Esimerkkitapauksemme tiedoston sisällön esittämiseen kuluisi näin * * * * *800 = bittiä. Algoritmin implementoinnissa kannattaa käyttää minimikekoa puiden hallintaan. Perustellaan nyt algoritmin oikeellisuutta yleisessä tapauksessa. Tehdään aluksi Havainto 1. Jos x ja z ovat kaksi harvimmin esiintyvää merkkiä, on olemassa optimaalinen koodi, jossa merkkejä x ja z vastaavat koodisanat ovat yhtä pitkät ja eroavat toisistaan vain yhdellä bitillä.
15 Perustelu: Olkoon T jokin optimaalinen koodi. Jos merkit ovat koodin puuesityksessä sisarussolmut, niin väite pitää paikkansa. Olkoon nyt koodin T puuesitys seuraava T x z a b Merkit a ja b olkoot puussa syvimmällä esiintyvät sisarussolmut (jolloin niiden koodiesitykset ovat vähintään yhtä pitkät kuin minkään muun merkin ja eroavat toisistaan vain yhdellä bitillä). Tällaiset ovat olemassa, sillä kaikilla alimman tason merkeillä on puussa myös sisarhaara; muutenhan merkki voitaisiin nostaa tasoa ylemmäs ja siten lyhentää sen esitystä muuttamatta koodia muuten. Tämä ei ole mahdollista, jos koodi on optimaalinen. Jos nyt määritellään koodi T puulla, jossa x vaihtaa paikkaa a:n ja z b:n kanssa, ei koodauksessa käytettävien bittien määrä voi kasvaa, koska x ja y esiintyivät harvimmin ja koodissa T merkkien x ja y koodisanat ovat korkeintaan yhtä pitkät kuin merkkien a ja b. Havainnosta 1 seuraa, että algoritmissa voidaan yhdistää aluksi kaksi pienimmän suhteellisen osuuden merkkiä, jotka joutuvat lopuksi syvimmälle puuhun. Havainto 2. Olkoon C merkkien joukko ja f[c] kunkin merkin c suhteellinen osuus. Olkoot x ja y harvimmin esiintyvät merkit (f[x]ja f[y] pienimmät). Olkoon C joukko, joka saadaan poistamalla joukosta C merkit x ja y sekä lisäämällä uusi merkki z, jolle f(z) = f[x]+f[y]. Olkoon T puu, joka esittää optimaalista etuliitekoodia joukolle C. Muodostetaan puu T seuraavasti: Korvataan puussa T merkin z lehti sisäisellä solmulla, jonka lapsina ovat x ja y. Tällöin T on optimaalinen etuliitekoodi joukolle C. Perustelu: Oletetaan, että merkkejä on N kappaletta ja merkitään merkin c bittilukumäärää koodissa T symbolilla (c). Tällöin koodin vaatima bittimäärä on N c C f d T c d ( c) N B( T) T ja koska N on vakio, koodi on optimaalinen kun koodin kustannus B(T) on mahdollisimman pieni. Huomataan ensin, että koodeissa T ja T pätee d T ( x) d ( y) d '( z) 1 T T ja koska koodit T ja T eroavat ainoastaan merkkien x, y ja z osalta, saadaan
16 B( T ) B( T' ) B( T' ) B( T ) f f x dt ( x) f y dt ( y) ( f x f ( y ) dt '( x) f x f y x f y. Oletetaan nyt, että väite ei pitäisikään paikkaansa. Silloin olisi olemassa koodi T, joka koodaisi merkit vähemmillä biteillä kuin T, ts. B( T'') B( T). Havainnon 1 perusteella voidaan olettaa, että T :ssa merkit x ja y ovat sisarussolmuja. Muodostetaan nyt koodi T korvaamalla solmujen x ja y yhteinen vanhempi merkillä z, jolle f(z) = f(x) + f(y). Silloin x f y B( T) f x f y B( '). B( T''') B( T'') f T Näin ollen T ei olisikaan optimaalinen koodi vastoin oletusta. Siis havainto 2 pitää paikkansa. Havainnosta 2 puolestaan seuraa heti, että Huffmanin algoritmi tuottaa optimaalisen etuliitekoodin. Ahneille algoritmeille on kehitetty myös yleinen teoreettinen viitekehys, joka perustuu ns. matroidin käsitteeseen. Asiasta kiinnostunut lukija voi perehtyä aiheeseen kirjan [Cor] luvusta Peruuttavat algoritmit Monet laskennalliset ongelmat vaativat jonkin mahdollisten ratkaisujen joukon läpikäymistä. Peruuttaminen (backtracking) on systemaattinen tapa luetella joukon alkiot. Joukkoon voivat kuulua esimerkiksi jonkin alkiojoukon kaikki mahdolliset järjestykset (permutaatiot), verkon kaikki virittävät puut jne. Yhteistä tällaisille ongelmille on, että jokainen mahdollinen ratkaisuehdotelma muodostetaan täsmälleen kerran. Muuten saattaa oikea ratkaisu jäädä löytymättä tai joudutaan tekemään turhaa työtä. Peruuttavat algoritmit soveltuvat erityisesti kombinatorisiin haku- ja konstruointitehtäviin. Esitetään seuraavaksi yksi geneerinen peruuttavan algoritmin toteutus. Oletetaan, että tutkittavan ongelman ratkaisu voidaan esittää vektorina (r1,r2,,rn) missä ri kuuluu järjestettyyn joukkoon Si. Tällöin ratkaisua voidaan yrittää konstruoida osittain siten, että kun on muodostettu osittaisratkaisu (r1,r2,,rk) missä k<n, yritetään vektorin loppuun lisätä uusi alkio niin, että saadaan uusi osittaisratkaisu. Ellei alkiota voida lisätä, poistetaan viimeinen alkio tarkasteltavasta osittaisratkaisusta ja siirrytään kokeilemaan seuraavaa osittaisratkaisua. Lopulta joko saadaan muodostettua täydellinen ratkaisu tai havaitaan että ratkaisua ei ole. Yleistasolla algoritmi voidaan esittää seuraavasti:
17 Syöte: Osittainen ratkaisu r = (r 1,r 2,...,r k) ja indeksi k Output: Kun ratkaisu löydetään se käsitellään Peruuta(r,k) 1. if r ratkaisu 2. Käsittele r 3. else 4. k = k Muodosta joukko S k 6. while S k!= ø 7. r k = alkio joukosta S k 8. Poista r k joukosta S k 9. Peruuta(r,k) Huomaa, että algoritmi muistuttaa verkkojen syvyyshakua. Algoritmia voidaankin pitää eräänlaisena syvyyshakuna osittaisratkaisujen muodostamassa verkossa. Sovelletaan tätä menetelmää ns. kahdeksan kuningattaren ongelmaan: Kuinka monella tavalla kahdeksan shakkipelin kuningatarta voidaan asetella shakkilaudalle niin, että ne eivät uhkaa toisiaan? Shakissa kuningatar liikkuu sijainnistaan pysty- ja vaakasuunnassa sekä kulmittain niin pitkälle kuin lautaa riittää. Alla on yksi mahdollinen asetelma: Q Q Q Q Muunnetaan ratkaisut sopivaan muotoon. Heti havaitaan, että ratkaisussa on aina yksi kuningatar kullakin pystyrivillä. Näin ollen ratkaisu voidaan esittää muodossa (r1,r2,,r8) missä ri on kuningattaren paikka i:nnellä pystyrivillä. Kun vektori (r1,r2,,rk) on annettu, on suoraviivaista tarkistaa onko kyseessä osittaisratkaisu, ts. uhkaavatko mitkään kaksi k:sta ensimmäisestä kuningattaresta toisiaan. Näin voidaan soveltaa edellä mainittua ratkaisumenetelmää ja saadaan algoritmiksi Q Q Q Q
18 Syöte: Taulukko t[1..8], jossa paikat ja sarake col Output: Kun ratkaisu löydetään lisätään lukumäärää Queens(t,col) 1. if col == 8 2. ratkaisuja = ratkaisuja+1 3. else 4. col = col for i = 1 to 8 6. t[col]=i 7. if osittaisratkaisu(t,col) 8. Queens(t,col) Edellä on oletettu, että apualgoritmi osittaisratkaisu kertoo, onko taulukon alkuosassa laillinen asetelma. Algoritmin aluksi asetetaan t=[1,,1] ja kutsutaan Queens(t,0). Harjoitustehtävä: Kirjoita valitsemallasi ohjelmointikielellä ohjelma, joka laskee ratkaisujen lukumäärän. Lähteet: [Cor] Cormen, T.H., Leiserson, C.E., Rivest, R.L., Stein, C. Introduction to Algorithms, 2 nd edition, The MIT Press [Ski] Skiena, S.S. The Algorithm Design Manual, 2 nd edition, Springer 2008.
811312A Tietorakenteet ja algoritmit, 2015-2016. VI Algoritmien suunnitteluparadigmoja
811312A Tietorakenteet ja algoritmit, 2015-2016 VI Algoritmien suunnitteluparadigmoja Sisältö 1. Hajota ja hallitse-menetelmä 2. Dynaaminen taulukointi 3. Ahneet algoritmit 4. Peruuttavat algoritmit 811312A
811312A Tietorakenteet ja algoritmit, 2014-2015, Harjoitus 7, ratkaisu
832A Tietorakenteet ja algoritmit, 204-205, Harjoitus 7, ratkaisu Hajota ja hallitse-menetelmä: Tehtävä 7.. Muodosta hajota ja hallitse-menetelmää käyttäen algoritmi TULOSTA_PUU_LASKEVA, joka tulostaa
Algoritmit 2. Luento 8 Ke 13.4.2016. Timo Männikkö
Algoritmit 2 Luento 8 Ke 13.4.2016 Timo Männikkö Luento 8 Rekursioyhtälöt Master-lause Lähin pistepari Ahne menetelmä Lyhin virittävä puu Kruskalin menetelmä Primin menetelmä Merkkitiedon tiivistäminen
Johdatus diskreettiin matematiikkaan Harjoitus 7, 28.10.2015
Johdatus diskreettiin matematiikkaan Harjoitus 7, 28.10.2015 1. Onko olemassa yhtenäistä verkkoa, jossa (a) jokaisen kärjen aste on 6, (b) jokaisen kärjen aste on 5, ja paperille piirrettynä sivut eivät
Luku 6. Dynaaminen ohjelmointi. 6.1 Funktion muisti
Luku 6 Dynaaminen ohjelmointi Dynaamisessa ohjelmoinnissa on ideana jakaa ongelman ratkaisu pienempiin osaongelmiin, jotka voidaan ratkaista toisistaan riippumattomasti. Jokaisen osaongelman ratkaisu tallennetaan
Lisää segmenttipuusta
Luku 24 Lisää segmenttipuusta Segmenttipuu on monipuolinen tietorakenne, joka mahdollistaa monenlaisten kyselyiden toteuttamisen tehokkaasti. Tähän mennessä olemme käyttäneet kuitenkin segmenttipuuta melko
811312A Tietorakenteet ja algoritmit III Lajittelualgoritmeista
811312A Tietorakenteet ja algoritmit 2016-2017 III Lajittelualgoritmeista Sisältö 1. Johdanto 2. Pikalajittelu 3. Kekolajittelu 4. Lajittelualgoritmien suorituskyvyn rajoista 811312A TRA, Lajittelualgoritmeista
Diskreetit rakenteet
Diskreetit rakenteet 811120P 5 op 7. Oulun yliopisto Tietojenkäsittelytieteiden laitos 2015 / 2016 Periodi 1 Mikä on verkko? verkko (eli graafi) koostuu solmuista ja väleistä, jotka yhdistävät solmuja
811312A Tietorakenteet ja algoritmit 2015-2016. V Verkkojen algoritmeja Osa 2 : Kruskalin ja Dijkstran algoritmit
811312A Tietorakenteet ja algoritmit 2015-2016 V Verkkojen algoritmeja Osa 2 : Kruskalin ja Dijkstran algoritmit Sisältö 1. Johdanto 2. Leveyshaku 3. Syvyyshaku 4. Kruskalin algoritmi 5. Dijkstran algoritmi
Algoritmit 1. Luento 13 Ti 23.2.2016. Timo Männikkö
Algoritmit 1 Luento 13 Ti 23.2.2016 Timo Männikkö Luento 13 Suunnittelumenetelmät Taulukointi Kapsäkkiongelma Ahne menetelmä Verkon lyhimmät polut Dijkstran menetelmä Verkon lyhin virittävä puu Kruskalin
A ja B pelaavat sarjan pelejä. Sarjan voittaja on se, joka ensin voittaa n peliä.
Esimerkki otteluvoiton todennäköisyys A ja B pelaavat sarjan pelejä. Sarjan voittaja on se, joka ensin voittaa n peliä. Yksittäisessä pelissä A voittaa todennäköisyydellä p ja B todennäköisyydellä q =
Luento 6. June 1, 2015. Luento 6
June 1, 2015 Normaalimuodon pelissä on luontevaa ajatella, että pelaajat tekevät valintansa samanaikaisesti. Ekstensiivisen muodon peleissä pelin jonottaisella rakenteella on keskeinen merkitys. Aluksi
Aluksi. 2.1. Kahden muuttujan lineaarinen epäyhtälö
Aluksi Matemaattisena käsitteenä lineaarinen optimointi sisältää juuri sen saman asian kuin mikä sen nimestä tulee mieleen. Lineaarisen optimoinnin avulla haetaan ihannearvoa eli optimia, joka on määritelty
811312A Tietorakenteet ja algoritmit Kertausta kurssin alkuosasta
811312A Tietorakenteet ja algoritmit 2017-2018 Kertausta kurssin alkuosasta II Perustietorakenteet Pino, jono ja listat tunnettava Osattava soveltaa rakenteita algoritmeissa Osattava päätellä operaatioiden
Algoritmit 2. Luento 9 Ti Timo Männikkö
Algoritmit 2 Luento 9 Ti 17.4.2018 Timo Männikkö Luento 9 Merkkitiedon tiivistäminen Huffmanin koodi LZW-menetelmä Taulukointi Editointietäisyys Algoritmit 2 Kevät 2018 Luento 9 Ti 17.4.2018 2/29 Merkkitiedon
Epäyhtälön molemmille puolille voidaan lisätä sama luku: kaikilla reaaliluvuilla a, b ja c on voimassa a < b a + c < b + c ja a b a + c b + c.
Epäyhtälö Kahden lausekkeen A ja B välisiä järjestysrelaatioita A < B, A B, A > B ja A B nimitetään epäyhtälöiksi. Esimerkiksi 2 < 6, 9 10, 5 > a + + 2 ja ( + 1) 2 2 + 2 ovat epäyhtälöitä. Epäyhtälössä
8. Lajittelu, joukot ja valinta
8. Lajittelu, joukot ja valinta Yksi tietojenkäsittelyn klassisista tehtävistä on lajittelu (järjestäminen) (sorting) jo mekaanisten tietojenkäsittelylaitteiden ajalta. Lajiteltua tietoa tarvitaan lukemattomissa
Algoritmit 1. Luento 12 Ti Timo Männikkö
Algoritmit 1 Luento 12 Ti 19.2.2019 Timo Männikkö Luento 12 Osittamisen tasapainoisuus Pikalajittelun vaativuus Lajittelumenetelmien vaativuus Laskentalajittelu Lokerolajittelu Kantalukulajittelu Algoritmit
2.7 Neliöjuuriyhtälö ja -epäyhtälö
2.7 Neliöjuuriyhtälö ja -epäyhtälö Neliöjuuren määritelmä palautettiin mieleen jo luvun 2.2 alussa. Neliöjuurella on mm. seuraavat ominaisuudet. ab = a b, a 0, b 0 a a b =, a 0, b > 0 b a2 = a a > b, a
811312A Tietorakenteet ja algoritmit Kertausta kurssin alkuosasta
811312A Tietorakenteet ja algoritmit 2016-2017 Kertausta kurssin alkuosasta II Algoritmien analyysi: oikeellisuus Algoritmin täydellinen oikeellisuus = Algoritmi päättyy ja tuottaa määritellyn tuloksen
Matematiikan tukikurssi
Matematiikan tukikurssi Kurssikerta 8 1 Derivaatta Tarkastellaan funktion f keskimääräistä muutosta tietyllä välillä ( 0, ). Funktio f muuttuu tällä välillä määrän. Kun tämä määrä jaetaan välin pituudella,
Algoritmit 1. Luento 12 Ke Timo Männikkö
Algoritmit 1 Luento 12 Ke 15.2.2017 Timo Männikkö Luento 12 Pikalajittelu Pikalajittelun vaativuus Osittamisen tasapainoisuus Lajittelumenetelmien vaativuus Laskentalajittelu Lokerolajittelu Kantalukulajittelu
Algoritmit 1. Luento 11 Ti Timo Männikkö
Algoritmit 1 Luento 11 Ti 14.2.2017 Timo Männikkö Luento 11 Algoritminen ongelmanratkaisu Osittaminen Lomituslajittelu Lomituslajittelun vaativuus Rekursioyhtälöt Pikalajittelu Algoritmit 1 Kevät 2017
2.2 Täydellinen yhtälö. Ratkaisukaava
. Täydellinen yhtälö. Ratkaisukaava Tulon nollasäännöstä näkee silloin tällöin omituisia sovellutuksia. Jotkut näet ajattelevat, että on olemassa myöskin tulon -sääntö tai tulon "mikä-tahansa"- sääntö.
Dynaaminen optimointi
Dynaaminen optimointi Tapa ratkaista optimointitehtävä Tehtävä ratkaistaan vaiheittain ja vaiheet yhdistetään rekursiivisesti Perustuu optimaalisuusperiaatteeseen: Optimaalisen ratkaisupolun loppuosa on
811312A Tietorakenteet ja algoritmit, 2015-2016, Harjoitus 2, Ratkaisu
8111A Tietoraketeet ja algoritmit, 15-16, Harjoitus, Ratkaisu Harjoituksessa käsitellää asymptoottista merkitätapaa ja algoritmie aikakompleksisuutta. Tehtävä.1 a Oko f ( O( tai f (, ku 1 f ( f, 4 ( 5
Luonnollisten lukujen laskutoimitusten määrittely Peanon aksioomien pohjalta
Simo K. Kivelä, 15.4.2003 Luonnollisten lukujen laskutoimitusten määrittely Peanon aksioomien pohjalta Aksioomat Luonnolliset luvut voidaan määritellä Peanon aksioomien avulla. Tarkastelun kohteena on
Algoritmit 2. Luento 13 Ti Timo Männikkö
Algoritmit 2 Luento 13 Ti 30.4.2019 Timo Männikkö Luento 13 Simuloitu jäähdytys Merkkijonon sovitus Horspoolin algoritmi Ositus ja rekursio Rekursion toteutus Algoritmit 2 Kevät 2019 Luento 13 Ti 30.4.2019
Tietorakenteet, laskuharjoitus 7, ratkaisuja
Tietorakenteet, laskuharjoitus, ratkaisuja. Seuraava kuvasarja näyttää B + -puun muutokset lisäysten jälkeen. Avaimet ja 5 mahtuvat lehtisolmuihin, joten niiden lisäys ei muuta puun rakennetta. Avain 9
Algoritmit 1. Luento 10 Ke Timo Männikkö
Algoritmit 1 Luento 10 Ke 14.2.2018 Timo Männikkö Luento 10 Algoritminen ongelmanratkaisu Suunnittelumenetelmät Raaka voima Järjestäminen eli lajittelu Kuplalajittelu Lisäyslajittelu Valintalajittelu Permutaatiot
monissa laskimissa luvun x käänteisluku saadaan näyttöön painamalla x - näppäintä.
.. Käänteisunktio.. Käänteisunktio Mikäli unktio : A B on bijektio, niin joukkojen A ja B alkioiden välillä vallitsee kääntäen yksikäsitteinen vastaavuus eli A vastaa täsmälleen yksi y B, joten myös se
Esimerkki 8. Ratkaise lineaarinen yhtälöryhmä. 3x + 5y = 22 3x + 4y = 4 4x 8y = 32. 3 5 22 r 1 + r 3. 0 13 26 4 8 32 r 3 4r 1. LM1, Kesä 2014 47/68
Esimerkki 8 Ratkaise lineaarinen yhtälöryhmä 3x + 5y = 22 3x + 4y = 4 4x 8y = 32. 3 5 22 r 1 + r 3 3 4 4 4 8 32 1 3 10 0 13 26 4 8 32 r 3 4r 1 1 3 10 3 4 4 r 2 3r 1 4 8 32 1 3 10 0 13 26 r 2 /13 0 4 8
Kenguru 2016 Mini-Ecolier (2. ja 3. luokka) Ratkaisut
sivu 1 / 11 TEHTÄVÄ 1 2 3 4 5 6 VASTAUS E B C D D A TEHTÄVÄ 7 8 9 10 11 12 VASTAUS E C D C E C TEHTÄVÄ 13 14 15 16 17 18 VASTAUS A B E E B A sivu 2 / 11 3 pistettä 1. Anni, Bert, Camilla, David ja Eemeli
Matematiikan tukikurssi
Matematiikan tukikurssi Kurssikerta 10 1 Sarjakehitelmiä Palautetaan mieliin, että potenssisarja on sarja joka on muotoa a n (x x 0 ) n = a 0 + a 1 (x x 0 ) + a 2 (x x 0 ) 2 + a 3 (x x 0 ) 3 +. n=0 Kyseinen
815338A Ohjelmointikielten periaatteet 2014-2015. Harjoitus 7 Vastaukset
815338A Ohjelmointikielten periaatteet 2014-2015. Harjoitus 7 Vastaukset Harjoituksen aiheena on funktionaalinen ohjelmointi Scheme- ja Haskell-kielillä. Voit suorittaa ohjelmat osoitteessa https://ideone.com/
10. Painotetut graafit
10. Painotetut graafit Esiintyy monesti sovelluksia, joita on kätevä esittää graafeina. Tällaisia ovat esim. tietoverkko tai maantieverkko. Näihin liittyy erinäisiä tekijöitä. Tietoverkkoja käytettäessä
4 Tehokkuus ja algoritmien suunnittelu
TIE-20100 Tietorakenteet ja algoritmit 52 4 Tehokkuus ja algoritmien suunnittelu Tässä luvussa pohditaan tehokkuuden käsitettä ja esitellään kurssilla käytetty kertaluokkanotaatio, jolla kuvataan algoritmin
Algoritmit ja tietorakenteet Copyright Hannu Laine. 1, kun n= 0. n*(n-1)!, kun n>0;
1 Rekursio Rekursion periaate ja rekursio määrittelyvälineenä Rekursiota käytetään tietotekniikassa ja matematiikassa erilaisiin tarkoituksiin. Eräänä käyttöalueena on asioiden määrittely. Esimerkkinä
Tietorakenteet ja algoritmit - syksy 2015 1
Tietorakenteet ja algoritmit - syksy 2015 1 Tietorakenteet ja algoritmit - syksy 2015 2 Tietorakenteet ja algoritmit Johdanto Ari Korhonen Tietorakenteet ja algoritmit - syksy 2015 1. JOHDANTO 1.1 Määritelmiä
Ohjelmoinnin peruskurssi Y1
Ohjelmoinnin peruskurssi Y1 CSE-A1111 30.9.2015 CSE-A1111 Ohjelmoinnin peruskurssi Y1 30.9.2015 1 / 27 Mahdollisuus antaa luentopalautetta Goblinissa vasemmassa reunassa olevassa valikossa on valinta Luentopalaute.
1. (a) Seuraava algoritmi tutkii, onko jokin luku taulukossa monta kertaa:
Tietorakenteet, laskuharjoitus 10, ratkaisuja 1. (a) Seuraava algoritmi tutkii, onko jokin luku taulukossa monta kertaa: SamaLuku(T ) 2 for i = 1 to T.length 1 3 if T [i] == T [i + 1] 4 return True 5 return
Matematiikan tukikurssi 3.4.
Matematiikan tukikurssi 3.4. Neliömuodot, Hessen matriisi, deiniittisyys, konveksisuus siinä tämän dokumentin aiheet. Neliömuodot ovat unktioita, jotka ovat muotoa T ( x) = x Ax, missä x = (x 1,, x n )
Graafit ja verkot. Joukko solmuja ja joukko järjestämättömiä solmupareja. eli haaroja. Joukko solmuja ja joukko järjestettyjä solmupareja eli kaaria
Graafit ja verkot Suuntamaton graafi: eli haaroja Joukko solmuja ja joukko järjestämättömiä solmupareja Suunnattu graafi: Joukko solmuja ja joukko järjestettyjä solmupareja eli kaaria Haaran päätesolmut:
811312A Tietorakenteet ja algoritmit, , Harjoitus 3, Ratkaisu
811312A Tietorakenteet ja algoritmit, 2018-2019, Harjoitus 3, Ratkaisu Harjoituksessa käsitellään algoritmien aikakompleksisuutta. Tehtävä 3.1 Kuvitteelliset algoritmit A ja B lajittelevat syötteenään
Algoritmit 2. Luento 13 Ti Timo Männikkö
Algoritmit 2 Luento 13 Ti 2.5.2017 Timo Männikkö Luento 13 Merkkijonon sovitus Horspoolin algoritmi Laskennallinen vaativuus Päätösongelmat Epädeterministinen algoritmi Vaativuusluokat NP-täydellisyys
Valitaan alkio x 1 A B ja merkitään A 1 = A { x 1 }. Perinnöllisyyden nojalla A 1 I.
Vaihto-ominaisuudella on seuraava intuition kannalta keskeinen seuraus: Olkoot A I ja B I samankokoisia riippumattomia joukkoja: A = B = m jollain m > 0. Olkoon vielä n = m A B, jolloin A B = B A = n.
Induktio kaavan pituuden suhteen
Induktio kaavan pituuden suhteen Lauselogiikan objektikieli määritellään kurssilla Logiikka 1B seuraavasti: 1. Lausemuuttujat p 1, p 2, p 3,... ovat kaavoja. 2. Jos A on kaava, niin A on kaava. 3. Jos
Tietorakenteet ja algoritmit Johdanto Lauri Malmi / Ari Korhonen
Tietorakenteet ja algoritmit Johdanto Lauri Malmi / Ari 1 1. JOHDANTO 1.1 Määritelmiä 1.2 Tietorakenteen ja algoritmin valinta 1.3 Algoritmit ja tiedon määrä 1.4 Tietorakenteet ja toiminnot 1.5 Esimerkki:
12. Algoritminsuunnittelun perusmenetelmiä
12. Algoritminsuunnittelun perusmenetelmiä Ei vain toteuteta tietorakenteita algoritmeilla, vaan myös tietorakenteita käytetään tyypillisesti erilaisten algoritmien yhteydessä. Kun nämä tietojenkäsittelytieteen
12. Algoritminsuunnittelun perusmenetelmiä
12. Algoritminsuunnittelun perusmenetelmiä Ei vain toteuteta tietorakenteita algoritmeilla, vaan myös tietorakenteita käytetään tyypillisesti erilaisten algoritmien yhteydessä. Kun nämä tietojenkäsittelytieteen
Esimerkkejä derivoinnin ketjusäännöstä
Esimerkkejä derivoinnin ketjusäännöstä (5.9.008 versio 1.0) Esimerkki 1 Määritä funktion f(x) = (x 5) derivaattafunktio. Funktio voidaan tulkita yhdistettynä funktiona, jonka ulko- ja sisäfunktiot ovat
1 Erilaisia tapoja järjestää
TIE-20100 Tietorakenteet ja algoritmit 1 1 Erilaisia tapoja järjestää Käsitellään seuraavaksi järjestämisalgoritmeja, jotka perustuvat muihin kuin vertailuun alkioiden oikean järjestyksen saamiseksi. Lisäksi
815338A Ohjelmointikielten periaatteet Harjoitus 6 Vastaukset
815338A Ohjelmointikielten periaatteet 2015-2016. Harjoitus 6 Vastaukset Harjoituksen aiheena on funktionaalinen ohjelmointi Scheme- ja Haskell-kielillä. Voit suorittaa ohjelmat osoitteessa https://ideone.com/
811120P Diskreetit rakenteet
811120P Diskreetit rakenteet 2016-2017 ari.vesanen (at) oulu.fi 5. Rekursio ja induktio Rekursio tarkoittaa jonkin asian määrittelyä itseensä viittaamalla Tietojenkäsittelyssä algoritmin määrittely niin,
VALTIOTIETEELLINEN TIEDEKUNTA TILASTOTIETEEN VALINTAKOE 7.6.2011 Ratkaisut ja arvostelu
VALTIOTIETEELLINEN TIEDEKUNTA TILASTOTIETEEN VALINTAKOE 7.6.2011 Ratkaisut ja arvostelu 1.1 Noudattakoon satunnaismuuttuja X normaalijakaumaa a) b) c) d) N(5, 15). Tällöin P (1.4 < X 12.7) on likimain
String-vertailusta ja Scannerin käytöstä (1/2) String-vertailusta ja Scannerin käytöstä (2/2) Luentoesimerkki 4.1
String-vertailusta ja Scannerin käytöstä (1/2) Vertailuja tehdessä törmätään usein tilanteeseen, jossa merkkijonoa (esimerkiksi merkkijonomuuttujaa) pitää vertailla toiseen merkkijonoon. Tällöin tavanomainen
Algoritmit 2. Luento 8 To Timo Männikkö
Algoritmit 2 Luento 8 To 4.4.2019 Timo Männikkö Luento 8 Algoritmien analysointi Algoritmien suunnittelu Rekursio Osittaminen Rekursioyhtälöt Rekursioyhtälön ratkaiseminen Master-lause Algoritmit 2 Kevät
811312A Tietorakenteet ja algoritmit , Harjoitus 2 ratkaisu
811312A Tietorakenteet ja algoritmit 2017-2018, Harjoitus 2 ratkaisu Harjoituksen aiheena on algoritmien oikeellisuus. Tehtävä 2.1 Kahvipurkkiongelma. Kahvipurkissa P on valkoisia ja mustia kahvipapuja,
MS-A0004 - Matriisilaskenta Laskuharjoitus 3
MS-A0004 - Matriisilaskenta Laskuharjoitus 3 atkaisut Tehtävä Merkitään matriisin rivejä, 2 ja 3. Gaussin eliminoinnilla saadaan 3 5 4 7 3 5 4 7 3 2 4 2+ 0 3 0 6 6 8 4 3+2 2 0 3 0 6 3 5 4 7 0 3 0 6 3+
Kenguru 2006 sivu 1 Benjamin 6. ja 7. luokka ratkaisut
Kenguru 2006 sivu 1 3:n pisteen tehtävät 1. 3 2006 = 2005 + 2007 +?. Valitse sopiva luku?-merkin paikalle. A) 2005 B) 2006 C) 2007 D) 2008 E) 2009 2. Viereisiin kortteihin on kirjoitettu kuusi lukua. Mikä
Algoritmit 1. Luento 3 Ti Timo Männikkö
Algoritmit 1 Luento 3 Ti 17.1.2017 Timo Männikkö Luento 3 Algoritmin analysointi Rekursio Lomituslajittelu Aikavaativuus Tietorakenteet Pino Algoritmit 1 Kevät 2017 Luento 3 Ti 17.1.2017 2/27 Algoritmien
Algoritmit 2. Luento 14 Ke Timo Männikkö
Algoritmit 2 Luento 14 Ke 3.5.2017 Timo Männikkö Luento 14 Ositus ja rekursio Rekursion toteutus Kertaus ja tenttivinkit Algoritmit 2 Kevät 2017 Luento 14 Ke 3.5.2017 2/30 Ositus Tehtävän esiintymä ositetaan
Esimerkkejä polynomisista ja ei-polynomisista ongelmista
Esimerkkejä polynomisista ja ei-polynomisista ongelmista Ennen yleisempiä teoriatarkasteluja katsotaan joitain tyypillisiä esimerkkejä ongelmista ja niiden vaativuudesta kaikki nämä ongelmat ratkeavia
MAA10 HARJOITUSTEHTÄVIÄ
MAA0 Määritä se funktion f: f() = + integraalifunktio, jolle F() = Määritä se funktion f : f() = integraalifunktio, jonka kuvaaja sivuaa suoraa y = d Integroi: a) d b) c) d d) Määritä ( + + 8 + a) d 5
Algoritmit 1. Luento 13 Ma Timo Männikkö
Algoritmit 1 Luento 13 Ma 26.2.2018 Timo Männikkö Luento 13 Suunnittelumenetelmät Taulukointi Kapsäkkiongelma Ahne menetelmä Verkon lyhimmät polut Dijkstran menetelmä Verkon lyhin virittävä puu Kruskalin
Luku 8. Aluekyselyt. 8.1 Summataulukko
Luku 8 Aluekyselyt Aluekysely on tiettyä taulukon väliä koskeva kysely. Tyypillisiä aluekyselyitä ovat, mikä on taulukon välin lukujen summa tai pienin luku välillä. Esimerkiksi seuraavassa taulukossa
Numeeriset menetelmät
Numeeriset menetelmät Luento 9 Ti 4.10.2011 Timo Männikkö Numeeriset menetelmät Syksy 2011 Luento 9 Ti 4.10.2011 p. 1/44 p. 1/44 Funktion approksimointi Etsitään p siten, että p f, mutta ei vaadita, että
Harjoitus 6 ( )
Harjoitus 6 (21.4.2015) Tehtävä 1 Määritelmän (ks. luentomoniste s. 109) mukaan yleisen, muotoa min f(x) s. t. g(x) 0 h(x) = 0 x X olevan optimointitehtävän Lagrangen duaali on missä max θ(u, v) s. t.
3. Hakupuut. B-puu on hakupuun laji, joka sopii mm. tietokantasovelluksiin, joissa rakenne on talletettu kiintolevylle eikä keskusmuistiin.
3. Hakupuut Hakupuu on listaa tehokkaampi dynaamisen joukon toteutus. Erityisesti suurilla tietomäärillä hakupuu kannattaa tasapainottaa, jolloin päivitysoperaatioista tulee hankalampia toteuttaa mutta
Algoritmit 2. Luento 6 To Timo Männikkö
Algoritmit 2 Luento 6 To 28.3.2019 Timo Männikkö Luento 6 B-puun operaatiot Nelipuu Trie-rakenteet Standarditrie Pakattu trie Algoritmit 2 Kevät 2019 Luento 6 To 28.3.2019 2/30 B-puu 40 60 80 130 90 100
Taloustieteen perusteet 31A00110 2016 Mallivastaukset 3, viikko 4
Taloustieteen perusteet 31A00110 2016 Mallivastaukset 3, viikko 4 1. Tarkastellaan pulloja valmistavaa yritystä, jonka päiväkohtainen tuotantofunktio on esitetty alla olevassa taulukossa. L on työntekijöiden
Oletetaan, että funktio f on määritelty jollakin välillä ]x 0 δ, x 0 + δ[. Sen derivaatta pisteessä x 0 on
Derivaatta Erilaisia lähestymistapoja: geometrinen (käyrän tangentti sekanttien raja-asentona) fysikaalinen (ajasta riippuvan funktion hetkellinen muutosnopeus) 1 / 13 Derivaatan määritelmä Määritelmä
Algoritmien suunnittelu ja analyysi (kevät 2004) 1. välikoe, ratkaisuja
58053-7 Algoritmien suunnittelu ja analyysi (kevät 2004) 1. välikoe, ratkaisuja Malliratkaisut ja pisteytysohje: Jyrki Kivinen Tentin arvostelu: Jouni Siren (tehtävät 1 ja 2) ja Jyrki Kivinen (tehtävät
Algoritmit 2. Luento 12 To Timo Männikkö
Algoritmit 2 Luento 12 To 3.5.2018 Timo Männikkö Luento 12 Geneettiset algoritmit Simuloitu jäähdytys Merkkijonon sovitus Horspoolin algoritmi Algoritmit 2 Kevät 2018 Luento 12 To 3.5.2018 2/35 Algoritmien
Algoritmit 1. Luento 8 Ke Timo Männikkö
Algoritmit 1 Luento 8 Ke 1.2.2017 Timo Männikkö Luento 8 Järjestetty binääripuu Solmujen läpikäynti Binääripuun korkeus Binääripuun tasapainottaminen Graafit ja verkot Verkon lyhimmät polut Fordin ja Fulkersonin
Algoritmit 2. Luento 7 Ti Timo Männikkö
Algoritmit 2 Luento 7 Ti 4.4.2017 Timo Männikkö Luento 7 Joukot Joukko-operaatioita Joukkojen esitystapoja Alkiovieraat osajoukot Toteutus puurakenteena Algoritmit 2 Kevät 2017 Luento 7 Ti 4.4.2017 2/26
Algoritmit 2. Demot Timo Männikkö
Algoritmit 2 Demot 4 24.-25.4.2019 Timo Männikkö Tehtävä 1 (a) int laske(n) { if (n
ja λ 2 = 2x 1r 0 x 2 + 2x 1r 0 x 2
Johdatus diskreettiin matematiikkaan Harjoitus 4, 7.10.2015 1. Olkoot c 0, c 1 R siten, että polynomilla r 2 c 1 r c 0 on kaksinkertainen juuri. Määritä rekursioyhtälön x n+2 = c 1 x n+1 + c 0 x n, n N,
ALGORITMIT 1 DEMOVASTAUKSET KEVÄT 2012
ALGORITMIT 1 DEMOVASTAUKSET KEVÄT 2012 1.1. (a) Jaettava m, jakaja n. Vähennetään luku n luvusta m niin kauan kuin m pysyy ei-negatiivisena. Jos jäljelle jää nolla, jaettava oli tasan jaollinen. int m,
Marjan makuisia koruja rautalangasta ja helmistä -Portfolio
Marjan makuisia koruja rautalangasta ja helmistä -Portfolio Saara Lohi 2007 Suunnittelu ja tavoitteet Suunnittelun lähtökohtana oli kuva pihlajanmarjoista pajumatolla. Tavoitteena on suunnitella ja toteuttaa
Algoritmit 2. Luento 6 Ke Timo Männikkö
Algoritmit 2 Luento 6 Ke 29.3.2017 Timo Männikkö Luento 6 B-puun operaatiot B-puun muunnelmia Nelipuu Trie-rakenteet Standarditrie Pakattu trie Algoritmit 2 Kevät 2017 Luento 6 Ke 29.3.2017 2/31 B-puu
Algoritmit 1. Demot Timo Männikkö
Algoritmit 1 Demot 2 1.-2.2.2017 Timo Männikkö Tehtävä 1 (a) Ei-rekursiivinen algoritmi: laskesumma(t, n) sum = t[0]; for (i = 1; i < n; i++) sum = sum + t[i]; return sum; Silmukka suoritetaan n 1 kertaa
JOENSUUN SEUDUN HANKINTATOIMI KOMISSIOMALLI 28.03.2014
JOENSUUN SEUDUN HANKINTATOIMI KOMISSIOMALLI 28.03.2014 KOMISSIO Komissio otetaan käyttöön kaikissa kilpailutuksissa, joiden hankintakausi alkaa 1.1.2012 tai sen jälkeen Raha liikkuu Joensuun seudun hankintatoimen
58131 Tietorakenteet (kevät 2009) Harjoitus 11, ratkaisuja (Topi Musto)
811 Tietorakenteet (kevät 9) Harjoitus 11, ratkaisuja (Topi Musto) 1. Bellmanin-Fordin algoritmin alustusvaiheen jälkeen aloitussolmussa on arvo ja muissa solmuissa on arvo ääretön. Kunkin solmun arvo
Johdatus diskreettiin matematiikkaan Harjoitus 5, Ratkaise rekursioyhtälö
Johdatus diskreettiin matematiikkaan Harjoitus 5, 14.10.2015 1. Ratkaise rekursioyhtälö x n+4 2x n+2 + x n 16( 1) n, n N, alkuarvoilla x 1 2, x 2 14, x 3 18 ja x 4 42. Ratkaisu. Vastaavan homogeenisen
1 2 x2 + 1 dx. (2p) x + 2dx. Kummankin integraalin laskeminen oikein (vastaukset 12 ja 20 ) antaa erikseen (2p) (integraalifunktiot
Helsingin yliopisto, Itä-Suomen yliopisto, Jyväskylän yliopisto, Oulun yliopisto, Tampereen yliopisto ja Turun yliopisto Matematiikan valintakoe (Ratkaisut ja pisteytys) 500 Kustakin tehtävästä saa maksimissaan
Algoritmi on periaatteellisella tasolla seuraava:
Algoritmi on periaatteellisella tasolla seuraava: Dijkstra(V, E, l, v 0 ): S := { v 0 } D[v 0 ] := 0 for v V S do D[v] := l(v 0, v) end for while S V do valitse v V S jolle D[v] on minimaalinen S := S
Algoritmit 2. Luento 2 To Timo Männikkö
Algoritmit 2 Luento 2 To 14.3.2019 Timo Männikkö Luento 2 Tietorakenteet Lineaarinen lista, binääripuu Prioriteettijono Kekorakenne Keko-operaatiot Keon toteutus taulukolla Algoritmit 2 Kevät 2019 Luento
Algoritmit 1. Luento 1 Ti Timo Männikkö
Algoritmit 1 Luento 1 Ti 10.1.2017 Timo Männikkö Luento 1 Algoritmi Algoritmin toteutus Ongelman ratkaiseminen Algoritmin tehokkuus Algoritmin suoritusaika Algoritmin analysointi Algoritmit 1 Kevät 2017
Eksponenttifunktion Laplace muunnos Lasketaan hetkellä nolla alkavan eksponenttifunktion Laplace muunnos eli sijoitetaan muunnoskaavaan
Laplace muunnos Hieman yksinkertaistaen voisi sanoa, että Laplace muunnos muuttaa derivaatan kertolaskuksi ja integroinnin jakolaskuksi. Tältä kannalta katsottuna Laplace muunnoksen hyödyllisyyden ymmärtää;
Tarkennamme geneeristä painamiskorotusalgoritmia
Korotus-eteen-algoritmi (relabel-to-front) Tarkennamme geneeristä painamiskorotusalgoritmia kiinnittämällä tarkasti, missä järjestyksessä Push- ja Raise-operaatioita suoritetaan. Algoritmin peruskomponentiksi
Liite 2: Verkot ja todennäköisyyslaskenta
Ilkka Mellin Todennäköisyyslaskenta Liite 2: Verkot ja todennäköisyyslaskenta Verkot TKK (c) Ilkka Mellin (2007) 1 Verkko eli graafi: Määritelmä 1/2 Verkko eli graafi muodostuu pisteiden joukosta V, särmien
Malliratkaisut Demot
Malliratkaisut Demot 6 24.4.2017 Tehtävä 1 Määritelmän (ks. luentomonisteen s. 107) mukaan yleisen muotoa min f(x) s.t. g(x) 0 h(x) = 0 x X (1) olevan optimointitehtävän Lagrangen duaali on min θ(u,v)
Harjoitus 3 (3.4.2014)
Harjoitus 3 (3..) Tehtävä Olkoon kaaren paino c ij suurin sallittu korkeus tieosuudella (i, j). Etsitään reitti solmusta s solmuun t siten, että reitin suurin sallittu korkeus pienimmillään olisi mahdollisimman
Algoritmit 1. Demot Timo Männikkö
Algoritmit 1 Demot 2 7.-8.2.2018 Timo Männikkö Tehtävä 1 (a) Ei-rekursiivinen algoritmi: etsipienin(t, n) { pnn = t[0]; for (i = 1; i < n; i++) { pnn = min(pnn, t[i]); return pnn; Silmukka suoritetaan
f(n) = Ω(g(n)) jos ja vain jos g(n) = O(f(n))
Määritelmä: on O(g(n)), jos on olemassa vakioarvot n 0 > 0 ja c > 0 siten, että c g(n) kun n > n 0 O eli iso-o tai ordo ilmaisee asymptoottisen ylärajan resurssivaatimusten kasvun suuruusluokalle Samankaltaisia
Algoritmit 2. Luento 3 Ti Timo Männikkö
Algoritmit 2 Luento 3 Ti 20.3.2018 Timo Männikkö Luento 3 Järjestäminen eli lajittelu Kekorakenne Kekolajittelu Hajautus Yhteentörmäysten käsittely Ketjutus Algoritmit 2 Kevät 2018 Luento 3 Ti 20.3.2018
Algoritmit 2. Luento 2 Ke Timo Männikkö
Algoritmit 2 Luento 2 Ke 15.3.2017 Timo Männikkö Luento 2 Tietorakenteet Lineaarinen lista, binääripuu Prioriteettijono Kekorakenne Keko-operaatiot Keon toteutus taulukolla Algoritmit 2 Kevät 2017 Luento
30 + x. 15 + 0,5x = 2,5 + x 0,5x = 12,5 x = 25. 27,5a + 27,5b = 1,00 55 = 55. 2,5a + (30 2,5)b (27,5a + 27,5b) = 45 55.
RATKAISUT, Insinöörimatematiikan koe 1.5.201 1. Kahdessa astiassa on bensiinin ja etanolin seosta. Ensimmäisessä astiassa on 10 litraa seosta, jonka tilavuudesta 5 % on etanolia. Toisessa astiassa on 20
Algoritmit 2. Luento 9 Ti Timo Männikkö
Algoritmit 2 Luento 9 Ti 19.4.2016 Timo Männikkö Luento 9 Merkkitiedon tiivistäminen LZW-menetelmä Taulukointi Editointietäisyys Peruutus Verkon 3-väritys Algoritmit 2 Kevät 2016 Luento 9 Ti 19.4.2016