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 useammaksi pienemmäksi esiintymäksi Osatehtävät ratkaistaan, yleensä rekursiivisesti Osatehtävien ratkaisuista kootaan alkuperäisen tehtävän ratkaisu Algoritmit 2 Kevät 2017 Luento 14 Ke 3.5.2017 3/30
Rekursio Algoritmi kutsuu itseään ratkaisun aikana Oltava lopetusehto, jotta rekursio päättyy Usein rekursiivinen ratkaisu on hyvin helppo löytää Mutta aina rekursio ei ole paras mahdollinen ratkaisu Algoritmit 2 Kevät 2017 Luento 14 Ke 3.5.2017 4/30
Rekursion toteutus Algoritmin kutsu annetulla ongelmalla: Jos pieni yksinkertainen ongelma Ratkaistaan se ja palautetaan ratkaisu Muuten jaetaan ongelma pienempiin vastaavanlaisiin ongelmiin Ratkaistaan ne rekursiivisilla kutsuilla Algoritmit 2 Kevät 2017 Luento 14 Ke 3.5.2017 5/30
Esimerkki: Taulukon summa Tehtävä: Laske taulukon lukujen summa Osittava ratkaisu: Jos taulukossa vain yksi luku, summa on tuo luku Jos taulukossa n kpl lukuja, missä n > 1 Lasketaan (n 1):n ensimmäisen luvun summa Lisätään siihen viimeinen luku Saadaan kaikkien n:n luvun summa Algoritmit 2 Kevät 2017 Luento 14 Ke 3.5.2017 6/30
Rekursiivinen ratkaisu laskesumma(t, n) { if (n == 1) return t[0]; else return (laskesumma(t, n-1) + t[n-1]); } Algoritmit 2 Kevät 2017 Luento 14 Ke 3.5.2017 7/30
Rekursiivinen ratkaisu laskesumma(t, n) { if (n == 1) return t[0]; else { alkusumma = laskesumma(t, n-1); summa = alkusumma + t[n-1]; return summa; } } Algoritmit 2 Kevät 2017 Luento 14 Ke 3.5.2017 8/30
Toteutus ohjelmointikielellä public static int laskesumma(int[] t, int n) { if (n == 1) return t[0]; else { int alkusumma = laskesumma(t, n-1); int summa = alkusumma + t[n-1]; return summa; } } Algoritmit 2 Kevät 2017 Luento 14 Ke 3.5.2017 9/30
Algoritmin toiminta Ensimmäisessä kutsussa n on koko taulukon pituus Siirrytään else-osaan Summaa ei voi laskea ennen kuin alkusumma on laskettu Tämän vaiheen suoritus jää toistaiseksi kesken Rekursiokutsu taulukon pituudella n-1 Algoritmit 2 Kevät 2017 Luento 14 Ke 3.5.2017 10/30
Algoritmin toiminta jatkuu Saman algoritmin kutsu pituudella n-1 Siirrytään else-osaan Summaa ei voi laskea ennen kuin alkusumma on laskettu Tämän vaiheen suoritus jää toistaiseksi kesken Rekursiokutsu taulukon pituudella n-2 Jne. Huom: Kaikki suoritukset jäävät kesken odottamaan rekursion päättymistä Algoritmit 2 Kevät 2017 Luento 14 Ke 3.5.2017 11/30
Algoritmin toiminta jatkuu Rekursio päättyy kun n pienenee arvoon 1 Jolloin palautetaan taulukon ensimmäinen luku Edellinen kesken jäänyt suoritus jatkuu Alkusumma saadaan paluuarvona Summa voidaan laskea Palautetaan summa Algoritmin tämän vaiheen suoritus päättynyt Algoritmit 2 Kevät 2017 Luento 14 Ke 3.5.2017 12/30
Algoritmin toiminta jatkuu Edellinen kesken jäänyt suoritus jatkuu Alkusumma saadaan paluuarvona Summa voidaan laskea Palautetaan summa Algoritmin tämän vaiheen suoritus päättynyt Jne. Huom: Kesken jääneet suoritukset päättyvät päinvastaisessa järjestyksessä Algoritmit 2 Kevät 2017 Luento 14 Ke 3.5.2017 13/30
Algoritmin toiminta jatkuu Algoritmin viimeinenkin kesken jäänyt suoritus viety loppuun Palataan sinne missä ensimmäinen kutsu tehtiin Algoritmin suoritus päättynyt Algoritmit 2 Kevät 2017 Luento 14 Ke 3.5.2017 14/30
Kertaus ja tenttivinkit Algoritmin suunnittelu: Suunnittelumenetelmät Algoritmin esitys: Sanallisesti, pseudokoodina Algoritmin analysointi: Aikavaativuuden kertaluokka Tietorakenteiden valinta: Tietoalkiot ja operaatiot Algoritmit 2 Kevät 2017 Luento 14 Ke 3.5.2017 15/30
Algoritmien analysointi Suoritusajan vaativuus: Lasketaan/arvioidaan algoritmin askelien/operaatioiden lukumääriä Määrätään suoritusajan riippuvuus syöttötiedon koosta Oleellista suoritusajan asymptoottinen kertaluokka Paras mahdollinen suoritusaika, huonoin mahdollinen suoritusaika, keskimääräinen suoritusaika Algoritmit 2 Kevät 2017 Luento 14 Ke 3.5.2017 16/30
Asymptoottinen kertaluokka Θ(g(n)) = funktiot, jotka asymptoottisesti yhtäsuuria kuin g(n) Peruskertaluokkia: Θ(1), Θ(log n), Θ(n), Θ(n log n), Θ(n 2 ), Θ(n 3 ) Yleinen polynominen: Θ(n k ) Eksponentiaalinen: Θ(2 n ) Algoritmit 2 Kevät 2017 Luento 14 Ke 3.5.2017 17/30
Prioriteettijono ja keko Minimiprioriteettijono: Perusoperaatiot (lisää alkio, poista pienin) Muita operaatioita perusoperaatioiden avulla Kekorakenne: Perusoperaatiot (lisäys, poisto) Toteutus taulukolla Aikavaativuus Algoritmit 2 Kevät 2017 Luento 14 Ke 3.5.2017 18/30
Järjestäminen eli lajittelu Kekolajittelu: Muodostetaan alkioista keko Vaihdetaan ensimmäinen ja viimeinen alkio Jätetään viimeinen alkio keon ulkopuolelle Korjataan yhtä alkiota pienemmän keon osittainen järjestys kuntoon Jatketaan kunnes keossa enää yksi alkio Kekolajittelun aikavaativuus: Keko-operaatioiden aikavaativuus Algoritmit 2 Kevät 2017 Luento 14 Ke 3.5.2017 19/30
Hajautus Yhteentörmäysten käsittely: Ketjutus Avoin osoitteenmuodostus Avoin osoitteenmuodostus: Hajautusfunktiot Lineaarinen etsintä Neliöllinen etsintä Algoritmit 2 Kevät 2017 Luento 14 Ke 3.5.2017 20/30
B-puu Astetta m oleva B-puu Perusoperaatiot (haku, lisäys, poisto) Lisäys: Poisto: Tarvittaessa solmujen halkaisu Tarvittaessa alkioiden siirto tai solmujen yhdistäminen Algoritmit 2 Kevät 2017 Luento 14 Ke 3.5.2017 21/30
Muita tietorakenteita Puut: Nelipuu Trie-rakenteet Joukot: Lista, taulukko, bittivektori Esitys ja operaatiot Algoritmit 2 Kevät 2017 Luento 14 Ke 3.5.2017 22/30
Suunnittelumenetelmät Raaka voima: Ongelman suoraviivainen ratkaiseminen Osittaminen: Ositus osatehtäviin, rekursiivinen ratkaiseminen, ratkaisun kokoaminen Taulukointi: Osatehtävien ratkaisujen taulukointi, taulukon täyttäminen vaiheittain Ahne menetelmä: Parhaimmalta näyttävän vaihtoehdon valinta Algoritmit 2 Kevät 2017 Luento 14 Ke 3.5.2017 23/30
Ositus ja rekursio Aikavaativuuden rekursioyhtälö: { c 1, kun n = 1 T (n) = at (n/b) + cn α, kun n = b k, k 1 Osituksen tasapainoisuus Rekursioyhtälön muodostaminen Master-lauseen soveltaminen (Lausetta ei tarvitse muistaa ulkoa) Algoritmit 2 Kevät 2017 Luento 14 Ke 3.5.2017 24/30
Ahneita algoritmeja Verkon lyhin virittävä puu: Kruskalin menetelmä Primin menetelmä Merkkitiedon tiivistäminen: Huffmanin koodi Algoritmit 2 Kevät 2017 Luento 14 Ke 3.5.2017 25/30
Raa an voiman algoritmeja Verkon 3-väritysongelma: Väritysvaihtoehtojen läpikäynti Peruutus Pelipuiden läpikäynti: Voittoarvojen määrittäminen Tehostaminen α-β-karsinnalla Algoritmit 2 Kevät 2017 Luento 14 Ke 3.5.2017 26/30
Heuristisia algoritmeja Kauppamatkustajan ongelma: Linin ja Kernighanin 2-vaihtoalgoritmi Geneettiset algoritmit Simuloitu jäähdytys Algoritmit 2 Kevät 2017 Luento 14 Ke 3.5.2017 27/30
Vaativuusluokat P = päätösongelmat, jotka voidaan ratkaista polynomisella algoritmilla NP = päätösongelmat, jotka voidaan ratkaista epädeterministisellä polynomisella algoritmilla Epädeterministinen arvaus Deterministinen polynominen tarkistus Algoritmit 2 Kevät 2017 Luento 14 Ke 3.5.2017 28/30
NP-täydellisyys Päätösongelman muuntaminen toiseksi päätösongelmaksi Ongelma T NP on NP-täydellinen, jos jokainen ongelma S NP voidaan muuntaa polynomisessa ajassa ongelmaksi T NP-täydelliset ongelmat: Luokan NP vaikeimmat ongelmat Algoritmit 2 Kevät 2017 Luento 14 Ke 3.5.2017 29/30
Onnea tenttiin! Algoritmit 2 Kevät 2017 Luento 14 Ke 3.5.2017 30/30