Algoritmit 2 Demot 1 27.-28.3.2019 Timo Männikkö
Tehtävä 1 (a) 4n 2 + n + 4 = O(n 2 ) c, n 0 > 0 : 0 4n 2 + n + 4 cn 2 n n 0 Vasen aina tosi Oikea tosi, jos (c 4)n 2 n 4 0, joten oltava c > 4 Kokeillaan c = 5 n 2 n 4 0, joka on tosi, kun n 3 Siten vakiot c = 5 ja n 0 = 3 kelpaavat Algoritmit 2 Kevät 2019 Demot 1 27.-28.3.2019 2/22
Tehtävä 1 (b) n 3 + 2n 2 = Ω(n 2 ) c, n 0 > 0 : 0 cn 2 n 3 + 2n 2 n n 0 Vasen aina tosi Oikea tosi, jos n 3 + (2 c)n 2 0 n 2 (n + 2 c) 0 n c 2 Siten esimerkiksi vakiot c = 1 ja n 0 = 1 kelpaavat Algoritmit 2 Kevät 2019 Demot 1 27.-28.3.2019 3/22
Tehtävä 1 (c) 5n + 2 = o(n 2 ) c > 0 n 0 > 0 : 0 5n + 2 < cn 2 n n 0 Vasen aina tosi Oikea < tosi, jos cn 2 5n 2 > 0 n > (5 + 25 + 8c)/2c Siten vakio n 0 siten, että n 0 > (5 + 25 + 8c)/2c kelpaa Algoritmit 2 Kevät 2019 Demot 1 27.-28.3.2019 4/22
Tehtävä 1 (d) 3n 3 + n 2 = ω(n 2 ) c > 0 n 0 > 0 : 0 cn 2 < 3n 3 + n 2 n n 0 Vasen aina tosi Oikea < tosi, jos 3n 3 + (1 c)n 2 > 0 n 2 (3n + 1 c) > 0 n > (c 1)/3 Siten vakio n 0 siten, että n 0 > (c 1)/3 kelpaa Algoritmit 2 Kevät 2019 Demot 1 27.-28.3.2019 5/22
Tehtävä 1 (e) 2n 2 + 5n = Θ(n 2 ) c 1, c 2, n 0 > 0 : 0 c 1 n 2 2n 2 + 5n c 2 n 2 n n 0 Vasen aina tosi Keskimmäinen tosi, jos (2 c 1 )n 2 + 5n 0 n((2 c 1 )n + 5) 0, joten oltava c 1 2 Kokeillaan c 1 = 2 n 0 Oikea tosi, jos (c 2 2)n 2 5n 0 n((c 2 2)n 5) 0, joten oltava c 2 > 2 Kokeillaan c 2 = 3 n 5 Siten vakiot c 1 = 2, c 2 = 3 ja n 0 = 5 kelpaavat Algoritmit 2 Kevät 2019 Demot 1 27.-28.3.2019 6/22
Tehtävä 2 (a) f (n) = n(n 1)/2, g(n) = n 2 lim n(n 1)/2 n 2 = lim ( 1 2 1 ) 2n = 1 2 f (n) = Θ(n 2 ), f (n) = O(n 2 ), f (n) = Ω(n 2 ) Algoritmit 2 Kevät 2019 Demot 1 27.-28.3.2019 7/22
Tehtävä 2 (b) f (n) = n 3/2 + n 1/2, g(n) = n 2 lim n 3/2 + n 1/2 n 2 = lim ( 1 n + 1 ) n n = 0 f (n) = O(n 2 ), f (n) = o(n 2 ) Algoritmit 2 Kevät 2019 Demot 1 27.-28.3.2019 8/22
Tehtävä 2 (c) f (n) = log 2 n + n, g(n) = n lim lim log 2 n n = lim 1/n ln 2 1/2 n 2 = lim = 0 n ln 2 log 2 n + n n = lim (l Hôpitalin sääntö) ( ) log2 n + 1 n = 1 f (n) = Θ( n), f (n) = O( n), f (n) = Ω( n) Algoritmit 2 Kevät 2019 Demot 1 27.-28.3.2019 9/22
Tehtävä 2 (d) f (n) = log 2 n + n, g(n) = log 2 n lim lim n log 2 n = lim 1/2 n 1/n ln 2 n ln 2 = lim = 2 log 2 n + ( n = lim 1 + log 2 n (l Hôpitalin sääntö) ) n log 2 n = f (n) = Ω(log 2 n), f (n) = ω(log 2 n) Algoritmit 2 Kevät 2019 Demot 1 27.-28.3.2019 10/22
Tehtävä 2 (e) f (n) = n 3 + n + n log 2 n, g(n) = n lim n 3 + n + n log 2 n n = lim ( n 2 + 1 + log 2 n ) = f (n) = Ω(n), f (n) = ω(n) Algoritmit 2 Kevät 2019 Demot 1 27.-28.3.2019 11/22
Tehtävä 2 (f) f (n) = (n + 1) 2, g(n) = n p, (p > 0) lim (n + 1) 2 n p = lim ( n 2 p + 2n 1 p + n p) =, 0 < p < 2 1, p = 2 0, p > 2 f (n) = Ω(n p ), f (n) = ω(n p ), 0 < p < 2 f (n) = Θ(n p ), f (n) = O(n p ), f (n) = Ω(n p ), p = 2 f (n) = O(n p ), f (n) = o(n p ), p > 2 Algoritmit 2 Kevät 2019 Demot 1 27.-28.3.2019 12/22
Tehtävä 3 (a) palautatoiseksipienin: Palauttaa alkion, jolla on toiseksi pienin prioriteetti, mutta ei poista sitä prioriteettijonosta Poistetaan kaksi pienintä alkiota Lisätään molemmat alkiot takaisin Aputilaa tarvitaan vain vakiomäärä (kaksi muuttujaa) palautatoiseksipienin(pjono) { if (size(pjono) < 2) return error; a = poistapienin(pjono); b = poistapienin(pjono); lisaaalkio(a,pjono); lisaaalkio(b,pjono); return b; } Algoritmit 2 Kevät 2019 Demot 1 27.-28.3.2019 13/22
Tehtävä 3 (b) poistasuurin: Poistaa ja palauttaa alkion, jolla on suurin prioriteetti Siirretään ensin alkiot apujonoon (tai aputaulukkoon) Viimeinen alkio on haettu suurin alkio Sitten siirretään muut alkiot takaisin Aputilan koko on samaa kertaluokkaa kuin alkuperäisen prioriteettijonon koko Algoritmit 2 Kevät 2019 Demot 1 27.-28.3.2019 14/22
Tehtävä 3 (b) jatkuu poistasuurin(pjono) { n = size(pjono); if (n <= 0) return error; for (i = 1; i < n; i++) { // n-1 alkiota a = poistapienin(pjono); lisaaalkio(a,apu); } b = poistapienin(pjono); // viimeinen alkio for (i = 1; i < n; i++) { a = poistapienin(apu); lisaaalkio(a,pjono); } return b; } Algoritmit 2 Kevät 2019 Demot 1 27.-28.3.2019 15/22
Tehtävä 3 (c) onkoprioriteetti: Tutkii, onko prioriteettijonossa alkiota, jolla on jokin tietty prioriteetti Siirretään alkioita apujonoon (tai aputaulukkoon), kunnes haettu prioriteetti löytyy (tai todetaan, että ei löydy) Lopuksi siirretään alkiot takaisin Aputilan koko samaa kertaluokkaa kuin alkuperäisen prioriteettijonon koko Algoritmit 2 Kevät 2019 Demot 1 27.-28.3.2019 16/22
Tehtävä 3 (c) jatkuu onkoprioriteetti(priori,pjono) { vastaus = false; // jos ei löydy while (!isempty(pjono)) { a = poistapienin(pjono); lisaaalkio(a,apu); if (a.prioriteetti == priori) { vastaus = true; break; // löytyi, joten lopetetaan silmukka } if (a.prioriteetti > priori) break; // ei enää löydy } while (!isempty(apu)) { a = poistapienin(apu); lisaaalkio(a,pjono); } return vastaus; } Algoritmit 2 Kevät 2019 Demot 1 27.-28.3.2019 17/22
Tehtävä 4 (a) Tutkitaan, muodostavatko taulukossa olevat luvut keon Lapsisolmujen arvot eivät saa olla pienempiä kuin niiden vanhempien arvot Käydään läpi melkein koko taulukko Θ(n) n = a[0]; // oletetaan, että n > 0 for (i = 2; i <= n; i++) { // lapsisolmut if (a[i] < a[i/2]) return false; } return true; // jos päästään tänne asti, taulukko on keko Algoritmit 2 Kevät 2019 Demot 1 27.-28.3.2019 18/22
Tehtävä 4 (b) Etsitään keon suurin alkio Suurin alkio on jossakin lehtisolmussa Ensimmäinen lehtisolmu on paikassa n/2 + 1 Käydään läpi noin puolet taulukosta Θ(n) n = a[0]; // oletetaan, että n > 0 suurin = a[n/2+1]; // ensimmäinen lehtisolmu for (i = n/2+2; i <= n; i++) { // muut lehtisolmut if (a[i] > suurin) suurin = a[i]; } Algoritmit 2 Kevät 2019 Demot 1 27.-28.3.2019 19/22
Tehtävä 4 (c) Lasketaan keon pienimmän ja suurimman alkion keskiarvo Pienin alkio on juuressa Suurin alkio löytyy edellisen kohdan mukaisesti Θ(n) pienin = a[1]; suurin = etsisuurin(a); // edellinen algoritmi keskiarvo = 0.5*(pienin + suurin); Algoritmit 2 Kevät 2019 Demot 1 27.-28.3.2019 20/22
Tehtävä 5 (a) Lisätään kekoon alkiot 15, 22, 7, 21, 5, 8, 18, 30, 16 ja 9 Käytetään jokaiselle alkiolle lisaakekoon-algoritmia: a 0 1 2 3 4 5 6 7 8 9 10 1 15 2 15 22 3 7 22 15 4 7 21 15 22 5 5 7 15 22 21 6 5 7 8 22 21 15 7 5 7 8 22 21 15 18 8 5 7 8 22 21 15 18 30 9 5 7 8 16 21 15 18 30 22 10 5 7 8 16 9 15 18 30 22 21 Algoritmit 2 Kevät 2019 Demot 1 27.-28.3.2019 21/22
Tehtävä 5 (b) Lisätään kekoon alkiot 15, 22, 7, 21, 5, 8, 18, 30, 16 ja 9 Käytetään teekeko-algoritmia: korjaakeko(a,5), korjaakeko(a,4), korjaakeko(a,3), korjaakeko(a,2), korjaakeko(a,1) a 0 1 2 3 4 5 6 7 8 9 10 10 15 22 7 21 5 8 18 30 16 9 10 15 22 7 21 5 8 18 30 16 9 10 15 22 7 16 5 8 18 30 21 9 10 15 22 7 16 5 8 18 30 21 9 10 15 5 7 16 9 8 18 30 21 22 10 5 9 7 16 15 8 18 30 21 22 Algoritmit 2 Kevät 2019 Demot 1 27.-28.3.2019 22/22