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ä 1.2 Tietorakenteen ja algoritmin valinta 1.3 Algoritmit ja tiedon määrä 1.4 Tietorakenteet ja toiminnot 1.5 Esimerkki: lineaarinen vs. eksponentiaalinen toteutus Tietorakenteet ja algoritmit - syksy 2015 4 1.1 Määritelmiä Algoritmi: • Epäformaalisti: täsmällinen menettelytapa, joka ratkaisee jonkin hyvin määritellyn laskennallisen ongelman. • Määritelmä: Algoritmi on äärellinen jono yksikäsitteisiä, äärellisellä työllä suoritettavissa olevia käskyjä, jotka laskevat funktion ƒ: I → O – I on syötejoukko – O on tulosjoukko – kaikilla i ∈ I, algoritmi pysähtyy s.e., o = ƒ(i) ∈ O Tietorakenteet ja algoritmit - syksy 2015 5 1.1 Määritelmiä... Tietorakenne: • Funktion ƒ tehokas laskenta edellyttää, että syötejoukko I on hyvin organisoitu • Päteekö sama tulosjoukolle O? • Voidaan kuvata tietotyyppeinä – Alkeistyypit, perustietotyypit, (tietorakenteet), abstraktit tietotyypit • Määritelmä: Tietorakenne on joukko muuttujia, joiden keskinäiset suhteet on määritelty täsmällisesti. • Huomaa, että em. määrittelyssä yksittäisen muuttujan tyyppi voi olla toinen tietorakenne (rakenteellinen kompositio). Tietorakenteet ja algoritmit - syksy 2015 6 Koodin luku-‐ ja kirjoitustaito • Tavoitteena ”nähdä” mitä algoritmi tekee/notaation taakse • Erilaisia näkökulmia – Notaatio (Miten algoritmi on esitetty? vrt. syntaksi, tyyli) – Oikeellisuus (Mitä algoritmi tekee? Kaikilla syötteillä?) – Abstraktiot/reduktio (Minkä päälle algoritmi rakentuu ja miksi se toimii?) – Analyysi (Kuinka tehokas algoritmi on?) – Eleganssi (Millaiseen oivallukseen algoritmi perustuu?) • ”Brute force” vs. Elegancy – Esim. lineaarinen haku vs. binäärihaku – ⇒ Koodin lukutaito (Ymmärrys miten algoritmi toimii) Tietorakenteet ja algoritmit - syksy 2015 7 Koodin luku-‐ ja kirjoitustaito… • Esimerkiksi järjestäminen (domain) – Useita eri menetelmiä – Miten ne eroavat toisistaan? koodi … tmp = A[i] A[i] = A[min] A[min] = tmp “näkemys” swap (vaihdetaan kahden alkion paikkaa) domain järjestämis-‐ menetelmä … Tietorakenteet ja algoritmit - syksy 2015 8 Koodin luku-‐ ja kirjoitustaito... § Esim. valintajärjestäminen § C-kieltä muistuttava Pseudo-koodi § Järjestää taulukon A alkiot (N kpl) suuruusjärjestykseen § Taulukon alkuosa järjestyksessä; uloin silmukka määrää jakopisteen; loppuosasta haetaan pienin alkio, joka vaihdetaan jakopisteen kanssa. § (N-1) + (N-2) + ... + 2 + 1 = N(N-1)/2 § ”Brute force” - raakaa voimaa 0 selection_sort(A, N) { 1 for (i=0; i<N-1; i++) { 2 min = i; 3 for (j=i+1; j<N; j++) 4 if (A[j] < A[min]) 5 min = j; 6 swap(min, i); 7 } 8 } Tietorakenteet ja algoritmit - syksy 2015 9 1.2 Tietorakenteen ja algoritmin valinta § Sama asia tai toiminto voidaan toteuttaa lukemattoman monella eri tavalla tietokoneohjelmana § Eri ratkaisujen paremmuutta voidaan verrata monessa suhteessa, mm. : 1. toimintojen nopeus (algoritmit) 2. vaadittu muistitila (tietorakenteet) 3. ohjelmakoodin laatu ja ylläpidettävyys 4. toteutuksen avoimuus laajennuksille § Tällä kurssilla keskitytään kahteen ensimmäiseen näkökulmaan ÄLÄ MIKRO-OPTIMOI - VALITSE PAREMPI ALGORITMI Tietorakenteet ja algoritmit - syksy 2015 10 Koodin luku-‐ ja kirjoitustaito... Esim. Kumpi algoritmeista on tehokkaampi? Miksi? Tietorakenteet ja algoritmit - syksy 2015 11 § Usein valitsemalla sopiva tiedon esitysrakenne voidaan merkittävästi vaikuttaa jonkin algoritmin tehokkuuteen Esimerkki 1: Lineaarinen haku vs. puolitushaku • Edellisessä hakuaika on suoraan suhteessa talletettujen alkioiden lukumäärään • Jälkimmäisessä hakuaika on suhteessa talletettujen alkioiden lukumäärän logaritmiin N log2 N 1.000 10 1.000.000 20 Tietorakenteet ja algoritmit - syksy 2015 12 Esimerkki 2: Miten tallentaa maantieverkko? • Seuraajalistana, eli luetellaan jokaiselle solmulle ne solmut, joihin kyseisestä solmusta pääsee • Vierusmatriisina (2-ulotteisena taulukkona), jolloin jokaiselle solmuparille merkitään, onko niiden välillä yhteyttä (1) vai ei (0) • Seuraajalista vaatii tilaa sen verran kuin yhteyksiä on olemassa • Vierusmatriisi vaatii tilaa suhteessa solmujen lukumäärän neliöön riippumatta yhteyksien määrästä • Vierusmatriisi voi olla tehokkaampi, jos verkko on tiheä, mutta se vie paljon tilaa, jos verkko on suuri. Tietorakenteet ja algoritmit - syksy 2015 13 1.3 Algoritmit ja tiedon määrä Algoritmin nopeus riippuu tiedon määrästä: ”Mikä tahansa algoritmi on nopea pienillä syötteillä” Esimerkki 3: Taulukon alkioiden järjestäminen • • • • Valintajärjestäminen on helppo ymmärtää ja toteuttaa Quicksort on paljon mutkikkaampi Valintajärjestämisen tehokkuus on suhteessa alkioiden lukumäärän N neliöön Quicksortin tehokkuus (keskimäärin) lukuun N log N N N*log2(N) N2 10 30 100 103 1*104 106 106 2*107 1012 Tietorakenteet ja algoritmit - syksy 2015 14 Esimerkki 4: Alkioiden (N kpl) talletus linkitettyyn listaan • Jos kukin alkio talletetaan listan alkuun, eikä listaa pidetä järjestyksessä, alkioiden talletus käy lineaarisessa ajassa (yksittäisen alkion talletus vie vakioajan) • Jos kukin alkio talletetaan listan loppuun ja paikka haetaan aina listan alusta lähtien, alkioiden talletus käy ajassa, joka on suhteessa listan pituuden neliöön • Jos kukin alkio talletetaan listan loppuun ja samalla ylläpidetään osoitinta listan viimeiseen alkioon, alkioiden talletus käy taas lineaarisessa ajassa Tietorakenteet ja algoritmit - syksy 2015 15 1.4 Tietorakenteet ja toiminnot Tietorakenteen tehokkuus riippuu siihen kohdistuvista toiminnoista (oikea abstraktio, frekvenssit, dynaamisuus jne.) Esimerkki 5: Haetaan tiettyä tietuetta suuresta määrästä tietueita • • • • Jos tiedot ovat staattisia, ne voidaan tallentaa taulukkoon suuruusjärjestyksessä ja hakea sieltä vaikka binääri- eli puolitushaulla Hakuaika on silloin suhteessa taulukon koon logaritmiin Jos lisätään uusia tietueita tai poistetaan vanhoja, taulukko pitää järjestää kokonaan uudelleen. Tässä vaiheessa aikaa kuluu lineaarisesti suhteessa taulukon kokoon. Jos tiedot talletetaan tasapainotettuun binääriseen hakupuuhun, tieto voidaan edelleen hakea logaritmisessa ajassa, mutta myös lisäykset ja poistot voidaan tehdä logaritmisessa ajassa Tietorakenteet ja algoritmit - syksy 2015 16 1.5 Esimerkki: lineaarinen vs. eksponentiaalinen toteutus Esimerkki 6: Fibonacci-luvut: 1, 1, 2, 3, 5, 8, 13, 21, 34,... F(0) = F(1) = 1 F(N) = F(N-1) + F(N-2) Lineaarinen menetelmä, käytetään muuttujia x, y ja z ja pyöritetään niitä seuraavassa luupissa x = y = 1; for (i = 1; i<N; i++) { z = y + x; x = y; y = z; print (z); § } suoritusaika verrannollinen N:ään Tietorakenteet ja algoritmit - syksy 2015 17 § Exponentiaalinen menetelmä, sovelletaan suoraan määritelmää rekursiivisesti F6 F5 F4 F3 F2 F1 F1 F3 F2 F1 F2 F0 Laskettaessa F6:n arvoa, lasketaan: F4 F1 F3 F1 F0 F2 F1 F2 F1 F1 F0 F5 F4 F3 F2 F1 1 kerran 2 kertaa 3 kertaa 5 kertaa 8 kertaa F0 F0 Tietorakenteet ja algoritmit - syksy 2015 18 § Exponentiaalinen menetelmä, sovelletaan suoraan määritelmää rekursiivisesti.... Koska pätee, että F100 ≈ F100 , missä F ≈ 1.618, seuraa, että F100:n laskemiseen tarvitaan luokkaa 1018 operaatiota... Eli algoritmien valinnalla on merkitystä... Huom! Ongelma ei ole rekursiossa vaan siinä, että algoritmi rikkoo yhtä ”rekursion kultaista sääntöä”, jonka mukaan jokainen aliongelma tulee ratkaista vain kerran. Tämä ongelma voidaan ratkaista esim. dynaamisella ohjelmoinnilla, jossa varataan oma tietorakenne jo lasketuille arvoille. Tietorakenteet ja algoritmit - syksy 2015 19 Ensi kerraksi… • Muista ilmoittautua kurssille (WebOodissa)! • Tutustu oppikirjan/oppimateriaalin avulla ensi kerraksi seuraaviin käsitteisiin – Abstrakti tietotyyppi (Abstract Data Type, ADT) – Lineaariset (perus)tietorakenteet Tietorakenteet ja algoritmit - syksy 2015 20
© Copyright 2024