Aineopintojen harjoitustyö: Tietorakenteet ja algoritmit (periodi II)

58161
3-5
Algoritmit ja koneoppiminen
Aineopinnot
Opintojaksossa opiskelijat harjoittelevat vaikeahkojen tietorakenteiden ja algoritmien toteuttamista, sekä erilaisten ratkaisujen vertailemista käytännössä. Työn arvioinnissa keskeistä on ohjelmakoodin oikeellisuus, selkeys ja tehokkuus, sekä vertailuissa saatujen tulosten esittäminen ja arviointi. Työn tekeminen edellyttää jossain määrin tieteellisen kirjallisuuteen perehtymistä. Esitiedot: Tietorakenteet ja algoritmit sekä Aineopintojen harjoitustyö: Ohjelmointi.
Vuosi Lukukausi Päivämäärä Periodi Kieli Vastuuhenkilö
2013 syksy 28.10-06.12. 2-2 Suomi Tomi Pasanen

Luennot

Aika Huone Luennoija Päivämäärä
Ma 14-16 C220 Tomi Pasanen 28.10.2013-28.10.2013

Ilmoittautuminen tälle kurssille alkaa tiistaina 8.10. klo 9.00.

Information for international students

International students, please contact Jani Rahkola jprahkol( at )cs.helsinki.fi

Yleistä

Demot torstaina 5.12 kello 10-12 ja 14-16 tilassa A318.

 

Ohjaajat

Jani Rahkola, jprahkol( at )cs.helsinki.fi, rahcola@IRCnet

Kanava

#tiralabra-2013-2

Deadlinet

Viikottainen code review perjantaihin kello 23:59 mennessä. Myöhästyminen -1 pistettä.

Demotilaisuus viimeisellä opetusviikolla 2. - 6.12.

Lopullinen palautus viimeisen opetusviikon perjantaina 6.12. kello 23.59 mennessä. Myöhästyminen -1 pistettä per alkava tunti.

Palautus

Kaikki dokumentit, koodi ja mahdolliset skriptat yhdessä pakatussa kansiossa toimitettuna ohjaajalle.

Kurssin suorittaminen

tl;dr;

Mahdollisen muun ohjauksen lisäksi kurssilla tehdään jokaviikkoinen code review. Tämä tarkoittaa käytännössä sitä, että lähetät joka viikko ohjaajalle mailia jossa pyydät käymään läpi jonkin funktion koodistasi. Ohjaaja lukee koodisi ja antaa siitä palautetta.

Dokumentit .txt, .html tai .pdf muodossa, riippuen ladonnan tarpeesta. Pyri selvään ja tiiviiseen esitykseen, yhdestä kahteen sivua.

  • Määrittelydokumentti
    • Minkä ongelman ratkaiset ja millä tietorakenteella tai algoritmilla
    • Miten tehokkaasti toteutuksesi tulee ongelman ratkaisemaan (aika- ja tilavaativuudet)
    • Mitä lähdettä käytät. Mistä ohjaaja voi ottaa selvää tietorakenteestasi/algoritmistasi
  • Toteutusdokumentti
    • Ratkaiseeko toteutuksesi ongelman määrittelyssä esittämälläsi tehokkuudella
    • Miksi näin on. Perustele pseudokoodia käyttäen
    • Onko toteutuksessasi puutteita
  • Testausdokumentti
    • Onko automaattista testausta
    • Millaisilla testisyötteillä ajoit toteutustasi
    • Millaisia tuloksia testisi antoivat
  • README
    • Miten ohjelmasi kääntyy
    • Miten ohjelmasi ajetaan
    • Millaisia syötteitä ohjelmasi ottaa

Kurssilla toteutat itsenäisesti jonkin algoritmin tai tietorakenteen, tai vertailet useaa saman ongelman ratkaisevaa algoritmia tai tietorakennetta. Tärkeää on, että toteutus saavuttaa ongelman ratkaisun tunnetut aika- ja tilavaativuudet. Esimerkiksi toteuttamasi kekojärjestämisen tulee toimia ajassa O(n log n). Toteutuksen tulee olla myös oikeellinen, joten koodin selkeys ja testaus ovat myös merkittävässä osassa. Erityisesti vertailutöissä toteutuksien tehokkuustestaus on tärkeä osa. Testisyötteet tulee valita perustellusti ja testien tulokset esittää havainnollisesti.

Suoritukseen sisältyy myös jonkin verran dokumentaatiota. Ensiksi määrittelet mitä algoritmeja ja/tai tietorakenteita aiot toteuttaa. Määrittelydokumentissa olisi myös hyvä kertoa minkä ongelman ohjelmasi ratkaisee, tai minkälaisen rajapinnan se tarjoaa. Määrittelydokumenttia varten selvität myös algoritmien ja tietorakenteiden aika- ja tilavaativuudet ja etsit muutaman hyvän lähtee. Lähteet auttavat myös ohjaajaa antamaan sinulle parempaa opastusta.

Kun toteutus alkaa olla kasassa, dokumentoit seuraavaksi sen. Toteutusdokumentissa kuvaat ohjelman rakenteen yleisellä tasolla. Tämä helpottaa ohjelmakoodin lukemista. Dokumentin keskeinen sisältö on toteutuksen aika- ja tilavaativuusanalyysi. Perustelet miksi ohjelmasi saavuttaa määrittelyssä asettamasi tavoitteet, ja teet analyysin pseudokoodille. Vertailutöissä esität suorittamiesi suorituskykyvertailujen tulokset. Toteutusdokumenttiin on myös hyvä listata ohjelman mahdolliset puutteet ja parannusehdotukset.

Testausdokumentti voi olla joko erillinen, tai osa toteutusdokumenttia. Siinä kerrot millaista testausta olet ohjelmallesi suorittanut. Vertailutöissä perustelet valitsemasi testisyötteet ja esität niillä saadut tulokset havainnollisessa muodossa. Useimmiten tämä tarkoittaa kuvaajia. Myös yhden algoritmin tai tietorakenteen töissä aika- ja tilavaativuusanalyysin tueksi on hyvä esittää testiajojen tuloksia.

Viimeinen dokumentti on README joka kertoo kuinka toteutuksesi käännetään, ajetaan ja testataan. Mahdolliset riippuvuudet tulee olla listattu, ja kääntämistä ja ajamista varten olisi hyvä olla komentoriviltä toimivat scriptit.

Ja sitten käytännössä

Toteuttamiseen käytettävän kielen saat valita melko vapaasti. Ohjaaja käyttää kuitenkin viimeisen sanan. Java on turvallinen ja hyvä valinta, ja sen työkalut ovat parhaasta päästä. Tämä on myös hyvä tilaisuus kokeilla ohjelmointikieltä johon olet jo hiukan tutustunut. Muista kuitenkin, että itse toteutus vie aikaa tutunkin kielen kanssa.

Yksikkötestaus kuuluu nykyaikaiseen ohjelmistokehitykseen, ja tietorakenteen tai algoritmin toteuttaminen on erinomainen tilaisuus harjoitelle testausta. Yksikkötestit antavat varmuutta sille, että toteutuksesi toimii oikein. Ne auttavat myös tehdessäsi muutoksia jo toimivaan koodiin.

Ohjaajat suosittelevat lämpimästi versionhallinan käyttöä. Jos et tiedä minkä valitsisit, ota Git. Vaikkei versionhallinan käyttösi olisikaan juuri muuta kuin yksi iso commit jokaisen koodaustuokiosi lopuksi, on versionhallinnasta yksi iso hyöty. Se on helppo tapa jakaa haluamasi versio koodistasi ohjaajan tarkasteltavaksi. Githubin tai jonkin vastaavan palvelun käyttö tekee kaikesta vielä helpompaa.

Aiheita

Klassikoita

  • Reitinhaku verkossa
  • Kauppamatkustajan ongelma
  • Hakupuut
  • Keot
  • Pakkausalgoritmit

Seikkailunhaluisille

  • Funktionaaliset tietorakenteet
  • Salausalgoritmit
  • Säännöllisten lausekkeiden tunnistaja
  • Pelitekoälyt
  • Merkkijonoalgoritmit

Arvostelu

Arvosana 0-5 määräytyy pisteiden 0-30 mukaan lineaarisesti. Hyväksyttävä suoritus vaatii vähintään viisi pistettä, arvosana 5 vähintään 25 pistettä. Työ arvostellaan seuraavien kriteerien mukaan. Hyväksytty suoritus vaatii kategorioista Toimivuus ja Tehokkuus vähintään yhden pisteen.

  • Oikeellisuus - 15p
    • Testaus - 5p
    • Toimivuus - 10p
  • Tehokkuus - 10p
  • Selkeys - 5p
    • Koodi - 3p
    • Dokumentaatio - 2p