2. Algoritmien analyysi

Samankaltaiset tiedostot
811312A Tietorakenteet ja algoritmit II Algoritmien analyysi

811312A Tietorakenteet ja algoritmit , Harjoitus 1 ratkaisu

811312A Tietorakenteet ja algoritmit, , Harjoitus 4, Ratkaisu

811312A Tietorakenteet ja algoritmit, , Harjoitus 3, Ratkaisu

Matematiikan tukikurssi

Matematiikan tukikurssi

T Datasta tietoon, syksy 2005 Laskuharjoitus 8.12., ratkaisuja Jouni Seppänen

( ) k 1 = a b. b 1) Binomikertoimen määritelmän mukaan yhtälön vasen puoli kertoo kuinka monta erilaista b-osajoukkoa on a-joukolla.

Kertaa tarvittaessa induktiota ja rekursiota koskevia tietoja.

811312A Tietorakenteet ja algoritmit, , Harjoitus 2, Ratkaisu

RATKAISUT x 2 3 = x 2 + 2x + 1, eli 2x 2 2x 4 = 0, joka on yhtäpitävä yhtälön x 2 x 2 = 0. Toisen asteen yhtälön ratkaisukaavalla saadaan

Diskreetin Matematiikan Paja Ratkaisuja viikolle 4. ( ) Jeremias Berg. n(n + 1) 2. k =

Tehtäviä neliöiden ei-negatiivisuudesta

MATP153 Approbatur 1B Harjoitus 1, ratkaisut Maanantai

4.3 Signaalin autokorrelaatio

3 10 ei ole rationaaliluku.

Matematiikan tukikurssi. Kertausta 1. välikokeeseen. Tehtävät

Matematiikan tukikurssi

Insinöörimatematiikka IA

1 Eksponenttifunktion määritelmä

811312A Tietorakenteet ja algoritmit Kertausta kurssin alkuosasta

Epäyhtälöoppia matematiikkaolympialaisten tehtäviin

811312A Tietorakenteet ja algoritmit Kertausta kurssin alkuosasta

****************************************************************** ****************************************************************** 7 Esim.

LIITTEET Liite A Stirlingin kaavan tarkkuudesta...2. Liite B Lagrangen kertoimet...3

2 avulla. Derivaatta on nolla, kun. g( 3) = ( 3) 2 ( 3) 5 ( 3) + 6 ( 3) = 72 > 0. x =

Ryhmän osajoukon generoima aliryhmä ja vapaat ryhmät

811312A Tietorakenteet ja algoritmit, , Harjoitus 3, Ratkaisu

Sormenjälkimenetelmät

Algoritmit 1. Luento 3 Ti Timo Männikkö

Tehtävä 1. Voidaanko seuraavat luvut esittää kahden neliön summina? Jos voidaan, niin kuinka monella eri tavalla? (i) n = 145 (ii) n = 770.

Äärettämän sarjan (tai vain sarjan) sanotaan suppenevan eli konvergoivan, jos raja-arvo lims

Otantajakauma. Otantajakauman käyttö päättelyssä. Otantajakauman käyttö päättelyssä

4 Tehokkuus ja algoritmien suunnittelu

Algebra I Matematiikan ja tilastotieteen laitos Ratkaisuehdotuksia harjoituksiin 5 (6 sivua)

Noora Nieminen. Hölderin epäyhtälö

811312A Tietorakenteet ja algoritmit , Harjoitus 2 ratkaisu

Solmu 3/ toteutuu kaikilla u,v I ja λ ]0,1[. Se on aidosti konveksi, jos. f ( λu+(1 λ)v ) < λf(u)+(1 λ)f(v) (2)

811312A Tietorakenteet ja algoritmit I Johdanto

Algoritmit 2. Luento 8 To Timo Männikkö

5. Lineaarisen optimoinnin perusprobleemat

Otantajakauman käyttö päättelyssä

Analyysi A. Harjoitustehtäviä lukuun 1 / kevät 2018

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

1. (Jatkoa Harjoitus 5A tehtävään 4). Monisteen esimerkin mukaan momenttimenetelmän. n ne(y i Y (n) ) = 2E(Y 1 Y (n) ).

3 x < < 3 x < < x < < x < 9 2.

3 Lukujonot matemaattisena mallina

HY, MTL / Matemaattisten tieteiden kandiohjelma Todennäköisyyslaskenta IIb, syksy 2018 Harjoitus 3 Ratkaisuehdotuksia.

Tietorakenteet ja algoritmit - syksy

Algoritmit 1. Demot Timo Männikkö

Algoritmit 1. Luento 2 Ke Timo Männikkö

Tunnuslukuja 27 III TUNNUSLUKUJA

Eräs matematiikassa paljon hyödynnetty summa on ns. luonnollisten lukujen neliöiden summa n.

811312A Tietorakenteet ja algoritmit, , Harjoitus 7, ratkaisu

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

Aritmeettinen jono

TILASTOT: johdantoa ja käsitteitä

S Laskennallinen systeemibiologia

Algoritmit 1. Luento 12 Ti Timo Männikkö

Harjoitustehtävien ratkaisuja

Tietorakenteet ja algoritmit Johdanto Lauri Malmi / Ari Korhonen

Algoritmit 1. Luento 12 Ke Timo Männikkö

Lasketaan esimerkkinä seuraava tehtävä. Monisteen sivulla 14 on vastaavanlainen. x 1

1. osa, ks. Solmu 2/ Kahden positiivisen luvun harmoninen, geometrinen, aritmeettinen ja + 1 u v 2 1

10 Kertolaskusääntö. Kahta tapahtumaa tai satunnaisilmiötä sanotaan riippumattomiksi, jos toisen tulos ei millään tavalla vaikuta toiseen.

3.2 Polynomifunktion kulku. Lokaaliset ääriarvot

2 u = 0. j=1. x 2 j=1. Siis funktio v saavuttaa suurimman arvonsa jossakin alueen Ω pisteessä x. Pisteessä x = x on 2 v. (x ) 0.

Tilastollinen todennäköisyys

811312A Tietorakenteet ja algoritmit III Lajittelualgoritmeista

MATEMATIIKAN JA TILASTOTIETEEN LAITOS

= true C = true) θ i2. = true C = false) Näiden arvot löydetään kuten edellä Kun verkko on opetettu, niin havainto [x 1

3 x < < 3 x < < x < < x < 9 2.

Algoritmit 1. Demot Timo Männikkö

EX1 EX 2 EX =

Tarkennamme geneeristä painamiskorotusalgoritmia

SMG-4200 Sähkömagneettisten järjestelmien lämmönsiirto Ehdotukset harjoituksen 6 ratkaisuiksi

Ruletti ja Martingaalistrategia

Algoritmit 1. Luento 1 Ti Timo Männikkö

Pseudoalkuluvuista ja alkulukutestauksesta

811120P Diskreetit rakenteet

Luento 7 Luotettavuus Koherentit järjestelmät

12. Javan toistorakenteet 12.1

Luento 6 Luotettavuus Koherentit järjestelmät

2.5. Eksponenttifunktio ja eksponenttiyhtälöt

Tekijä Pitkä Matematiikka 11 ratkaisut luku 3

Algoritmit 2. Luento 14 Ke Timo Männikkö

ALGORITMIT 1 DEMOVASTAUKSET KEVÄT 2012

Algoritmit 1. Luento 11 Ti Timo Männikkö

9 Lukumäärien laskemisesta

Kombinatoriikka. Iiro Honkala 2015

811120P Diskreetit rakenteet

811312A Tietorakenteet ja algoritmit, VI Algoritmien suunnitteluparadigmoja

12. Javan toistorakenteet 12.1

3.9. Mallintaminen lukujonojen avulla harjoituksia

811120P Diskreetit rakenteet

Mat Lineaarinen ohjelmointi

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

Algoritmit 1. Luento 10 Ke Timo Männikkö

Transkriptio:

. Algoritmie aalyysi Tässä osassa käsitellää algoritmie aalyysia, joka tarkoittaa algoritmie oikeellisuustarkasteluja sekä iide suorituskyvy aalysoitia. Joskus algoritmie aalyysi katsotaa sisältävä aioastaa suorituskyvy aalyysi, mutta tässä siihe kuuluu myös algoritmi oikeellisuude varmistamie. Algoritmie aalyysii voi tarkemmi perehtyä kirja [Cor] luvuista -4..1. Algoritmie oikeellisuus Muistettakoo, että tässä kurssissa algoritmi o aia äärellie, ts. se suoritus loppuu äärellisessä ajassa. Tästä syystä oikeellisuus jaetaa kahtee tyyppii: osittaisee oikeellisuutee (partial correctess) ja täydellisee oikeellisuutee (total correctess). Näistä esi maiittu tarkoittaa, että mikäli algoritmi päättyy, se tuottaa vaaditu tulokse ja toie sitä, että algoritmi päättyy ja tuottaa oikea tulokse. Näi olle algoritmi oikeaksi todistamisee vaaditaa osittaise oikeellisuude ja algoritmi päättymise todistamie. Usei algoritmi päättymie o itsestää selvää ja aioaa työä o todistaa osittaie oikeellisuus. Kute jokaie ohjelmoitia harrastaut tietää, ohjelma saattaa jäädä joskus, eteki joillaki harviaisilla erityisillä syötteillä, ikuisee silmukkaa tai rekursioo. Näi olle o tärkeää myös varmistaa algoritmi päättymie kaikissa tapauksissa. Miksi algoritmi o todistettava oikeaksi? Jos tietokoeohjelma toimii vääri, voi syyä olla laitevika, virheellie algoritmi tai siäsä oikea algoritmi virheellie implemetoiti. Näistä viimeksi maiittu o ylivoimaisesti yleisi virhee lähde ja esimmäie todeäköisesti harviaisi. O kuiteki selvää, että mikäli algoritmi o jo suuiteltu vääri, ei ohjelma voi hieosta implemetoiista huolimatta toimia täysi oikei. Näi olle erityisesti tieteellistä lasketaa tai erilaisia protokollia toteuttavissa ohjelmissa olisi syytä varmistaa algoritmi oikeellisuus, jos se suiki o teoreettisesti mahdollista. Myös suorituskykyaalyysii kaattaa kiiittää huomiota erityisesti äissä tapauksissa. Mikälaisilla mekaismeilla algoritmi voidaa todistaa oikeaksi? O olemassa erilaisia formaaleja metodeja tätä varte. Tämä kurssi tarpeisii käyttökelpoisi meetelmä o todistaa osittaie oikeellisuus tekemällä eri kohtii algoritmia väitteitä (assertios), jotka voidaa osoittaa paikkasapitäviksi ja jotka yhdessä varmistavat algoritmi osittaise oikeellisuude. Nämä ovat yleesä s. ivariatteja (ivariats), koska iissä esitetää joki omiaisuus, joka o säilyttävä voimassa tietyssä kohdassa algoritmia koko se suoritukse aja. Algoritmi päättymie varmistetaa käyttämällä kovergetteja (covergets), eli arvoja jotka pieeevät algoritmi edetessä ja päättävät algoritmi saavuttaessaa joki alaraja (useimmite arvo 0). Tällöi algoritmi ei voi jatkua loputtomii.

Otetaa aluksi yksikertaie esimerkki; algoritmi joka palauttaa kolmesta luvusta suurimma: Syöte: Luvut a, ja c Tulostus: Suuri luvuista a, ja c MAKSIMI(a,,c) 1. x = a. if > x. x = 4. if c > x 5. x = c 6. retur x Esitetää seuraavat väitteet: 1. Rivillä 4 muuttuja x arvo o suurempi luvuista a ja.. Rivillä 6 muuttuja x arvo o suuri luvuista a, ja c. Todistetaa esi väite 1: Jos a o suurempi tai yhtä suuri kui, if-lausee sisällä olevaa sijoituslausetta ei suoriteta ja x=a. Muute, jos o suurempi kui a, lause suoritetaa ja x=. Kummassaki tapauksessa rivillä 4 muuttuja x arvo o suurempi luvuista a ja. Todistetaa väite. Väittee 1 perusteella tultaessa rivi 4 if-lauseesee muuttuja x arvo o suurempi luvuista a ja. Jos c o suuri luvuista, se o suurempi kui x, jote rivi 5 sijoituslause suoritetaa ja x=c. Muussa tapauksessa sijoituslausetta ei suoriteta ja x o suurempi luvuista a ja, joka o myös suuri luvuista a, ja c. Kummassaki tapauksessa x o suuri luvuista a, ja c. Väittee perusteella algoritmi o osittai oikea. Lisäksi o selvää, että algoritmi päättyy, jote se o myös täysi oikea. Siirrytää hiema mutkikkaampaa tapauksee, jossa joudutaa käyttämää iduktiivista päättelyä. Tutkitaa seuraavaa algoritmia, joka palauttaa parametria saamasa tauluko pieimmä arvo: Syöte: Taulukko A[1,..,], >= 1 Tulostus: Piei luvuista A[1],, A[] MINIMI(A) 1. i =. x = A[1]. while i <= 4. if A[i] < x 5. x = A[i] 6. i = i+1 7. retur x Nyt muuttuja i o eräälaie kovergetti: o selvää että i saavuttaa lopulta arvo +1 ja päättää algoritmi suoritukse. O siis aioastaa todistettava algoritmi osittaie oikeellisuus. Tätä varte muotoillaa ivariatti, jota tällaisessa tapauksessa saotaa myös silmukkaivariatiksi, koska se o voimassa suoritettava silmuka tietyssä kohdassa:

while-silmuka kierrokse alkaessa rivillä, ku muuttuja i = k, muuttuja x arvo o piei tauluko arvoista A[1],, A[k-1]. Ivariati todistamie muistuttaa iduktiotodistusta: Osoitetaa esi, että ivariatti o aluksi voimassa ja sitte, että se säilyy voimassa silmuka suorituskerrasta toisee. Ku silmukkaa tullaa esimmäistä kertaa, o x = A[1] ja i= ja väite selvästi voimassa. Oletetaa, että i o aiaki kaksi ja korkeitaa ja ivariatti voimassa arvolla k, ts. kierrokse i=k alussa muuttuja x arvo o piei arvoista A[1], A[k-1]. Tällöi seuraavalla kierroksella (eli kierroksella i=k) verrataa muuttuja x arvoa arvoo A[k]. Jos A[k] o pieempi kui mikää arvoista A[1], A[k-1], se o pieempi kui x ja x päivittyy arvoo A[k]. Muute x ei muutu ja kummassaki tapauksessa muuttuja x arvo o piei arvoista A[1], A[k-1], A[k]. Näi olle ivariatti o voimassa myös seuraava kierrokse (eli kierrokse i=k+1) alussa ja koska se oli voimassa ee esimmäistä silmukkaa, se pysyy voimassa ii kaua kui silmukkaa suoritetaa. Site se o voimassa myös viimeisellä kierroksella eli ku i=+1 (jolloi silmuka sisää ei eää meä). Tällöi muuttujassa x o piei arvoista A[1], A[], A[] eli piei tauluko arvo. Myös rekursiiviste algoritmie oikeellisuude voi usei todistaa iduktiotekiikalla. Otetaa esimerkiksi Haoi torit. Alkuasemassa o kolme paalua (umeroidaa e 1, ja ), joista paaluu 1 o piottu N erikokoista kiekkoa suuruusjärjestyksessä ii, että suuri o alimmaisea ja piei päällimmäiseä. Tehtävää o siirtää kaikki kiekot paaluu ii, että missää vaiheessa ei isompaa kiekkoa saa siirtää pieemmä päälle. Luoollisesti kiekkoja saa siirtää paalusta toisee aioastaa yksi kiekko kerrallaa. O laadittava algoritmi, joka tulostaa kiekkoje siirtojärjestykse. Tutkitaa seuraavaa rekursiivista algoritmia Syöte: Luku N >= 1 ja paaluje umerot A, B ja C (luvut 1,, jossaki järjestyksessä) Tulostus: Siirtojärjestys N:lle kiekolle paalusta A paaluu B Käyttämällä apua paalua C SIIRRÄ(N,A,B,C) 1. if N==1. tulosta A -> B. else 4. SIIRRÄ(N-1,A,C,B) 5. tulosta A -> B 6. SIIRRÄ(N-1,C,B,A) 7. retur Muuttuja N pieeee jokaisella kutsulla ja N: arvolla 1 ei eää algoritmia suoriteta eteepäi. Näi olle N o kovergetti, ja o selvää että suoritettaessa algoritmia millä tahasa N: arvolla, joka o vähitää 1, algoritmi päättyy. Site riittää osoittaa osittaie oikeellisuus. Koska algoritmi o rekursiivie, käytäössä aioa mahdollisuus se oikeaksi todistamiseksi o iduktiivie argumetoiti. Todistetaa seuraava väite: Mistä tahasa laillisesta asemasta, jossa N pieitä kiekkoa ovat paalussa A, algoritmi tulostaa laillise siirtosarja, missä ämä N pieitä kiekkoa siirtyvät paaluu B käyttäe apua paalua C eikä siiä siirretä mitää muita kiekkoja.

Jos N=1, o oletukse mukaa piei kiekko paalussa A ja se voidaa laillisesti siirtää mihi tahasa. Site algoritmi aioa operaatio tulosta A -> B o laillie ja väite o voimassa N: arvolla 1. Oletetaa yt, että N o vähitää ja että väite o voimassa arvolla N-1. Nyt siis oletukse mukaa N pieitä kiekkoa ovat paalussa A ja asema o laillie. Koska myös N-1 pieitä kiekkoa ovat luoollisesti paalussa A, oletukse mukaa kutsu SIIRRÄ(N-1,A,C,B) siirtää laillisesti N-1 pieitä kiekkoa paalusta A paaluu C käyttäe apua paalua B eikä se siirrä muita kiekkoja. Koska N-1 pieitä kiekkoa ovat paalussa C, voidaa N:eksi piei kiekko siirtää paalusta A paaluu B laillisesti (rivi 5). Nyt N-1 pieitä kiekkoa ovat paalussa C ja asema o edellee laillie, jote oletukse mukaa rivi 6 kutsu SIIRRÄ(N-1,C,B,A) siirtää laillisesti N-1 pieitä kiekkoa paalusta C paaluu B käyttäe apua paalua A eikä se siirrä muita kiekkoja. Site lopputuloksea o, että N pieitä kiekkoa siirtyivät laillisesti paalusta A paaluu B ilma että muita kiekkoja siirrettii. Koska väite oli voimassa N: arvolla 1, yllä olevasta argumetoiista seuraa, että se o voimassa myös N: arvolla, je. Algoritmi o siis oikea. Ku haluttaisii siirtää kolme kiekkoa paalusta 1 paaluu, kutsuttaisii SIIRRÄ(,1,,), jolloi se suoritettaisii seuraavasti: SIIRRÄ(,1,,) SIIRRÄ(,1,,) SIIRRÄ(1,1,,) 1 -> 1 -> SIIRRÄ(1,,,1) -> 1 -> SIIRRÄ(,,,1) SIIRRÄ(1,,1,) -> 1 -> SIIRRÄ(1,1,,) 1 -> Näi saataisii siirtosarjaksi 1-> 1-> -> 1-> ->1 -> 1-> mikä voi vahvistaa oikeaksi. Ylimääräie harjoitustehtävä: Keksi Haoi toreille iteratiivie ratkaisu ja todista se oikeaksi!

Tutustutaa vielä lisäyslajittelualgoritmii. Tämä lajittelumeetelmä tuetaa myös kortipelaaja lajittelua, sillä meetelmä vastaa tapaa, jolla useimmat lajittelevat kädessä olevat pelikortit suuruusjärjestyksee: Esi verrataa vasemmalta lähtie toista korttia esimmäisee; jos toie o pieempi, siirretää se esimmäiseksi. Nyt kaksi esimmäistä korttia ovat järjestyksessä. Sitte verrataa kolmatta korttia kahtee esimmäisee ja haetaa sille oikea paikka. Tällöi kolme esimmäistä korttia o järjestetty. Sitte tutkitaa eljäs kortti je. Algoritmi o varsi tehokas piete taulukoide lajittelussa. Pseudokoodia algoritmi äyttää tältä, ku tauluko ideksit alkavat ollasta: Syöte: Taulukko A[0,1,..,-1], >= 1 Tulostus: Tauluko alkiot (luvut) järjestyksessä A[0] <= <= A[-1] INSERTION_SORT(A) 1. for j = 1 to -1. k = A[j]. //Lisätää alkio A[j] jooo A[0,.., j-1] 4. i = j-1 5. while i>=0 ad A[i]>k 6. A[i+1] = A[i] 7. i = i-1 8. A[i+1] = k Osoitetaa algoritmi oikeaksi. Tarkastellaa esi algoritmi päättymistä. Riviltä 1 alkavaa forsilmukkaa suoritetaa -1 kertaa, jote algoritmi päättyy, mikäli jokaisella silmuka kierroksella rivie 5-7 while-silmukka päättyy. Rivillä 4 asetetaa muuttuja i arvoksi j-1, jote muuttuja i arvo ee while-silmukkaa o vähitää 0 ja korkeitaa -. Rivie 5-7 while-silmukka päättyy viimeistää, ku i saa arvo -1. Koska muuttujaa i väheetää jokaisella silmuka kierroksella, tämä tapahtuu väistämättä viimeistää -1 kierrokse jälkee. Näi olle while-silmukka päättyy jokaisella for-silmuka kierroksella. Site myös algoritmi päättyy. Vielä pitää varmistaa, että algoritmi tuottaa oikea tulokse. Tutkitaa esi esimerkkitapausta algoritmi suorituksesta. Sovelletaa sitä taulukkoo A={6,,5,4,1,}. 1.kierros j=1, k=a[1]= i while lopussa -1. kierros j=, k=a[]=5 i while lopussa 0. kierros j=, k=a[]=4 i while lopussa 0 6 5 4 1 6 5 4 1 5 6 4 1 4. kierros j=4, k=a[4]=1 i while lopussa -1 4 5 6 1 5. kierros j=5, k=a[5]= i while lopussa 1 1 4 5 6 for-silmukka päättyy. Taulukko järjestyksessä 1 4 5 6 Tästä huomataa, mite algoritmi toimii. Tauluko alkuosa o järjestyksessä ja silmukassa haetaa käsiteltävälle tauluko alkiolle oikea paikka alkuosassa. Näi voidaa muotoilla silmukkaivariatti:

Algoritmi riviä 1 suoritettaessa tauluko alkiot A[0, j-1] ovat samat kui alkuperäisessä taulukossa, mutta ovat suuruusjärjestyksessä A[0] <= <= A[j-1]. Silmuka esimmäisellä suorituskerralla j=1 ja ivariatti koskee vai tauluko alkiota A[0], joka luoollisesti o järjestyksessä. Näi olle ivariatti o alussa voimassa. Oletetaa seuraavaksi että j=r < -1 ja että ivariatti o voimassa, ts. for-silmuka alussa tauluko alkiot A[0],, A[r- 1] ovat samat kui alkuperäisessä taulukossa ja ovat suuruusjärjestyksessä. Aluksi asetetaa k=a[r] ja i=r-1. Tämä jälkee while-silmukassa siirretää alkioita A[r-1], A[r-] je taulukossa askelee oikealle ja väheetää muuttuja i arvoa yhdellä, kues löydetää alkio A[i], joka o pieempi kui A[r] tai i=-1. Tämä jälkee kirjoitetaa A[r] paikalle A[i+1]. Näi for-silmuka seuraava kierrokse alussa tauluko alkiot A[0], A[r] ovat samat kui alkuperäisessä taulukossa, mutta suuruusjärjestyksessä. Site ivariatti pysyy voimassa koko algoritmi suoritukse aja ja johtaa siihe, että algoritmi päättyessä koko taulukko o suuruusjärjestyksessä. Olemme siis osoittaeet, että algoritmi päättyy ja päättyessää tuottaa oikea tulokse. Näi olle algoritmi o oikea. HUOM! Kute tarkkaavaie lukija saattoi huomataki, edellie todistus ei ollut muodollisesti täysi pitävä, koska emme muotoilleet ja todistaeet while-silmukalle omaa silmukkaivariattia. Meidä tarkoituksiimme päättely o kuiteki riittävä pätevä... Algoritmie suorituskyvy aalyysi Edellä tarkasteltii algoritmie oikeellisuutta. O luoollisesti tärkeää, että ogelma ratkaisualgoritmi toimii oikei. Kuiteki samalle ogelmalle o yleesä olemassa useita ratkaisuja eivätkä kaikki ole yhtä tehokkaita (tehokkuuskriteerejäki voi olla moelaisia). Siksi suuitellu ratkaisualgoritmi suorituskykyä pyritää myös yleesä aalysoimaa. Algoritmia voidaa arvioida se kuluttamie resurssie tai se käyttämä aja suhtee. Esimmäisessä tapauksessa tarkoitetaa yleesä algoritmi tarvitsemaa muistia; tällöi puhutaa algoritmi tilakompleksisuudesta (space complexity). Jälkimmäisessä tapauksessa puhutaa algoritmi aikakompleksisuudesta (time complexity). Nämä omiaisuudet ovat aiaki jossai määri vastakkaisia: lisäämällä muistikäyttöä voidaa saada algoritmi usei toimimaa opeammi. Koska tila- ja aikavaatimukset tyypillisesti kasvavat, ku syöttee koko kasvaa, kumpaaki kompleksisuustyyppiä tarkastellaa suhteessa syöttee kokoo. Tällä kurssilla perehdytää algoritmie aikakompleksisuutee. Selvästikää ei ole mielekästä tutkia algoritmi kuluttamia resursseja jossaki kokreettisessa tietokoeympäristössä, koska tulokset eivät olisi välttämättä siirrettävissä muihi ympäristöihi. Siksi algoritmie aalysoimiseksi o määriteltävä joki yleie, astrakti malli, jossa algoritmi ajatellaa toteutettava. Tässä mallia käytetää hajasaatikoetta (radom-access machie), jota luoehtii samalaisista muistipaikoista koostuva muisti ja prosessori, jolla o käytettävissää rekistereitä. Prosessori voi ladata dataa mielivaltaisista muistipaikoista rekistereihi ja talletaa arvoja takaisi muistii. Rekistereissä voidaa tehdä loogisia ja aritmeettisia operaatioita. Koee ohjelma koostuu käskyjoukosta, joka sisältää em. operaatioita ja suoritusta ohjaavia kotrollikäskyjä. Mallissa käskyt suoritetaa peräkkäi, ts. riakkaie suorittamie ei ole mahdollista.

Oikeassa tietokoeessa eri operaatiot (joita voidaa aalysoida myös CPU-syklie tai tarvittava RAM-muisti määrä fuktioia) vaativat hiema erilaise suoritusaja. Erilaiset prosessoriarkkitehtuurit vaikuttavat paljo suoritusaikaa ja voidaa algoritmeja toteuttaa muuteki kui prosessorille, vaikkapa ASIC- tai FPGA-piirille, mutta äistä vaihtoehdoista ei eempää tällä kurssilla. Hajasaatikoemallissa oletamme kuiteki kaikkie perusoperaatioide kestävä joki vakioaja; aioastaa tämä o oleellista algoritmie suorituskyvy periaatteellisessa aalyysissä. Eri rivie suoritusajat voivat olla erisuuret, mutta tiety rivi suoritus vie joka kerta sama verra aikaa ja fuktio kutsumisee kuluva aika erotetaa se suorituksee kuluvasta ajasta. Koko algoritmi eri suorituskerrat eivät vie yhtä kaua aikaa, vaa suoritusaikaa vaikuttavat: Syöttee järjestys. Kute esimerkiksi lisäyslajittelu esimerkistä o ähtävissä, syöttee järjestyksellä o merkitystä algoritmi suoritusajassa. Jos lisäyslajitteluu syötetää jo valmiiksi mootoisesti kasvava sekvessi, sisempää while -silmukkaa ei tarvitse suorittaa, mikä puolestaa opeuttaa ulomma for -silmuka suoritusta huomattavasti. Syöttee koko. Syöttee koko vaikuttaa suoraa algoritmi suoritusaikaa, kute esimerkiksi lisäyslajittelu silmukkaivariati lopetusehdosta o ähtävissä. Koska syöttee koolla o yleisessä tapauksessa eite merkitystä suoritusaikaa, algoritmi suoriutumista mitataa yleesä syöttee koo fuktioa. Kokreettiste tietokoeide käskykaoissa o myös hajasaatikoee perusoperaatioita vastaavie käskyje lisäksi yleesä muitaki käskyjä, jotka voivat muuttaa hiema hajasaatikoeella saatuja aalyysituloksia. Esimerkiksi luvu kaksi korottamie riittävä pieee potessii o tavallisesti vakioaikaie operaatio, mitä se ei ole hajasaatikoeessa ellei koee perusoperaatioide joukossa ole ittisiirtoa. Hajasaatikoeessa ei myöskää oleteta oleva ykyprosessoreissa käytettäviä välimuisteja je. Tästä huolimatta hajasaatimallilla saadut aalyysit eustavat varsi hyvi algoritmie suorituskykyä oikeissa koeissaki... Iteratiiviste algoritmie aalyysi Aalysoidaa yt joitaki verrattai yksikertaisia iteratiivisia algoritmeja. Tutkitaa aluksi tauluko alkioide summa laskevaa ohjelmaa: Syöte: Taulukko A[1,..,], >= 1 Tulostus: Tauluko alkioide summa SUMMA(A) 1. sum = 0. for i = 1 to. sum = sum + A[] 4. retur sum

Lasketaa kuki rivi suorituskertoje lukumäärä; o selvää, että kuki rivi suoritusaika o vakio, mutta eri rivit voivat viedä eri ajat. Merkitää siis Syöte: Taulukko A[1,..,], >= 1 Tulostus: Tauluko alkioide summa SUMMA(A) kustaus rivi suorituskerrat 1. sum = 0 c 1 1. for i = 1 to c. sum = sum + A[] c 4. retur sum Esimmäistä riviä suoritetaa kerra ja kahta seuraavaa kertaa, jote algoritmi kokoaissuoritusaika o c1 (c c). Suoritusaika riippuu siis lieaarisesti syötetauluko koosta. Tarkastellaa seuraavaksi aiivia versiota yksikertaisesta vaihtolajittelusta: Syöte: Taulukko A[1,..,], >= 1 Tulostus: Tauluko luvut järjestyksessä A[1] <= <= A[] VAIHTOLAJITTELU(A) 1. for i = 1 to. for j = 1 to. if i<j && A[i]>A[j] 4. x = A[i]; 5. A[i] = A[j]; 6. A[j] = x; 7. retur Lasketaa jällee kuki rivi suorituskertoje lukumäärä; taaski jokaise rivi suoritusaika o vakio, mutta eri rivit voivat viedä eri ajat. Määritellää luku t(i, j) seuraavasti: t(i, j) 1, jos ehto silmukoide sisällä ehto A[i] > A[j] o tosi ja t(i, j) 0 muute.

Merkitää kute aiemmi Syöte: Taulukko A[1,..,], >= 1 Tulostus: Tauluko luvut järjestyksessä A[1] <= <= A[] VAIHTOLAJITTELU(A) kustaus suorituskerrat 1. for i = 1 to c 1. for j = 1 to c =. if i<j && A[i]>A[j] c 4. x = A[i]; c 4 5. A[i] = A[j]; c 5 6. A[j] = x; c 6 t(i,j) i,j t(i,j) i,j t(i,j) i,j 7. retur Esimmäistä riviä suoritetaa kertaa ja seuraavaa jokaisella i: arvolla kertaa, jote toise rivi suorituskertoja tulee kappaletta. Riviä suoritetaa myös yhtä mota kertaa, koska vertailu tehdää aia. Se sijaa tauluko alkioide vaihtamie, eli rivit 4 6 suoritetaa aioastaa iflausee ehdo ollessa voimassa. Näi saadaa edellä maiitut suorituskerrat ja algoritmi suoritusaika o c 1 (c c) (c4 c5 c6 ) t(i, j) Summalauseke riippuu luoollisesti tauluko alkuperäisestä järjestyksestä. Jos taulukko o jo alussa järjestyksessä, ei vaihtoja tarvitse tehdä laikaa ja suoritusajaksi tulee c1 (c c) Tätä saotaa parhaaksi tapaukseksi. Jos taas taulukko o kääteisessä järjestyksessä, vaihto tehdää joka kerra ku j o suurempi kui i (alkuosa taulukosta o järjestyksessä) ja tällöi lauseet 4 6 suoritetaa ( -1) ( - )... 1 ( -1)/ kertaa. Tässä tapauksessa algoritmi suoritusaika o c (c 1 (c c c ) (c 4 c (c 5 4 c c )/) (c 6 5 i,j c ) ( -1)/ 6 1 - (c 4 c 5 c 6 )/)

Tämä o huooi tapaus. Yleesä aalysoitaessa algoritmia ollaa kiiostueita huooimmasta tapauksesta tai keskimääräisestä tapauksesta, paras tapaus o yleesä harviaie eikä aa totuudemukaista kuvaa algoritmi suorituskyvystä. Keskimääräisessä tapauksessa tutkittavassa algoritmissa vaihto tapahtuu joka toie kerta ja site lauseet 4 6 suoritetaa keskimääri 1 ( -1)/ kertaa ja siksi keskimääräie suoritusaika o c1 (c c) (c4 c5 c6 ) ( -1)/4. (c c (c c c )/4) (c - (c c c )/4) 4 5 6 Mitä yhteistä äillä suoritusajoilla o? Kaikki ovat muotoa A B, missä A ja B ovat vakioita, jote suoritusajat riippuvat syötetauluko koo eliöstä ( ). Tällaie algoritmi o selvästi hitaampi kui aiempi summa-algoritmi ja syötetauluko koko alkaa rajoittaa algoritmi suorittamista jo huomattavasti aiemmi kui summa laskemie. Tavallisesti keskitymme aioastaa huooimma tapaukse aalysoitii, koska silloi saamme yläraja algoritmi suoritusajalle. Joskus kiiostaa myös keskimääräie suoritusaika, mutta paras tapaus o yleesä harviaie erikoisuus, jota ei kaata tarkastella. Aettua algoritmia voidaa helposti parataa muuttamalla ulomma silmuka ylärajaa ja sisemmä silmuka alarajaa: Syöte: Taulukko A[1,..,], >= 1 Tulostus: Tauluko luvut järjestyksessä A[1] <= <= A[] VAIHTOLAJITTELU(A) kustaus suorituskerrat 1. for i = 1 to -1 c 1-1. for j = i+1 to c 1++...-1 = (-1)/. if A[i] > A[j] c *(-1)/ 4. x = A[i]; c 4 5. A[i] = A[j]; c 5 6. A[j] = x; c 6 7. retur 1 4 5 6 i,j t(i, j) t(i,j) i,j t(i,j) i,j Laskemalla suoritusaika samaa tapaa kui yllä, huomataa että kaikissa tapauksissa suoritusaika o muotoa A B, missä A ja B ovat vakioita. Esimerkiksi paras tapaus o c 1 ( -1) (c c) ( -1)/ (c c)/ (c1 (c c)/) - c1, mikä o oi puolet alkuperäisestä. Samaa tapaa saadaa, että muissaki tapauksissa algoritmi opeutuu puolee alkuperäisestä. Algoritmi o siis selvästi opeampi kui alkuperäie mutta riippuu joka tapauksessa eliöllisestä termistä, jote suoritusaika kasvaa kuiteki samassa suhteessa tauluko kokoo. Näi olle uutta algoritmia ei voi pitää oleaisea parauksea. Ns.

asymptoottisessa merkitätavassa samaistetaaki samoi kasvavat suoritusajat keskeää, jolloi algoritmie suoritusaikoje tarkastelua voidaa helpottaa. Tähä perehdytääki seuraavaksi..4. Asymptoottie merkitä ja fuktioide kasvu Kute aiemmi todettii, algoritmi aikakompleksisuudella tarkoitetaa yleesä algoritmi vaatimaa suoritusaikaa suhteessa syöttee kokoo. Suoritusaja tutkimie tarkasti ei siis yleesä ole tarpee, vaa oleellisempaa o ymmärtää kuika syöttee koo kasvu vaikuttaa suoritusaikaa. Ku syöte o tarpeeksi suuri, aioaksi merkitseväksi tekijäksi jää suoritusaja kasvuvauhti. Tällöi voimme tutkia kuika suoritusaika käyttäytyy, ku syöte kasvaa rajatta. Tätä saotaa algoritmi asymptoottiseksi tehokkuudeksi (asymptotic efficiecy) Yleesä algoritmi, joka asymptoottie tehokkuus o parempi, o paras valita kaikkii tilateisii, paitsi hyvi pieille syötteille. Aikakompleksisuude tarkastelussa tarvitaa muutamia fuktioide asymptoottisee kasvuu liittyviä käsitteitä, jotka ovat varsi keskeisessä asemassa tällä kurssilla. Niitä esitellää seuraavaksi. Olkoo g() joki fuktio. Silloi merkiällä ( g( tarkoitetaa fuktioide joukkoa, joka määritellää seuraavasti: ( g( { f ( ) O olemassa sellaiset positiiviset vakiot c c ja, että c g ) f ( ) c g( ),aia ku } (kaava 1.1) 1, 0 1 ( 0 Ku fuktio f () toteuttaa yllä aetu ehdo, merkitää f ( ) g(. Tällöi fuktio g() o asymptoottisesti tarkka raja fuktiolle f (). Joskus äkee (esimerkiksi kirjassa [Cor]) käytettävä myös epätarkkaa merkitää f ( ) g(. Alla oleva kuva havaiollistaa visuaalisesti -merkitää. Tämä s. theta-otaatio määrittelee algoritmi suoritusajalle muuttuja fuktioa asymptoottise tarka raja (asymptotically tight oud).

c g() f() c1 g() Kuva 1.1. Fuktio f () kasvua voidaa rajoittaa sekä ylhäältä että alhaalta fuktiolla g (), jote f ( ) g(. Esimerkki 1. Olkoo 1, jote 0 f ( ). Tällöi f ( ) 5, ku 1 f ( ), ku 0. Voidaa siis valita kaavassa 1.1. Edellee, ku g( ), 1 1 c, c 5 ja 0 1, jolloi saadaa ( ) ( f ). Tällöi saotaa myös, että algoritmi suoritusaika kasvaa eliöllisesti. Useimmite algoritmie aalyysissa ollaa kiiostueita arvioimaa sitä, kuika opeasti algoritmi vähitää toimii. Tällöi tarvitsee tarkastella aioastaa asymptoottista ylärajaa (siis suoritukse maksimiaikaa), joka määritellää O-merkiä avulla. Olkoo g() joki fuktio. Silloi merkiällä O ( g( tarkoitetaa fuktioide joukkoa, joka määritellää seuraavasti: O( g( { f ( ) O olemassa sellaiset positiiviset vakiot c ja 0, että 0 f ( ) c g( ),aia ku 0} (kaava 1.) Ku fuktio f () toteuttaa yllä aetu ehdo, merkitää f ( ) g(. Tällöi fuktio g() o asymptoottie yläraja fuktiolle f ().

c g() f() 0 Kuva 1.. Fuktio f () kasvua voidaa rajoittaa ylhäältä fuktiolla g () f ( ) g(., jote Esimerkki. Olkoo f ( ) 5. Tällöi f ( ), ku 5. Näi olle kaavassa 1. voidaa valita g( ), c 5 ja 0 5, jolloi saadaa f ( ) ). Fuktio g( ) o siis fuktio f () asymptoottie yläraja. Kuitekaa se ei ole asymptoottisesti tarkka raja, sillä olipa vakio c mikä hyväsä, f ( ) 5 c, ku o riittävä suuri (mieti miksi!). Siis f ( ) ), mutta f ( ) ). Huomaa myös, että mikä tahasa fuktiota g( ) 5 opeammi kasvava fuktio voitaisii valita fuktiolle f () ylärajaksi, esimerkiksi f ( ) ) tai f ( ) ). Toisiaa tarvitaa asymptoottista alarajaa: Olkoo g() joki fuktio. Silloi merkiällä ( g( tarkoitetaa fuktioide joukkoa, joka määritellää seuraavasti: ( g( { f ( ) O olemassa sellaiset positiiviset vakiot c ja 0, että 0 c g( ) f ( ),aia ku 0} (kaava 1.) Ku fuktio f () toteuttaa yllä aetu ehdo, merkitää f ( ) g(. Joskus o hyödyllistä huomioida edellä esitettyje merkitöje trasitiivisuusomiaisuus:

1. Jos f ( ) g( ja g( ) h(, ii f ( ) h(,. Jos f ( ) g( ja g( ) h(, ii f ( ) h( ja. Jos f ( ) g( ja g( ) h(, ii f ( ) h(. Näytetää, esimerki vuoksi, että keskimmäie omiaisuus o voimassa. Olkoo f ( ) g( ja g( ) h(. Tällöi o olemassa positiiviset vakiot c 1 ja 1, että 0 f ( ) c1 g( ),aia ku 1. Lisäksi o olemassa positiiviset vakiot c ja, että 0 g( ) c h( ),aia ku. Ku valitaa max{ 1, }, o aia ku : f ( ) c g( ) c ( c h( ( c c ) h( ). Siis f ( ) h(. 0 1 1 1 Esitetää lopuksi vielä pari esimerkkiä esitettyje merkitöje käytöstä. Esimerkki. Olkoot a ja positiivisia reaalilukuja ja olkoo että f ( ) )? Ratkaisu. Aia, ku 0 o luoollisesti f ( ) ( a). Pitääkö paikkasa,, ( a). Edellee, ku a ( a) (1 a / ) (1 1). Voidaa siis valita kaavassa 1.1. g ( ), c 1 1, c ja a 0, ja saadaa f ( ) ). Ehto o siis voimassa. 1 Esimerkki 4. Olkoo f ( ) ja h( ). Pitääkö paikkasa, että f ( ) )? Etä h( ) )? Ratkaisu. Aia, ku 0 o 1. Siis f ( ) sitte, että olisi h( ) ). Silloi olisi sellaie vakio c, että riittävä suuri. Mutta tällöi olisi mahdotota, koska c o vakio ja paikkaasa., jote ( ) O( ) f. Oletetaa h( ) c, aia ku o c c, aia ku o riittävä suuri. Tämä o kasvaa rajatta. Site esimerki jälkimmäie väite ei pidä Palataa vielä edellise kappalee esimerkkeihi. Tauluko summa-algoritmi kokoaissuoritusaika oli (c c ), ku tauluko koko oli. Näi olle algoritmi c1 aikakompleksisuusluokka o (). Edellee vaihtolajittelualgoritmie kaikki suoritusajat olivat muotoa A B, ku tauluko koko oli. Site algoritmie aikakompleksisuus o luokkaa ( ). Tästä tarkastelusta huomataa myös, että jos olemme kiiostueita aioastaa algoritmi kompleksisuusluokasta (kute yleesä o asia laita), ei eri rivie suoritusajoilla ole merkitystä, kuha e vai ovat vakioita eivätkä siis riipu syöttee koosta. Tämä vuoksi yleesä tarkastelussa huomioidaa vakiokestoiset operaatiot samaarvoisia, jolloi aalysoiti helpottuu hiema. Myös huomataa, että ku kompleksisuus o polyomista luokkaa, ts. suoritusaika syöttee koo fuktioa o muotoa a k k-1 k a k-1 a1 a 0,

aioastaa korkeimmalla termillä o opeimmi kasvavaa merkitystä ja algoritmi aikakompleksisuus o luokkaa ( k ). Sisäkkäisiä silmukoita sisältävät iteratiiviset algoritmit ovat usei tällaisia. Olkoo algoritmi muotoa ALGORITMI() 1. for i1 = 1 to. for i = 1 to _ k sisäkkäistä... silmukkaa k. for ik = 1 to k+1. // Joki vakioaikaie operaatio Tällöi riviä 1 suoritetaa kertaa ja koska riviä suoritetaa jokaisella ulomma silmuka kierroksella kertaa, riviä suoritetaa kaikkiaa kertaa. Kolmatta riviä suoritetaa kertaa. Näi jatkamalla havaitaa, että sisimmä silmuka vakioaikaista operaatiota suoritetaa k... kertaa, mistä seuraa, että algoritmi kompleksisuusluokka o ( k ). Huomaa, että tällaie päättely voitii tehdä, koska silmukkoje suorittamista eivät kahlieet muut ehdot ja jokaista silmukkaa suoritetaa se alkaessa kertaa. Lisäksi kaikki yksittäiset rivit ovat vakioaikaisia. Algoritmise ogelma kompleksisuustyyppiä määriteltäessä käytetää usei termejä "polyomisessa ajassa ratkeava" ja "ekspoetiaalie ogelma". Esimmäie termi tarkoittaa sitä, että ogelmaa o ratkaisualgoritmi joka suoritusaikaa voidaa rajoittaa ylhäältä jollaki polyomifuktiolla, esimerkiksi f ( ). Ekspoetiaalie ogelma taas tarkoittaa sitä, että ogelmaa ei tueta pieempää ylärajaa kui joki ekspoetiaalie fuktio, esimerkiksi 1000 01 f ( ). Ero äide kompleksisuusasteide välillä o merkittävä: esimerkiksi 1.07 10 9 ku taas 1000 10. Tämä ero vuoksi polyomisessa ajassa ratkeavia ogelmia saotaa usei myös käytäössä ratkeaviksi ogelmiksi. Kaattaa kuiteki muistaa, että myös polyomiaikaise algoritmi suoritusaika kasvaa erittäi opeasti, mikäli polyomi korkei potessi o suuri. Iteret-osoitteessa http://e.wikipedia.org/wiki/big_o_otatio#orders_of_commo_fuctios o lista useimmi tavattavista kompleksisuusluokista ja esimerkkejä algoritmisista ogelmista joide ratkaisualgoritmi o aettua luokkaa..5. Rekursiiviste algoritmie aalyysi Usei algoritmit esitetää rekursio avulla. Tällöi tarvitaa uusia tekiikoita aikakompleksisuude määrittämisee; voidaa turvautua iduktiivisee päättelyy, rekursiopuu avulla tarkasteluu tai joissaki tapauksissa voidaa soveltaa eräälaista keittokirjameetelmää, kuha algoritmia vastaava rekursioyhtälö o saatu muodostettua. Palataa esi aiemmi esitettyy Haoi tori-algoritmii:

Syöte: Luku N >= 1 ja paaluje umerot A, B ja C (luvut 1,, jossaki järjestyksessä) Tulostus: Siirtojärjestys N:lle kiekolle paalusta A paaluu B Käyttämällä apua paalua C SIIRRÄ(N,A,B,C) 1. if N==1. tulosta A -> B. else 4. SIIRRÄ(N-1,A,C,B) 5. tulosta A -> B 6. SIIRRÄ(N-1,C,B,A) 7. retur Mite voidaa päätellä algoritmi kompleksisuus? Jos algoritmi suoritusaika tuetaa, ku kiekkoja o N-1 kappaletta, voidaa päätellä suoritusaja N:llä kiekolla, koska tällöi tehdää yksi vakioaikaie operaatio (ajatellaa vertailu ja tulostamie yksikertaisuude vuoksi yhdeksi operaatioksi, e vievät yhteesä vakioaja) ja kahdesti suoritus (N-1):llä kiekolla. Sovelletaa yt iduktiivista päättelyä: Merkitää T(N):llä algoritmi vaatimie askelie lukumäärää. Ku N=1, algoritmi tekee vai yhde tulostukse, jote T(1) = 1. Ku N=, tehdää yksi tulostus ja suoritetaa kaksi kertaa algoritmi arvolla N=1, jote T() = 1 + T(1) = Yleisesti millä tahasa N: arvolla tehdää yksi tulostus ja suoritetaa kaksi kertaa algoritmi arvolla N-1, jote T(N) = 1 + T(N-1) (kaava.1) ja saadaa T() = T() + 1 = +1 = 7, T(4) = T()+1 = 7 + 1 = 15. Koska suoritusaika hiema eemmä kui kaksikertaistuu N: kasvaessa yhdellä, voidaa arvella luvu T(N): liittyvä joteki lukuu N. Koska T(1) = -1, T() = 4-1, T() = 8-1 ja T(4)=16-1, arvataa että T(N) = N -1. (kaava.) Kaava. pätee, ku N < 5 ja jos oletetaa, että T(N-1) = N-1-1, saadaa kaava.1 avulla T(N) = T(N-1)+1 = ( N-1-1)+1 = N - +1 = N -1 ja iduktiolla päätellää että kaava. o voimassa kaikilla N: arvoilla. Siis aettu Haoi torie ratkaisualgoritmi o luokkaa ( N ). Samaa tuloksee olisi päästy myös tutkimalla puurakeetta, joka muodostuu algoritmi suorituspolusta

Seuraavassa o kuvattu Haoi torie rekursiivisesta suorituspolusta muodostuva puu. Puu solmut äyttävät kullaki rekursio tasolla suoritettavie operaatioide lukumäärä. Jokaisella algoritmi kutsulla, alita tasoa lukuu ottamatta, tehdää yksi vakioaikaie operaatio ja kaksi rekursiivista kutsua. Vakioaikaie operaatio koostuu, kute edellä maiittii, yhdestä vertailusta ja tulostuksesta. Jos käytetää N:ää kiekkoa, puuhu muodostuu N tasoa ja algoritmi suorittamie operaatioide lukumäärä saadaa, ku lasketaa puu solmuje määrä. Kuviossa o merkitty äkyvii eri tasoje solmuje lukumäärät ja laskettu e yhtee. Näi saadaa algoritmi kompleksisuusluokaksi ( N ) kute pitääki. Kuva 1. Haoi torie rekursiopuu. Aalysoitaessa rekursiivista algoritmia, se suoritusajalle saadaa usei kaava.1 tapaie esitys, jollaista kutsutaa rekursioyhtälöksi. Rekursioyhtälö voidaa joskus ratkaista arvaamalla ratkaisu ja todistamalla se iduktiotekiikalla oikeaksi. Moii tapauksii voidaa kuiteki soveltaa seuraavaa lausetta, joka todistusta ei tarvitse osata, riittää ku sitä osaa käyttää:

Lause M. (Master Theorem) Olkoot a 1 1 kokoaislukuvakioita ja f fuktio. Rekursio T( ) a T( / ) f ( ) samoi kui rekursio T( ) a T( / ) f ( ) ratkaisulle pätee seuraavaa: log a 1) Jos f ( ) O( ) jollaki vakiolla 0, ii T( ) log a log a ) Jos f ( ) ), ii T( ) log a ) lg ) log a ) Jos f ( ) ( ) jollaki vakiolla 0 ja jos a f ( / ) c f ( ) jollaki vakiolla c 1 ja riittävä suurilla luvu arvoilla, ii T( ) f ( HUOM! Merkitä x tarkoittaa suurita kokoaislukua, joka o korkeitaa yhtä suuri kui x. Esimerkiksi 1.8 1. Merkitä x tarkoittaa pieitä kokoaislukua, joka o vähitää yhtä suuri kui x. Esimerkiksi.. HUOM! Usei rekursioyhtälössä jätetää kokoaisosa merkitsemättä ja kirjoitetaa T( ) a T( / ) f ( ), jolloi yleesä tarkoitetaa yhtälöä / ) f ( ) T( ) a T(. HUOM! Jotta rekursioyhtälöllä olisi ratkaisu, o luoollisesti T(1) aettava. Tämä vaikuttaa tarkkaa ratkaisuu, mutta ei kuitekaa ratkaisu kompleksisuusluokkaa, jote usei se jätetää eriksee maiitsematta.

Esimerkkejä lausee käytöstä. Selvitä lausee M avulla seuraavie rekursioyhtälöide ratkaisufuktioide kompleksisuudet: a) T( ) 4 T( / ) ) T( ) 4 T( / ) c) T( ) 4 T( / ) d) T( ) T( / ) lg Ratkaisu. 1 a) Tässä a 4, ja f ( ). Näi olle log a log 4 ja koska f ( ) O( ), voidaa soveltaa lausee esimmäistä kohtaa (tässä siis 1) ja saadaa T( ) log a ) ) Nyt a 4, kute edellä ja ) f ( ). Siksi tässäki tapauksessa log a log 4 koska f ( ) ( ), saadaa lausee toise kohda mukaa T( ) lg ) 1 c) Tässäki a 4, ja yt f ( ). Taaski log a log 4 ja f ( ) ( ), voidaa lausee kolmaessa kohdassa valita 1. Lisäksi a f ( / ) 4 ( / ) 1/ 1/ f ( ), jote voimme soveltaa lausee kolmatta kohtaa (c=1/) rekursioyhtälö ratkaisuu ja saamme T( ) f ( ). d) Nyt a, ja f ( ) lg. Tällöi log a log 1. Koska lg, o selvää että lausee tapaukset 1 ja eivät sovellu. Kuiteki, olipa 0 kuika piei hyväsä, pätee lg 1, ku o riittävä suuri. Site kolmattakaa tapausta ei voi soveltaa aettuu rekursioyhtälöö. Siis kaikkia rekursioyhtälöitä ei valitettavasti voi ratkaista lausee M avulla. Varsi moii tapauksii se kuiteki soveltuu. Sovelletaa yt lausetta M lomituslajittelu aalyysii. Lomituslajittelu perustuu siihe, että lajiteltava aieisto jaetaa kahtee osaa, jotka lajitellaa eriksee. Tämä jälkee järjestyksessä olevat osat lomitetaa yhtee ii, että alkiot tulevat järjestyksee. Ku algoritmia sovelletaa rekursiivisesti, päädytää lopulta lajittelemaa yhde alkio listoja, mikä o triviaali tehtävä. Lomituslajittelu algoritmia varte tarvitaa esi algoritmi lomittamaa järjestyksessä olevat lista osat: ja

Syöte: Taulukko A[1,..,], >= 1, luvut 1 <= p <= q < r <= Tauluko alkioide A[p..q] ja A[q+1,r] oletetaa oleva suuruusjärjestyksessä Tulostus: Tauluko alkiot A[p..r] suuruusjärjestyksessä LOMITA(A,p,q,r) 1. varaa listat L[1,..,q-p+1] ja R[1,..,r-q] // Kopioidaa osalistat. for i=p to q. L[i-p+1] = A[i] 4. for i=q+1 to r 5. R[i-q] = A[i] 6. i = 1 7. j = 1 8. k = p // Lomitetaa vase ja oikea puoli 9. while i <= q-p+1 ad j <= r-q 10. if L[i] <= R[j] 11. A[k] = L[i] 1. i = i+1 1. else 14. A[k] = R[j] 15. j = j+1 16. k = k+1 // while loppuu 17. for m=i to q-p+1 18. A[k] = L[m] 19. k = k+1 0. for m=j to r-q 1. A[k] = R[m]. k = k+1. retur O selvää (vai oko?) että yllä oleva algoritmi kompleksisuus o muotoa c (r-p). Nyt voidaa laatia helposti rekursiivie algoritmi LOMITUSLAJITTELU, jolle syötetää taulukko A[1,,] ja jota kutsutaa muodossa LOMITUSLAJITTELU(A,1,), ku halutaa lajitella koko taulukko A. Syöte: Taulukko A[1,..,], >= 1, luvut 1 <= p <= q <= Tulostus: Tauluko alkiot A[p..q] suuruusjärjestyksessä LOMITUSLAJITTELU(A,p,q) 1. if p < q. r = ( p q) /. LOMITUSLAJITTELU(A,p,r) 4. LOMITUSLAJITTELU(A,r+1,q) 5. LOMITA(A,p,r,q) 6. retur Ku kutsutaa lomituslajittelualgoritmia taulukolle, joka pituus o, lajitellaa samalla algoritmilla taulukot, joide pituudet ovat / ja /. Lisäksi tehdää -pituiselle listalle

lomitus, joka suoritusaja todettii oleva muotoa c. Näi olle lomituslajittelu suoritusajalle T() saadaa rekursio T( ) T( / ) c Sovelletaa yt lausetta M, jolloi a, ja f ( ) c. Tällöi log a log 1 ja 1 f ( ) c ( ) jote lausee M kohda ojalla T( ) lg ). Siis lomituslajittelu kompleksisuusluokka o lg. Lähteet [Cor] Corme, T.H., Leiserso, C.E., Rivest, R.L., Stei, C. Itroductio to Algorithms, d editio, The MIT Press 001.