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?