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