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 analysointi Määritellään ohjelman/algoritmin yksittäisten käskyjen/askelien asymptoottinen vaativuus Yhdistetään peräkkäin suoritettavien käskyjen/askelien vaativuudet Huomioidaan ehtolauseet, silmukat ja muut rakenteet Algoritmit 1 Kevät 2017 Luento 3 Ti 17.1.2017 3/27
Perusoperaatiot Sijoituslause: Yleensä vakioaika O(1) Peräkkäiset lauseet: Lasketaan yhteen yksittäisten lauseiden suoritusaika Ehtolause: Ehtolausekkeen suoritusaika + ehdollisesti suoritettujen lauseiden maksimisuoritusaika Silmukka: Silmukkalauseen lausekkeiden suoritusaika + silmukan rungon suoritusaika summattuna yli silmukan suorituskertojen Algoritmit 1 Kevät 2017 Luento 3 Ti 17.1.2017 4/27
Aliohjelmat Ei-rekursiiviset aliohjelmakutsut: Selvitetään alimman tason aliohjelmien suoritusaika (eivät sisällä aliohjelmakutsuja) Selvitetään seuraavan tason aliohjelmien suoritusaika (sisältävät vain sellaisten aliohjelmien kutsuja, joiden suoritusaika jo selvitetty) Jatketaan kunnes kaikkien aliohjelmien suoritusajat selvitetty Algoritmit 1 Kevät 2017 Luento 3 Ti 17.1.2017 5/27
Rekursio Algoritmi/aliohjelma kutsuu itseään Ongelma jaetaan pienempiin vastaavanlaisiin osaongelmiin, jotka ratkaistaan rekursiivilla kutsuilla Yksi vahvimmista ratkaisumenetelmistä Monet ongelmat luonnostaan rekursiivisia tai ne voidaan kuvata rekursiivisesti Algoritmit 1 Kevät 2017 Luento 3 Ti 17.1.2017 6/27
Rekursiiviset algoritmit Algoritmin kutsu annetulla ongelmalla: Jos pieni yksinkertainen ongelma Ratkaistaan se ja palautetaan ratkaisu Muutoin jaetaan ongelma pienempiin vastaavanlaisiin ongelmiin Ratkaistaan ne rekursiivisilla kutsuilla Muodostetaan pienempien ongelmien ratkaisuista tämän kutsun ongelman ratkaisu Algoritmit 1 Kevät 2017 Luento 3 Ti 17.1.2017 7/27
Lomituslajittelu Oletus: Järjestettäviä alkioita n = 2 k Jaetaan järjestettävät alkiot kahteen osajoukkoon Osajoukoissa n/2 alkiota Osajoukot lajitellaan rekursiivisesti Rekursio lopetetaan, kun osajoukossa on yksi alkio Yhdistetään kahden järjestetyn osajoukon alkiot lomittamalla Algoritmit 1 Kevät 2017 Luento 3 Ti 17.1.2017 8/27
Lomituslajittelu Merge_sort(a, l, h) { if (l < h) { k = (l + h)/2; Merge_sort(a, l, k); Merge_sort(a, k+1, h); Merge(a, l, k, h); } } Merge(a, l, k, h) // Lomitetaan alkiot l,...,k ja // k+1,...,h järjestykseen Algoritmit 1 Kevät 2017 Luento 3 Ti 17.1.2017 9/27
Lomituslajittelu: Esimerkki 20 6 12 17 14 9 23 15 20 6 12 17 14 9 23 15 20 6 12 17 14 9 23 15 20 6 12 17 14 9 23 15 6 20 12 17 14 9 23 15 6 20 12 17 14 9 23 15 6 20 12 17 14 9 23 15 6 12 17 20 14 9 23 15 Algoritmit 1 Kevät 2017 Luento 3 Ti 17.1.2017 10/27
Lomituslajittelu: Esimerkki jatkuu 6 12 17 20 14 9 23 15 6 12 17 20 14 9 23 15 6 12 17 20 14 9 23 15 6 12 17 20 9 14 23 15 6 12 17 20 9 14 23 15 6 12 17 20 9 14 15 23 6 12 17 20 9 14 15 23 6 9 12 14 15 17 20 23 Algoritmit 1 Kevät 2017 Luento 3 Ti 17.1.2017 11/27
Lomituslajittelun vaativuus Merkitään: T (n) = suoritusajan pahimman tapauksen vaativuus, kun syöttötiedon koko n alkiota Ehtolauseen ja sijoituslauseen suoritukset: vakioaika b Rekursiivisten kutsujen suoritukset: kaksi kutsua T (n/2) Lomitus voidaan tehdä lineaarisessa ajassa: cn jollain vakiolla c Algoritmit 1 Kevät 2017 Luento 3 Ti 17.1.2017 12/27
Lomituslajittelun vaativuus T (n) = { b, jos n = 1 2T ( n ) + cn, jos n > 1 2... T (n) = O(n log n) Algoritmit 1 Kevät 2017 Luento 3 Ti 17.1.2017 13/27
Lajittelumenetelmien vaativuus Yksinkertaisia (raakaan voimaan perustuvia) lajittelumenetelmiä: Kuplalajittelu, lisäyslajittelu, valintalajittelu Vaativuus O(n 2 ) Osittamiseen perustuvia lajittelumenetelmiä: Lomituslajittelu, pikalajittelu Vaativuus O(n log n) Algoritmit 1 Kevät 2017 Luento 3 Ti 17.1.2017 14/27
Lajittelumenetelmien vaativuus Esimerkki: Tietokone suorittaa 100 000 000 käskyä sekunnissa Järjestettävänä 1 000 000 alkiota Yksinkertainen lajittelumenetelmä: 2n 2 käskyä 5.56 tuntia Osittamiseen perustuva lajittelumenetelmä: 50n log n käskyä 10 sekuntia Algoritmit 1 Kevät 2017 Luento 3 Ti 17.1.2017 15/27
Aikavaativuusanalyysi: Huomioita Muut seikat voivat olla tärkeämpiä kuin suoritusaika: Käytettävyys, modulaarisuus, siirrettävyys, yksinkertaisuus, laajennettavuus jne. Algoritmien käyttäytyminen voi olla keskimäärin huomattavasti parempaa kuin pahimmassa tapauksessa Jos algoritmia käytetään kerran tai pari, helpommin/halvemmin toteutettava algoritmi voi olla parempi valinta Algoritmit 1 Kevät 2017 Luento 3 Ti 17.1.2017 16/27
Aikavaativuusanalyysi: Huomioita (jatkuu) Jos algoritmia käytetään vain pienillä n, suoritusajan funktion termien kertoimilla voi olla suurempi vaikutus kuin funktion kasvunopeudella Tehokkain algoritmi voi olla liian monimutkainen toteutettavaksi Suuri muistitilan tarve tai erilaisten muistien käyttö voi hidastaa algoritmin toimintaa Algoritmeilla voi olla muita tärkeitä vaatimuksia, esim. numeerinen tarkkuus Algoritmit 1 Kevät 2017 Luento 3 Ti 17.1.2017 17/27
Muistitilan analysointi Muistitilaa tarvitaan: Ohjelmakoodille Käsiteltävälle datalle Kiinteä osa muistitilasta: Ei riipu ongelman esiintymästä Vaihteleva osa muistitilasta: Esiintymän data, muuttujat, työtilat, aliohjelmakutsut jne. Muistitilan tarpeen laskenta yleensä yksinkertaisempaa kuin suoritusajan laskenta Algoritmit 1 Kevät 2017 Luento 3 Ti 17.1.2017 18/27
Suoritusajan mittaaminen Empiirinen analyysi: Toteutetaan (ohjelmoidaan) algoritmi Muodostetaan testiaineistot Mitataan suoritusaikoja Voidaan selvittää muitakin asioita: Tiettyjen operaatioiden lukumäärät Muistiviittausten lukumäärät Ohjelman pullonkaulat Empiirisen analyysin tulos riippuu aina syöttötiedoista Algoritmit 1 Kevät 2017 Luento 3 Ti 17.1.2017 19/27
Tietorakenteet Algoritmin toteutus vaatii sopivan tietorakenteen Ongelman tiedot, algoritmin tiedot, työtilat Tallennustapa vaikuttaa suoritusaikaan ja muistitilan tarpeeseen Tarkastellaan tietorakenteita abstrakteina tietotyyppeinä Algoritmit 1 Kevät 2017 Luento 3 Ti 17.1.2017 20/27
Abstrakti tietotyyppi Tiedot: Mitä tietoalkioita rakenteessa on Operaatiot: Mitä tiedoilla voidaan tehdä Riippumaton tiedon esitysmuodosta ja toteutuksen ohjelmointikielestä Ei välitetä toteutuksen yksityiskohdista Erilaiset määrittelyt ja toteutukset vaikuttavat algoritmin toimintaan: Nopeus, muistitila, yksinkertaisuus, käytettävyys jne. Algoritmit 1 Kevät 2017 Luento 3 Ti 17.1.2017 21/27
Pino Pino, stack, Last-In-First-Out, LIFO Perusoperaatiot: push: Alkion lisäys pinon päällimmäiseksi pop: Alkion palautus ja poisto pinon päältä Muita mahdollisia operaatioita: isempty: Testaa onko pino tyhjä size: Palauttaa pinon alkioiden lukumäärän top: Palauttaa pinon päällimmäisen alkion ilman että se poistetaan pinosta Algoritmit 1 Kevät 2017 Luento 3 Ti 17.1.2017 22/27
Pinon käyttökohteita Pino yksinkertainen, mutta paljon käytetty Ohjelmointikielet: Kun aliohjelmaa kutsutaan, paluuosoite ja osa parametreista tallennetaan pinoon Käyttöjärjestelmät: Kun suorittimessa tapahtuu keskeytys, osa rekistereistä tallennetaan pinoon Algoritmit 1 Kevät 2017 Luento 3 Ti 17.1.2017 23/27
Esimerkki Merkkijonossa sulkumerkkejä { } [ ] ( ) Testataan, sulkeutuvatko sulut oikein Oikein: ( ) ( [ ( ) ( ) ] { ( ) } ) Pino: Väärin: [ ( ) ( ] ) ( [ ( ) ] { ( ) } ) pohja pino huippu merkkijono Algoritmit 1 Kevät 2017 Luento 3 Ti 17.1.2017 24/27
Esimerkki jatkuu 1. Pino tyhjäksi, asetutaan merkkijonon alkuun 2. Jos merkkijono loppu ja pino tyhjä, lopetetaan (sulut oikein) 3. Merkkijonosta seuraava merkki a 4. Jos a jokin vasen sulku, niin push(a) 5. Jos a jokin oikea sulku ja pinon päällä saman tyyppinen vasen sulku, niin pop() Muuten lopetetaan (sulut väärin) 6. Jos a muu merkki, ei tehdä mitään 7. Toistetaan kohdasta 2 Algoritmit 1 Kevät 2017 Luento 3 Ti 17.1.2017 25/27
Esimerkki jatkuu ( ) ( [ ( ) ( ) ] { ( ) } ) ( ) ( [ ( ) ( ) ] { ( ) } ) ( [ ( ) ( ) ] { ( ) } ) ( [ ( ) ( ) ] { ( ) } ) ( [ ( ) ( ) ] { ( ) } ) ( [ ( ) ( ) ] { ( ) } ) ( [ ( ) ] { ( ) } ) ( [ ( ) ] { ( ) } ) Algoritmit 1 Kevät 2017 Luento 3 Ti 17.1.2017 26/27
Esimerkki jatkuu ( [ ( ) ] { ( ) } ) ( [ ] { ( ) } ) ( { ( ) } ) ( { ( ) } ) ( { ( ) } ) ( { } ) ( ) Algoritmit 1 Kevät 2017 Luento 3 Ti 17.1.2017 27/27