Kertauskalvot


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