Rekursioyhtälöt

Tietorakenteet ja algoritmit
Algoritmianalyysin perusteet
Ari Korhonen
1
5. ALGORITMIANALYYSI
5.1 Johdanto
5.2 Tavoitteet
5.3 Algoritmien luokittelu
5.4 Kertaluokkamerkinnät (Big Oh Notation)
5.5 Kertaluokkamerkinnöillä laskeminen
5.6 Muita tunnuslukuja
5.7 Iteratiivisen ohjelman kompleksisuus
5.8 Rekursiiviset ohjelmat
5.9 Rekursioyhtälöt
5.10 Kuinka analyysi tarkistetaan?
5.11 Analyyttisten tulosten tulkinta
17.9.2015
Tietorakenteet ja algoritmit - syksy 2015
2
5.1 Johdanto
MIKSI tarvitaan algoritmianalyysiä?
§ 
Ohjelman resurssitarpeiden ennustaminen
• 
CPU-aika
• 
muistitila
§ 
Algoritmien keskinäinen vertailu
§ 
Sopivan algoritmin valitseminen (perusteet)
17.9.2015
Tietorakenteet ja algoritmit - syksy 2015
3
MITEN algoritmeja voi analysoida?
1. Empiirinen mittaaminen ja ekstrapolointi
• 
• 
• 
Tulos riippuu syöteaineistosta
Tulos riippuu toteutuksesta
Ekstrapolointi voi johtaa vääriin päätelmiin
2. Matemaattinen analyysi
• 
• 
• 
Luotettavampi, mutta ei ongelmaton
Tulokset voivat olla epäkäytännöllisiä
Voi johtaa analyyttisesti vaikeisiin ongelmiin
3. Käsitteellinen luokittelu
• 
17.9.2015
Kvalitatiivinen (luokitteleva, kuvaileva)
analyysi harvoin riittävä
Tietorakenteet ja algoritmit - syksy 2015
4
5.2 Algoritmianalyysin tavoitteet
A) Syöteaineiston laatu ei saa johtaa vääriin tuloksiin
§ 
Koska täsmällinen ennustaminen suoritusajasta ei ole
mahdollista, haetaan seuraavia tunnuslukuja:
Pahin tapaus (worst case performance)
• 
• 
Realistinen tai sitten ei
Esim. haetaan tiettyä alkiota linkitetystä listasta. Mikä on
pahin tapaus?
Keskimääräinen tapaus (average case performance)
• 
• 
• 
17.9.2015
Usein merkittävämpi tulos
Analyysi usein vaikeaa
Esim. ”Mikä on keskimääräinen tekstitiedosto?”
Tietorakenteet ja algoritmit - syksy 2015
5
Tavoitteet...
B) Erotetaan algoritmi ja sen toteutus toisistaan
§ 
Toteutus vaikuttaa suoritusaikaan vain kertoimen kautta
C) Etsitään pienintä ylärajaa
§ 
Mahdollisimman lähellä teoreettista ylärajaa
D) Keskitytään olennaiseen
§ 
Pääosa CPU-ajasta kuluu vain pienessä osassa ohjelmaa
E) Täsmällinen lauseke harvoin tarpeen
§ 
§ 
17.9.2015
Määräävä termi riittää (esim. N2 + N ≈ N2, kun N >> 1)
Syötteen tai aineiston koon eli alkioiden lukumäärän funktio,
merkitään T(N)
Tietorakenteet ja algoritmit - syksy 2015
6
5.3 Algoritmien luokittelu, T(N) = f(N), jossa f(N) =
1:
N2 :
• 
• 
log N :
• 
• 
kiinteä (vakio) suoritusaika
esim. lausekkeen evaluointi
• 
• 
neliöllinen
esim. sijoituslajittelu
• 
• 
kuutiollinen
esim. matriisitulo
• 
• 
eksponentiaalinen
esim. salasanan haku,
travelling salesman
N3 :
logaritminen
esim. puolitushaku
N:
2N :
• 
• 
lineaarinen
esim. lineaarinen haku
N*log N :
• 
"N log N"
• 
esim. Mergesort
Eksponentiaaliset algoritmit eivät sovellu suurille aineistoille, mutta niitä
esiintyy monien käytännön ongelmien perusratkaisuissa
17.9.2015
Tietorakenteet ja algoritmit - syksy 2015
7
Esim.
• 
Tarkastellaan neljää eri algoritmia, joiden tehokkuusluvut ovat
100N, 5N2 , N3/2 ja 2N
• 
Oletetaan koneet, joista toinen laskee 106 askelta sekunnissa,
toinen 107 askelta sekunnissa
algoritmi
N (106 s)
N (107 s)
muutos
100N
10
100
10,0
5N2
14
45
3,2
N3/2
12
27
2,3
2N
10
13
1,3
Eksponentiaalisella algoritmilla konetehon kymmenkertaistuminen johtaa siihen, että pystytään käsittelemään vain 30v%
suurempaa ongelmaa!
17.9.2015
Tietorakenteet ja algoritmit - syksy 2015
8
5.4 Kertaluokkamerkinnät
Funktio T(N) ∈ O( f(N) ), jos on olemassa c ja N0 siten, että
T(N) < c f(N), kaikille N > N0
laskentaan
kuluva aika
c f(N)
T(n)
Merkitään: T(N) = O( f(N) )
Tämä on syötteestä ja toteutuksesta
riippumaton yläraja
f(N)
ongelman koko
HUOM!
N
•  Kuvaa ‘askelten’ määrää, EI kulutettuja CPU-sekunteja
•  Yläraja voi olla turhan epätarkka eli epärealistinen
• 
c ja N0 eivät ole välttämättä pieniä
•  Funktiot asymptoottisesti kasvavia (vrt. suoritusaika)
•  Asymptoottinen käyttäytyminen ei välttämättä ratkaise
"pienillä" N:n arvoilla, esim. 10N2 < 1000*N, N < 100
0
17.9.2015
Tietorakenteet ja algoritmit - syksy 2015
9
Osoita, että n2 + n – 1 = O(n2)
Etsitään (mitkä tahansa) c ja N0 s.e.
n2 + n – 1 < cn2, kun n > N0
Voidaan valita esim. c = 2, jolloin
epäyhtälö on voimassa, kun n > 0, joten
valitaan N0 = 0, jolloin saadaan
n2 + n – 1 < 2n2, kun n > 0
Eli n2 + n – 1 = O(n2)☐
17.9.2015
Tietorakenteet ja algoritmit - syksy 2015
10
Lähde: http://science.slc.edu/~jmarshall/courses/2002/spring/cs50/BigO/index.html
17.9.2015
Tietorakenteet ja algoritmit - syksy 2015
11
5.5 Kertaluokkamerkinnöillä laskeminen
1. f(x) = O(f(x))
2. f(x) = O(x * f(x))
3. c * f(x) = O(f(x))
4. f(x) + c = O(f(x))
5. f(x) + g(x) = O(MAX[ f(x), g(x) ])
= MAX[ O(f(x)), O(g(x)) ]
6. f(x) * g(x) = O(f(x) * g(x))
N
7.
∑
i=0
ai
8. log2x
17.9.2015
*xi
=
O(xN)
= O(log10x)
:
ä
v
ä
t
h
e
t
o
t
n
Lue
…
a
t
n
i
s
ta
di
t
o
i
t
e
,
r
e
a
l
e
t
-­‐  p
s
u
r
e
p
,
ä
t
i
l
-­‐  se
Tietorakenteet ja algoritmit - syksy 2015
12
logkx
= O(logpx), k ja p vakioita
Todistus:
logkx
17.9.2015
= logpx / logpk = (1/vakio) * logpx = O(logpx)
Tietorakenteet ja algoritmit - syksy 2015
13
VIRHEITÄ:
1. O(f(x)) - O(f(x)) = 0
(p.o. O(f(x)) )
2. f(x) = O(g(x) / 2)
3. f(x) = O(x2 + x)
4. O(f(x)) = f(x)
5. f(x) <= O(g(x))
6. f(x) >= O(g(x))
OK:
f(x, M) = O(g(x) + M)
17.9.2015
Tietorakenteet ja algoritmit - syksy 2015
14
5.6 Muita tunnuslukuja
Iso-O (Big-Oh): f on T:lle ‘yläraja’
• 
T(N) = O( f(N) ), jos on olemassa c ja N0 siten, että T(N) < cf(N)
kaikille N > N0
Iso-Omega: f on T:lle ‘alaraja’
• 
T(N) = Ω( f(N) ), jos on olemassa c ja N0 siten, että T(N) > cf(N)
kaikille N > N0
Iso-Theta: f ‘kasvaa täsmälleen kuin’ T
• 
T(N) = Θ( f(N) ) ⇔ T(N) = O( f(N) ) ja T(N) = Ω( f(N) )
Pikku-o (Little-oh): f on T:n ‘aito yläraja’
• 
T(N) = o( f(N) ) ⇔ T(N) = O( f(N) ) ja T(N) ≠ Θ( f(N) )
Huom! Nyt ei puhuta ylärajoista tavallisessa mielessä
17.9.2015
Tietorakenteet ja algoritmit - syksy 2015
15
t
c 3N
c N3
c 0 N2
T(N) = 77+N/2
c2 s q r t ( N )
N
T(N) = O(N2 )
T(N) = O(N3 )
T(N) = O(N)
T(N) = Ω(sqrt(N))
T(N) = Ω(N)
T(N) = θ(N)
T(N) = o(N2 )
T(N) = o(N3 )
K3.3
Big-Oh on tärkein tunnusluku.
17.9.2015
Tietorakenteet ja algoritmit - syksy 2015
16
5.7 Iteratiivisen ohjelman O-kompleksisuus
§ 
Peräkkäiset lauseet
s=0;
for (i=0; i<N; i++)
s= s+1;
• 
§ 
Valitaan maksimi O(N)
Haarautuminen (if-then-else; switch; case)
• 
§ 
vakio O(1)
O(N)
Valitaan maksimi
Silmukat (for; while; do...while; repeat...until)
for (i=1; i<N; i++)
for (j=i+1; j<=N; j++)
s= s+1;
• 
17.9.2015
(N-1)*N/2 = O(N2)
Tietorakenteet ja algoritmit - syksy 2015
17
5.8 Rekursiiviset ohjelmat
int fibonacci(int n)
{
if (n<=1)
return 1;
else
return fibonacci(n-1) +
fibonacci(n-2);
}
T(0) = T(1) = 1
F6
F5
F4
F3
F2
T(N) = T(N-1) + T(N-2) + 2 >= fib(N)
F1
F2
F4
F3
F2
F3
F1
F1 F0 F1 F0
F2
F2 F1 F1
F0
F1 F0
F1 F0
(3/2)N <= fib(N) <= (5/3)N
T(N) on eksponentiaalinen
17.9.2015
Tietorakenteet ja algoritmit - syksy 2015
18
Rekursiivinen kertoma-funktio
int factorial(int n)
{
if (n==0)
return 1;
else
return n*factorial(n-1);
}
T(0) = 1
T(N) = T(N-1) + 1
T(N) = O(N)
§ 
Iso O -notaatiossa yhtä hyvä kuin iteratiivinen
§ 
Rekursiosta aiheutuu yleiskustannuksia
17.9.2015
Tietorakenteet ja algoritmit - syksy 2015
19
5.9 Rekursioyhtälöt
Mentaalisen mallin muodostuminen (muna-kana-ongelma)
1.  Rekursiohistoriapuut, laskennan etenemisen
sisäistäminen
2.  Laskennan vaativuuden erottaminen itse laskennen
lopputuloksesta
3.  ”Valikoitu arvaus” laskennan vaativuudelle
4.  Yhteys induktiotodistukseen
5.  Rekursioyhtälö mentaalisen mallin ulkoistamisen
välineenä
Rekursioyhtälöiden ratkaisumenetelmiä (todistus)
•  Aritmeettiset ja geometriset sarjakehitelmät
•  Parametrien muunnokset
•  Lausekkeen manipulointi
•  Näiden yhdistely
•  Master Theorem (Cormen)
•  Induktiotodistus (e-book)
•  …
17.9.2015
Tietorakenteet ja algoritmit - syksy 2015
20
Esim 1. Linkitetyn listan läpikäynti silmukassa, poista joka
kierroksella yksi alkio (ks. aritmeettinen sarja):
T(N) = T(N-1) + N, T(1) =1
T(N) =
N
∑ k = N (N + 1) / 2
k=1
T(N) on noin N2 / 2 = O(N2 )
17.9.2015
T(N-1) = T((N-1)-1) + (N-1)
= T(N-2) + N - 1
T(N-2) = T((N-2)-1) + (N-2)
= T(N-3) + N - 2
T(N-k) = T((N-k)-1) + (N-k)
= T(N-k-1) + N - k
Tietorakenteet ja algoritmit - syksy 2015
21
Esim 2. Binäärihaku, puolita aineisto vakioajassa:
T(N) = T(N/2) + 1,
T(1) =1
N = 2k , k = log2 N (parametrin muunnos)
T(2k ) = T(2k-1) + 1 = T(2k-2) + 1 + 1 = T(20) + k = k +1
T(N) = O(k) = O(log N)
Esim 3. Quick select, puolita aineisto lineaarisessa ajassa
(geometrinen sarja):
T(N) = T(N/2) + N,
T(1) = 1
T(N) = N + N/2 + N/4 + N/8 + ... = 2N = O(N)
17.9.2015
Tietorakenteet ja algoritmit - syksy 2015
22
Esim 4. ”Hajoita ja hallitse”: Jaa aineisto kahteen osaan lineaarisessa
ajassa, käsittele molemmat puolet rekursiivisesti
T(N) = 2T(N/2) + N,
T(1) = 1
N = 2k , k = log2 N
T(2k) = 2T(2k-1) + 2k
<=>
<=>
<=>
...
<=>
<=>
T(2k) / 2k
T(2k-1) / 2k-1
T(2k-2) / 2k-2
=
=
=
T(2k-1) / 2k-1
T(2k-2) / 2k-2
T(2k-3) / 2k-3
T(22) / 22
T(21) / 21 =
=
T(21) / 21 + 1
T(20) / 20
+1
+1
+1
+1
Lasketaan yhteen (teleskooppi)
⇒  T(2k) / 2k = k
⇒  T(N) = T(2k) = k 2k = N log N = O(N log N)
17.9.2015
Tietorakenteet ja algoritmit - syksy 2015
23
Esim 5. Potenssiinkorotus:
Jos laskettaisiin xn = x*x*x*...*x, n-1 kertolaskua => O(n)
Mutta voidaan laskea esim. x9 = (x2) 4 x = ((x2 ) 2 ) 2 x
(vain 4 kertolaskua 8:n sijaan!)
integer pow(int x, int n){
switch (n) {
case 0: return 1; break;
case 1: return x; break;
default:
if (n&1)
return pow(x*x, n/2)*x;
else
return pow(x*x, n/2);
}
}
T(n) = T(n/2) + 1 , T(1) = T(0) = 1
T(n) = O(log n) (Ratkaisu: vrt. Esim. kohta 2 edellä)
17.9.2015
Tietorakenteet ja algoritmit - syksy 2015
24
5.10 Kuinka analyysi tarkistetaan?
§ 
Empiirisesti
§ 
Toteuttamalla ohjelma
§ 
Tehdään koeajoja mahdollisimman suurilla aineistoilla
• 
§ 
Kun N tuplaantuu
• 
• 
• 
• 
• 
• 
§ 
17.9.2015
N, 2N, 4N, 8N, ...
O(N) - algoritmien ajoaika tuplaantuu
O(N2 ) : nelinkertaistuu
O(N3 ) : kahdeksankertaistuu
jne.
O(log N) : vain vakiotermi lisää riippumatta N:stä
O(N log N) : hiukan huonompi kuin O(N)
Alemman asteen termit sotkevat empiiristä tarkastelua
Tietorakenteet ja algoritmit - syksy 2015
25
§ 
17.9.2015
Jos T(N) on mitattu suoritusaika ja oletetaan, että
T(N) = O( f(N) ), niin voidaan tilastoida suuretta c = T(N)/f(N)
satunnaisilla N:n arvoilla
• 
Jos c lähestyy positiivista arvoa ⇒ f(N) on tiukka raja,
ehkä T(N) = θ( f(N) )
• 
Jos c lähestyy nollaa ⇒ f(N) on liian lepsu raja, voidaan
sanoa että T(N) = o( f(N) )
• 
Jos arvot hajaantuvat ⇒ f(N) kasvaa liian hitaasti, T(N) ei
ole O( f(N) )
Tietorakenteet ja algoritmit - syksy 2015
26
5.11 Analyyttisten tulosten tulkinta
§ 
Usein ei ole olemassa selvästi parasta algoritmia tai
tietorakennetta. Valintaan vaikuttaa monia tekijöitä :
• 
• 
• 
• 
• 
§ 
Matemaattinen analyysi kertoo vain osan totuudesta. Muita
tekijöitä ovat :
• 
• 
• 
§ 
17.9.2015
kuinka usein ohjelmaa tarvitaan?
syötteen koko (aineiston määrä)
suoritusaikavaatimukset
reaaliaikainen / eräluonteinen työ
lisäysten / poistojen / päivitysten määrä ja suhde hakuihin
kääntäjä
käyttöjärjestelmä
I/O:n määrä
Yleensä kannattaa aloittaa yksinkertaisella menetelmällä
(brute force ↔ well tuned)
Tietorakenteet ja algoritmit - syksy 2015
27
§ 
Ongelman kasvaessa algoritmia voidaan vaihtaa
tehokkaampaan uusimatta koko ohjelmaa
N2 → N * LOG N
§ 
Algoritmin viilaaminen katkaistaan sopivasti.
Ohjelmakoodin optimointi käsin kannattaa harvoin.
§ 
§ 
17.9.2015
Tärkeämpää on se, että ohjelmassa on varauduttu
muutoksiin hyvin
• 
ehjä kokonaisuus
• 
abstraktit tietotyypit
Ohjelman ylläpidettävyys on usein tärkeämpää kuin
tehokkuus!
Tietorakenteet ja algoritmit - syksy 2015
28
Ensi kerraksi…
•  Tee viikkojen 38-39 viikkoharjoitukset
Viikon 39 viikkoharjoitusten aiheena on prioriteettijonot, joka
aihepiirinä on jätetty itseopiskelun varaan.
•  Tutustu algoritmien suunnittelumenetelmiin
•  Hajoita ja hallitse
•  Taulukointi (dynaaminen ohjelmointi)
•  Ks. luentotehtävä (viikko 39) A+:ssa
17.9.2015
Tietorakenteet ja algoritmit - syksy 2015
29