You are on page 1of 36

Algoritmit 1 (ITKA201)

Laajuus 4 op
Luentoajankohtina opetusta voi seurata myös osoitteessa
https://jyufi.zoom.us/j/62483623748?pwd=akxqT3NoZEw2QzFsbmNyaGJKVVZlUT09.

Luentotallenteet ilmestyvät muutama päivä luennon jälkeen (tallennetaan Moniviestimeen, linkit


tulevat TIMiin).

Opintojakson materiaalit TIMissä https://tim.jyu.fi/view/kurssit/tie/itka201/2022s/koti.


Opintojakson sisältö

• Algoritmeista

• Algoritmin analysointi

• Perustietorakenteista

• Järjestämisen perusteita

• Algoritmien suunnittelutekniikoiden perusteita

Tiivistetysti: Algoritmit 1:llä esimerkkeinä järjestämisalgoritmeja, joiden avulla tutustutaan laskenta-


resurssitarpeisiin (erit. aikavaativuus). Tutustutaan myös näiden kanssa tarvittaviin perustietorak-
enteisiin. Algoritmit 2:lla käsitellään eri menetelmiä kauppamatkustajan ongelman ratkaisemiseen
(tietorakenteineen).
Esitiedot

• Ohjelmointi 1 (tai muu vastaava kurssi)

• Matematiikan välineitä, kuten raja-arvo, summamerkintä, eksponentti- ja logaritmifunktio,


tarvitaan työkaluina algoritmien analysoinnissa.

Ohjelmointikielet

• Ohjelmointikielellä ei ole tällä kurssilla kovin suurta merkitystä; tärkeintä on että osaa valitulla
kielellä ilmaista rakenteen selvästi ja ymmärrettävästi.
Pseudokoodi

• Ohjelmointikieliä muistuttavaa koodia

• Muuttujien (int,float,INTEGER, DOUBLE,...) määrittelyjä ei näkyvissä

• Tärkeintä on rakenne

• Esim. (tässä a on taulukko/matriisi)

boolean test(int a[0..n-1,0..n-1] {


for (i = 0; i < n-1; i++)
for (j = i+1; j < n; j++)
if a[i,j] != a[j,i]
return false;
return true;
}
Tässä yhteydessä voi lisätietoa katsoa Wikipediasta http://fi.wikipedia.org/wiki/Pseudokoodi, vaikka se ei olekaan
tietolähteenä aina luotettava (ei sovellu esim. opinnäytetöiden viitteeksi).
Kirjallisuutta

• T. H. Cormen, C. E. Leiserson, R. L. Rivest, C. Stein: Introduction to Algorithms

• M. T. Goodrich, R. Tamassia, M. H. Goldwasser: Data Structures and Algo-


rithms in Java

• M. A. Weiss: Data Structures and Algorithm Analysis in Java (/C / C++)

• M. A. Weiss: Data Structures and Problem Solving in Java

• A. Laaksonen: Tietorakenteet ja algoritmit (https://www.cs.helsinki.fi/u/ahslaaks/


tirakirja/).
Algoritmi

• Toimintosarja, joka saa syötteen ja tuottaa (oikean) tuloksen.

• Sisältää äärellisen määrän (selkeitä, ristiriidattomia) käskyjä, joita noudattamalla


suoritetaan jokin määrätty tehtävä.

Ongelma

Algoritmi

Syöte Tietokone Tuloste

• Esitetään selväkielisenä käskynä, pseudokoodina, tietokoneohjelmana, . . .


Arkipäivän algoritmeja
• ajo-ohjeet

• ruokaohjeet

• käyttöohjeet

• tomintaohjeet
Algoritmien tietokonetoteutus

• Käytännön toteutus (implementointi) ohjelmina.

• Tietokone tekee vain sen mitä sen on käsketty tehdä.

• Ongelmaan voi olla monta ratkaisutapaa.

• Valitaan sovelluskohteeseen parhaiten sopiva vaihtoehto.


Esimerkkejä ongelmista, joita ratkotaan
tietokoneella toteutettavien algoritmien avulla
http://www.boic.com/numalgo.htm

cs4fn, Queen Mary University of London


http://www.dcs.qmul.ac.uk/cs4fn/algorithms/noughtscrosses.html
Laskennalliset ongelmat
• tietokoneella ratkaistavaksi mallinnettavia
• ratkeavia tai ratkeamattomia

Esimerkkejä:

• Laske kahden kokonaisluvun m ja n tulo.


Syöte: Kaksi lukua 4 ja 6
Tuloste: Syötelukujen tulo 24
• Järjestä annettu kokonaislukujono nousevaan (kasvavaan, ei-vähenevään) järjestykseen.
Syöte: Lukujono 7, 16, 3, 48, 25
Tuloste: Lukujono 3, 7, 16, 25, 48
• Järjestä nimet aakkosjärjestykseen.
Syöte: Joukko nimiä
Tuloste: Syötenimet aakkosjärjestyksessä
• Sisältääkö annettu verkko (koostuu solmuista ja niitä yhdistävistä kaarista) Eulerin kehän? Toisin sanoen: Löytyykö
reitti, joka käyttää tasan kerran jokaista verkon kaarta ja palaa lähtösolmuunsa?
Esimerkkejä verkoista, jotka eivät sisällä Eulerin kehän:

Esimerkki verkosta, joka sisältää Eulerin kehän:


• Sisältääkö annettu verkko Hamiltonin kehän? Toisin sanoen: Löytyykö polku, joka käy tasan kerran jokaisessa
verkon solmussa ja palaa lähtösolmuunsa?

Eräs mahdollinen ratkaisualgoritmi:


1. Muodosta kaikki mahdolliset solmujen järjestykset eli permutaatiot.
(solmuja n kappaletta → permutaatioita n!)

2. Testaa jokaisella solmujen järjestyksellä onko kyseessä Hamiltonin kehä.

Pahimmassa tapauksessa joudutaan testaamaan kaikki järjestykset läpi.


Hamiltonin kehän löytämiseen tai olemassaolon toteamiseen ei tunneta tehokkaita algoritmeja: NP-täydellinen
ongelma
• Pysähtyykö annetun ohjelman suoritus syötteellä x?
Algoritmisesti ratkeamaton ongelma, jolle voidaan kuitenkin löytää osittaisratkaisu simuloimalla (testaamalla).

Oletetaan, että olisi ratkaisualgoritmi, so. kaikilla syötteillä pysähtyvä testifunktio H:


boolean H(text p, text x)
// p ohjelmateksti, x merkkijono,
// H(p, x) = true, jos p pysähtyy syötteellä x,
// H(p, x) = false, jos p ei pysähdy syötteellä x.
{
...
}
Määritellään tästä uusi funktio:
boolean K(text p)
{
if (H(p, p))
while true do ; // ikuinen silmukka
else
return true;
}
Merkitään funktion K tekstiä k:lla: K(k) pysähtyy, joss H(k, k) = false joss K(k) ei pysähdy.
Saadusta ristiriidasta seuraa, ettei oletetun kaltaista pysähtymisen testausfunktiota K voi olla
olemassa.
• Pysähtyykö annetun ohjelman suoritus kaikilla syötteillä?
Algoritmisesti ratkeamaton ongelma, ei voi löytää osittaisratkaisua simuloimalla.
Algoritmi tietokonetoteutusta varten
Ongelma

Algoritmi

Syöte Tietokone Tuloste

Algoritmi

• ratkaisee tietyn ongelman

• täsmällisesti esitetty jono toimenpiteitä, joilla syötteestä saadaan haluttu tuloste

• periaateratkaisu, jonka perusteella tehdään tietokoneohjelma.

Algoritmin valinnalla on huomattava merkitys, jos

• syöttötiedot ovat pitkiä

• tulostetieto (vastaukset) tarvitaan nopeasti

• sama ongelma on ratkaistava useasti.


Syötteen koko n voi olla esim.

• vektorin alkioiden lkm


• tietokantaan tallennettujen alkioiden määrä
• useammasta luvusta koostuva (esim. graafialgoritmeissa)

Algoritmin suoritusaika T (n)

• Lasketaan perusoperaatioina (alkeisoperaatioina, alkeisaskelina)


• Syöttötiedosta riippuen eri tapauksia
– Paras mahdollinen suoritusaika
– Pahin mahdollinen suoritusaika
– Keskimääräinen suoritusaika
Algoritmin nopeus riippuu

• tiedon määrästä (syötteen pituudesta)

• tietorakenteista (vaaditusta muistitilasta)

• tiedon järjestyksestä (alkioiden järjestys)


vrt esim. järjestämistehtävässä lukujonot 1, 2, 6, 8, 7 ja 9, 2, 4, 7, 3, 6, 8, 5, 4, 7

• laitteistosta

• ohjelmointiympäristöstä

• ohjelmoijasta . . .

Suoritusaikojen vertailu

• Ohjelman suorittaminen tietokoneella


• Yleisempi menetelmä laskemalla
Esimerkkejä syötteen koosta ja suoritusajoista
Lasketaan n taulukossa esitettyä lukua yhteen.
int laskeSumma(int[] t, int n) {
int summa = 0;
for (int i = 0; i < n; i++) {
summa = summa + t[i];
}
return summa;
}
• Syöttötiedon koko on alkioiden lukumäärä n.
• Oletetaan luvut riittävän pieniksi, jolloin yhteenlasku suoritetaan vakioajassa t1 .
• Summan laskeminen vaatii n − 1 (eli noin n) yhteenlaskua, lisäksi vakioaika t2 muihin suorituksiin.
• Suoritusaika on muotoa T (n) = nt1 + t2 .

Etsitään suurin alkio taulukosta, jossa on n kokonaislukua.


int haeSuurin(int[] t, int n) {
int suurin = t[0];
for (int i = 1; i < n; i++) {
if (suurin < t[i])
suurin = t[i];
}
return suurin;
}
• Syöttötiedon koko on alkioiden lukumäärä n.
• Alkion vertaaminen suurimpaan jo löydettyyn on vakioajassa suoritettava operaatio.
• Operaatioiden lukumäärä riippuu myös taulukon alkioista, suoritusaika vaihtelee.
• Silmukan runko suoritetaan aina n − 1 kertaa.
Matriisikertolaskun vaativuudesta (Lineaarinen algebra ja geometria 1:n suorittaneille)

• A on p × q-matriisi.

• B on q × r-matriisi.

• Matriisikertolasku AB (AB on p × r-matriisi) vaatii pqr perusoperaatiota.

• Huom! Matriisien kertolasku on liitännäinen, mutta ei vaihdannainen. Toisin sanoen pätee A(BC) = (AB)C,
mutta yleensä AB ̸= BA.

• Suoritettavana on matriisikertolasku ABCD, jossa A on 10 × 30-matriisi (10 riviä ja 30 saraketta), B on 30 × 60-


matriisi, C on 60 × 1-matriisi ja D on 1 × 100-matriisi.

• Kumpi matriisien kertomisjärjestys vaatii yhteensä vähiten perusoperaatioita


((AB)C)D vai (A(BC))D?
Käydään läpi eri vaihtoehdot kertomisjärjestyksessä:
Ensin voidaan tehdä jokin seuraavista kertolaskuista AB tai BC tai CD
AB on 10 × 60-matriisi, operaatioita 10 · 30 · 60 = 18000
BC on 30 × 1-matriisi, operaatioita 30 · 60 · 1 = 1800
CD on 60 × 100-matriisi, operaatioita 60 · 1 · 100 = 6000

Toisessa vaiheessa saadaan tulokseksi


(AB)C (tuloksena 10 × 1-matriisi, operaatioita 10 · 60 · 1 = 600) tai
(BC)D (tuloksena 30 × 100-matriisi, operaatioita 30 · 1 · 100 = 3000) tai
A(BC) (tuloksena 10 × 1-matriisi, operaatioita 10 · 30 · 1 = 300) tai
B(CD) (tuloksena 30 × 100-matriisi, operaatioita 30 · 60 · 100 = 180000) tai
(AB)(CD) (tuloksena 10 × 100-matriisi, operaatioita 10 · 60 · 100 = 60000)

Kolmannessa vaiheessa ((AB)C)D (tuloksena 10 × 100-matriisi, operaatioita 10 · 1 · 100 = 1000) tai


A((BC)D) (tuloksena 10 × 100-matriisi, operaatioita 10 · 30 · 100 = 30000) tai
(A(BC))D (tuloksena 10 × 100-matriisi, operaatioita 10 · 1 · 100 = 1000) tai
A(B(CD)) (tuloksena 10 × 100-matriisi, operaatioita 10 · 30 · 100 = 30000)
Eri kertomisjärjestykset:

((AB)C)D (AB)(CD) (A(BC))D A((BC)D) A(B(CD))


18000 18000 1800 1800 6000
+600 +6000 +300 +3000 +180000
+1000 +60000 +1000 +30000 +30000
=19600 =84000 =3100 =34800 =216000

Kertomisjärjestys (A(BC))D on paras, sillä se vaatii vain 3100 operaatiota.


Periaate versus käytäntö
• Algoritmin käyttäytyminen voi olla huomattavasti parempaa kuin pahimmassa tapauksessa.

• Nopein algoritmi voi olla hankalasti toteutettavissa.

• Pienet syöttötiedot.

• Muistitilan tarve.

• Numeerinen tarkkuus.
Esimerkki: Algoritmin suoritusaika T (n)
Eräs ongelma, jonka syötteen koko on n, voidaan ratkaista algoritmeilla A, B, C ja D, joiden suoritusaikavaativuudet
(aikakompleksisuudet) alkeisoperaatioiden (primitiivioperaatioiden) määränä ilmoitettuna ovat syötteen koon suhteen
seuraavat:

a) TA (n) = n alkeisoperaatiota Oletetaan, että ongelman ratkaisemiseen käytetään tietokonetta, joka


b) TB (n) = n2 alkeisoperaatiota pystyy ratkaisemaan 109 alkeisoperaatiota sekunnissa. Kuinka suuren
c) TC (n) = n3 alkeisoperaatiota ongelman näillä eri algoritmeilla pystyy ratkaisemaan puolessa tun-

d) TD (n) = n alkeisoperaatiota nissa?

Puoli tuntia = 30 · 60s = 1800s.


Puolessa tunnissa kone suorittaa 1800 · 109 = 1.8 · 1012 alkeisoperaatiota.
a) TA (n) = n = 1.8 · 1012 ⇒ n = 1.8 · 1012 Vastaus: n = 1.8 · 1012

b) TB (n) = n2 = 1.8 · 1012 ⇒ n ≈ 1341640.8 Vastaus: n = 1341640

c) TC (n) = n3 = 1.8 · 1012 ⇒ n ≈ 12164.4 Vastaus: n = 12164



d) TD (n) = n = 1.8 · 1012 ⇒ n = 3.24 · 1024 Vastaus: n = 3.24 · 1024
Esimerkki
Ohjelman rivien suorituskerrat

1: s=0;
2: for(i=0;i<3*n;i++)
3: s=s+1

rivi 1 suoritetaan kerran, aikaa kuluu t1


rivi 2 suoritetaan 3n+1 kertaa, aikaa kuluu jokaisella suorituskerralla t2
rivi 3 suoritetaan 3n kertaa (kullakin i:n arvolla 0, 1, . . . , 3n − 1), aikaa kuluu jokaisella suorituskerralla t3

T (n) = t1 + (3n + 1)t2 + 3nt3 = 3n(t2 + t3 ) + t1 + t2


Esimerkki
Kokeellisesti tuotettuja suoritusaikojen kuvaajia

Average running time of LU matrix decomposition without pivoting, for different number of parallel
fragment processors disabled in a NVidia 6800 Ultra GPU, in function of matrix size. The number of
fragment processors associated with each data curve is shown on the right. The data shows almost
linear improvement in the performance of our algorithms as the number of fragment processors is
increased. (http://gamma.cs.unc.edu/LU-GPU/)
Esimerkki
Järjestämistehtävä: väliinsijoitusmenetelmä eli lisäyslajittelu (engl. insertion sort)

• Järjestettävät alkiot jaetaan kahteen osaan.


– Alkuosa: järjestetyt
– Loppuosa: järjestämättömät

• Aluksi alkuosassa vain yksi alkio.

• Loppuosan alkiot siirretään yksi kerrallaan alkuosaan oikeille paikoilleen.

• Lopuksi kaikki alkiot ovat alkuosassa.

• Ks. https://visualgo.net/en/sorting.
Syöte: 83, 25, 79, 60, 12, 40

83 25 79 60 12 40

25 83 79 60 12 40

25 79 83 60 12 40

25 60 79 83 12 40

12 25 60 79 83 40

12 25 40 60 79 83
// Väliinsijoitusmenetelmä
1 for (j = 1; j < n; j++) {
2 key = a[j];
3 // Lisätään a[j] järjestettyyn alkuosaan a[0..j-
1]
4 i = j-1;
5 while (i >= 0 and a[i] > key) {
6 a[i+1] = a[i];
7 i = i-1;
8 }
9 a[i+1] = key;
10 }
• Rivin 1 for-silmukka suoritetaan kaikilla j:n arvoilla eli yhteensä n kertaa.
• Rivi 2 suoritetaan n − 1 kertaa (j = 1, . . . , n − 1).
• Rivi 4 samoin n − 1 kertaa (i = 0, . . . , n − 2).
• Rivin 5 while-lause suoritetaan, kun j = 1, . . . , n − 1. Olkoon cj se määrä kertoja, joka tätä
Pn−1
while-lausetta suoritetaan tietyllä j:n arvolla. Silloin while-lause suoritetaan yhteensä j=1 cj
kertaa.
• Rivi 6 suoritetaan vastaavasti n−1
P
Pn−1 j=1 (cj − 1) kertaa.
• Rivi 7 samoin j=1 (cj − 1) kertaa.
• Rivi 9 suoritetaan n − 1 kertaa.
Rivin i suoritusaika on rivin suorituskertojen lukumäärä kertaa yhden suorituskerran suoritusaika ti .
Algoritmin suoritusaika on rivien suoritusaikojen summa.
T (n) = t1 n + t2 (n − 1) + t4 (n − 1) + t5 n−1
P Pn−1 Pn−1
c
j=1 j + t 6 (c
j=1 j − 1) + t 7 j=1 (cj − 1) + t9 (n − 1)
Väliinsijoitusalg:n suoritusaika T (n) = t1 n+(t2 +t4 +t9 )(n−1)+t5 n−1
P Pn−1
j=1 cj +(t 6 +t 7 ) j=1 (cj −1)
riippuu järjestettävien alkioiden lukumäärästä n ja syöttötiedon järjestyksestä cj

• Paras mahdollinen suoritusaika: kasvava alkujärjestys, cj = 1 (while-ehto testataan aina vain


kerran)
n−1
X
T (n) = t1 n + (t2 + t4 + t9 )(n − 1) + t5 1 = t1 n + (t2 + t4 + t5 + t9 )(n − 1)
j=1
= (t1 + t2 + t4 + t5 + t9 )n + (−t2 − t4 − t5 − t9 )

• Pahin mahdollinen suoritusaika: vähenevä alkujärjestys, cj = j + 1


n−1
X n−1
X
T (n) = t1 n + (t2 + t4 + t9 )(n − 1) + t5 (j + 1) + (t6 + t7 ) j
j=1 j=1
 n(n + 1)  n(n − 1)
= t1 n + (t2 + t4 + t9 )(n − 1) + t5 − 1 + (t6 + t7 )
2 2
t5 + t6 + t7 2 t5 − t6 − t7
= n + (t1 + t2 + t4 + t9 + )n + (−t2 − t4 − t9 − t5 )
2 2

• Keskimääräinen suoritusaika: keskimäärin puolet alkuosan alkioista pienempiä ja puolet suurem-


pia kuin alkuosaan lisättävä alkio, cj = j/2
n−1 n−1
j X X j
T (n) = T (n) = t1 n + (t2 + t4 + t9 )(n − 1) + t5 +(t6 + t7 ) ( − 1)
j=1
2 j=1
2
| {z }
2 +n−2
=n 4
Väliinsijoitusmenetelmän suoritusaikojen tarkastelu tietokoneohjelman avulla

• Toteutetaan algoritmin mukainen ohjelma.

• Ohjelma suoritetaan eri kokoisilla syöttötiedoilla.

• Tulostetaan suoritusajat.

n 10 100 1 000 10 000 100 000


Satunnainen
Paras
Pahin

n 250 500 1 000 2 000 4 000 8 000 16 000


Satunnainen
Paras
Pahin

Huom.! Eri koneissa lasketut tulokset ovat keskenään eri suuruisia.


Yhteenveto
• Algoritmit ovat keskeisessä roolissa ohjelmistojen toteuttamisessa.

• Algoritmeja analysoimalla voi säästää aikaa toteutusvaiheessa (vrt. yritys-erehdys-korjaus).goritmit

• Tällä opintojaksolla esimerkit ovat testaamisen ja vertailun harjoittelemista varten (eivät es-
imerkkejä parhaista algoritmeista tiettyä käyttötarkoistusta varten).

You might also like