Aineopintojen harjoitustyö: Tietorakenteet ja algoritmit (periodi I) : Aiheita

 

Yleisiä linkkejä:

Hajautusfunktiosta: http://www.strchr.com/hash_functions

Verkoista: http://comopt.ifi.uni-heidelberg.de/software/TSPLIB95/index.html

Laajahkoja tiedostoja testausta varten: http://pizzachili.dcc.uchile.cl/texts.html

Trie: http://en.wikipedia.org/wiki/Trie

Tiedon koodaus / pakkaus: http://www.binaryessence.com/dct/en000003.htm

 

 

Puut ja muut tietorakenteet

 

 

Sanaindeksi

Sanaindeksiohjelma saa syötteenä yhden tai useamman tekstitiedoston. Tiedostojen sanoista muodostetaan yksi hakupuu, jolloin on helppoa hakea tietyn sanan esiintymiskohdat tiedostoissa.  Vertaili ohjelmaa kahdella eri puun totetuksella:  punamusta ja trie. Oma aputietorakenne. Parhaimpaan arvosanaan vaaditaan, että ohjelma voi lukea sisään n tiedostoa yhteen puuhun ja haun voi suorittaa m sanalla / sananalulla.

 

Kekovertailu

Toteuta ja vertaile seuraavia kekoja: Binomi, Binääri ja Fibonacci. Vaikeutta lisää saa työhön toteuttamalla myös Brodal Queue.

 

Puita ja niiden karsintaa

Jokaisen puun kohdalla toteutetaan puun läpikäynti: pre-order, in-order ja level-order. Puita: Trie, binäärihaku, AVL, punamusta, AA, Splay, etc. Kolmen eri puun toteutus, lisähaasteena toteutetaan Alpha-Beta pruning tai Mini-Max (Johdatus tekoälyyn materiaalia)

 

 

Verkot

 

A* vs Dijsktra

A* ja Dijsktra – havainnollista miksi A* on yleensä parempi, esitä myös esimerkki jossa A* ei ole parempi. Vertaa tila- ja aikavaativuuksia toteutuksissasi. Ainakin yksi oma apu-tietorakenne ja graafinen kuva (etsinnän aikana päivittyvä kuva paras) etsintäalueesta ja lopullisesta polusta. Kahdella eri heuristiikalla, esim. Manhattan ja Euklidinen. Vain yksi toteutus kummastakin sekä A* että Dijsktra algoritmistä, pitää toimia kahdella eri heuristiikalla (eli älä kovakoodaa naapureiden määrittelyä/etsintää. Toteuta niin että voidaan arvioida n-määrä naapuria). Sivun alareunan linkistä pääset Matti Luukkaisen A*-ohjeeseen, siellä on hyvä opastus miten teet kuvasta (bittikartta) A*:ille labyrintin. Lisähaastetta saat työhön toteuttamalla kaksi eri versiota PriorityQueue-tietorakenteesta (esim. minimikeko, fibonaccikeko ja järjestyksessä oleva lista).

 

Verkon virittävät puut

Vertaile kahta algoritmiä: Prim ja Kruskal. Graafinen tulostus lähtötilanteesta sekä lopputuloksesta (kannattaa tutustua käsitteisiin digraph sekä dot-notaatio, jos ei itse halua alkaa tekemään piirtoa). Toteuta kaksi eri versiota PriorityQueue-tyyppisestä tietorakenteesta (esim minimikeko ja järjestetty lista). 

 

Kauppamatkustajan ongelman approksimaatio tai tarkka ratkaisu

Toteutus vähintään kahdella eri algoritmillä. Täältä löytyy tietoa ja esimerkkejä verkoista: http://comopt.ifi.uni-heidelberg.de/software/TSPLIB95/index.html

 

Verkon maksimivirtaus

Vertaile kahta verkon maksimivirtausta tutkivaa algoritmiä.

 

 

Pelit, tekoälyt, muut aiheet

 

Hexed-palapeli

Pelin tekijöiden väitös: Tietokone vahvistaa, 2339 tapaa ratkaista peli. Onko näin?
http://populaari.blogspot.fi/2007/05/hexed.html

 

Kuutiopalapeli - kuinka monta tapaa ratkaista?

2-ulotteiset palat, 3-ulotteiset palat, yleistys aiheesta - kuinka monta laatikkoa eri typpejä mahtuu konttiin

http://en.wikipedia.org/wiki/Soma_cube

 

Matriisilaskin

Matlab tai Octave osaavat tehdä matriisilaskentaa. Javassa ei ole valmista kalustoa matriisilaskennalle. Toteuta tämä itse!

Esimerkkejä: http://www.bluebit.gr/matrix-calculator/ http://www.math.ubc.ca/~israel/applet/mcalc/matcalc.html

Sännöllisten lauseiden tulkki

Säännölliset lausekkeet: http://linux.fi/wiki/S%C3%A4%C3%A4nn%C3%B6llinen_lauseke ja http://en.wikipedia.org/wiki/Regular_expression

 

Pelin tekoäly

Shakki, 4/5/n-suora, ehdota omaa! Itse kehitetty logiikka ja ehkä jokin puu-rakenne. Tarpeen mukaan myös Alpha-Beta-Pruning ja MiniMax (tms.)

 

Konveksin peitteen algoritmit (convex hull algorithms)

Selostus tulossa

Monen merkkijonon etsintä: Aho-Corasick

Selostus tulossa

 

 

Tiedon pakkaus

 

Huffmanpakkaus

Toteutus Trie-rakenteella =  O (n log n). Haastetta lisää tuo tehokkaampi ratkaisu:  van Emde Boas puu = O (n log log n) http://en.wikipedia.org/wiki/Huffman_coding

 

LempelZiv-78

Nopea ja tehokas toteutus, monipuolisesti tutkittu mahdollisuuksia tallentaa. Voi toimia valinnan mukaan monella tiedostotyypillä. Vertaa omaa ohjelmaasi esimerkiki gzip-ohjelman toimintaan. Korkean tason selostus aiheesta: http://marknelson.us/1989/10/01/lzw-data-compression/ SEKÄ http://en.wikipedia.org/wiki/LZ77_and_LZ78

 

LempelZiv-78 ja Huffman

Toteuta työssä ensin Huffman-koodauksella lyhyemmät bittijonot tavuille ja sitten LempelZiv-78 pakkaa nämä. http://en.wikipedia.org/wiki/LZ77_and_LZ78 SEKÄ http://en.wikipedia.org/wiki/Huffman_coding

 

Deflate algoritmi

Gzip- ja 7-zip-ohjelmat käyttävät pohjautuvat Deflate algoritmiin. Työssä tulet tutustumaan sekä LempelZiv-7-7 sekä Huffman-algoritmiin. http://en.wikipedia.org/wiki/DEFLATE

 

 

 

Muita aihe-ehdotuksia ja tarkempia kuvauksia aiheista:

Hyviä aihe-ehdotuksia voi löytää Tietorakenteiden kurssimateriaalista. Oheisista linkeistä voi myös löytää hyvän aiheen. Huomioi että kaikista vanhoista aiheista ei välttämättä voi suoraan saada parasta arvosanaa, tarkista aihe ohjaajalta. Kaikki yllä mainitut työt ovat tarpeeksi haastavia parhaimpaan arvosanaan.

Esa Junttila: http://www.cs.helsinki.fi/u/ejunttil/opetus/tiraharjoitus/index.html#aiheita

Matii Luukkainen: http://www.cs.helsinki.fi/u/mluukkai/tirak2010/labra.html

Joel Rybicki: http://www.cs.helsinki.fi/u/jrybicki/tiralabra/#aiheet