4 Tehokkuus ja algoritmien suunnittelu

Samankaltaiset tiedostot
5 Kertaluokkamerkinnät

9 Erilaisia tapoja järjestää

1 Erilaisia tapoja järjestää

811312A Tietorakenteet ja algoritmit, , Harjoitus 3, Ratkaisu

TIE Tietorakenteet ja algoritmit 25

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

Algoritmit 1. Luento 12 Ti Timo Männikkö

Algoritmit 1. Luento 11 Ti Timo Männikkö

Algoritmit 1. Luento 1 Ti Timo Männikkö

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

Algoritmit 1. Luento 12 Ke Timo Männikkö

Algoritmit 2. Luento 8 To Timo Männikkö

Tietorakenteet, laskuharjoitus 3, ratkaisuja

ALGORITMIT 1 DEMOVASTAUKSET KEVÄT 2012

Algoritmit 2. Demot Timo Männikkö

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

Tämä on helpompi ymmärtää, kun tulkitaan keko täydellisesti tasapainotetuksi binääripuuksi, jonka juuri on talletettu taulukon paikkaan

Algoritmit 1. Luento 2 Ke Timo Männikkö

Algoritmit 1. Luento 5 Ti Timo Männikkö

Tiraka, yhteenveto tenttiinlukua varten

Algoritmit 2. Luento 7 Ti Timo Männikkö

Hakupuut. tässä luvussa tarkastelemme puita tiedon tallennusrakenteina

Algoritmit 2. Luento 2 To Timo Männikkö

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

1.4 Funktioiden kertaluokat

Algoritmit 2. Luento 2 Ke Timo Männikkö

1 Puu, Keko ja Prioriteettijono

Algoritmit 1. Luento 3 Ti Timo Männikkö

Lähteet. OHJ-2010 TIETORAKENTEIDEN KÄYTTÖ lukuvuosi Terhi Kilamo

Algoritmit 1. Demot Timo Männikkö

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

811312A Tietorakenteet ja algoritmit Kertausta kurssin alkuosasta

811312A Tietorakenteet ja algoritmit Kertausta kurssin alkuosasta

Tietorakenteet ja algoritmit - syksy

Algoritmit 1. Luento 10 Ke Timo Männikkö

Algoritmit 2. Luento 13 Ti Timo Männikkö

Algoritmit 2. Luento 1 Ti Timo Männikkö

Tietorakenteet ja algoritmit Johdanto Lauri Malmi / Ari Korhonen

4. Algoritmien tehokkuus

Nopea kertolasku, Karatsuban algoritmi

Algoritmit 2. Luento 13 Ti Timo Männikkö

(p j b (i, j) + p i b (j, i)) (p j b (i, j) + p i (1 b (i, j)) p i. tähän. Palaamme sanakirjaongelmaan vielä tasoitetun analyysin yhteydessä.

A TIETORAKENTEET JA ALGORITMIT

Algoritmit 1. Demot Timo Männikkö

TKT20001 Tietorakenteet ja algoritmit Erilliskoe , malliratkaisut (Jyrki Kivinen)

9.3 Algoritmin valinta

Algoritmit 2. Luento 14 Ke Timo Männikkö

A TIETORAKENTEET JA ALGORITMIT

Algoritmit 1. Luento 13 Ma Timo Männikkö

Algoritmit 1. Demot Timo Männikkö

Algoritmianalyysin perusteet

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

Tarkennamme geneeristä painamiskorotusalgoritmia

Tutkimusmenetelmät-kurssi, s-2004

811312A Tietorakenteet ja algoritmit I Johdanto

lähtokohta: kahden O(h) korkuisen keon yhdistäminen uudella juurella vie O(h) operaatiota vrt. RemoveMinElem() keossa

Algoritmit 1. Demot Timo Männikkö

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

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

Algoritmit 1. Luento 13 Ti Timo Männikkö

Algoritmi on periaatteellisella tasolla seuraava:

Tietorakenteet, laskuharjoitus 2,

4. Joukkojen käsittely

811312A Tietorakenteet ja algoritmit III Lajittelualgoritmeista

Ohjelmoinnin perusteet Y Python

Luku 8. Aluekyselyt. 8.1 Summataulukko

811312A Tietorakenteet ja algoritmit , Harjoitus 2 ratkaisu

811120P Diskreetit rakenteet

811312A Tietorakenteet ja algoritmit, , Harjoitus 7, ratkaisu

TAMPEREEN TEKNILLINEN YLIOPISTO

ja λ 2 = 2x 1r 0 x 2 + 2x 1r 0 x 2

58131 Tietorakenteet ja algoritmit (syksy 2015)

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

1.1 Tavallinen binäärihakupuu

Algoritmit 2. Demot Timo Männikkö

8. Lajittelu, joukot ja valinta

811312A Tietorakenteet ja algoritmit, VI Algoritmien suunnitteluparadigmoja

Algoritmit 2. Luento 3 Ti Timo Männikkö

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

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

useampi ns. avain (tai vertailuavain) esim. opiskelijaa kuvaavassa alkiossa vaikkapa opintopistemäärä tai opiskelijanumero

811312A Tietorakenteet ja algoritmit, , Harjoitus 4, Ratkaisu

Algoritmit 2. Luento 12 To Timo Männikkö

Liitosesimerkki Tietokannan hallinta, kevät 2006, J.Li 1

Tietorakenteet ja algoritmit. Järjestäminen. Ari Korhonen

Algoritmit 1. Luento 8 Ke Timo Männikkö

Algoritmit 2. Luento 6 To Timo Männikkö

13 Lyhimmät painotetut polut

Algoritmit 1. Luento 10 Ke Timo Männikkö

TIE Tietorakenteet ja algoritmit 1. TIE Tietorakenteet ja algoritmit

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

Pinot, jonot, yleisemmin sekvenssit: kokoelma peräkkäisiä alkioita (lineaarinen järjestys) Yleisempi tilanne: alkioiden hierarkia

Algoritmit 2. Luento 6 Ke Timo Männikkö

Diskreetin matematiikan perusteet Laskuharjoitus 2 / vko 9

Algoritmit 2. Luento 3 Ti Timo Männikkö

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

Ohjelmoinnin perusteet Y Python

TAMPEREEN TEKNILLINEN YLIOPISTO

Tietorakenteet ja algoritmit

Liitosesimerkki. Esim R1 R2 yhteinen attribuutti C. Vaihtoehdot

Transkriptio:

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 asymptoottista käyttäytymistä eli tapaa, jolla algoritmin resurssien kulutus muuttuu syötekoon kasvaessa. t n

TIE-20100 Tietorakenteet ja algoritmit 53 4.1 Kertaluokat Algoritmin analysoinnilla tarkoitetaan sen kuluttamien resurssien määrän arvioimista Tyypillisesti analysoidaan syötekoon kasvun vaikutusta algoritmin resurssien kulutukseen Useimmiten meitä kiinnostaa algoritmin ajankäytön kasvu syötteen koon kasvaessa Voimme siis tarkastella ajankäyttöä irrallaan toteutusympäristöstä Itse asiassa voimme kuvata periaatteessa minkä tahansa peräkkäisiä operaatioita sisältävän toiminnan ajankulutusta

TIE-20100 Tietorakenteet ja algoritmit 54 Algoritmin ajankäyttö: Algoritmin suorittamien "askelten" suorituskertojen määrä Askel: syötekoosta riippumattoman operaation viemä aika. Emme välitä siitä, kuinka monta kertaa jokin operaatio suoritetaan kunhan se tehdään vain vakiomäärä kertoja. Tutkimme kuinka monta kertaa algoritmin suorituksen aikana kukin rivi suoritetaan ja laskemme nämä määrät yhteen.

TIE-20100 Tietorakenteet ja algoritmit 55 Yksinkertaistamme vielä tulosta poistamalla mahdolliset vakiokertoimet ja alemman asteen termit. Näin voidaan tehdä, koska syötekoon kasvaessa riittävästi alemman asteen termit käyvät merkityksettömiksi korkeimman asteen termin rinnalla. Menetelmä ei luonnollisestikaan anna luotettavia tuloksia pienillä syöteaineistoilla, mutta niillä ohjelmat ovat tyypillisesti riittävän tehokkaita joka tapauksessa. Kutsumme näin saatua tulosta algoritmin ajan kulutuksen kertaluokaksi, jota merkitään kreikkalaisella kirjaimella Θ (äännetään theeta ). f(n) = 23n 2 + 2n + 15 f Θ(n 2 ) f(n) = 1 2n lg n + n f Θ(n lg n)

TIE-20100 Tietorakenteet ja algoritmit 56 Esimerkki 1: taulukon alkioiden summaus 1 for i := 1 to A.length do 2 summa := summa + A[i] jos taulukon A pituus (syötekoko) on n, rivi 1 suoritetaan n + 1 kertaa rivi 2 suoritetaan n kertaa ajankulutus kasvaa siis n:n kasvaessa seuraavalla tavalla: n aika = 2n + 1 1 3 10 21 100 201 1000 2001 10000 20001 n:n arvo hallitsee ajankulutusta

TIE-20100 Tietorakenteet ja algoritmit 57 suoritamme edellä sovitut yksinkertaistukset: poistamme vakiokertoimen ja alemman asteen termin: f(n) = 2n + 1 n saamme tulokseksi Θ(n) kulutettu aika riippuu lineaarisesti syötteen koosta

TIE-20100 Tietorakenteet ja algoritmit 58 Esimerkki 2: alkion etsintä järjestämättömästä taulukosta 1 for i := 1 to A.length do 2 if A[i] = key then 3 return i tässä tapauksessa suoritusaika riippuu syöteaineiston koon lisäksi sen koostumuksesta eli siitä, mistä kohtaa taulukkoa haluttu alkio löytyy On tutkittava erikseen: paras, huonoin ja keskimääräinen tapaus

TIE-20100 Tietorakenteet ja algoritmit 59 paras tapaus: Kuva 6: Etsintä: paras tapaus, löytyy ensimmäisestä alkiosta alkio löytyy vakioajassa eli ajankulutus on Θ(1)

TIE-20100 Tietorakenteet ja algoritmit 60 huonoin tapaus Kuva 7: Etsintä: huonoin tapaus, löytyy viimeisestä tai ei ollenkaan rivi 1 suoritetaan n + 1 kertaa ja rivi 2 n kertaa suoritusaika on lineaarinen eli Θ(n).

TIE-20100 Tietorakenteet ja algoritmit 61 keskimääräinen tapaus: täytyy tehdä jonkinlainen oletus tyypillisestä eli keskimääräisestä aineistosta: alkio on taulukossa todennäköisyydellä p (0 p 1) ensimmäinen haettu alkio löytyy taulukon jokaisesta kohdasta samalla todennäköisyydellä voimme laskea suoraan todennäköisyyslaskennan avulla, kuinka monta vertailua keskimäärin joudutaan tekemään

TIE-20100 Tietorakenteet ja algoritmit 62 todennäköisyys sille, että alkio ei löydy taulukosta on 1 - p joudutaan tekemään n vertailua (huonoin tapaus) todennäköisyys sille, että alkio löytyy kohdasta i, on p/n joudutaan tekemään i vertailua odotusarvoinen tarvittavien vertailujen määrä saadaan siis seuraavasti: [1 p n + 2 p n + + i p n + n p ] + n (1 p) n

TIE-20100 Tietorakenteet ja algoritmit 63 oletamme, että alkio varmasti löytyy taulukosta eli p = 1, saamme tulokseksi (n+1)/2 eli Θ(n) koska myös tapaus, jossa alkio ei löydy taulukosta, on ajankäytöltään lineaarinen, voimme olla varsin luottavaisia sen suhteen, että keskimääräinen ajankäyttö on kertaluokassa Θ(n) kannattaa kuitenkin muistaa, että läheskään aina kaikki syötteet eivät ole yhtä todennäköisiä jokaista tapausta on syytä tutkia erikseen

TIE-20100 Tietorakenteet ja algoritmit 64 Esimerkki 3: kahden taulukon yhteisen alkion etsintä 1 for i := 1 to A.length do 2 for j := 1 to B.length do 3 if A[i] = B[j] then 4 return A[i] rivi 1 suoritetaan 1.. (n + 1) kertaa rivi 2 suoritetaan 1.. (n (n + 1)) kertaa rivi 3 suoritetaan 1.. (n n) kertaa rivi 4 suoritetaan korkeintaan kerran

TIE-20100 Tietorakenteet ja algoritmit 65 nopeimmillaan algoritmi on siis silloin kun molempien taulukoiden ensimmäinen alkio on sama parhaan tapauksen ajoaika on Θ(1) pahimmassa tapauksessa taulukoissa ei ole ainuttakaan yhteistä alkiota tai ainoastaan viimeiset alkiot ovat samat tällöin suoritusajaksi tulee neliöllinen eli 2n 2 + 2n + 1 = Θ(n 2 ) keskimäärin voidaan olettaa, että molempia taulukoita joudutaan käymään läpi noin puoleen väliin tällöin suoritusajaksi tulee Θ(n 2 ) (tai Θ(nm) mikäli taulukot ovat eri mittaisia)

TIE-20100 Tietorakenteet ja algoritmit 66 Palataan INSERTION-SORTiin. Sen ajankäyttö: INSERTION-SORT( A ) (syöte saadaan taulukossa A) 1 for j := 2 to A.length do (siirretään osien välistä rajaa) 2 key := A[ j ] (otetaan alkuosan uusi alkio käsittelyyn) 3 i := j 1 4 while i > 0 and A[ i ] > key do (etsitään uudelle alkiolle oikea paikka) 5 A[ i + 1 ] := A[ i ] (raivataan uudelle alkiolle tilaa) 6 i := i 1 7 A[ i + 1 ] := key (asetetaan uusi alki o oikealle paikalleen) rivi 1 suoritetaan n kertaa rivit 2 ja 3 suoritetaan n - 1 kertaa rivi 4 suoritetaan vähintään n - 1, enintään (2 + 3 + 4 + + n - 2) kertaa rivit 5 ja 6 suoritetaan vähintään 0, enintään (1 + 2 + 3 + 4 + + n - 3) kertaa

TIE-20100 Tietorakenteet ja algoritmit 67 parhaassa tapauksessa, kun taulukko on valmiiksi järjestyksessä, koko algoritmi siis kuluttaa vähintään Θ(n) aikaa huonoimmassa tapauksessa, kun taulukko on käänteisessä järjestyksessä, aikaa taas kuluu Θ(n 2 ) keskimääräisen tapauksen selvittäminen on jälleen vaikeampaa: oletamme, että satunnaisessa järjestyksessä olevassa taulukossa olevista elementtipareista puolet ovat keskenään epäjärjestyksessä. vertailuja joudutaan tekemään puolet vähemmän kuin pahimmassa tapauksessa, jossa kaikki elementtiparit ovat keskenään väärässä järjestyksessä keskimääräinen ajankulutus on pahimman tapauksen ajankäyttö jaettuna kahdella: [(n - 1)n]/ 4 = Θ(n 2 )

TIE-20100 Tietorakenteet ja algoritmit 68 Tarkastellaanpa sitten MERGE-SORTin ajankäyttöä. MERGEn ensimmäinen for-silmukka käyttää osataulukon kokoon nähden lineaarisen määrän aikaa Θ(n) while-silmukka käy osataulukon alkuosan ja loppuosan molemmat läpi korkeintaan kerran ja ainakin toisen puolikkaan kokonaan Θ(n) toinen for-silmukka käy läpi korkeintaan puolet taulukosta, ja käyttää siis pahimmassa tapauksessa aikaa Θ(n) muut operaatiot ovat vakioaikaisia kun edelliset yhdistetään, saadaan suoritusajaksi Θ(n) sekä parhaassa että pahimmassa tapauksessa.

TIE-20100 Tietorakenteet ja algoritmit 69 MERGE-SORTIN suoritusajan laskeminen on aiempaa haastavampaa, koska algoritmi on rekursiivinen, ja sen suoritusajan kaava olisi myös rekursiivinen. Rekursiivisen kaavan etsiminen matemaattisesti on kuitenkin tämän kurssin tavoitteiden ulkopuolella, joten tyydymme tutkimaan tilannetta vähemmän formaalilla tavalla. MERGE-SORT kutsuu itseään ja MERGEÄ, kaikki muut operaatiot ovat vakioaikaisia. voidaan siis keskittyä tarkastelemaan MERGEN suorituskertojen kuluttamaa aikaa, kaikki muu on vakioaikaista. 1 1 1 1 1 1 1 1 1 1 1 2 2 2 2 2 4 4 4 log 2 n n

TIE-20100 Tietorakenteet ja algoritmit 70 MERGEN suorituskerroista muodostuu edellisellä sivulla esitetty puurakenne. osataulukoiden koot on merkitty MERGEN instanssien kuviin ensimmäisellä tasolla kaikki osataulukot ovat yhden (tai nollan kokoisia) muilla tasoilla osataulukot ovat aina kaksi kertaa edellisen tason osataulukoiden kokoisia viimeisellä tasolla käsitellään koko taulukkoa jokaisen tason osataulukoiden yhteenlaskettu koko on n yksittäisen tason MERGE-instanssien määrä on 2 kertaa edellisen tason vastaava määrä kasvaa kahden potensseissa, jolloin viimeisen tason instanssien määrä on 2 h, missä h on puun korkeus viimeisellä tasolla instansseja on noin n kappaletta 2 h = n log 2 n = h, siis puun korkeus on log 2 n koska jokaisella tasolla tehdään lineaarinen määrä työtä ja tasoja on lg n kappaletta, koko algoritmin suoritusaika on Θ(n lg n)

TIE-20100 Tietorakenteet ja algoritmit 71 MERGE-SORT on selvästi monimutkaisempi kuin INSERTION-SORT. Onko sen käytöstä vastaavaa hyötyä? Kyllä, suurilla testiaineistolla ero on selvä. jos n on 1000 000 n 2 on 1000 000 000 000, kun taas nlogn on noin 19 930 000 aivan pienillä syötteillä INSERTION-SORT on kuitenkin usein tehokkaampi MERGE-SORT on kurssin määritelmän mukainen hyvä algoritmi.

TIE-20100 Tietorakenteet ja algoritmit 72 MERGE-SORTin etuja ja haittoja Etuja Ajankäyttö Θ(n lg n) Vakaus Haittoja MERGE-SORTin lisämuistintarve on Θ(n) INSERTION-SORT ja myöhemmin tavattava QUICKSORT järjestävät paikoillaan (lisämuistin tarve Θ(1)) Algoritmin vakiokerroin on suuri

TIE-20100 Tietorakenteet ja algoritmit 73 4.2 Puolitushaku Kun hakujoukko on järjestyksessä, voidaan alkion etsinnässä hyödyntää hajota ja hallitse -periaatetta Ns. puolitushaku toimii vertaamalla hakuavainta tietojoukon keskimmäisen alkion avainarvoon seuraavasti: jaetaan hakualue kahtia valitaan se puoli, jossa avaimen on avainten järjestyksen perusteella oltava ja unohdetaan toinen puoli turhana jatketaan kunnes on saatu rajattua yksi ehdokasalkio, joka joko on etsitty avain, tai etsittyä alkiota ei ole tietojoukossa

TIE-20100 Tietorakenteet ja algoritmit 74 BIN-SEARCH( A, 1, n, key ) vaatimus: n 1, taulukko on järjestetty 1 low := 1; hi := n (alustetaan etsintäalue kattamaan koko taulukon) 2 while low < hi do (jatketaan etsintää, kunnes etsintäalue on tyhjä) 3 mid := ( low + hi )/2 (puolitetaan etsintäalue) 4 if key A[ mid ] then (jos avain löytyy alemmasta puoliskosta...) 5 hi := mid (...valitaan alempi puolisko uudeksi etsintäalueeksi) 6 else (muuten...) 7 low := mid + 1 (...valitaan ylempi puolisko uudeksi etsintäalueeksi) 8 if A[ low ] = key then 9 return low (etsitty löytyi taulukosta) 10 else 11 return 0 (etsittyä ei löytynyt) BIN-SEARCHIN suoritusaika on Θ(lg n).