430 likes | 757 Views
Algoritmid ja andmestruktuurid. Praktikum 20 11 /201 2 kevadsemestril J. Liivi 2-20 3 , R 8 - 10 Jüri Kiho. Osavõtt praktikumidest tarvilik. Kodutööd antakse praktikumides ja kontrollitakse (lõplikult) samuti praktikumides.
E N D
Algoritmid ja andmestruktuurid Praktikum 2011/2012 kevadsemestril J. Liivi 2-203, R8 -10 Jüri Kiho
Osavõtt praktikumidest tarvilik. Kodutööd antakse praktikumides ja kontrollitakse (lõplikult) samuti praktikumides. Kodutööks on reeglina aega kaks nädalat. Kuid soovitatav on esitada kodutöö ühe nädala jooksul – siis on võimalik saada tagasisidet ning sellel vastavalt kodutööd veel viimistleda (hinnet tõsta). Praktikumitööd tuleb teha reeglina kohapeal (J. Liivi 2-203). Praktikumi alguses on väike test (~5 min). Paarisprogrammeerimine lubatud (ja soovitatav). Programmeerimiskeel: Python (vers. 3.1) Programmeerimiskeskkond: Amadeus_AlgPython (väga soovitatav).
Praktikum 1 • Keskkonna Amadeus_AlgPython installeerimine • Fibonacci arvude leidmine • Lihtsa sorteerimisalgoritmi realiseerimine • Sorteerimise ajalise keerukuse katseline hindamine Kodutöö nr 1
Süsteemi Amadeus_AlgPython installeerimine praktikumiks ruumis L203* (Windows) aines Algoritmid ja andmestruktuurid 1. Installeerida süsteem Amadeus_AlgPython 1.1 Luua Amadeus_AlgPythoni kodukaust ntAlgPython 1.2 Laadida kodukaustaprogramm AlgPythonStarter.jar aadressilt http://www.cs.ut.ee/~kiho/AlgPythonDownload.shtml 1.3 Startida, käivitades kodukaustas programmi AlgPythonStarter.jar Kui: 'jar' is not recognized as an internal or external command,operable program or batch file.siis seda teed veel pole. Tee lisamiseks saab abi: http://courses.cs.ut.ee/2010/sylearvuti/Main/Juhend08 2. Korrigeerida Python-interpretaatori tee 2.1 Projektis (vasakus aknas) teha parandus (L203-spetsiifiline): Python: python3.0 Python: C:\Python31\python [Vt järgmine slaid] 3. Salvestada muudetud projekt: Fail > Eksportida (AlgPythonWorks.xml) 4. Installeerida praktikumi abimaterjal AAbits 4.1 Projektis (vasakus aknas, viimases sektsioonis) lisada programmide nimed: AAbits.algpy Graaf.algpy 4.2 Olemasolevasse kausta AlgPython\workspace pakkida lahti AAbits.zip aadressilt http://www.cs.ut.ee/~kiho/ads/spring12 [Vt järgmine slaid] * Ruumist sõltuv on ainult samm 2.1
Pärast installeerimist (Windows) TÖÖKAUST PROJEKT
Süsteemi Amadeus_AlgPython(ning AA-abimaterjali) installeerimine ruumis L205* (Linux: openSUSE) 1. Installeerida süsteem Amadeus_AlgPython 1.1 Luua Amadeus_AlgPythoni kodukaustntAlgPython205 1.2 Laadida kodukaustaprogramm AlgPythonStarter.jar aadressilt http://www.cs.ut.ee/~kiho/AlgPythonDownload.shtml 1.3 Startida, käivitades kodukaustas käsurealt AlgPython205> java -jar AlgPythonStarter.jar 2. Korrigeerida Python-interpretaatori tee 2.1 Projektis (vasakus aknas) teha parandus (L205-spetsiifiline): Python: python3.0 Python: python3.1 [Vt järgmine slaid] 3. Salvestada muudetud projekt: Fail > Eksportida (AlgPythonWorks.xml) 4. Installeerida praktikumi abimaterjal AAbits 4.1 Projektis (vasakus aknas, viimases sektsioonis) lisada programmide nimed: AAbits.algpy Graaf.algpy 4.2 Pakkida lahti Aabits.zip aadressilt http://www.cs.ut.ee/~kiho/ads/spring12 järgmiselt: failid*.*py (olemasolevasse) kausta AlgPython205/workspace failid Sebi*.jar kodukausta AlgPython205 [Vt järgmine slaid] * Ruumist sõltuv on ainult samm 2.1
Pärast installeerimist (Linux) PROJEKT KODUKAUST TÖÖKAUST
2. Fibonacci arvude leidmine Vt ka [Kiho 2003, lk 89] TÜ Moodle / ► MTAT.03.133 / ► Kursuse materjalid / ► Arvutipraktikum / ► prakt_1_2_aasta2012.pdf / ► Ülesanne 1. • [Kiho 2003] J.Kiho. Algoritmid ja andmestruktuurid. TÜ, 2003, 147 lk. • Raamat saadaval ATI kantseleis. • e-koopiad: • http://math.ut.ee/~kiho/ads/spring10/Kirjandus/e-koopiaid/ads2003.pdf • http://math.ut.ee/~kiho/ads/spring10/Kirjandus/e-koopiaid/ads2003.ps
3. Lihtsa sorteerimisalgoritmi realiseerimine Näiteks mullimeetod. Kirjutada funktsioon mullSort ja testida. 4. Sorteerimise ajalise keerukuse katseline hindamine • Algatada uus programm, kopeerides selle preambuli programmist Aabits.algpy. • Kopeerida uude programmi stend programmist Aabits.algpy, st skeem nimega • “funktsioonide tööajad: mõõtmine ja graafikud”. • Lisada uuritavate meetodite sektsiooni funktsioon mullSort ja meetodite nimede • loetelus asendada (näiteks) nimi valikSort nimega mullSort.
Kodutöö nr 1 TÜ Moodle / ► MTAT.03.133 / ► Kursuse materjalid / ► Arvutipraktikum / ► prakt_1_2_aasta2012.pdf Ülesanne 2 (a+b+c). Tähtaeg: 1. märts.
Praktikum2 I. Algoritmi ajaline keerukus II. Kombinatoorika 0. Test 2 • Test 1 vastused • Meelespea AAbits värskendamine. Näidisprogramm EestiLipp • Järjendi “unifitseerimise” ülesanne • Kombinatoorika: permutatsioonid, kombinatsioonid, alamhulgad Kodutöö nr 2
Algoritmid ja andmestruktuurid 2011/2012 kevadsemester Eesnimi Perekonnanimi Eriala Test 1 1. Tunnen programmeerimiskeelt Python (jah / ei) 2. Mis on algoritm? Täpne eeskiri, kuidas ülesannet lahendada lihtsamate operatsioonide täitmise teel. 3. Algoritmi ajaline keerukus on funktsioon, mis … Algoritmi ajaline keerukus on funktsioon f, mis lahendatava ülesande algandmete mahulen seab vastavusse programmi (keskmise) tööajaf(n). algoritmi operatsioonide arvu Edetabel: 1. JL ÜR 2. TI MO RV TI := 1 boonuspunkt (Praktikum 1 + Test 1)
2. Meelespea AAbits värskendamine. Näidisprogramm EestiLipp Asendada fail …\AlgPython\workspace\AAbits.algpy Moodle … AAbits.algpy Lisada fail …\AlgPython\workspace\________ Moodle … EestiLipp.algpy Projekti lisada failinimi EestiLipp.algpy
3. Järjendi “unifitseerimise” ülesanne 3.1 Realiseerida Testis 2 toodud algoritm funktsioonina. 3.2* Kirjutada Testis 2 kirjeldatud jadaülesande lahendamise rekursiivne funktsioon. Ülesanne 3A Antud: järjend a. Tulemus: tagastatakse järjend, mis on saadud järjendist a duplikaatväärtuste eemaldamise teel (unikaalsete elementide järjestus säilitatud). Näiteks: a: 12 15 16 12 11 15 12 15 18 13. Tulemus: 12 16 11 15 18 13 3.3 Kirjutada ja testida ülesannet 3A lahendav funktsioon. • Boonuse võimalus • Osaleda kiireima unifitseerimisalgoritmi pakkumise võistluses; selleks saata • ülesande 3A funktsioon *.algpy aadressile jyri.kiho@ut.ee hiljemalt 19. veebruaril. • Saadetud funktsioonidest kiireima autor saab 1-3 boonuspunkti. Kiirusi võrreldakse • eeskätt graafikute alusel, mille kuvab vastav programm abimaterjalist AAbits.
4. Kombinatoorika: permutatsioonid, kombinatsioonid, alamhulgad Generaatori (generaator-funktsiooni) mõiste. Moodle … juri\Praktikum2\ylesanded2.pdf Ülesanne 1 (a + b + c)
Kodutöö nr 2 Moodle … juri\Praktikum2\ylesanded2.pdf Ülesanne 2 (a | b |c |d |e) Tähtaeg: 1. märts. Soovitus: silumisel kasutada algul väiksemamahulisi näiteandmeid. Näiteks ülesande 2e puhul võiks alustada sobivustabeliga
Praktikum3 Magasin ja järjekord 0. Test 3 • Test 2 vastused • 2. Kiireima unifitseerimisalgoritmi pakkumise võistluse tulemused • 3. Magasini ja järjekorra realisatsioon Pythonis 4. Praktikumitöö Kodutöö nr 3
Test 2 vastused Algoritmid ja andmestruktuurid 2011/2012 kevadsemester Eesnimi Perekonnanimi Eriala Test 2 Esitada Pythoni funktsioonina n-nda Fibonacci arvu leidmise rekursiivne algoritm. Antud: järjend a pikkusega n. Näiteks: a = 12 15 16 12 11 15 15 18 13 Tulemus: järjendi a unikaalsetest elementidest koostatud järjend (elementide järjestus säilitatud). 1. Luua abijärjend b, mille i-ndaks elemendiks on arv, mitu korda järjendi ai-nda elemendi väärtus esineb järjendis a. Näiteks: a = 12 15 16 12 11 15 15 18 13 b = 2 3 1 2 1 3 3 1 1 2. Luua tulemusjärjend c, kuhu kanda a need elemendid, millele vastav b element on 1. Näiteks: a = 12 15 16 12 11 15 15 18 13 b = 2 3 1 2 1 3 3 1 1 c = 16 11 18 13 def Fib(n): if n <= 1 : return n return Fib(n-1) + Fib(n-2) Ülaltoodud algoritmi ajaline keerukus on ja isegi .. Vastus pole just vale, kuid ei sobi. Miks? Edetabel: 1. TI 2. JL
2. Kiireima unifitseerimis- algoritmi pakkumise võistluse tulemused Ülesanne 3A Antud: järjend a. Tulemus: tagastatakse järjend, mis on saadud järjendist a duplikaatväärtuste eemaldamise teel (unikaalsete elementide järjestus säilitatud). Näiteks: a: 12 15 16 12 11 15 12 15 18 13. Tulemus: 12 16 11 15 18 13 Jõumeetod (II koht, 1 bp) Antud järjend: a = [□ □ □ □ □ □ ■ □ □ □ □ □] b.count(a[i])> 0 vs a[i] in b Lisada, kui ■ b on O(n) ? == Tulemusjärjend: b = [□ □ □ □ □ ] 2 Kogukeerukus: O(n ) Kiire meetod (I koht, 3 bp) a = [□ □ □ □ □ □ ■ □ □ □ □ □] Antud järjend: Pythonis: hulk paisktabelina, seal lisamine ja otsimine ~O(1) Lisada, kui ■ c on ~O(1) b = [□ □ □ □ □ ] Tulemusjärjend: Abihulk: c = {□ □ □ □ □ } Kogukeerukus: ~O(n)
Ülesanne 3A Antud: järjend a. Tulemus: tagastatakse järjend, mis on saadud järjendist a duplikaatväärtuste eemaldamise teel (unikaalsete elementide järjestus säilitatud). Näiteks: a: 12 15 16 12 11 15 12 15 18 13. Tulemus: 12 16 11 15 18 13 Algoritm (JK_unif ) Luua paaride järjend enumerate( ) O(n) b = [ (0,12), (1,15), (2,16 ), (3, 12), (4,11), (5,15), (6,12), (7,15), (8,18), (9,13) ] Sorteerida paari teise liikme järgi sort(key = lambda x: x[1] ) O(n log n) b = [(4,11), (0,12), (3, 12), (6,12), (9,13), (1,15), (5,15), (7,15), (2,16 ), (8,18)] Jätta ainult need, mille ees ei ole samasuguse teise liikmega paar O(n) c = [(4,11), (0,12), (9,13), (1,15), (2,16 ), (8,18)] Sorteerida paari esimese liikme järgi sort(key = lambda x: x[0] )O(n log n) c = [ (0,12), (1,15), (2,16 ), (4,11), (8,18), (9,13) ] Tulemuseks on järjend paaride teistest liikmetest: O(n) tulem = [ 12, 15, 16, 11, 18, 13 ] Kokku: O(n log n)
4. Praktikumitöö Ülesanne 1 (järgmiselt slaidilt) • Vastavalt realisatsiooniskeemile eelmisel slaidil • *Kasutades järjekorraoperatsioonideks eestikeelsete nimetustega funktsioone • (vt Moodle … Praktikum3\jrkOperatsioonid.algpy) • **Kasutades järjekorra klassi või või Kodutöö nr 3 Ülesanded 2 ja 3 (järgmistelt slaididelt) NB! Preambul ja kommentaarid! Tähtaeg: 15. märts.
Ülesanne 1 Realiseerida ja kiirus-testida sorteerimise nn järjekorrameetod. Idee näite varal: 4 6 7 8 9 10 12 13 14 8 6 10 14 13 7 12 4 9 esimene viimane 8 10 14 6 13 jaotada järjekordadesse (igas sorteeritult) tagasi järjendisse (võttes esimestest vähima) 7 12 4 9 Millisest klassist on selle algoritmi keerukus? Millise järjendi korral töötab kõige kiiremini? Ülesanne 2 Realiseerida ja kiirus-testida sorteerimise nn magasinmeetod. Idee näite varal: 4 6 7 8 9 10 12 13 14 8 6 10 14 13 7 12 4 9 aken 8 6 4 jaotada magasinidesse (igas sorteeritult) tagasi järjendisse (võttes akendelt vähima) 10 7 14 13 12 9 Millisest klassist on selle algoritmi keerukus? Millise järjendi korral töötab kõige kiiremini?
Ülesanne 3 Juveelipoe omanik korraldab aegajalt reklaamiürituse, kus ühele külastajale loositakse võimalus tasuta omandada üks ehe vaateaknal olevast ehetereast. Selline premeerimine toimub vahetult enne poe sulgemist, mil ehted vaateaknalt ära viiakse. Loosiga väljavalitud isik peab ütlema ühe arvu k (0 < k < ehete arv reas). Seejärel hakatakse ehteid aknalt eemaldama: vasakult paremale liikudes eemaldatakse iga k-s ese, rea lõppu jõudes jätkub loendamine rea algusest. Isik saab endale ehte, mis viimasena jääb vaateaknale. Selleks et loosiõnne naeratamise puhuks olla valmis ütlema sellist arvu k, et saada võimalikult hinnaline ehe, tuleb koostada (oma nutitelefoni laadimiseks :) programm, mis, saades ehete hindade järjendi, väljastab soovitud k. Vihje: nn Josephuse probleemi saab hõlpsasti lahendada, kujutades rea järjekorrana, millest igal sammul: esimesed k-1 viiakse järjekorra algusest järjekorra lõppu, seejärel järjekorras esimeseks jäänu lihtsalt eemaldatakse.
Praktikum4 Paiskfunktsioon 0. Test 4 Test 3 vastus Kirje, võti ja võtmefunktsioon 3. Paiskfunktsiooni mõiste 4. Praktikumitöö
Test 3 vastus Algoritmid ja andmestruktuurid 2011/2012 kevadsemester Test 3 (Josephus) a := teha_tühi_järjekord() panna_viimaseks(a, 13) panna_viimaseks(a, 15) panna_viimaseks(a, 11) panna_viimaseks(a, 18) panna_viimaseks(a, 11) --- tsükkel panna_viimaseks(a, võtta_esimene(a)) panna_viimaseks(a, võtta_esimene(a)) x = võtta_esimene(a) on_tühi(a) ? --- katkestada tsükkel --- siinkohal: x = 18 • Andmestruktuur järjekord (J ) on iseloomustatud järgmiste • operatsioonidega (funktsioonidega): • teha_tühi_järjekord() • --- luuakse ja tagastatakse tühi järjekord • panna_viimaseks(J, x) • --- järjekorda J lisatakse (viimaseks) element väärtusega x • võtta_esimene(J) • --- järjekorrast J eemaldatakse (esimene) element, tagastatakse selle väärtus • on_tühi(J) --- tagastatakse Tõene, kui J on tühi, Väär vastasel korral ? 13 13 15 13 15 11 13 15 11 18 13 15 11 18 11 11 18 11 13 15 18 11 13 15 13 15 18 11 15 18 11 1115 18 15 18 15 18
2. Kirje, võti ja võtmefunktsioon Eraldaja \t protokoll: • 1 Aukland Anders Norra 2:59:41 M35 protokoll[0] • 21 Brink Jörgen Rootsi 2:59:42 M35 protokoll[1] • 5 Svaerd Oskar Rootsi 2:59:42 M21 protokoll[2] • 4 Rezac Stanislav Tshehhi 2:59:46 M35 protokoll[3] • 24 Fredriksson Mathias Rootsi 2:59:48 M35 protokoll[4] • 8 Larsson Martin Rootsi 2:59:53 M21 protokoll[5] • 6 Sinnes Svein Tore Norra 2:59:58 M21 protokoll[6] • Narusk Priit Voru 3:00:03 M21 protokoll[7] • . . . “4 Rezac Stanislav Tshehhi 2:59:46 M35” protokoll[3] = võtmefn = lambda x: x.split(‘\t’)[1] võtmefn(protokoll[3] ) = “Rezac Stanislav” võtmefn1 = lambda x: x.split(‘\t’)[1].split()[0] võtmefn1(protokoll[3] ) = “Rezac” võtmefn2 = lambda x: x.split(‘\t’)[1].split()[1]võtmefn2(protokoll[3] ) = “Stanislav” Kui kasutame võtmefn(x), siis kirje (x) võtmeks on perenimi <tühik> eesnimi Kui kasutame võtmefn1, siis kirje (x) võtmeks on perenimi Kui kasutame võtmefn2, siis kirje (x) võtmeks on eesnimi
3. Paiskfunktsiooni mõiste ~ -231 +1 = -2147483647 võti kirje hash(võti) hash on Pythoni paiskfunktsioon hash(võti’) ~231 -1 = 2147483647 . . . 0 1 võti h on paiskfunktsioon kirje h(võti) kollisioon! h: {võtmed} {0,1, …, 3000} h(võti’) 3000 h(võti”) . . . Näiteks: h(x) = hash(x) % 3001
4. Praktikumitöö • Koostada erinevate paiskfunktsioonide uurimise programm. • Antud: kirjete fail, nt protokoll1.txt (Moodle … Praktikum4\protokoll1.txt \workspace) • Programmis olgu • seatud muutuja M, mis määrab paiskfunktsiooni väärtuste piirkonna {0, 1, …, M-1} • defineeritud kirjest võtme eraldamise funktsioon võtmefn(kirje) = lambda x: … • defineeritud uuritav paiskfunktsioon def h(võti):…h: võtmete hulk {0, 1, …, M-1} • Tulemus (näite varal): M = 17001 0 11326-- h väärtuste arv, mida ei esinenud 1 2794 -- h väärtuste arv, mida esines 1 kord (st unikaalseid oli 2794) 2 2189-- h väärtuste arv, mida esines á 2 korda 3 460-- h väärtuste arv, mida esines á 3 korda 4 177 . . . 5 36 6 17 7 2-- h väärtuste arv, mida esines á 7 korda 9 1-- h väärtuse arv, mida esines 9 korda Kirjete arv: 9565 Unikaalseid h vaartusi: 29.21% Boonusevõimalus: defineerida h, mille korral unikaalsete h väärtuste % on suurem, kui h(x) = hash(x)%M korral. Sama fail (protokoll1.txt) ja sama M = 17001.
Praktikum5 Paisktabel 0. Test 5 Test 4 vastus Erinevaid paiskfunktsioone Sorteerimine paisktabeli abil (kimbumeetod) 4. Kodutöö nr 4
1. Test 4 vastus Algoritmid ja andmestruktuurid 2011/2012 kevadsemester Eesnimi Perekonnanimi Test 4 1. Andmestruktuuri magasin mõiste Magasini korral on põhioperatsioonideks lisada(lisatav) ja võtta() omadusega võtta(lisada(x)) = x Vt ka J.Kiho. AA 2003, lk 24-26 2. Kas andmestruktuuri järjekord iseloomustab inglisekeelne akronüüm LIFO või FIFO? FIFO (First In First Out) 3. Pythoni avaldise “11101011“.split(‘0‘)väärtuseks on:[“111”, “1”, “11“] Edetabel: 1. UL 2. JL
3. Sorteerimine paisktabeli abil (kimbumeetod) Kimbumeetodi võimalik skeem h(x) on monotoonne funktsioon
Kodutöö nr 4 4.1. Koostada paiskfunktsioonide uurimise programm (vt Praktikum 4, p 4). 4.2. Realiseerida täisarvude sorteerimise kimbumeetod. Esitada mõlemad, nii 4.1 kui ka 4.2. Tähtaeg: 29. märts.
Praktikum6 Graafitöötluse algeid 6.1 Töötada läbi programmi Aabits.algpy sektsioon graafid. Seonduvad klassid on kirjeldatud moodulis Graaf.algpy. Graafi kuvamiseks/käitlemiseks ekraanil: Java käivitatav moodul SebiGraafi.jar. Selle kohta infot ka: Moodle … Praktikum6\Sebimine.ppt 6.2 Kirjutada funktsioon, mis muudab antud graafis kaarte orientatsiooni vastupidiseks.
graaf.txt 1) D[199;30] a --> 2 2) G[30;185] SebiGraafi.jar Kasutaja from Graaf import * import os os.system("java -jar SebiGraafi.jar graaf.txt") g = graafFailist(“graaf.txt”) print("Graafi tippude arv = ", g.n()) t = g.tippNr(1) # graafi g esimene tipp print("Esimese tipu aste on ", g.aste(t)) loodud objekt g (graaf sisekujul) g
Praktikum7 Kahendpuud 0. Test 6 Etüüdid kahendpuul (vt ka AAbits) Kahendotsimispuu Kodutöö nr 5
1. Etüüdid kahendpuul (vt ka AAbits) Kõik kasutavad funktsioone vasakAlluv ja paremAllluv klassist Graaf
2. Kahendotsimispuu Ülesanne 2.1. Koostada funktsioon, mis antud (täisarvu)järjendist moodustab võimalikult madala kahendotsimispuu, mille tippudes on arvud antud järjendist. Kodutöö nr 5 Kasutades J.Kiho koostatud moodulit Graaf : 5.1. Kolm etüüdi kahendpuul (eelmiselt slaidilt, omal valikul). 5.2. Ülesanne 2.1. 5.3. Realiseerida funktsioonidena kahendotsimispuu operatsioonid leida, lisada, eemaldada. Antud on kahendpuu ja väärtus (arv). Soovitus: võib eeldada, et ei eemaldata juurtippu. Esitada 5.1 ja 5.2 ja 5.3 Tähtaeg: 12. aprill.
Praktikum8 Puud Etüüdid puul