811312A Tietorakenteet
ja algoritmit
2015 - 2016
Kertausta kurssin alkuosasta
II Algoritmien analyysi: oikeellisuus
Algoritmin täydellinen oikeellisuus = Algoritmi päättyy ja
tuottaa määritellyn tuloksen
Algoritmin oikeaksi todistaminen = Todistettava
algoritmin päättyminen ja oikea tulos
Osattava todistaa algoritmi vääräksi
Päättymisen todistaminen: usein käytetään
konvergenttia, joka takaa toistorakenteen tai rekursion
päättymisen
Oikeellisuus: Toistorakenteisissa algoritmeissa usein
invariantti, joka takaa oikean tuloksen kun algoritmi
päättyy
Invariantin muotoilu ja oikeaksi osoittaminen
Ari Vesanen
811312A TRA, Kertausta
II Algoritmien analyysi: asymptoottinen merkintä
Osattava O ja Ɵ-merkinnät (määritelmä ja käyttö)
Olkoon g(n) jokin funktio. Silloin O(g(n)) ja Ɵ(g(n)) ovat
seuraavat funktioiden joukot:
O( g (n)) { f (n) On olemassa sellaiset
positiiviset vakiot c ja n0 , että
0 f (n) c g (n), aina kun n n0 }
( g ( n )) { f ( n ) On olemassa sellaiset
positiiviset vakiot c1 , c2 ja n0 , että
c1 g ( n ) f ( n ) c2 g ( n ), aina kun n n0 }
Ari Vesanen
811312A TRA, Kertausta
II Algoritmien analyysi: aikakompleksisuus
Aikakompleksisuus = algoritmin suoritusaika
(operaatioiden lukumäärä) suhteessa syötteen kokoon
Ilmaistaan kompleksisuusluokkana O- tai Ɵmerkinnällä
Yleensä tarkastellaan huonointa tapausta
Osattava määrittää yksinkertaisen iteratiivisen tai
rekursiivisen algoritmin kompleksisuusluokka
Tentissä aina tällainen tehtävä, enimmäkseen
iteratiivisia algoritmeja
Jos tarvitaan Master Theoremia, se annetaan
Ari Vesanen
811312A TRA, Kertausta
Esimerkkitehtäviä
a) Esitä mitä määritelmän mukaan tarkoittaa merkintä
f(n) (n2).
b) Onko f(n) (n2), kun
f(n) = 2n2 + n
f(n) = n3+2n+1 ?
Perustele vastauksesi.
Ari Vesanen
811312A TRA, Kertausta
Esimerkkitehtäviä (2)
Seuraavan algoritmin tulisi laskea summa 1+2+…+n aina kun n on
positiivinen kokonaisluku. Todista algoritmi vääräksi.
Syöte: Kokonaisluku n >= 1
Tuloste: Summa 1+2+...+n
SUMMA(n)
1.
s = 1
2.
i = 1
3.
if n == 1
4.
return s
5.
while i <= n do
6.
s = s+i
7.
i = i+1
8.
return s
Ari Vesanen
811312A TRA, Kertausta
Esimerkkitehtäviä (3)
Seuraava algoritmi laskee syötteenä saamansa taulukon alkioiden
keskiarvon. Todista algoritmi oikeaksi.
Syöte: Taulukko A[1,..,n], n >= 1
Tuloste: Taulukon alkioiden keskiarvo
KESKIARVO(A)
1.
s = 0
2.
i = 1
3.
ka = 0
4.
while i <= n do
5.
s = s+A[i]
6.
i = i+1
7.
ka = s/n
8.
return ka
Ari Vesanen
811312A TRA, Kertausta
Esimerkkitehtäviä (4)
Mitkä ovat seuraavien algoritmien
aikakompleksisuusluokat, kun syötteen koon mittarina on
syötetaulukon A[1..n] koko n?
SUM1(A)
1. sum = 0
2. for i=1 to n
3.
sum = sum + A[i]
4. return sum
SUM2(A)
1. sum = 0
2. for i=1 to n
3.
for j=1 to n
4.
sum = sum+A[i]-A[j]
5. return sum
Ari Vesanen
SUM3(A)
1. max = 0
2. for i=1 to n
3.
sum = 0
4.
for j=i to n
5.
sum = sum+A[j]
6.
if sum > max
7.
max = sum
8. return sum
811386A Tietorakenteet ja algoritmit, Tehtäviä
III Lajittelualgoritmit
Tiedettävä että nopeimpien vertailuun perustuvien
lajittelualgoritmien aikakompleksisuus Ɵ(nlg(n)), kun n
on taulukon koko
Pikalajittelusta tunnettava idea: taulukko jaetaan saranaalkion suhteen ja osat lajitellaan rekursiivisesti
Kekolajittelu: tunnettava maksimikeko tietorakenteena ja
sen esittäminen taulukolla
Kekolajittelun idea: Muodostetaan maksimikeko ja
poistetaan siitä toistuvasti suurin alkio, sijoitetaan
taulukon loppuun ja pienennetään keon kokoa
Ari Vesanen
811312A TRA, Kertausta
Esimerkkitehtäviä (5)
Ovatko taulukot A=[15,10,12,7,5,9,8],
B=[20,12,18,8,14,13] maksimikekojärjestyksessä?
Sadistinen valmentaja harjoittaa 2n pelaajaa. Hän haluaa
jakaa pelaajat kahteen joukkueeseen niin, että pelistä
tulee mahdollisimman epätasainen. Minkälaista
algoritmia hän voi käyttää jaon tekemiseen?
Taulukossa on lukuja jotka halutaan järjestää niin, että
negatiiviset luvut ovat taulukon alkuosassa ja positiiviset
luvut loppuosassa. Anna tehokas algoritmi tämän
tekemiseen.
Ari Vesanen
811312A TRA, Kertausta
Pikalajittelun muunnettu ositus
Syöte: Taulukko A[1,..,n] n>=1
Tuloste: Taulukon vasemmalla puolella negatiiviset
arvot ja oikealla positiiviset (ja nollat)
OSITA(A)
1. i = 0
2. for j = 1 to n
3.
if A[j] < 0
4.
i = i + 1
5.
vaihda A[i] A[j]
6. return
Ari Vesanen
811312A TRA / 52144A ATR , Lajittelualgoritmeista
11
Esimerkkitehtäviä (6)
Olkoon A[1..n] pienimmästä suurimpaan järjestetty
kokonaislukutaulukko, jonka kaikki luvut ovat erisuuria.
Suunnittele aikakompleksisuudeltaan luokkaa O(lg(n))
oleva algoritmi, joka vastaa kysymykseen, onko lukua i,
jolle A[i] = i (kiintopiste).
Ari Vesanen
811312A TRA, Kertausta
Alkuperäinen puolitushaku
Syöte: Taulukko A[1,..,n], n >= 1, A[1] <= A[2] <= …
<= A[n]. Luvut 1<=p<=q<=n. Luku x jota haetaan
taulukosta väliltä A[p,..,q].
Tulostus: Alkion x indeksi taulukossa tai arvo NIL,
jos x ei esiinny taulukossa välillä A[p,..,q].
HAKU(A,p,q,x)
1. if p==q
2.
if A[p]==x return p
3.
else return NIL
4. else
5.
r = (p + q)/2
6.
if x<=A[r]
7.
return HAKU(A,p,r,x)
8.
else
9.
return HAKU(A,r+1,q,x)
Ari Vesanen
811312A TRA, Kertausta
Kiintopisteen hakemisalgoritmi
Syöte: Taulukko A[1,..,n], n >= 1, A[1] < A[2] < … <
A[n]. Luvut 1<=p<=q<=n.
Tulostus: TRUE jos A[i]=i jollakin i, FALSE muuten
KIINTOPISTE(A,p,q)
1. if p==q
2.
if A[p]==p
3.
return TRUE
4.
else return FALSE
5. else
6.
r = (p + q)/2
7.
if A[r]==r
8.
return TRUE
9.
else if A[r]>r
10.
return KIINTOPISTE(A,p,r)
11.
else
12.
return KIINTOPISTE(A,r+1,q,x)
Ari Vesanen
811312A TRA, Kertausta
© Copyright 2025