Tehtävät

58131 Tietorakenteet ja algoritmit, erilliskoe 15.9.2015
Tentissä saa olla mukana käsin kirjoitettu yksi A4-kokoinen "lunttilappu", jonka molemmilla puolilla saa olla tekstiä.
Kirjoita jokaisen vastauspaperin yläkulmaan kurssin nimi, kokeen päivämäärä, nimi,
nimikirjoitus ja opiskelijanumero. Tässä kokeessa ei ole tarpeen kirjoittaa jokaista
tehtävää erilliselle konseptipaperille.
Tehtävissä, joissa pyydetään algoritmia, voit käyttää luentojen (Cormenin) tyyppistä
pseudokoodia tai muita ymmärrettäviä pseudokoodityylejä, tai oikeata ohjelmointikieltä,
esim. Javaa. Jos käytät oikeata ohjelmointikieltä, selitä erityisen hyvin, mitä ohjelmassasi
tapahtuu, äläkä käytä mitään kielen erikoista piirrettä tai valmiita kirjastoja.
Tehtävissä, joissa todetaan, että voit olettaa tunnetuksi luennoilla esitetyt algoritmit, sinun
ei tarvitse kirjoittaa auki pseudokoodia esimerkiksi Kruskalin algoritmille, kunhan on selvää, mitä algoritmia käytät. Näissä tehtävissä saat myös olettaa tunnetuksi, mitä tiedetään
luennoilla esitettyjen algoritmien aika- ja tilavaativuuksista.
Vastaukset on aina perusteltava. Esimerkiksi jos kysytään algoritmin aikavaativuutta, ei
riitä todeta aikavaativuutta ilman selitystä. Ellei muuta sanota, saa aika- ja tilavaativuudet esittää O-muotoisina, mutta tarkoitus on antaa mahdollisimman tiukkoja pahimman
tapauksen vaativuuksia.
1. [12 pistettä] Vastaa lyhyesti (muutamalla rivillä) seuraaviin kysymyksiin.
(a) Mitä tarkoittaa, että järjestämisalgoritmi on vakaa (englanniksi ”stable”)?
(b) Mainitse kaksi kurssilla esitettyä tehokasta tietorakennetta joukko-operaatioiden
insert, delete ja search toteuttamiseksi. Mitkä ovat näiden operaatioiden aikavaativuudet mainitsemillasi tietorakenteilla?
(c) Mikä on avoin hajautus (englanniksi ”open addressing”)?
(d) Mitkä ovat maksimikeon kekoehdot?
(e) Mitä tarkoitetaan suunnatun verkon vahvasti yhtenäisellä komponentilla?
(f ) Millainen on ahne algoritmi?
2. [12 pistettä] Syötteenä on annettu binääripuu, jonka kuhunkin solmuun on talletettu
yksi kokonaisluku mutta josta muuten ei voi tehdä mitään oletuksia. Esitä tehokas
algoritmi, joka tarkastaa, toteuttaako annettu binääripuu hakupuuehdon. Mikä on
algoritmisi aikavaativuus?
3. [12 pistettä] Esitä tehokas algoritmi, jolla k järjestettyä listaa voidaan lomittaa yhdeksi järjestetyksi listaksi. Täysien pisteiden saamiseksi algoritmin tulisi toimia ajassa O(n log k), missä n on listojen yhteispituus. Voit käyttää apuna mitä tahansa
kurssilla esitettyjä tietorakenteita ja niihin liittyviä aikavaativuuksia.
Käännä!
4. [12 pistettä]
(a) [4 pistettä] Tarkastele seuraavaa AVL-puuta. Lisää siihen avaimet 17 ja 13 yksitellen ja tässä järjestyksessä. Piirrä askel askeleelta, miten puu muuttuu.
11
/
\
21
/ \
15 20
\
19
5
\
8
(b) [4 pistettä] Tarkastele samaa puuta kuin edellisessä kohdassa (siis ennen lisäyksiä). Poista siitä avaimet 5 ja 21 yksitellen ja tässä järjestyksessä. Piirrä askel
askeleelta, miten puu muuttuu.
(c) [4 pistettä] Tarkastele seuraavaa minimikekoa A puunmuotoisena. Suorita heapdel-min(A) ja sen jälkeen heap-insert(1). Piirrä askel askeleelta, miten puu
muuttuu.
2
/
\
3
7
/ \
/
6 13 10
5. [12 pistettä] Tässä tehtävässä ei tarvitse esittää varsinaista ratkaisualgoritmia, vaan
esittää ratkaisun idea.
(a) [6 pistettä] Oletamme, että painotetussa verkossa ei ole negatiivisia painoja.
Dijkstran algoritmilla voi etsiä verkosta kahden solmun välisen polun, jossa kaarten painojen summa on pienin. Entä jos tehtävänä on löytää polku, jossa kaarten
painojen tulo on pienin? Mitä muutoksia Dijkstran algoritmiin vaaditaan tässä
tapauksessa?
(b) [6 pistettä] Rautatieverkosto on esitetty suuntaamattoma verkkona G = (V, E),
jonka solmuina on kaikki rautatieliikennepaikat ja kaarina niiden väliset ratayhteydet. Kutakin ratayhteyttä (u, v) meneville kuljetuksille on asetettu maksimipaino w(u, v). Tehtävänä on määrittää suurin paino, jolle voidaan taata rautatiekuljetus minkä tahansa kahden liikennepaikan välillä. Miten ratkaisisit ongelman soveltamalla kurssilla esitettyjä verkko-ongelmia ja niiden tunnettuja
ratkaisualgoritmeja? Vastauksestasi tulee ilmetä selvästi, mitkä ovat käyttämäsi
tunnetun verkkoalgoritmin syötteet ja tulosteet, miten niitä pitää mahdollisesti
muokata tässä annetun ongelman ratkaisemiseksi sekä mikä on lopullisen algoritmisi aikavaativuus. Sen sijaan sinun ei tarvitse selittää kurssilla esitettyjen
algoritmien toimintaa.
Onnea kokeeseen!