Tietorakenteet ja algoritmit I 24.

Transcription

Tietorakenteet ja algoritmit I 24.
Tietorakenteet ja algoritmit I
Harjoitus 4
24.-25.9.2015
Ohjausta keskiviikkona, sovitaan aika ja paikka maanantain luennolla. Pysyväismääräykset kuten
ennenkin, piirrä kuva, tee algoritmi on Java-metodi, jne. Tehtävien 23 ja 24 asiat käsitellään ma
ja ke luennoilla.
Seuraava tehtävä X1 on pakollinen kaikille opiskelijoille. X-tehtävien ratkaisujen pitää olla kunkin
opiskelijan itse tekemiä. Saman ratkaisun kopioita ei hyväksytä (versioitunakaan). Vastaukset pitää
lähettää keskiviikkona 23.9. klo 21:00 mennessä sähköpostitse allaolevaa ohjetta käyttäen. Saat
automaattisen vastauksen pian onnistuneen lähetyksen jälkeen. Jollet saa kuittausta, on lähetyksessä mennyt jotain väärin, esim. otsikko. Jos kuittauksessa on kääntäjän virheilmoituksia, on
tiedostossa tai sen lähetyksessä jotain väärin. Lähetä tällöin korjattuna uudestaan. Vastauksen on
sisällettävä lyhyt itsearviointi jossa arvioit ratkaisun toimivuutta, aikavaativuutta ja mahdollisia
parannusmahdollisuuksia. Oikea itsearvointi (jonkinlaiseen ratkaisuun) on yhden pisteen arvoinen.
Tehtävän pisteet lasketaan suoraan mukaan kurssin pisteisiin.
Lähetä ratkaisusi osoitteeseen Simo . Juvaste @ uef . fi käyttäen viestin otsikkona merkkijonoa
TRA1_X1_tunnus.kokonaan@osoite missä tunnus.kokonaan@osoite on se sähköpostiosoite
jonka olet WebOodiin (tai muuten tälle kurssille) antanut. Helpointa lähettäminen on cs:ltä
käyttäen komentoa:
mutt -s TRA1_X1_tunnus.kokonaan@osoite sjuva < tunnus.java
missä tunnus.kokonaan@osoite on sinun sähköpostiosoitteesi ja tunnus.java on Java-lähdekooditiedosto joka sisältää vastauksesi. Jotta tehtävä kääntyisi, on pääohjelman luokan nimen
oltava täsmälleen sama kuin sähköpostiosoitteesi alkuosa ensimmäiseen pisteeseen tai @ -merkkiin
asti. Esim. sjuva @ uef . com → sjuva.java ja simo . juvaste @ uef.com → simo.java. Voit
lähettää sähköpostin myös www-lomakkeella jonka osoitteen ja salasanan olet saanut sähköpostilla.
Älä muuta varsinaisen tehtävämetodin otsikkoa (nimeä, parametreja, tyyppejä). Huomaa, ettei Javakääntäjälle kelpaa HTML, MIME, allekirjoitukset, eikä merkkijonojen/kommenttien jakaminen
usealle riville.
X1. Kirjoita algoritmi joka saa parametrinaan kaksi kasvavassa järjestyksessä olevaa listaa (A ja
B) ja joka palauttaa järjestetyn listan niistä alkioista jotka esiintyvät molemmissa parametrilistoissa (A ja B) vähintään kahdesti (siis vähintään kahdesti A:ssa ja vähintään kahdesti
B:ssä). Kukin alkio tulee tuloslistaan kuitenkin vain kerran.
Mikä on algoritmisi aikavaativuus? Algoritmin aikavaativuus vaikuttaa tehtävän arvosteluun.
Täysiin pisteisiin vaaditaan lineaarinen aikavaativuus. Tehtävää on helpompi lähestyä suunnittelemalla ensin algoritmi joka vie tuloslistaan kaikki ne alkiot jotka esiintyvät edes kertaalleen
molemmissa parametrilistoissa (siis listojen alkiojoukkojen leikkaus) ja muokata siitä eteenpäin. Jos teet vain tavallisen leikkauksen, maksimi on 4 pistettä (muuten 6 p). Voit käyttää
valintasi mukaan java.util.LinkedList:iä tai TraLinkedList:iä. Älä käytä apuna joukkotyypin
apukokoelmia. Ota tehtävään pohja kurssin www-sivulta, äläkä muuta metodin otsikkoa.
21. Kirjoita algoritmi joka kääntää pinon k päällimmäistä alkiota, eli vaihtaa pinon k:n päällimmäisen alkion järjestyksen päinvastaiseksi. Jos pinossa on ≤k alkiota, algoritmi kääntää
koko pinon. Käytä apuna joko tietorakennekirjaston LinkedStack -kokoelmaa tai Java API:n
LinkedList -kokoelmaa. Aikavaativuus? Tilavaativuus?
22. Palindromi on merkkijono joka myös takaperin luettuna on sama. Kun sana talletetaan pakkaan merkki kerrallaan, on helppoa tarkastaa onko sana palindromi vai ei. Kirjoita algoritmi
joka tallettaa merkkijonon merkit pakkaan ja joka tarkastaa onko pakan sisältö palindromi
vai ei. Ota kurssin www-sivulta pääohjelma jossa on vinkkejä miten merkkijono muutetaan
pakaksi. Aikavaativuus?
23. Kirjoita algoritmi joka laskee annetun binääripuun korkeuden, ts. pisimmän polun juuresta
lehtisolmuun. Aikavaativuus? Vihje: rekursio.
24. Kirjoita algoritmi, joka lisää sisäjärjestyksessä olevaan binääripuuhun uuden solmun siten,
että puu säilyy sisäjärjestyksessä. Jos samannimiöinen solmu oli jo puussa, niin solmua ei
lisätä puuhun. Parametrina puu ja alkio, algoritmi luo uuden solmun jos lisäys tehdään.
Algoritmi palauttaa totuusarvon lisättiinkö alkio vai ei. Algoritmin toiminta käytiin läpi
luennolla. Aikavaativuus?