Algoritmien analyysi - luentokalvot


811312A Tietorakenteet
ja algoritmit
2015 - 2016
II Algoritmien analyysi

Sisältö
1. Algoritmien oikeellisuus
2. Algoritmien suorituskyvyn analyysi
3. Master Theorem
Ari Vesanen
811312A TRA, Algoritmien analyysi
2

II.1. Algoritmien oikeellisuus





Yksi osa algoritmien analyysistä
Varmistaa, että algoritmi toimii oikein
Osittainen oikeellisuus
 Jos algoritmi päättyy, se tuottaa oikean tuloksen
Täydellinen oikeellisuus
 Algoritmi päättyy ja tuottaa oikean tuloksen
Algoritmin oikeaksi todistaminen = Todistettava
osittainen oikeellisuus ja algoritmin päättyminen
Ari Vesanen
811312A TRA, Algoritmien analyysi
3

II.1.1 Algoritmin oikeaksi todistaminen



Tällä kurssilla ei käytetä formaaleja menetelmiä
Oikean tuloksen varmistaminen: käytetään väitteitä,
jotka osoitetaan oikeaksi ja joista seuraa algoritmin
oikeellisuus
 Usein invariantteja = ominaisuuksia, jotka ovat
voimassa tietyssä kohdassa koko algoritmin
suorituksen ajan
Päättymisen varmistaminen: käytetään
konvergentteja
 Yleensä arvoja, jotka pienenevät tai kasvavat ja
päättävät algoritmin, kun saavat jonkun tietyn arvon
Ari Vesanen
811312A TRA, Algoritmien analyysi
4

II.1.1.1 Esimerkki: Kolmen luvun maksimi
Syöte: Luvut a,b
Tulostus: Suurin
MAKSIMI3(a,b,c)
1.
x = a
2.
if b > x
3.
x = b
4.
// VÄITE 1:
5.
if c > x
6.
x = c
7.
// VÄITE 2:
8.
return x
Ari Vesanen
ja c
luvuista a,b ja c
x = max(a,b)
x = max(a,b,c)
811312A TRA, Algoritmien analyysi
5

II.1.1.2 Esimerkki: Taulukon arvojen minimi
Syöte: Taulukko A[1,..,n], n >= 1
Tulostus: Pienin luvuista A[1], … , A[n]
MINIMI(A)
i on konvergentti
1.
i = 2
2.
x = A[1]
Silmukkainvariantti:
3.
while i <= n do
4.
if A[i] < x
Kun i=k, rivillä 3 muuttujan
5.
x = A[i]
x arvo on pienin taulukon
6.
i = i+1
arvoista A[1], …, A[k-1]
7.
return x
Ari Vesanen
811312A TRA, Algoritmien analyysi
6

II.1.1.3 Esimerkki: Hanoin tornit
Alkutilanne:
1
N kiekkoa
Tavoite:
2
3
Säännöt:
1. Kiekkoja
siirretään yksi
kerrallaan
paalusta toiseen
2. Vain pienemmän
kiekon saa
siirtää toisen
päälle
Keksi siirtosarjan tuottava algoritmi
Ari Vesanen
811312A TRA, Algoritmien analyysi
7

II.1.1.3 Esimerkki: Hanoin tornit (2)
Syöte: Luku N >= 1 ja paalujen numerot A, B ja C
Tulostus: Siirtojärjestys N:lle kiekolle paalusta A
paaluun B käyttämällä apuna paalua C
SIIRRÄ(N,A,B,C)
N on konvergentti
1.
if N==1
2.
tulosta A -> B
Väite: Mistä tahansa laillisesta
3.
else
4.
SIIRRÄ(N-1,A,C,B) asemasta, jossa N pienintä kiekkoa
5.
tulosta A -> B
ovat paalussa A, algoritmi tulostaa
6.
SIIRRÄ(N-1,C,B,A) laillisen siirtosarjan, missä nämä
7.
return
N pienintä kiekkoa paaluun B
käyttäen apuna paalua C eikä siinä
siirretä mitään muita kiekkoja.
Ari Vesanen
811312A TRA, Algoritmien analyysi
8

II.1.1.4 Esimerkki: Lisäyslajittelu
Syöte: Taulukko A[0,1, ..,n-1], n >= 1
Tulostus: Järjestys A[0] <= … <= A[n-1]
Invariantti: Rivillä 1 alkiot
A[0,…j-1] samat kuin alkup.
INSERTION_SORT(A)
taulukossa, mutta
1.
for j = 1 to n-1
suuruusjärjestyksessä
2.
k = A[j]
A[0] <= … <= A[j-1]
3.
i = j-1
4.
while i>=0 and A[i]>k
5.
A[i+1] = A[i]
i on konvergentti:
6.
i = i-1
while päättyy joka
7.
A[i+1] = k
for-kierroksella
Ari Vesanen
811312A TRA, Algoritmien analyysi
9

II.2 Algoritmien suorituskyvyn analyysi



Tällä kurssilla ollaan kiinnostuneita
aikakompleksisuudesta = algoritmin vaatiman
suoritusajan suhteesta algoritmin syötteen kokoon
Tarvitaan abstrakti malli koneelle, joka suorittaa
algoritmia
Tässä käytetään hajasaantikonetta (random-access
machine)
Ari Vesanen
811312A TRA, Algoritmien analyysi
10

II.2.1 Hajasaantikone



Samanlaisista muistipaikoista koostuva muisti
Prosessori, jolla käytettävissään rekistereitä
 Dataa mielivaltaisista muistipaikoista rekistereihin
 Arvoja rekistereistä takaisin muistiin
 Rekistereissä loogisia ja aritmeettisia operaatioita
Ohjelma käskyjoukko
 Em. muisti- ja aritmeettisia operaatioita
 Suoritusta ohjaavia kontrollikäskyjä
 Käskyt suoritetaan peräkkäin, ts. ei rinnakkaista
suorittamista
Ari Vesanen
811312A TRA, Algoritmien analyysi
11

II.2.1 Hajasaantikone (2)



Kaikki perusoperaatiot vaativat saman ajan
 Eroaa reaalikoneista
Reaalikoneissa on muitakin perusoperaatioita kuin
hajasaantikoneessa
Analyysitulokset silti yleensä melko hyviä
reaalikoneillekin
Ari Vesanen
811312A TRA, Algoritmien analyysi
12

II.2.2 Analyysi: Iteratiiviset algoritmit
II.2.2.1 Esimerkki: taulukon summa
HUOM! Tässä oletetaan, että koodiriveillä
eri suoritusajat c1,c2,c3
Syöte: Taulukko A[1,..,n], n >= 1
Tulostus: Taulukon alkioiden summa
SUMMA(A)
1.
sum = 0
2.
for j = 1 to n
3.
sum = sum+A[j]
4.
return sum
Ari Vesanen
kust.
c1
c2
c3
suorituskerrat
1
n
n
811312A TRA, Algoritmien analyysi
13

II.2.2.1 Esimerkki: taulukon summa (2)

Saadaan suoritusajaksi
c1  (c 2  c3 )  n

Siis muotoa A·n + B
 Tällaisia algoritmeja sanotaan lineaarisiksi
 Voidaan suorittaa erittäin suurilla taulukoilla
Ari Vesanen
811312A TRA, Algoritmien analyysi
14

II.2.2.2 Esimerkki: vaihtolajittelu
HUOM! Tässä oletetaan, että koodiriveillä
eri suoritusajat c1,c2,…,c6
Syöte: Taulukko A[1,..,n], n >= 1
Tulostus: Taulukon luvut järjestyksessä A[1] <= … <= A[n]
VAIHTOLAJITTELU(A)
1.
for i = 1 to n
2.
for j = 1 to n
3.
if i<j && A[i]>A[j]
4.
x = A[i]
kust.
c1
c2
c3
c4
suorituskerrat
n
n∙n = n2
n2
 t(i, j)
i, j
5.
A[i] = A[j]
c5
 t(i, j)
i, j
6.
A[j] = x
c6
 t(i, j)
i, j
t(i,j) = 1 , jos ehto A[i] > A[j] on tosi ja
t(i,j) =0 muuten.
Ari Vesanen
811312A TRA, Algoritmien analyysi
15

II.2.2.2 Esimerkki: vaihtolajittelu (2)

Saadaan suoritusajaksi
c1  n  (c 2  c 3 )  n 2  (c 4  c 5  c 6 )   t(i, j)
i, j

 Riippuu taulukon alkuperäisestä järjestyksestä
Paras tapaus

c1  n  (c 2  c 3 )  n 2
Huonoin tapaus
n 2  (c2  c3  (c4  c5  c6 )/2)  n  (c1 - (c4  c5  c6 )/2)

Keskimääräinen tapaus
n 2  (c2  c3  (c4  c5  c6 )/4)  n  (c1 - (c4  c5  c6 )/4)
Ari Vesanen
811312A TRA, Algoritmien analyysi
16

II.2.2.2 Esimerkki: vaihtolajittelu (4)
Parannettu versio:
Syöte: Taulukko A[1,..,n], n >= 1
Tulostus: Luvut järjestyksessä A[1] <= … <= A[n]
VAIHTOLAJITTELU2(A)
1.
for i = 1 to n-1
2.
for j = i+1 to n
3.
if A[i] > A[j]
4.
x = A[i]
5.
A[i] = A[j]
6.
A[j] = x

Ari Vesanen
811312A TRA, Algoritmien analyysi
17

II.2.2.2 Esimerkki: vaihtolajittelu (5)


Parannettu algoritmi noin puolet nopeampi kuin
alkuperäinen
Suoritusaika silti luokkaa A·n2 + B·n
 Parantuiko oleellisesti?
 Tällaiset algoritmit neliöllisiä
 Suoritusaika pitkä erittäin suurilla taulukoilla
Ari Vesanen
811312A TRA, Algoritmien analyysi
18

II.2.3 Analyysi: Asymptoottinen merkintätapa

Työlästä (ja useimmiten vaikeaa) laskea tarkkaa
suoritusaikaa -> Samaistetaan suoritusajat, jotka ovat
samaa luokkaa
 Esim. ajat 2n+3 ja 7n+9 samaa luokkaa
 Esim. ajat 5n2 + 2n ja 21n2 + n samaa luokkaa



Kummassakin tapauksessa aikafunktiot kasvavat samalla
tavalla
Aikakompleksisuuden käsittelyssä Käytetään ns.
asymptoottista tarkastelua
Käytettävät merkinnät: O-merkintä, Θ-merkintä ja merkintä
Ari Vesanen
811312A TRA, Algoritmien analyysi
19

II.2.3 Analyysi: Asymptoottinen merkintätapa
II.2.3.1 O-merkintä

Olkoon g(n) jokin funktio. Silloin O(g(n)) on niiden
funktioiden joukko, joita voidaan rajoittaa ylhäältä
funktiolla g:
O( g (n))  { f (n) On olemassa sellaiset
positiiviset vakiot c ja n0 , että
0  f (n)  c  g (n), aina kun n  n0 }

Funktio g on funktion f asymptoottinen yläraja
 Merkitään f(n) Є O(g(n))
 HUOM! Cormenin kirjassa epätarkasti f(n) = O(g(n))
Ari Vesanen
811312A TRA, Algoritmien analyysi
20

c∙g(n)
f(n)
n0
Funktion f kasvua voidaan ylhäältä rajoittaa funktiolla g,
joten f(n) Є O(g(n))

II.2.3.1 O-merkintä (2)



Esimerkkejä:
f(n) = 2n2 + 3n
 f(n) Є O(n2),
 f(n) Є O(n3),
 f(n) Є O(n)
f(n) = n lg(n)
 f(n) Є O(n2)
Ari Vesanen
811312A TRA, Algoritmien analyysi
22

II.2.3.2 -merkintä

Olkoon g(n) jokin funktio. Silloin (g(n)) on niiden
funktioiden joukko, joita voidaan rajoittaa sekä ylhäältä
että alhaalta funktiolla g:
( 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 }

Funktio g asymptoottisesti tarkka raja funktiolle f
 Merkitään f(n) Є (g(n))
 HUOM! Cormenin kirjassa epätarkasti f(n) = (g(n))
Ari Vesanen
811312A TRA, Algoritmien analyysi
23
c2∙g(n)
f(n)
c1∙g(n)
n0
Funktion f kasvua voidaan ylhäältä ja alhaalta rajoittaa
funktiolla g, joten f(n) Є (g(n))


II.2.3.2  -merkintä (2)



Esimerkkejä:
f(n) = 2n2 + 3n
 f(n) Є (n2),
 f(n) Є (n3), vaikka f(n) Є O(n3)
f(n) = n lg(n)
 f(n) Є (n2), vaikka f(n) Є O(n2)
Ari Vesanen
811312A TRA, Algoritmien analyysi
25

II.2.3.3 -merkintä

Olkoon g(n) jokin funktio. Silloin (g(n)) on niiden
funktioiden joukko, joita voidaan rajoittaa alhaalta
funktiolla g:
( g (n))  { f (n) On olemassa sellaiset
positiiviset vakiot c ja n0 , että
0  c  g (n)  f (n), aina kun n  n0 }

Funktio g on funktion f asymptoottinen alaraja
 Merkitään f(n) Є (g(n))
 HUOM! Cormenin kirjassa epätarkasti f(n) = (g(n))
Ari Vesanen
811312A TRA, Algoritmien analyysi
26

f(n)
c∙g(n)
n0
Funktion f kasvua voidaan alhaalta rajoittaa funktiolla g,
joten f(n) Є (g(n))

II.2.3.4 Merkintöjen ominaisuuksia

Kaikki merkinnät transitiivisia:
Jos f (n)  O( g (n)) ja g (n)  O(h(n)), niin f (n)  O(h(n))
Jos f (n)  ( g (n)) ja g (n)  (h(n)), niin f (n)  (h(n))
Jos f (n)  ( g (n)) ja g (n)  (h(n)), niin f (n)  (h(n))
Ari Vesanen
811312A TRA, Algoritmien analyysi
28

II.2.3.5 Esimerkki: vaihtolajittelu



Aiemmassa vaihtolajitteluesimerkissä aikakompleksisuus
kaikissa tapauksissa luokkaa Θ(n2)
Parannettu algoritmi noin puolet nopeampi kuin
alkuperäinen: kompleksisuus silti luokkaa Θ(n2)
 Ei siis parantunut olennaisesti kun tarkastellaan
asymptoottisesti
HUOM! Jos tarkastellaan vain aikakompleksisuusluokkaa,
ei kustannuksilla c1, …, c6 ole merkitystä!
 Seuraus: Voidaan olettaa vakiokestoiset operaatiot
samanarvoisiksi -> Tarkastelu helpottuu
Ari Vesanen
811312A TRA, Algoritmien analyysi
29

II.2.3.5 Esimerkki: vaihtolajittelu (2)




Kaikki suoritusajat luokkaa Θ(n2)
Yleensä keskitytään huonoimman tapauksen
tarkasteluun
 Yläraja suoritusajalle
Joskus myös keskimääräinen tapaus kiinnostava
 Esim. Quicksort, huonoin tapaus Θ(n2),
keskimääräinen Θ(n∙lg(n))
Yleensä paras tapaus ei oleellinen
 Usein harvinainen erikoistapaus
Ari Vesanen
811312A TRA, Algoritmien analyysi
30

II.2.3.6 Sisäkkäisten silmukoiden kompleksisuus

Tutkitaan algoritmia
ALGORITMI(n)
1.
for i1 = 1 to n
2.
for i2 = 1 to n
k sisäkkäistä silmukkaa.
...
k.
for ik = 1 to n
k+1.
// Jokin vakioaikainen operaatio

HUOM! Kaikki indeksit kulkevat 1..n eivätkä riipu toisistaan. Muuten
seuraava tarkastelu ei välttämättä päde.
Ari Vesanen
811312A TRA, Algoritmien analyysi
31

II.2.3.6 Sisäkkäisten silmukoiden kompleksisuus (2)

Algoritmin suoritusaika muotoa
a k  n k  a k -1  n k -1    a 1  n  a 0



 Miksi?
Ainoastaan korkein termi vaikuttaa
kompleksisuusluokkaan -> Algoritmi luokkaa Θ(nk)
Jos algoritmin kompleksisuusluokka on O(nk) sitä
sanotaan polynomiaikaiseksi
Polynomiaikaisia algoritmeja pidetään laskennallisesti
sovellettavina
Ari Vesanen
811312A TRA, Algoritmien analyysi
32

II.2.4 Analyysi: Rekursiiviset algoritmit
Rekursiivisille algoritmeille tarvitaan uusia menetelmiä:
1. Rekursiopuun avulla tarkastelu
2. Induktiivinen päättely
3. Rekursioyhtälön muodostaminen ja ”Master Theorem”

Ari Vesanen
811312A TRA, Algoritmien analyysi
33

II.2.4.1 Esimerkki: Hanoin tornit
Syöte: Luku N >= 1 ja paalujen numerot A, B ja C
Tulostus: Siirtojärjestys N:lle kiekolle paalusta A
paaluun B käyttämällä apuna paalua C
SIIRRÄ(N,A,B,C)
1.
if N==1 then
2.
tulosta A -> B
3.
else
4.
SIIRRÄ(N-1,A,C,B)
5.
tulosta A -> B
6.
SIIRRÄ(N-1,C,B,A)
7.
end if
8.
return
Ari Vesanen
811312A TRA, Algoritmien analyysi
34

II.2.4.1 Esimerkki: Hanoin tornit (2)





Rekursiopuu: Kun N>1, haaraantuu kahteen osaan ja
tekee yhden vakioaikaisen operaation (vertailu +
tulostus) jne
Tasolla N-1 loppuu, kukin haara tekee yhden
vakioaikaisen operaation
Koska jakaantuu kahtia, tasolla k tehdään 2k operaatiota
-> Kaikkiaan 1+2+4+…+2N-1 = 2N-1 operaatiota
Algoritmin kompleksisuusluokka on Θ(2N)
Piirrä kuva!
Ari Vesanen
811312A TRA, Algoritmien analyysi
35

II.2.4.1 Esimerkki: Hanoin tornit (3)





Induktiivinen päättely:
Merkitään algoritmin askelmäärä = T(N), kun kiekkoja N
Selvästi T(1) = 1
Jos T(N-1) tunnetaan, T(N) = 1 + 2∙T(N-1)
 Ns. rekursioyhtälö
Arvataan T(N) = 2N-1 ja todetaan induktiivisesti, että
pitää paikkansa
Ari Vesanen
811312A TRA, Algoritmien analyysi
36

II.2.4.2 Master Theorem
Lause M .Olkoot a  1, b  1 kokonaislu kuvakioita ja f funktio.
Rekursion
T (n)  a  T ( n / b )  f (n) (tai T (n)  a  T ( n / b )  f (n) )
ratkaisulle pätee :
1) Jos f (n)  O( n logb a  ) jollakin v akiolla   0, niin
T (n)  ( n logb a ).
2) Jos f (n)  ( n logb a ), niin T (n)  ( n logb a  lg n)
3) Jos f (n)  ( n logb a  ) jollakin v akiolla   0 ja jos
a  f (n / b)  c  f (n) jollakin v akiolla c  1 ja riittävän
suurilla luvun n arvoilla, niin T (n)  ( f (n)).
Ari Vesanen
811312A TRA, Algoritmien analyysi
37

II.2.4.2 Master Theorem (2)



Lausetta M voidaan soveltaa antamaan rekursiivisen
algoritmin kompleksisuusluokka, kunhan rekursioyhtälö
on muodostettu
HUOM! Ei sovellu kaikkiin tapauksiin
Esimerkiksi Hanoin tornien yhtälö ei ratkea lauseella M
Ari Vesanen
811312A TRA, Algoritmien analyysi
38

II.2.4.2 Master Theorem (2)





Ratkaise lauseen M avulla
a) Rekursio T (n)  4  T (n / 2)  n
2
 Vastaus: T (n)  ( n )
b) Rekursio T (n)  4  T (n / 2)  n 2
2
 Vastaus: T (n)  ( n  lg n)
c) Rekursio T (n)  4  T (n / 2)  n3
3
 Vastaus: T (n)  ( n )
d) Rekursio T (n)  2  T (n / 2)  n lg n
 Vastaus: Lausetta ei voi
soveltaa tähän tapaukseen
Ari Vesanen
811312A TRA, Algoritmien analyysi
39

II.2.4.3 Esimerkki: Lomituslajittelu
Syöte: Taulukko A[1,..,n], n >= 1,
luvut 1 <= p <= q <= n
Tulostus: Taulukon alkiot A[p..q]
suuruusjärjestyksessä
LOMITUSLAJITTELU(A,p,q)
1.
if p < q
2.
r = ( p  q) / 2
3.
4.
5.
6.
LOMITUSLAJITTELU(A,p,r)
LOMITUSLAJITTELU(A,r+1,q)
LOMITA(A,p,r,q)
A[r]
LOMITA:
return
A[p] 3 5 8 9
A[r+1] A[q]
2 6 7 8
2 3 5 6 7 8 8 9
Ari Vesanen
811312A TRA, Algoritmien analyysi
40

II.2.4.3 Esimerkki: Lomituslajittelu (2)



Algoritmi rekursiivinen: aluksi lajitellaan listan alkiot
A[p..r] ja A[r+1..q], sitten lomitetaan järjestyksessä
olevat osalistat niin, että A[p..q] järjestyksessä
Selvästi lomittaminen voidaan tehdä lineaarisessa ajassa
 Kumpikin osalista käydään kerran läpi
Saadaan rekursio
T (n)  2  T (n / 2)  c  n

Lauseella M:
T (n)  ( n  lg n)
Ari Vesanen
811312A TRA, Algoritmien analyysi
41