Algoritmit 1. Demot Timo Männikkö

Samankaltaiset tiedostot
Algoritmit 1. Demot Timo Männikkö

ALGORITMIT 1 DEMOVASTAUKSET KEVÄT 2012

Algoritmit 2. Demot Timo Männikkö

Algoritmit 1. Demot Timo Männikkö

Algoritmit 1. Luento 4 Ke Timo Männikkö

Algoritmit 2. Demot Timo Männikkö

Algoritmit 1. Demot Timo Männikkö

Algoritmit 1. Luento 3 Ti Timo Männikkö

TIETORAKENTEET JA ALGORITMIT

A TIETORAKENTEET JA ALGORITMIT

Algoritmit 2. Luento 13 Ti Timo Männikkö

811312A Tietorakenteet ja algoritmit II Perustietorakenteet

1. (a) Seuraava algoritmi tutkii, onko jokin luku taulukossa monta kertaa:

Tarkennamme geneeristä painamiskorotusalgoritmia

Algoritmit 2. Luento 2 To Timo Männikkö

Algoritmit 2. Luento 7 Ti Timo Männikkö

Algoritmit 2. Luento 14 Ke Timo Männikkö

Algoritmit 1. Luento 5 Ti Timo Männikkö

Algoritmit 2. Luento 2 Ke Timo Männikkö

Kaksiloppuinen jono D on abstrakti tietotyyppi, jolla on ainakin seuraavat 4 perusmetodia... PushFront(x): lisää tietoalkion x jonon eteen

811312A Tietorakenteet ja algoritmit Kertausta kurssin alkuosasta

Algoritmit 1. Luento 7 Ti Timo Männikkö

Algoritmit 1. Luento 9 Ti Timo Männikkö

Tietorakenteet ja algoritmit

Algoritmit 1. Luento 11 Ti Timo Männikkö

Algoritmit 2. Luento 3 Ti Timo Männikkö

4 Tehokkuus ja algoritmien suunnittelu

Algoritmit 2. Luento 10 To Timo Männikkö

Algoritmit 2. Demot Timo Männikkö

Algoritmit 1. Luento 1 Ti Timo Männikkö

1.1 Pino (stack) Koodiluonnos. Graafinen esitys ...

Algoritmit 1. Luento 12 Ke Timo Männikkö

Algoritmit 2. Luento 3 Ti Timo Männikkö

Tietorakenteet, laskuharjoitus 3, ratkaisuja

Listarakenne (ArrayList-luokka)

Tietorakenteet ja algoritmit

Algoritmit 1. Luento 12 Ti Timo Männikkö

Algoritmit 2. Luento 9 Ti Timo Männikkö

Pino S on abstrakti tietotyyppi, jolla on ainakin perusmetodit:

Algoritmit 1. Luento 6 Ke Timo Männikkö

(p j b (i, j) + p i b (j, i)) (p j b (i, j) + p i (1 b (i, j)) p i. tähän. Palaamme sanakirjaongelmaan vielä tasoitetun analyysin yhteydessä.

Algoritmit 1. Luento 10 Ke Timo Männikkö

Algoritmit 2. Luento 8 To Timo Männikkö

Algoritmit 1. Luento 2 Ke Timo Männikkö

815338A Ohjelmointikielten periaatteet Harjoitus 7 Vastaukset

Algoritmit 2. Luento 13 Ti Timo Männikkö

Algoritmit 2. Luento 12 To Timo Männikkö

815338A Ohjelmointikielten periaatteet Harjoitus 6 Vastaukset

(a) L on listan tunnussolmu, joten se ei voi olla null. Algoritmi lisäämiselle loppuun:

58131 Tietorakenteet ja algoritmit (kevät 2014) Uusinta- ja erilliskoe, , vastauksia

Algoritmit 2. Luento 10 To Timo Männikkö

Algoritmit 2. Luento 11 Ti Timo Männikkö

ITKP102 Ohjelmointi 1 (6 op)

58131 Tietorakenteet ja algoritmit (kevät 2013) Kurssikoe 1, , vastauksia

811312A Tietorakenteet ja algoritmit , Harjoitus 2 ratkaisu

Tehtävän V.1 ratkaisuehdotus Tietorakenteet, syksy 2003

List-luokan soveltamista. Listaan lisääminen Listan läpikäynti Listasta etsiminen Listan sisällön muuttaminen Listasta poistaminen Listan kopioiminen

Algoritmit 1. Luento 8 Ke Timo Männikkö

2. Perustietorakenteet

Tietorakenteet ja algoritmit

2. Seuraavassa kuvassa on verkon solmujen topologinen järjestys: x t v q z u s y w r. Kuva 1: Tehtävän 2 solmut järjestettynä topologisesti.

Tietorakenteet, laskuharjoitus 10, ratkaisuja. 1. (a) Seuraava algoritmi tutkii, onko jokin luku taulukossa monta kertaa:

Algoritmit 2. Luento 6 To Timo Männikkö

Algoritmit 2. Luento 9 Ti Timo Männikkö

811312A Tietorakenteet ja algoritmit Kertausta kurssin alkuosasta

Algoritmit 2. Luento 6 Ke Timo Männikkö

Aikavaativuuden perussäännöt

Luento 5. Timo Savola. 28. huhtikuuta 2006

Algoritmit 2. Luento 4 To Timo Männikkö

Vasen johto S AB ab ab esittää jäsennyspuun kasvattamista vasemmalta alkaen:

4. Perustietorakenteet: pino, jono ja lista

Kohdissa 2 ja 3 jos lukujen valintaan on useita vaihtoehtoja, valitaan sellaiset luvut, jotka ovat mahdollisimman lähellä listan alkua.

Jakso 4 Aliohjelmien toteutus

Algoritmit 2. Luento 5 Ti Timo Männikkö

Ohjelmoinnin perusteet Y Python

Algoritmit 1. Luento 10 Ke Timo Männikkö

TAMPEREEN TEKNILLINEN YLIOPISTO

ITKP102 Ohjelmointi 1 (6 op)

Numeeriset menetelmät

Olio-ohjelmointi Syntaksikokoelma

TAMPEREEN TEKNILLINEN YLIOPISTO

A TIETORAKENTEET JA ALGORITMIT

Aliohjelmatyypit (2) Jakso 4 Aliohjelmien toteutus

Ohjelmoinnin perusteet Y Python

Jakso 4 Aliohjelmien toteutus

Luento 4 Aliohjelmien toteutus

Oikeasta tosi-epätosi -väittämästä saa pisteen, ja hyvästä perustelusta toisen.

Alkuarvot ja tyyppimuunnokset (1/5) Alkuarvot ja tyyppimuunnokset (2/5) Alkuarvot ja tyyppimuunnokset (3/5)

811120P Diskreetit rakenteet

Luku 3. Listankäsittelyä. 3.1 Listat

Se mistä tilasta aloitetaan, merkitään tyhjästä tulevalla nuolella. Yllä olevassa esimerkissä aloitustila on A.

811312A Tietorakenteet ja algoritmit, , Harjoitus 4, Ratkaisu

Lista luokan sisällä

Harjoitustyö: virtuaalikone

Numeeriset menetelmät

Algoritmit 2. Luento 11 Ti Timo Männikkö

Tietorakenteet ja algoritmit Johdanto Lauri Malmi / Ari Korhonen

Algoritmien suunnittelu ja analyysi (kevät 2004) 1. välikoe, ratkaisuja

4. Joukkojen käsittely

Imperatiivisen ohjelmoinnin peruskäsitteet. Meidän käyttämän pseudokielen lauseiden syntaksi

Transkriptio:

Algoritmit 1 Demot 2 1.-2.2.2017 Timo Männikkö

Tehtävä 1 (a) Ei-rekursiivinen algoritmi: laskesumma(t, n) sum = t[0]; for (i = 1; i < n; i++) sum = sum + t[i]; return sum; Silmukka suoritetaan n 1 kertaa O(n) Algoritmit 1 Kevät 2017 Demot 2 1.-2.2.2017 2/29

Tehtävä 1 (a) jatkuu Rekursiivinen algoritmi: laskesumma(t, n) if (n == 1) return t[0]; else return (laskesumma(t, n-1) + t[n-1]); Suoritusaika muotoa b, kun n = 1, T (n) = T (n 1) + c, kun n > 1, missä b, c > 0 vakioita Algoritmit 1 Kevät 2017 Demot 2 1.-2.2.2017 3/29

Tehtävä 1 (a) jatkuu Suoritusaika muotoa b, kun n = 1, T (n) = T (n 1) + c, kun n > 1, missä b, c > 0 vakioita T (n) = T (n 1) + c = T (n 2) + 2c = T (n 3) + 3c = = T (1) + (n 1)c = b c + cn = O(n) Algoritmit 1 Kevät 2017 Demot 2 1.-2.2.2017 4/29

Tehtävä 1 (b) Ei-rekursiivinen algoritmi: etsisuurin(t, n) iso = t[0]; for (i = 1; i < n; i++) iso = max(iso, t[i]); return iso; Silmukka suoritetaan n 1 kertaa O(n) Algoritmit 1 Kevät 2017 Demot 2 1.-2.2.2017 5/29

Tehtävä 1 (b) jatkuu Rekursiivinen algoritmi: etsisuurin(t, n) if (n == 1) return t[0]; else return max(etsisuurin(t, n-1), t[n-1]); Suoritusaika samaa muotoa kuin (a)-kohdassa O(n) Algoritmit 1 Kevät 2017 Demot 2 1.-2.2.2017 6/29

Tehtävä 1 (c) Ei-rekursiivinen algoritmi: etsialkio(t, n, alkio) for (i = 0; i < n; i++) if (t[i] == alkio) return i; return -1; // ei ole Silmukka suoritetaan n kertaa O(n) Algoritmit 1 Kevät 2017 Demot 2 1.-2.2.2017 7/29

Tehtävä 1 (c) jatkuu Rekursiivinen algoritmi: etsialkio(t, n, alkio) if (n == 0) return -1; else if (t[n-1] == alkio) return n-1; else // Huom: Etsii alkiota // taulukon lopusta // alkaen, toisin kuin // ei-rekursiivinen versio // Miten tehtäisiin // etsintä taulukon // alusta alkaen? return etsialkio(t, n-1, alkio); Suoritusaika muuten samaa muotoa kuin (a)-kohdassa paitsi että rekursio päättyy vasta kun n = 0 Algoritmit 1 Kevät 2017 Demot 2 1.-2.2.2017 8/29

Tehtävä 1 (c) jatkuu Suoritusaika muotoa b, kun n = 0, T (n) = T (n 1) + c, kun n > 0, missä b, c > 0 vakioita T (n) = T (n 1) + c = T (n 2) + 2c = = T (0) + nc = b + cn = O(n) Algoritmit 1 Kevät 2017 Demot 2 1.-2.2.2017 9/29

Tehtävä 2 (a) Tavalliset pino-operaatiot: push, pop, isempty, size, top swap: Vaihtaa pinon kaksi päällimmäistä alkiota keskenään swap(pino) if (size(pino) < 2) return error; a = pop(pino); b = pop(pino); push(a,pino); push(b,pino); Aputilaa tarvitaan vakiomäärä (muuttujat a ja b) Algoritmit 1 Kevät 2017 Demot 2 1.-2.2.2017 10/29

Tehtävä 2 (b) isthere: Tutkii, onko pinossa jotain tiettyä alkiota Siirretään alkioita apupinoon, kunnes haettu alkio löytyy tai pino tyhjenee Lopuksi siirretään alkiot apupinosta takaisin alkuperäiseen pinoon Aputilaa tarvitaan apupinolle (ja muille muuttujille) Aputilan koko samaa kertaluokkaa kuin alkuperäisen pinon koko Algoritmit 1 Kevät 2017 Demot 2 1.-2.2.2017 11/29

Tehtävä 2 (b) jatkuu isthere(alkio,pino) vastaus = false; while (!isempty(pino)) if (top(pino) == alkio) vastaus = true; break; // löytyi, lopetetaan while-silmukka else a = pop(pino); push(a,apu); // apupinoon while (!isempty(apu)) a = pop(apu); push(a,pino); // takaisin return vastaus; Algoritmit 1 Kevät 2017 Demot 2 1.-2.2.2017 12/29

Tehtävä 2 (c) rotate: Kierrättää pinon n päällimmäistä alkiota siten, että päällimmäisin alkio siirtyy paikkaan n ja alkiot 2,..., n nousevat yhdellä askeleella ylöspäin Siirretään n päällimmäistä alkioita taulukkoon (tai apupinoon) Siirretään alkiot takaisin uudessa järjestyksessä Algoritmit 1 Kevät 2017 Demot 2 1.-2.2.2017 13/29

Tehtävä 2 (c) jatkuu rotate(n,pino) if (size(pino) < n) return error; for (i = 1; i <= n; i++) a[i] = pop(pino); push(a[1],pino); for (i = n; i >= 2; i--) push(a[i],pino); Aputilaa tarvitaan n:lle alkiolle (taulukko a[]) Jos n:llä kiinteä yläraja Kertaluokka vakio Jos n:ää ei ole rajoitettu Kertaluokka sama kuin alkuperäisen pinon koko Algoritmit 1 Kevät 2017 Demot 2 1.-2.2.2017 14/29

Tehtävä 3 (a) Merkkijono EFABHCDGI Lisätään merkki s pinoon p operaatiolla push(s,p) Poistetaan merkki pinosta operaatiolla pop(p) Pinoon ei saa lisätä merkkiä sellaisen merkin päälle, joka on aakkosissa aikaisemmin (koska silloin alle jäänyttä merkkiä ei voi poistaa oikealla hetkellä) Algoritmit 1 Kevät 2017 Demot 2 1.-2.2.2017 15/29

Tehtävä 3 (a) jatkuu Merkkijono EFABHCDGI push(e,1) push(f,2) push(a,1) pop(1) A push(b,1) pop(1) B push(h,3) push(c,1) pop(1) C Tarvitaan vähintään kolme pinoa push(d,1) pop(1) D pop(1) E pop(2) F push(g,1) pop(1) G pop(3) H push(i,1) pop(1) I Algoritmit 1 Kevät 2017 Demot 2 1.-2.2.2017 16/29

Tehtävä 3 (b) Merkkijono DCIHBGAFE push(d,1) push(c,1) push(i,2) push(h,2) push(b,1) push(g,2) push(a,1) pop(1) A pop(1) B Tarvitaan vähintään kaksi pinoa pop(1) C pop(1) D push(f,1) push(e,1) pop(1) E pop(1) F pop(2) G pop(2) H pop(2) I Algoritmit 1 Kevät 2017 Demot 2 1.-2.2.2017 17/29

Tehtävä 3 (c) Merkkijono EFABHCDGI Lisätään merkki s jonoon q operaatiolla enq(s,q) Poistetaan merkki jonosta operaatiolla deq(q) Jonoon ei saa lisätä merkkiä sellaisen merkin perään, joka on aakkosissa myöhemmin (koska silloin taakse jäänyttä merkkiä ei voi poistaa oikealla hetkellä) Algoritmit 1 Kevät 2017 Demot 2 1.-2.2.2017 18/29

Tehtävä 3 (c) jatkuu Merkkijono EFABHCDGI enq(e,1) enq(f,1) enq(a,2) deq(2) A enq(b,2) deq(2) B enq(h,1) enq(c,2) deq(2) C Tarvitaan vähintään kaksi jonoa enq(d,2) deq(2) D deq(1) E deq(1) F enq(g,2) deq(2) G deq(1) H enq(i,1) deq(1) I Algoritmit 1 Kevät 2017 Demot 2 1.-2.2.2017 19/29

Tehtävä 3 (d) Merkkijono DCIHBGAFE enq(d,1) enq(c,2) enq(i,1) enq(h,2) enq(b,3) enq(g,3) enq(a,4) deq(4) A deq(3) B Tarvitaan vähintään viisi jonoa deq(2) C deq(1) D enq(f,4) enq(e,5) deq(5) E deq(4) F deq(3) G deq(2) H deq(1) I Algoritmit 1 Kevät 2017 Demot 2 1.-2.2.2017 20/29

Tehtävä 4 first (a) Siirretään listan ensimmäinen alkio viimeiseksi (b) Siirretään listan viimeinen alkio ensimmäiseksi Molemmissa tapauksissa operaatiot mielekkäitä vain jos listassa vähintään kaksi alkiota Ensin tarkistukset: if (first == null) return; // tyhjä lista if (first.next == null) return; // vain yksi alkio Algoritmit 1 Kevät 2017 Demot 2 1.-2.2.2017 21/29

Tehtävä 4 (a) first q p p = osoitin viimeiseen alkioon q = osoitin ensimmäiseen alkioon p = first; while (p.next!= null) p = p.next; q = first; Algoritmit 1 Kevät 2017 Demot 2 1.-2.2.2017 22/29

Tehtävä 4 (a) jatkuu p first q first = first.next; p.next = q; q.next = null; Täytyy etsiä listan viimeinen alkio Joudutaan käymään läpi koko lista Suoritusaika O(n) Algoritmit 1 Kevät 2017 Demot 2 1.-2.2.2017 23/29

Tehtävä 4 (b) q p first p = osoitin viimeiseen alkioon q = osoitin toiseksi viimeiseen alkioon q = null; p = first; while (p.next!= null) q = p; p = p.next; Algoritmit 1 Kevät 2017 Demot 2 1.-2.2.2017 24/29

Tehtävä 4 (b) jatkuu q p first p.next = first; q.next = null; first = p; Täytyy etsiä listan viimeinen ja toiseksi viimeinen alkio Suoritusaika O(n) Algoritmit 1 Kevät 2017 Demot 2 1.-2.2.2017 25/29

Tehtävä 5 (a) first first last first last Algoritmit 1 Kevät 2017 Demot 2 1.-2.2.2017 26/29

Tehtävä 5 (a) jatkuu first last Jos lista on tyhjä, lisätään vain osoitin loppuun: if (first == null) last = null; return; Muuten lisätään osoittimet prev-kenttiin (next-kentät pysyvät ennallaan) Algoritmit 1 Kevät 2017 Demot 2 1.-2.2.2017 27/29

Tehtävä 5 (a) jatkuu q p first last q = null; p = first; do p.prev = q; q = p; p = p.next; while (p!= null) // nyt q osoittaa listan loppuun last = q; Käydään läpi koko lista Suoritusaika O(n) Algoritmit 1 Kevät 2017 Demot 2 1.-2.2.2017 28/29

Tehtävä 5 (b) first last Muutetaan rengaslistaksi: // (a)-kohdan algoritmi, jonka lisäksi: first.prev = last; last.next = first; Suoritusaika edelleen O(n) Algoritmit 1 Kevät 2017 Demot 2 1.-2.2.2017 29/29