2. Johdanto

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