MAT Tieto ja laskenta laskuharjoituksia

Samankaltaiset tiedostot
MAT Tieto ja laskenta laskuharjoituksia

811312A Tietorakenteet ja algoritmit Kertausta kurssin alkuosasta

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

ITKP102 Ohjelmointi 1 (6 op)

Algoritmit 2. Luento 8 To Timo Männikkö

Algoritmit 2. Luento 3 Ti Timo Männikkö

4 Tehokkuus ja algoritmien suunnittelu

Algoritmit 2. Luento 7 Ti Timo Männikkö

Tietorakenteet ja algoritmit - syksy

Algoritmit 2. Luento 3 Ti Timo Männikkö

Tietorakenteet ja algoritmit Johdanto Lauri Malmi / Ari Korhonen

Datatähti 2019 loppu

Tietotekniikan valintakoe

811312A Tietorakenteet ja algoritmit Kertausta kurssin alkuosasta

Tietorakenteet, laskuharjoitus 7, ratkaisuja

9 Erilaisia tapoja järjestää

58131 Tietorakenteet ja algoritmit (kevät 2016) Ensimmäinen välikoe, malliratkaisut

Algoritmit 1. Demot Timo Männikkö

811120P Diskreetit rakenteet

Algoritmit 2. Luento 2 To Timo Männikkö

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

ja λ 2 = 2x 1r 0 x 2 + 2x 1r 0 x 2

Algoritmit 1. Luento 8 Ke Timo Männikkö

Diskreetin matematiikan perusteet Laskuharjoitus 2 / vko 9

Kirjoita oma versio funktioista strcpy ja strcat, jotka saavat parametrinaan kaksi merkkiosoitinta.

Tietorakenteet ja algoritmit syksy Laskuharjoitus 1

815338A Ohjelmointikielten periaatteet Harjoitus 2 vastaukset

TKT20001 Tietorakenteet ja algoritmit Erilliskoe , malliratkaisut (Jyrki Kivinen)

Algoritmit 1. Luento 9 Ti Timo Männikkö

A ja B pelaavat sarjan pelejä. Sarjan voittaja on se, joka ensin voittaa n peliä.

Tietorakenteet (syksy 2013)

Algoritmit 1. Luento 11 Ti Timo Männikkö

811312A Tietorakenteet ja algoritmit , Harjoitus 2 ratkaisu

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

811120P Diskreetit rakenteet

Algoritmit 1. Luento 1 Ti Timo Männikkö

Algoritmit 1. Luento 12 Ti Timo Männikkö

13 Lyhimmät painotetut polut

Algoritmit 2. Luento 2 Ke Timo Männikkö

TIE Tietorakenteet ja algoritmit 25

Tietorakenteet ja algoritmit

Algoritmit 1. Luento 13 Ti Timo Männikkö

Algoritmit 1. Luento 12 Ke Timo Männikkö

Johdatus lukuteoriaan Harjoitus 2 syksy 2008 Eemeli Blåsten. Ratkaisuehdotelma

1. Esitä rekursiivinen määritelmä lukujonolle

Kurssikoe on maanantaina Muista ilmoittautua kokeeseen viimeistään 10 päivää ennen koetta! Ilmoittautumisohjeet löytyvät kurssin kotisivuilla.

Algoritmi on periaatteellisella tasolla seuraava:

811312A Tietorakenteet ja algoritmit, , Harjoitus 7, ratkaisu

Algoritmit 2. Luento 13 Ti Timo Männikkö

Olkoon seuraavaksi G 2 sellainen tasan n solmua sisältävä suunnattu verkko,

811120P Diskreetit rakenteet

Algoritmit 2. Luento 14 Ke Timo Männikkö

Äärellisten mallien teoria

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.

811312A Tietorakenteet ja algoritmit, , Harjoitus 3, Ratkaisu

58131 Tietorakenteet ja algoritmit (syksy 2015)

(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ä.

ITKP102 Ohjelmointi 1 (6 op)

ITKP102 Ohjelmointi 1 (6 op)

ITKP102 Ohjelmointi 1 (6 op)

Ohjelmoinnin perusteet Y Python

Graafit ja verkot. Joukko solmuja ja joukko järjestämättömiä solmupareja. eli haaroja. Joukko solmuja ja joukko järjestettyjä solmupareja eli kaaria

Algoritmit 2. Luento 6 To Timo Männikkö

MS-A0402 Diskreetin matematiikan perusteet

(1) refleksiivinen, (2) symmetrinen ja (3) transitiivinen.

ALGORITMIT 1 DEMOVASTAUKSET KEVÄT 2012

815338A Ohjelmointikielten periaatteet Harjoitus 6 Vastaukset

Matematiikassa ja muuallakin joudutaan usein tekemisiin sellaisten relaatioiden kanssa, joiden lakina on tietyn ominaisuuden samuus.

Tiraka, yhteenveto tenttiinlukua varten

Luku 8. Aluekyselyt. 8.1 Summataulukko

Ohjelmoinnin perusteet Y Python

TIE Tietorakenteet ja algoritmit 261

Ohjelmoinnin perusteet Y Python

Algoritmit 2. Luento 9 Ti Timo Männikkö

Ohjelmassa muuttujalla on nimi ja arvo. Kääntäjä ja linkkeri varaavat muistilohkon, jonne muuttujan arvo talletetaan.

815338A Ohjelmointikielten periaatteet Harjoitus 3 vastaukset

11. Javan toistorakenteet 11.1

ICS-C2000 Tietojenkäsittelyteoria Kevät 2016

a k+1 = 2a k + 1 = 2(2 k 1) + 1 = 2 k+1 1. xxxxxx xxxxxx xxxxxx xxxxxx

Algoritmit 1. Luento 3 Ti Timo Männikkö

Algoritmit 1. Demot Timo Männikkö

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

Kerta 2. Kerta 2 Kerta 3 Kerta 4 Kerta Toteuta Pythonilla seuraava ohjelma:

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

1 Erilaisia tapoja järjestää

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

Esimerkkejä polynomisista ja ei-polynomisista ongelmista

f(n) = Ω(g(n)) jos ja vain jos g(n) = O(f(n))

12. Javan toistorakenteet 12.1

4. Joukkojen käsittely

Hakupuut. tässä luvussa tarkastelemme puita tiedon tallennusrakenteina

Python-ohjelmointi Harjoitus 2

4.3. Matemaattinen induktio

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

58131 Tietorakenteet ja algoritmit Uusinta- ja erilliskoe ratkaisuja (Jyrki Kivinen)

Java-kielen perusteet

815338A Ohjelmointikielten periaatteet Harjoitus 5 Vastaukset

TAMPEREEN TEKNILLINEN YLIOPISTO

Algoritmit. Ohjelman tekemisen hahmottamisessa käytetään

A TIETORAKENTEET JA ALGORITMIT

Transkriptio:

MAT-71000 Tieto ja laskenta laskuharjoituksia Antti Valmari Tampereen teknillinen yliopisto 31.3.2016 Tehtävien tähtiluokitus Tehtävät on yritetty luokitella helppoihin (ei tähtiä), keskivaikeisiin (yksi tähti) ja vaikeisiin (kaksi tähteä). Luokittelu ei perustu työmäärään vaan tehtävän ratkaisemisessa tarvittavaan osaamiseen, ottaen huomioon myös aikaisemmat tehtävät. Puutteellisesti ratkaistu tehtävä voidaan harkinnan mukaan tai tehtävässä ilmoitetulla tavalla hyväksyä pienemmällä tähtien määrällä. Luokittelua voidaan tulevia vuosia varten muuttaa, jos tehtävä osoittautuu arvioitua helpommaksi tai vaikeammaksi. Kysymysmerkki ilmaisee, että tehtävää ei ole vielä luokiteltu. Pisteytys Arvosanan 1 raja tulee olemaan välillä 40%... 50% tentin maksimipisteistä. Muiden arvosanojen rajat tulevat olemaan suunnilleen 10 %-yksikön välein. Laskuharjoituspisteet lisätään tenttipisteisiin kuten jäljempänä on kerrottu. Laskuharjoitusten tehtävät on jaettu ryhmiin viikkojen mukaan. Jos opiskelija esittää hyväksytysti ryhmästä yhden ratkaisun, hän saa kolme pistettä. Kahdella ratkaisulla samasta ryhmästä saa viisi ja kolmella kuusi pistettä. Tämän säännön tavoitteena on kannustaa ratkaisemaan tehtäviä useista eri aiheista. Tentin arvostelussa otetaan huomioon korkeintaan 30 laskuharjoituspistettä. Yksi laskuharjoituspiste vastaa 1 3 % tentin maksimipisteistä. Ratkaisujen esittämisessä on olennaista perustella ratkaisu. Kokeellisten tehtävien tapauksessa kerro kokeen lopputuloksen lisäksi myös koejärjestely ja miksi uskot, että se mittaa oikeaa asiaa. Ohjelmointitehtävien tapauksessa kerro ohjelman lisäksi miksi uskot, että se laskee luvatun tuloksen. Päättelytehtävien tapauksessa kerro, miksi kukin päättelyaskel pitää paikkansa. Tiedonhakutehtävien tapauksessa kerro, mistä hait tiedon ja miksi juuri sieltä. Muiden tyyppisten tehtävien tapauksessa esitä tehtävän luonteeseen sopiva perustelu.

MAT-71000 laskuharjoituksia AV 31.3.2016 2 1 Tiedon esittämistavoista 1. Selvitä kirjoittamalla sopivia C++-ohjelmia, voiko tietokoneesi C++-toteutuksen char-luku olla negatiivinen. 2. Selvitä kokeilemalla kaikki neljä tapausta joissa n ja m ovat positiivisia tai negatiivisia, milloin tietokoneesi C++-toteutuksessa n%m on negatiivinen. Mihin suuntaan n/m pyöristetään kokeilemissasi tapauksissa? 3.* Kokeile, ovatko tietokoneesi C++-toteutuksessa kaikki osoittimet (tarkemmin sanoen niiden osoittamien muistipaikkojen osoitteet) neljällä jaollisia. Keksitkö tietotyypin, jolle osoittimet ovat jaollisia suuremmalla luvulla kuin neljä? 4.* Kirjoita C++-ohjelma, joka ei käytä sellaisia toimintoja kuin sizeof, MAXINT tai <limits> ja jonka avulla voit selvittää, montako bittiä on unsigned-luvuissa. 5.* Mitä laskevat C++:n (a) n&m, (b) n m, (c) nˆm, (d) n ja (e) (n-1)ˆn? Tee ohjelma, joka havainnollistaa jokaisen. 6.* Opeta muille läsnäolijoille, mikä on heksadesimaalijärjestelmä ja miten luvun voi muuttaa heksadesimaalijärjestelmästä 10-järjestelmään ilman tehokkaampia apuvälineitä kuin kynä, paperi ja nelilaskin (laskin, jossa on yhteen-, vähennys-, kerto- ja jakolasku). 7.* Opeta muille läsnäolijoille, miten luvun voi muuttaa 10-järjestelmästä heksadesimaalijärjestelmään ilman tehokkaampia apuvälineitä kuin kynä, paperi ja nelilaskin (laskin, jossa on yhteen-, vähennys-, kerto- ja jakolasku). 8.* Selvitä, kuinka monta tavua tietokoneesi C++-toteutus varaa std::vectorille siihen talletettavalle aineistolle varatun tilan lisäksi. Voit esimerkiksi varata kaksi vektoria ja verrata niiden osoitteita. Kerro, mitkä tavut ilmoittavat vektorin koon, mitkä vektorille varatun tilan ja mitkä vektoriin talletettavan aineiston osoitteen. 9. Tee ohjelma, joka havainnollistaa säiliön std::vector sisällön siirtymistä muistin alueesta toiseen. 10. Esitä perusteluja puolesta ja vastaan sille, että liukuluvuissa on erikseen +0 ja 0. Voit käyttää lähteenä Wikipediaa. 11.* Liukuluvuilla laskettaessa tapahtuu pyöristysvirheitä. Siksi kaksi laskutoimitusta, joiden tarkat tulokset ovat samat, saattaa tuottaa eri luvut. Tämä täytyy usein ottaa huomioon liukulukujen yhtäsuuruutta verrattaessa. Yksi keino on laskutoimituksen jälkeen muuntaa lopputulos lähimmäksi luvuksi, jonka kolme vähiten merkitsevää bittiä ovat 100. Tee (mielellään mahdollisimman tehokas) aliohjelma, joka tekee tämän tietokoneesi C++-toteutuksen float-luvuille. Ota huomioon, että aivan kaikkia lukuja ei ole järkevää muuntaa näin. 12.** Kerro mikä on Base64 encoding ja miksi sitä tarvitaan. Voit käyttää lähteenä Wikipediaa.

MAT-71000 laskuharjoituksia AV 31.3.2016 3 13. Tee ohjelma, joka lukee merkkejä ja tulostaa niiden numeroarvot. Selvitä sen avulla merkkien a, 4, Ö ja jonkin kreikkalaisen kirjaimen (esim. µ) numeroarvot tai numeroarvojen jonot. 14. Matalin Suomessa mitattu ilmanpaine on 940 hpa ja korkein 1066 hpa. Tee ohjelma, joka ottaa vastaan enintään 100 kpl Suomessa mitattuja ilmanpainelukemia ja sen jälkeen vastaa tehokkaasti kysymyksiin muotoa esiintyykö lukema x aineistossa. Ohjelmasi ei saa käyttää tietorakenteita, joita ei ole vielä käsitelty tällä opintojaksolla. Syötteessä on ensin ilmanpainelukemat, sitten 0, sitten luvut x ja lopuksi 0. Kaikki luvut ovat kokonaislukuja. 15. Kirjoita www-sivu, jossa lukee X : X ξ : ξ X Huolehdi, että X on kursivoitu eli näyttää suunnilleen siltä, kuin tässä. Tuota symbolit käyttäen sopivia character entity. 16. Käyttäen CSS-kielen keinoja, kirjoita www-sivu, jossa yksi tekstikappale on vihreää taustaa vasten mutta teksti on keltaista taustaa vasten kuten tässä. Rivien tulee olla keskitettyjä (siis sekä rivin alussa että lopussa voi olla tyhjää). 17.* Mitä erilaisia väliviivoja, tavuviivoja, ajatusviivoja yms. Unicode sisältää? Entä mitä erilaisia välejä ja sen kaltaisia? 18.** Suunnittele esitystapa monikulmioille tasossa. Monikulmioita ovat kolmiot, nelikulmiot ja niin edelleen. Tasoa edustaa x y-koordinaatisto. Monikulmion ei tarvitse olla säännöllinen ja sivut voivat mennä ristiin. Kaksi monikulmiota katsotaan samoiksi, jos niistä tulee sama kuva, vaikka niiden esitystavat eivät olisikaan samat. Kuvaile testi, jolla voi selvittää, esittääkö kaksi eri esitystä samaa monikulmiota. 19.* Merkit on numeroitu 0,...,n 1. Esitä laskukaava, jolla merkkijonot ja luonnolliset luvut voidaan asettaa 1 1-vastaavuuteen siten, että tyhjää merkkijonoa vastaa luku 0, yhden pituisia merkkijonoja vastaavat luvut 1,..., n, kahden pituisia merkkijonoja vastaavat luvut n+1,..., n+n 2 ja niin edelleen. 20.** Tarkastellaan vaihtoehtoista etumerkin esitystapaa 10-järjestelmän kokonaisluvuille. Olkoot n k 1,...,n 0 numeroita (eli 0, 1,..., 9). Positiiviset luvut ja 0 esitetään tuttuun tapaan. ~n k 1 n 0 esittää luvun (n k 1 n 0 ) 10 k. Esim. ~612 = 612 1000 = 388. (a) Osoita ~n k 1 n 0 = ~9n k 1 n 0. (b) Vanhassa järjestelmässä lasketaan eri tilanteissa eri tavoilla. Esim. 41 17 = 24 lasketaan normaalisti, mutta 17 41 lasketaan laskemalla 41 17 = 24 ja vaihtamalla tuloksen etumerkki tuottaen 24. Miten yhteen- ja vähennyslasku lasketaan uudessa järjestelmässä, ja kuinka monta eri tapaa tarvitaan?

MAT-71000 laskuharjoituksia AV 31.3.2016 4 21. Tampereen bussien aikataulut on esitetty muodossa, jossa rivin alussa on tunnin numero t ja rivillä on ne minuutit m, joille bussi lähtee kello t:m. Ihan alussa on bussilinjan numero omalla rivillään. Laadi BNF-määritelmä, joka esittää tämän muodon. Oleta, että rivinsiirto on tekstialkio RS. 22.* Joukon A ositus on kokoelma joukkoja A 1,..., A n siten, että A 1 A n = A, A i A j = kun 1 i < j n, ja A i kun 1 i n. Ekvivalenssirelaatio joukossa A on A:n alkioita vertaava toiminto a b siten, että jokaiselle A:n alkiolle a, b ja c pätee a a; jos a b niin b a; ja jos a b ja b c niin a c. Osoita, että ositukset ja ekvivalenssirelaatiot ovat kaksi tapaa ilmaista sama asia. Täsmällisemmin, osoita, että jokainen ositus synnyttää ekvivalenssirelaation ja jokainen ekvivalenssirelaatio synnyttää osituksen siten, että jos 1 :n synnyttämä ositus on A 1,..., A n ja sen synnyttämä ekvivalenssi on 2, niin 1 ja 2 ovat sama ekvivalenssi. Mihin tarvitaan oletusta A i? 2 Lausekkeet, lauseet ym. 23. Piirrä seuraavien lausekkeiden lausekepuut. Jos sama puu tulee monesti, riittää viitata jo piirrettyyn. (a) 1+2*3+4 (b) (1+2)*3+4 (c) 1+(2*3)+4 (d) 1+2*(3+4) (e) (1+2*3)+4 (f) 1+(2*3+4) (g) (1+2)*(3+4) (h) 1+(2*(3+4)) 24. Piirrä seuraavien lausekkeiden lausekepuut. (a) A[i+1]*p->n (b)!!!0 (c) std::cout<<1 2<<3&&4 (d) p*=*q 25. Piirrä seuraavien lausekkeiden lausekepuut. Jos sama puu tulee monesti, riittää viitata jo piirrettyyn. (a) (i=-j)-=1 (b) i=-(j-=1) (c) i=--j-=1 (d) --i=j-- 26.* Kirjoita lauseke, joka hyödyntää operaattoreiden erilaisia presedenssejä mutta ei erilaisia merkityksiä, ja jonka tuottama arvo muuttuu, jos && korvataan &:lla. Myös kirjoita lauseke, joka hyödyntää operaattoreiden erilaisia merkityksiä mutta ei erilaisia presedenssejä, ja jonka tuottama arvo muuttuu, jos && korvataan &:lla. Vaihtoehtoisesti voit toisessa tai molemmissa kohdissa käyttää operaattoreiden && ja & sijaan ja. 27.* Olkoot i ja j C++-ohjelman muuttujia ja α mikä tahansa merkkijono, jossa ei ole muita merkkejä kuin välilyöntiä ja merkkiä -. Mitkä eri toiminnot voi saada aikaan C++-lausekkeilla muotoa iαj? Muutama malliksi: ij ei käänny, i-j laskee vähennyslaskun i j, i -j laskee saman kuin i-j, ja i-- -j sekä laskee vähennyslaskun i j että pienentää i:n arvoa yhdellä. 28. Opeta muille läsnäolijoille, mitä lausekkeiden käänteinen puolalainen esitystapa tarkoittaa ja miten sillä saadaan lausekepuut halutunlaisiksi ilman sulkuja. Kerro, miksi puolalaisella esitystavalla toimiva laskin on erityisen helppo toteuttaa. 29.* Ohjelmoi käänteisen puolalaisen esitystavan mukainen laskin, joka laskee liukulukujen yhteen-, vähennys-, kerto- ja jakolaskuja. Ohjelmoinnin helpottamiseksi oleta, että jokaisen luvun edessä on #.

MAT-71000 laskuharjoituksia AV 31.3.2016 5 30. Selvitä lausekkeesta (1+2)*(3+4), kumman yhteenlaskun tietokoneesi C++toteutus laskee ensin. Vihje: tee oma lukutyyppi, jolle määrittelet operator+. 31.* Kirjoita ohjelma, jossa on tämä rivi siten, että se tulostaa 1321. Rivin sisälle ei saa lisätä mitään eikä riviä saa muuttaa. Älä ota käyttöön omia tietotyyppejä. i=j=123; std::cout<<i; i=321; std::cout<<i; 32. Millä muuttujan i arvoilla silmukan for(int i=32; i--; ){...} vartalo suoritetaan? Entä for(unsigned i=32; i>=0; --i){...}? 33.** Taulukko A sisältää luvut 0, 1,..., n 1 jossain järjestyksessä. Kirjoita algoritmi seur, joka muuttaa järjestystä siten, että kun seur toistetaan riittävän monta kertaa, käydään kaikki järjestykset läpi. 34.* Tässä tehtävässä saat käyttää silmukoina vain perusmuotoisia for-silmukoita. Poikkeusten, ylimääräisten aliohjelmien yms. käyttö on kielletty, mutta if on sallittu. Vastausaliohjelmat eivät saa kutsua toisiaan. Laskutoimituksia varten saat käyttää vain operaattoreita ++ ja -- (siis +, * jne. on kielletty). Sijoitukset, syöttö std::cin >> ja tulostus std::cout << on sallittu. Jokainen ohjelma lukee kaksi luonnollista lukua n ja m. (a) Käyttäen enintään yhtä silmukkaa, kirjoita aliohjelma, joka palauttaa n + m. (b) Käyttäen enintään kahta silmukkaa, kirjoita aliohjelma, joka palauttaa nm. (c) Käyttäen enintään kolmea silmukkaa, kirjoita aliohjelma, joka palauttaa n m. Perustele, että jos lukualue ei loppuisi kesken, niin varsin lyhyellä aliohjelmalla voitaisiin tuottaa valtavan suuri luku. 35.* Tee edellisen tehtävän mukainen seuraava aliohjelma, eli aliohjelma, joka käyttää enintään neljää silmukkaa ja palauttaa f(m), missä f(0) = 1 ja f(m+1) = n f(m). 36.* Oletetaan, että ohjelmassa saa olla vain yksi silmukka eikä rekursiivisia aliohjelmia saa käyttää. Tällainen rajoitus tekee ohjelmoinnista kömpelöä, mutta tekeekö se kokonaan mahdottomaksi laskea jotakin, mitä ilman rajoitusta voisi laskea? 37.* Kerro, miten silmukat ja if-lauseet saa aikaan ohjelmointikielellä Brainfuck. 38. Yksisuuntaisen rengasmaisen listan viimeinen alkio osoittaa ensimmäiseen ja osoitin listaan osoittaa viimeiseen. Kirjoita seuraavat aliohjelmat. (a) Aliohjelma, joka lisää alkion listan ensimmäiseksi. (b) Aliohjelma, joka lisää alkion listan viimeiseksi. (c) Aliohjelma, joka poistaa listan ensimmäisen alkion.

MAT-71000 laskuharjoituksia AV 31.3.2016 6 39. Aja seuraava ohjelma ja kerro, miksi tulostukset ovat ne mitä ne ovat. #include <iostream> #include <vector> std::vector<int> A(4,7); void print(){ for( unsigned i=0; i<a.size(); ++i ){ std::cout << << A[i]; } std::cout << \n ; } int main(){ print(); int &k = A[2]; k=5; print(); A.push_back(9); print(); k=3; print(); } 3 Aliohjelmat ja abstraktiot 40. Kirjoita aliohjelma, joka kääntää yksisuuntaisen linkitetyn listan takaperin. 41.** Tässä tehtävässä toteutetaan nimellä Merge-Sort tunnettu järjestämisalgoritmi yksisuuntaisille linkitetyille listoille. Yleisimmät nopeat järjestämisalgoritmit Quicksort ja Heapsort edellyttävät kykyä valita mikä tahansa alkio nopeasti indeksoimalla, mikä ei onnistu listoille. Merge-Sort on nopea eikä vaadi tätä kykyä. Se on niin ollen hyvä algoritmi listojen järjestämiseen. (a) Kirjoita aliohjelma, joka yhdistää kaksi yksisuuntaista linkitettyä listaa seuraavasti. Se vertaa, kumman listan ensimmäinen alkio on pienempi. Se poistaa näin valitun alkion listastaan ja lisää sen tuloslistan jatkeeksi. Se toistaa tätä, kunnes jompikumpi lista on tyhjä. Lopuksi se kytkee jäljelle jääneen listan tuloslistan jatkeeksi. Tuloslista on alun perin tyhjä. (b) Tee aliohjelma, joka poimii saamastaan listasta k ensimmäistä ja k niiden jälkeen tulevaa alkiota, ja tekee niille edellisen kohdan toiminnon. Sitten se tekee saman seuraaville k+k alkiolle ja lisää tuloksen tuloslistan jatkeeksi. Se toistaa tätä, kunnes kaikki syötelistan alkiot on siirretty tuloslistaan. Valitse järkevä käyttäytyminen siihen tilanteeseen, että listassa on jäljellä vähemmän kuin 2k alkiota. (c) Tee aliohjelma, joka järjestää listan tekemällä edellisen kohdan toiminnon k:n arvoilla 1, 2, 4, 8,... niin pitkälle kuin tarvitaan. 42.* Selvitä sopivalla koejärjestelyllä, kuinka monta tavua tietokoneesi C++toteutus varaa aliohjelman aktivaatiotietueelle parametrien ja paikallisten muuttujien tarvitseman muistin lisäksi. Selvitä myös, että jos aliohjelmassa luodaan tilapäisiä muuttujia (esim. for(int i=...), varataanko niille tilaa jo aliohjelmaan tultaessa vai vasta muuttuja käyttöön otettaessa. Vihje: kutsu toista aliohjelmaa ennen ja jälkeen tilapäisen muuttujan luonnin. Suunnittele tilanne, jossa toteutuksen odottaisi käyttävän samaa muistia kahdelle tilapäiselle muuttujalle, ja selvitä, käyttääkö se todella samaa muistia.

MAT-71000 laskuharjoituksia AV 31.3.2016 7 43.* (a) Luo muuttuja, joka käyttää paljon tavuja (esim. miljoona-alkioinen std:: vector<int>). Osoita kokeellisesti, että sen välittäminen arvoparametrina (esim. vektori v) vie enemmän aikaa kuin välittäminen vakioituna viiteparametrina (esim. const vektori &v). Tarvittaessa kutsu ko. aliohjelmaa useasti. (b) Osoita esimerkillä, että vakioituna viiteparametrina välittäminen ei takaa, että kun parametriä käytetään, sillä on sama arvo kuin aliohjelman kutsuhetkellä oli. Tee tämä antamalla pääsy samaan tietoon (b1) globaalina muuttujana, (b2) välittämällä sama muuttuja myös toisena parametrina, ja (b3) antamalla aliohjelmalle osoitin. 44.** Selvitä sopivalla koejärjestelyllä, varaako tietokoneesi C++-toteutus muistia (a) muuttujalle (b) aliohjelman parametrille i, joka on tyyppiä int &. Huomaa, että &i ei anna i:n omaa osoitetta (vaikka sellainen olisi olemassa), vaan sen muuttujan tms. osoitteen, johon i viittaa. 45. Lisää alla olevaan aliohjelmaan static-muuttujaa käyttävä kirjanpito siitä, kuinka monesti sitä on kutsuttu. Muuta se sellaiseksi, että kun kutsujen määrä ylittää 1 000, se ei toimi normaalisti vaan tulostaa en jaksa enää. Mikä on pienin n, jolla se antaa periksi? unsigned Fib( unsigned n ){ if( n<2 ){ return n; } else{ return Fib(n-1) + Fib(n-2); } } 46. Aapo kyllästyi taulukoiden ohi-indeksoinnin aiheuttamiin virheisiin ja tietoturvaongelmiin, ja kirjoitti seuraavat aliohjelmat. Mikä toisessa niistä on vikana? bool sijoita( std::vector<int> &A, int i, int x ){ if( 0 <= i && i < A.size() ){ A[i] = x; return true; } else{ return false; } } int palauta( std::vector<int> A, int i, bool &ok ){ if( 0 <= i && i < A.size() ){ ok = true; return A[i]; } else{ ok = false; return 0; } } 47. Kirjoita aliohjelma kopioi(a, i, n, B, j), joka kopioi taulukon A alkiot A[i], A[i+1],..., A[i+n 1] taulukkoon B alkioiksi B[j], B[j+1] jne. Oleta, että A ja B ovat riittävän suuria. Mitä tapahtuu kutsussa kopioi(a, 1, 5, A, 3)? Voiko tältä suojautua, edes jossain määrin?

MAT-71000 laskuharjoituksia AV 31.3.2016 8 48.* Kahden muuttujan sisältö voidaan yleensä mutta ei aina vaihtaa ilman apumuistia seuraavasti. Selitä, miten se toimii, ja anna esimerkki tilanteesta, jossa se ei toimi oikein. void vaihda( int &x, int &y ){ xˆ=y; yˆ=x; xˆ=y; } 49. Tavoitteena on tulostaa taulukossa A[1... n] annettu teksti riveille siten, että lyhyin muu kuin viimeinen rivi on mahdollisimman pitkä. Kahden peräkkäisen sanan välissä on A:ssa yksi välilyönti, eikä A:ssa ole muita välilyöntejä. Myös tulostuksessa kahden samalla rivillä peräkkäin olevan sanan väliin pitää tulostaa yksi välilyönti, eikä muita välilyöntejä saa tulostaa. Rivillä on tilaa l merkille. Osoita esimerkillä, että oikeaa jakoa ei välttämättä saada siten, että A käydään läpi alusta loppuun ja uusi rivi aloitetaan aina kun seuraavana vuorossa oleva sana ei enää mahdu edelliselle riville. 50.* Alla on alettu laatia aliohjelmaa toteuttamaan edellisen tehtävän tavoite. Se ei tulosta jakokohtia, mutta kertoo, kuinka pitkä huonoin rivi on. jako(i) N if n i l then return l h := 0 for j := 2 to l+1 do if A[i+j] = then k := jako(i+j) if k > j 1 then k := j 1 if k > h then h := k return h (a) Miten aliohjelmaa pitää kutsua, jotta se laskisi vastauksen koko tekstille? (b) Miten aliohjelmassa on otettu huomioon, että viimeisen rivin pituudella ei ole väliä? (c) Miksi for-silmukka aloittaa muuttujan j arvolla 2, eikä 1 tai 0? (d) Mitä aliohjelma tekee, jos jokin sana on pitempi kuin l? 51.** Ohjelmoi edellisen tehtävän aliohjelma tietokoneellesi. Laadi jokin niin iso syöte, että suoritusaika tietokoneessasi on ainakin 10 sekuntia. Sitten muuta aliohjelmaa siten, että aina laskettuaan vastauksen se laittaa sen talteen, ja aina kun siltä kysytään vastausta, se käyttää aikaisemmin laskemaansa, jos se on sellaisen tallettanut. Mittaa suoritusaika uudelleen. Jos havaitset merkittävän eron, selitä, mistä se johtuu. 52.* Muunna tehtävässä 50 annettu aliohjelma tarkoitukseen sopivaksi ja laadi sitä hyödyntäen ohjelma, joka tulostaa tekstin jaettuna riveille. Pseudokoodina annettu vastaus riittää.

MAT-71000 laskuharjoituksia AV 31.3.2016 9 53.** Seuraavilla aliohjelmilla Fib(n) N voi laskea Fibonaccin lukuja. Vertaa niiden ajan ja muistin kulutusta toisiinsa olettaen, että lukutyyppi pystyy tallettamaan niin isoja lukuja, että Fib(n) voidaan laskea kun 0 n 100. (Tämä on päättelytehtävä. Ohjelmia ei tarvitse toteuttaa.) Onko muita tekijöitä, jotka tulee ottaa huomioon, kun tehdään valintaa niiden välillä? (Operaattori & laskee bitittäisen ja-operaation kuten C++:ssa.) (a) if n < 2 then return n else return Fib(n 1)+Fib(n 2) (b) A[0] := 0; A[1] := 1 for i := 2 to n do A[i] := A[i 1]+A[i 2] return A[n] (c) if n < 2 then return n j := 0; k := 1 for i := 2 to n do h := k; k := k +j; j := h return k ( (d) return 1 5 ( 1+ 5 2 ) n ( 1 5 2 ) n) (e) return 1 5 5 (1+ 2 ) n + 1 2 (f) if n < 2 then return n j := 0; k := 1; m := 1 while m n/4 do m := 2m while m > 0 do h := (2j +k)k; j := k 2 +j 2 ; k := h if m&n then h := k; k := k+j; j := h m := m/2 return k 54. Hanoin tornit on tehtävä, jossa on kolme pystysuoraa puikkoa ja n kiekkoa. Kiekoissa on keskellä reikä, niin että niitä voidaan pinota puikkoihin kuten kuvassa. Kiekkojen koot ovat 1, 2,..., n. Kiekkojen tulee olla koko ajan puikoissa, paitsi että yhden kiekon kerrallaan saa siirtää puikosta toiseen. Isompaa kiekkoa ei saa koskaan laittaa pienemmän päälle. Aluksi kaikki kiekot ovat puikossa 1. Tee ohjelma, joka kertoo, miten kiekkoja pitää siirtää, jotta ne kaikki saadaan puikkoon 2. 55. Olkoon sailio tyyppiä std::vector<int>. Aja alla oleva ohjelmanpätkä siten, että säiliön sisältö on muotoa 0, 0, 1, 1, 2, 2, 3, 3,..., n, n. Valitse niin suuri n, että suoritusaika tietokoneessasi on ainakin 10 sekuntia. Sitten vaihda säiliön tyypiksi std::list<int>. Miten suoritusaika muuttuu? Mistä ero johtuu? s1 = sailio.begin(); while( s1!= sailio.end() ){ s2 = s1; ++s2; if( s2!= sailio.end() && *s1 == *s2 ){ sailio.erase( s2 ); } else{ s1 = s2; } }

MAT-71000 laskuharjoituksia AV 31.3.2016 10 56.** Olkoon edellisen tehtävän sailio tyyppiä std::deque<int>. Kuinka monta erilaista virhetoimintoa saat havainnollistettua käyttämällä erilaisia säiliön sisältöjä? Yhdellä virhetoiminnolla saat nolla tähteä, kahdella yhden ja kolmella kaksi. 4 Algoritmien toimivuus ja nopeus 57.* Tavoitteena on löytää vaihtoehtoinen tapa sanoa jos alkiot pannaan kasvavassa suuruusjärjestyksessä jonoon, niin jonon viides on arvoltaan x. (a) Osoita, että tasan neljä alkiota on pienempiä kuin x ei toimi. (b) Anna samaan ajatukseen perustuva, mutta paremmin toimiva ilmaus. 58.* Kirjoita ei-rekursiivinen algoritmi, joka etsii suuruusjärjestyksessä kohtaan k osuvan alkion taulukosta A[1... n] ja toimii keskimäärin ajassa Θ(n). Vihje: tee siitä Quicksortia muistuttava, mutta osituksen jälkeen se hylkää jomman kumman osan. 59.** Oletetaan, että Quicksortin toteutuksen keskimääräinen suoritusaika on noin 10nlog 2 n + 2n ja Insertion-sortin noin n 2. Ne voidaan yhdistää siten, että kun osataulukon koko on enintään k, Quicksort jättää sen järjestämättä. Lopuksi ajetaan Insertion-sort koko taulukolle. Tämä toimii isoille taulukoille nopeammin kuin kumpikaan algoritmi yksinään. (a) Miksi lopun Insertion-sort on nopea? (b) Mikä kannattaa valita k:n arvoksi? (Jos et keksi parempaa tapaa löytää vastaus, tee vaikka tietokoneohjelma, joka kokeilee k:n arvoja 1, 2, 3,... kunnes vastaus löytyy.) 60.* Toteuta edellisen tehtävän algoritmit C++:lla käyttäen lähtökohtana luentojen pseudokoodeja, ja kokeile mittaamalla, mistä luvun k arvosta alkaen yhdistelmä on nopein. Käytä aineistona lukuja 1, 2,..., n laitettuna satunnaiseen järjestykseen. 61. Oletetaan, että taulukon sekoittamisalgoritmissa lukee j := random(1, n) eikä j := random(1, i). Olkoon n = 3. Millä todennäköisyydellä kukin lopputulos tulee? 62. Ilmaise seuraavat funktiot mahdollisimman yksinkertaiselle Θ-merkinnällä. Lisäksi luettele kaikki parit (i,j) siten, että f i (n) = O(f j (n)). f 1 (n) = n 2 3n+2 f 2 (n) = 4+5nlogn 2n f 4 (n) = 3+n 2+4n f 5 (n) = 1 2 n(n+1) f 3 (n) = 6+2 n+ 1 3 n3 +8nlogn f 6 (n) = n n

MAT-71000 laskuharjoituksia AV 31.3.2016 11 63. Olkoot X ja Y jotkin symboleista ω, Ω, Θ, O ja o. (a) Luettele kaikki parit (X, Y), joissa f(n) = X(g(n)) takaa f(n) = Y(g(n)). (b) Mitä merkintää tai merkintöjä käyttäessäsi voit jättää sanomatta, että puhe on hitaimman tapauksen suoritusajasta? (c) Mitä merkintää tai merkintöjä käyttäessäsi voit jättää sanomatta, että puhe on nopeimman tapauksen suoritusajasta? 64.* Oletetaan, että n on niin iso, että todellinen suoritusaika käyttäytyy Θ- merkinnän ennustamalla tavalla. Kun tietokoneen teho kaksinkertaistuu, niin miten kymmenessä sekunnissa ratkeavan tehtävän koko muuttuu, kun suoritusaika on (a) Θ(n) (b) Θ(n 2 ) (c) Θ(n 3 ) (d) Θ(1,41 n )? 65.** Ilmaise seuraavien sarjojen summat Θ-merkinnällä. Perustele vastauksesi matemaattisesti. Kolmella saat nolla, neljällä yhden ja kuudella kaksi tähteä. (a) 1 2 +2 2 +...+n 2 (b) log 2 1+log 2 2+...+log 2 n (c) 1+ 2+...+ n (d) 1+sin1 π 4 +sin2 π 4 +...+sinn π 4 (e) 1 2 + 2 3 +...+ n n+1 (f) 2 1 +2 2 +...+2 n 66.* Keksi funktio f(n) siten, että se tuottaa vain positiivisia arvoja kun n N, f(n) O(n) ja n O(f(n)). Vihje: laita f(n) heilumaan ylös ja alas. 67.** Osoita, että Θ(2 n ) ei ole sama kuin Θ(3 n ), mutta ne molemmat ovat 2 Θ(n). 68. Arvioi seuraavien algoritmien suoritusaikaa n:n funktiona O-, Ω- ja Θ-merkinnällä. Huomaa tässä ja myöhemmissä tehtävissä, että saattaa olla mahdotonta antaa kaikki kolme. (a) i := 1; while i n A[i] x do i := i+1 (b) i := 1; while i < n do i := 2i+1 (c) z := n while z > 1 do y := z 1; z := 0 for i := 1 to y do if A[i] > A[i+1] then t := A[i]; A[i] := A[i+1]; A[i+1] := t; z := i 69. Arvioi seuraavan algoritmin suoritusaikaa n:n funktiona O-, Ω- ja Θ-merkinnällä. h := 0; x := A[1]; i := 1 while h < n do i := i+1; if i > n then i := 1 if x+1 = A[i] then x := A[i]; h := 0 else h := h+1

MAT-71000 laskuharjoituksia AV 31.3.2016 12 70. Arvioi seuraavien algoritmien suoritusaikaa n:n funktiona O-, Ω- ja Θ-merkinnällä. (b)-kohdassa tarkka tulos on työläs laskea, joten helposti löytyvät likiarvot riittävät. (a) s := 0; i := 1; while s < n do s := s+i; i := i+1 (b) for i := 2 to n do p[i] := true for i := 2 to n do if p[i] then print(i); j := 2i while j n do p[j] := false; j := j +i (c) Oletetaan, että A[1] A[2]... A[n]. a := 1; y := n while A[a]+A[y] x a < y do if A[a]+A[y] < x then a := a+1 else y := y 1 71.* Arvioi seuraavien algoritmien suoritusaikaa n:n funktiona O-, Ω- ja Θ- merkinnällä. (a) m := 0 for i := 0 to n do j := i while j > 0 do if j mod2 = 1 then m := m+1 j := j/2 (b) t := n for i := 1 to n do s := t for j := 1 to s do t := t+1 72. Suunnittele algoritmi, joka ei käytä monimutkaisia tietorakenteita, ja joka selvittää, esiintyykö mikään luku ainakin kahdesti taulukossa A[1... n]. (Vain ne tietorakenteet on sallittu, joita on jo käsitelty luennoilla tai jotka olet itse keksinyt.) Mikä on algoritmisi asymptoottinen suoritusaika? Saatko suoritusajaksi O(n log n) siten, että keskimääräisen suoritusajan takaava vastaus ei riitä? 73.** On n opiskelijaa jamesitelmäaikaa. S[i,j] = true jos ja vain jos opiskelijalle i sopii pitää esitelmä aikana j. Samana aikana ei voi olla useampaa kuin yksi esitelmä. Seuraava algoritmi yrittää etsiä jokaiselle opiskelijalle esitelmäajan. for j := 1 to m do O[j] := 0 for i := 1 to n do for k := 1 to i do Y[k] := false if yritä(i) then return false return true yritä(i) {false, true} if Y[i] then return false Y[i] := true for j := 1 to m do if S[i,j] then if O[j] = 0 yritä(o[j]) then O[j] := i; return true return false

MAT-71000 laskuharjoituksia AV 31.3.2016 13 (a) Perustele, että jos yritä(i) palauttaa true, niin jokaisella opiskelijalla 1, 2,..., i on aika. Miten opiskelijalle i varattu aika on ilmaistu taulukoiden sisältöinä? (b) Tarkastellaan tilannetta, jossa opiskelijoilla 1, 2,..., i 1 on ajat. Perustele, että jos aikoja siirtämällä on mahdollista varata aika myös opiskelijalle i, niin algoritmi onnistuu tekemään niin. (c) Mikä on taulukon Y tehtävä tai vaikutus algoritmin suoritukseen? (d) Arvioi algoritmin hitaimman tapauksen suoritusaikaa O- tai Θ-merkinnällä. 74.* Osoita, että Insertion-sortin keskimääräinen suoritusaika on Θ(n 2 ), jos kaikki alkiot ovat erisuuria. Vihje: tarkastele niiden i ja j määrää, joille 1 i < j n ja A[i] > A[j]. Ajattele, että x on aukon kohdalla. Miten parien määrä muuttuu sijoituksessa A[j] := A[j 1]? Ajattele, että alkuperäinen taulukko luodaan arpomalla luvuille 1, 2,..., n paikat siten, että kun i 1 lukua on saanut paikkansa, i osuu samalla todennäköisyydellä minkä tahansa niistä eteen tai kaikkien perään. 75.** Lukujen x 1, x 2,..., x n liukuva mediaani ikkunan koolla 2w + 1 tarkoittaa lukujonoa m 1, m 2,..., m n 2w, missä kukin m i on luvuista x i, x i+1,..., x i+2w suuruusjärjestyksessä keskimmäinen. Tarkastellaan algoritmia, joka ottaa ensin vastaan luvut x 1, x 2,..., x 2w. Sitten se ottaa lukuja vastaan yksi kerrallaan ja aina luvun x 2w+i saatuaan palauttaa luvun m i. Oletetaan, että se perustuu vertailemiseen ja käyttää aikaa t(w) lukua kohti. Osoita, että hitaimmillaan t(w) Ω(logw). 5 Tärkeimmät tietorakenteet 76. Näytä, miten jono voidaan rakentaa kahdesta pinosta siten, että yksittäinen toiminto voi olla hidas, mutta tyhjästä jonosta aloittavan n:n mittaisen toimintojonon suoritusaika on silti Θ(n). 77.** Oletetaan, että osoitin vie yhden sanan ja samoin kokonaisluku. Pino toteutetaan linkitettynä listana, jonka jokaisessa tietueessa on tilaa kolmelle kokonaisluvulle ja osoitin seuraavaan tietueeseen. Lisäksi on osoitin listan alkuun sekä muuttuja, joka pitää kirjaa pinossa olevien alkioiden määrästä eli luvusta n. (a) Etsi mahdollisimman pieni vakio a ja sen jälkeen mahdollisimman pieni vakio b siten, että kun pinossa on n alkiota, niin muistin kulutus on enintään an+b sanaa. (b) Vertaa tämän toteutuksen muistin kulutusta suurilla n tavalliseen tapaan linkitettynä listana toteutettuun pinoon. (c) Vertaa tämän toteutuksen muistin kulutusta suurilla n taulukkona toteutettuun pinoon, jossa taulukon koko kaksinkertaistuu aina, kun n ohittaa kahden potenssin. Älä laske taulukkototeutuksen muistin kulutukseen mukaan sitä muistia, jota taulukko ei enää käytä.

MAT-71000 laskuharjoituksia AV 31.3.2016 14 78.* Etsi esim. Wikipediasta, mikä on hyppylista (skip list) ja kerro se muille läsnäolijoille. Tähti tulee, jos esitys on helppo ymmärtää ja kaikki olennainen on mukana. 79.** (Ilman c-kohtaa yksi tähti.) Oletetaan, että on n alkiota, ja etsintä kohdistuu alkioon i todennäköisyydellä p i, missä 1 i n. Alkiot on talletettu linkitettyyn listaan. Alkioita ei lisätä eikä poisteta. Joka kerta kun käsitellään alkiota i, se siirretään listan ensimmäiseksi. (a) Oletetaan, että p i = 1 n. Mikä on haun asymptoottinen ajan kulutus? (b) Oletetaan, että p i = 2 i /(1 2 n ) ja lista on i:n mukaisessa järjestyksessä, alkio 1 ensin. Mikä on haun asymptoottinen ajan kulutus? (c) Oletetaan, että p i = c n /i 2 ja lista on i:n mukaisessa järjestyksessä, alkio 1 ensin. Luku c n = ( n i=1 i 2 ) 1 vaihtelee n:n mukana niin vähän, että sitä ei tarvitse ottaa huomioon. Mikä on haun asymptoottinen ajan kulutus? 80. Kirjoita epätyhjästä keosta poistamisen algoritmi uusiksi siten, että keon suurin on lokerossa A[0] ja keko ulottuu lokeroon A[n 1] asti. 81. Oletetaan, että k on paljon pienempi kuin n. Luonnostele algoritmi, joka ajassa O(n log k) tulostaa n alkion joukosta k suurinta. Keskimääräisen suoritusajan takaava vastaus ei riitä. 82. Oletetaan, että rekisteritunnus koostuu enintään kolmesta kirjaimesta ja enintään kolmesta numeromerkistä. Kaikki suomalaisen aakkoston 29 kirjainta ovat käytössä. Numero-osuus voi alkaa nollalla vain jos se on 0. Kumpikaan osuus ei ole tyhjä. (a) Kuinka monta erilaista rekisteritunnusta on olemassa? (b) Oletetaan, että rekisterissä on noin 5 000 000 ajoneuvoa. Valitse hajautustaulun koko ja suunnittele hajautusfunktio. 83.* Heebo ehdotti, että jos käytetään tarpeeksi suurta hajautustaulua, niin kahden eri avaimen osuminen samaan lokeroon on niin epätodennäköistä, että siihen ei tarvitse varautua. Tällöin voitaisiin käyttää taulua, jossa alkiot ovat suoraan, eikä linkitettyjä listoja tarvittaisi. Etsi netistä syntymäpäiväongelma ja selvitä, kuinka monta alkiota enintään voidaan laittaa 365 alkion tauluun, jos todennäköisyyden on oltava alle 50% sille, että kaksi eri alkiota osuu samaan lokeroon. Kommentoi Heebon ehdotuksen toimivuutta. 84.** Tavoitteena on tallettaa 7 000 kappaletta 21-bittisiä lukuja mahdollisimman vähällä muistilla, kun lukujen jakauma voidaan olettaa satunnaiseksi. (a) Luvut talletetaan peräkkäisiin tavuihin mahdollisimman tiiviisti. Ensimmäinen luku varaa kaksi ensimmäistä tavua ja kolmannesta tavusta 5 bittiä. Toinen luku varaa kolmannen tavun loput 3 bittiä, kaksi seuraavaa tavua ja kuudennesta tavusta 2 bittiä. Kolmas luku varaa kuudennen tavun loput bitit, seitsemännen tavun ja yhtä bittiä vaille kahdeksannen tavun. Näin jatketaan. Kuinka monta tavua tarvitaan kaikkiaan?

MAT-71000 laskuharjoituksia AV 31.3.2016 15 (b) Luvut talletetaan erikoisvalmisteiseen hajautustauluun. Siinä on perustaulukko, jossa on 1 024 kappaletta 9-tavuisia tietueita sekä ylivuototaulukko, jossa on 1 700 kappaletta 3-tavuisia tietueita. Luvun vähiten merkitseviä 10 bittiä käytetään valitsemaan yksi perustietue. Perustietueessa on 6 kappaletta 11-bittisiä lokeroita. Luvun eniten merkitsevät 11 bittiä talletetaan ensimmäiseen vapaaseen lokeroon. Perustietueessa on myös 3-bittinen koodi, jonka arvot 0,..., 6 tarkoittavat, että lokeroista niin monta on käytössä, ja arvo 7 tarkoittaa, että 5 lokeroa on käytössä ja kuudes lokero sisältää linkin ylivuototietueeseen. Ylivuototietueessa on kaksi 11-bittistä lokeroa sekä saman periaatteen mukainen koodi. Tarkasta, että perustietue mahtuu sille varattuun määrään tavuja. Jääkö muistia hyödyntämättä? Tee sama tarkastus ylivuototietueelle. Onko linkeissä riittävästi bittejä? (c) Arvioi, montako ylivuototietuetta tarvitaan. Pituutta k olevien listojen määrä on laskettu oheen kaavasta me n/m (n/m) k /k!, missä m = 1024 ja n = 7 000. Kaava on paljon tarkempi kuin tarvittaisiin. Onko varattu riittävästi ylivuototietueita? pituus 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 määrä 1 8 26 59 100 137 156 152 130 99 68 42 24 13 6 3 1 (d) Laske hajautustaulun käyttämän muistin määrä. Huomaatko mitään yllättävää? (Keksitkö selityksen?) 85. Oletetaan, että binäärihakupuun jokaisessa solmussa on ylimääräinen kenttä n, jonka sisältö kertoo, montako solmua on siinä alipuussa, jonka juuri on ko. solmu. Jokaisessa solmussa on osoitin isäsolmuun. Kirjoita hitaimmillaan puun korkeuteen verrannollisessa ajassa toimiva algoritmi, jolle annetaan osoitin solmuun, ja joka palauttaa luvun, joka kertoo, kuinka mones ko. solmu on suuruusjärjestyksessä. 86.* Radix-puu on binääripuu, jonka jokaisessa solmussa on yksi bitti ja solmulla on korkeintaan kaksi lasta, 0-lapsi ja 1-lapsi. Radix-puu tallettaa joukon bittijonoja. Bittijono on joukossa, jos ja vain jos sen mukaan voidaan kulkea puussa (ts. vuorossa olevan bitin arvoa vastaava lapsi on aina olemassa) ja päädytään solmuun, jonka bitti on päällä. Olkoon n puussa olevien bittijonojen määrä ja m puussa olevien solmujen määrä. (a) Kirjoita algoritmi, joka lisää bittijonon radix-puuhun. Olkoon bittijonossa b bittiä. Mikä on algoritmin asymptoottinen ajan kulutus? (b) Miten radix-puun avulla voidaan järjestää joukko keskenään erisuuria bittijonoja, ja mikä on sen asymptoottinen ajan kulutus? 87. Mittaa, kuinka monta tavua tietokoneesi C++-toteutuksen set-säiliön tietue vie, jos avain vie (a) yhden (b) neljä (c) kahdeksan (d) 12 tavua. 88.** (Ilman d-kohtaa yksi tähti.) C++:n säiliöt set, multiset, map ja multimap edellyttävät, että avainten vertaamista varten on operaattori. Merkitsemme sitä <. Siltä vaadittavat ominaisuudet esitetään C++-kirjallisuudessa eri tavoin. Aina vaaditaan ainakin seuraavat ominaisuudet jokaisella x, y ja z:

MAT-71000 laskuharjoituksia AV 31.3.2016 16 Irrefleksiivisyys: (x<x). Transitiivisuus: jos x<y ja y <z, niin x<z. (a) Toisinaan vaaditaan myös asymmetrisyys: jos x < y, niin (y < x). (Jos C++kirjasi kutsuu tätä antisymmetrisyydeksi, niin se on väärässä.) Osoita, että asymmetrisyys seuraa irrefleksiivisyydestä ja transitiivisuudesta. (Sitä ei siis tarvitse vaatia erikseen.) (b) Operaattori == määritellään x==y (x<y) (y<x). Osoita, että == on refleksiivinen, eli jokaisella x pätee x == x. (c) Osoita, että == on symmetrinen, eli jokaisella x ja y, joille x==y pätee, pätee myös y ==x. (d) Osoita, että == ei välttämättä ole transitiivinen. Vihje: vastaesimerkin voi rakentaa olettamalla, että on olemassa vain kolme erisuuruista arvoa. Erilaisia irrefleksiivisiä transitiivisia < on silloin niin vähän, että ne voi vaikka kokeilla kaikki. 89.* (Ilman b-kohtaa nolla tähteä.) Olkoot < ja == kuten edellisessä tehtävässä. (a) Osoita, että kullekin x ja y pätee täsmälleen yksi seuraavista: x<y, x== y tai y <x. (b) Osoita, että jos == on transitiivinen, x 1 ==x 2, y 1 ==y 2 ja x 1 <y 1, niin x 2 <y 2. 90. Mikä on C++-algoritmin find_first_of ajan kulutus? (Kirjallisuudessa esiintyy harhaanjohtavaa tietoa.) Miten päästään olennaisesti parempaan ajan kulutukseen? 91.* Tarvitaan tietorakenne tallettamaan monijoukko. Toisin sanoen, sama avain voi esiintyä useasti, eikä alkiossa ole mitään muuta tietoa kuin avain. Oletetaan, että jos alkio on joukossa ainakin yhden kerran, se on siinä keskimäärin kolme kertaa. Voit vastata kysymyksiin todellisen tai kuvitellun tietokoneen mukaan. (a) Kuinka paljon muistia kuluu alkion talletuskertaa kohden, jos tietorakenteeksi valitaan C++:n multiset? (b) Kuinka paljon muistia kuluu alkion talletuskertaa kohden, jos valitaan map, ja talletetaan alkiosta ja luvusta koostuvia pareja, missä luku kertoo alkion esiintymiskertojen määrän? (c) Minkälaisessa tilanteessa multiset on hyödyllinen? Vihje: etsi paperisesta suomenkielisestä sanakirjasta Watti tai puhelinluettelosta Wikström.

MAT-71000 laskuharjoituksia AV 31.3.2016 17 6 Algoritmien oikeaksi todistaminen 92. Kerro suomeksi, mitä seuraavat taulukkoa A[1... n] koskevat väittämät tarkoittavat. Jos väittämä on loogisesti yhtäpitävä jonkin yksinkertaisemman väittämän kanssa, kerro se. (a) i;1 i n : A[i] > 0 (b) i;1 i < n : A[i] = A[i+1] (c) i;1 i n : j;1 j n : A[i] A[j] (d) i;1 i n : j;1 j n : A[i] > A[j] 93. Kerro suomeksi, mitä seuraavat taulukkoa A[1... n] koskevat väittämät tarkoittavat. Jos väittämä on loogisesti yhtäpitävä jonkin yksinkertaisemman väittämän kanssa, kerro se. (a) i;1 i n : A[i] = A[i] (b) i;1 i n : A[i] A[i] (c) i;1 i n : j;1 j n : A[i] = A[j] (d) i;1 i n : j;1 j n : A[i] = A[j] 94. Esitä seuraavat taulukkoa A[1... n] koskevat väittämät. Kirjoita jokaiselle C++-aliohjelma, joka palauttaa true jos ja vain jos väittämä pätee. (a) Ensimmäinen alkio on 3. (b) Jokin alkio on 3. (c) Jokainen alkio on 3. (d) Kohdassa i oleva alkio on 3. 95. Esitä seuraavat taulukkoa A[1... n] koskevat väittämät. (a) Taulukon suurin alkio on i. (b) Taulukon suurin alkio on kohdassa i. (c) Taulukon suurin alkio esiintyy taulukossa vain yhden kerran. 96. Esitä seuraavat taulukkoja A[1... n] ja B[1... m] koskevat väittämät. (a) A:n alkiot ovat suurempia kuin B:n alkiot. (b) Jokin A:n alkio on suurempi kuin B:n alkiot. (c) i on pienin sellainen luku, että A[i] esiintyy B:ssä.

MAT-71000 laskuharjoituksia AV 31.3.2016 18 97. Missä kohdassa seuraava päättely menee pieleen? Merkitään suurinta reaalilukua symbolilla x. Koska x on suurin reaaliluku, pätee x... mille tahansa hyvin määritellylle... Siksi pätee x x 2 x+1. Vähentämällä molemmilta puolilta x ja soveltamalla binomin neliön kaavaa saadaan 0 x 2 2x+1 = (x 1) 2. Koska reaaliluvun neliö ei voi olla negatiivinen, seuraa tästä (x 1) 2 = 0, josta saadaan x = 1. Siis 1 on suurin reaaliluku. 98. Anna oheisen ohjelman sisemmälle silmukalle invariantti. Ei tarvitse osoittaa, että se on pätevä. 99. for i := 1 to n 1 do k := i for j := i+1 to n do if A[j].x < A[k].x then k := j apu := A[i]; A[i] := A[k]; A[k] := apu (a) Miksi k;1 k < i : A[k].x A[k +1].x ei ole edellisen tehtävän ohjelman ulomman silmukan invariantti? (b) Anna edellisen tehtävän ohjelman ulommalle silmukalle invariantti. Ei tarvitse osoittaa, että se on pätevä. 100.* Seuraavan ohjelman tehtävä on laskea polynomin n i=0 A[i]xi arvo tehokkaasti. Anna sille silmukkainvariantti ja osoita, että se on silmukkainvariantti. y := 0 for i := n downto 0 do y := x y +A[i] 101.* Anna seuraavalle ohjelmalle silmukkainvariantti. Ei tarvitse osoittaa, että se on pätevä. { ( i;1 i < n : A[i] A[i+1] ) i : j;1 i < j n : A[i]+A[j] = x } a := 1; y := n while A[a]+A[y] x a < y do if A[a]+A[y] < x then a := a+1 else y := y 1 { A[a]+A[y] = x } 102.* Tarkoittakoon #(A[a...y],x) (osa)taulukossa A[a...y] olevien alkioiden x määrää. Osoita seuraava ohjelma oikeaksi. Huomaa, että lsk ei välttämättä ole siihen mennessä kohdattujen oikeiden ja väärien alkioiden määrien erotus eikä sen vastaluku. { #(A[1...n], avain) > n 2 } lsk := 0 for i := 1 to n do if lsk = 0 then arvaus := A[i] if A[i] = arvaus then lsk := lsk+1 else lsk := lsk 1 { arvaus = avain }

MAT-71000 laskuharjoituksia AV 31.3.2016 19 103. Luentojen muunnettu binääripotenssi jää ikuiseen silmukkaan, kun n = 1. Muunna sitä edelleen niin, että se tuottaa silloin oikean vastauksen. (Oleta, että muuttujat kykenevät esittämään kaikki tarvittavat luvut.) 104.** Risteykset on numeroitu 1,..., n. Alun perin P[i,j] sisältää risteyksestä i risteykseen j vievän tienpätkän pituuden tai erityisen arvon, jota merkitsemme, kertomaan, että tienpätkää ei ole. Suunnittele Θ(n 3 ) algoritmi, jonka lopetettua P[i, j] sisältää lyhimmän risteyksestä i risteykseen j vievän reitin pituuden. Algoritmin pääsilmukan kierroksen alussa P[i, j] sisältää lyhimmän sellaisen risteyksestä i risteykseen j vievän reitin pituuden, joka lukuunottamatta aloituskohtaa i ja lopetuskohtaa j ei kulje sellaisen risteyksen kautta, jonka numero on k tai enemmän. 105. Lasten pelissä jokainen pelaaja on aluksi ameeba. Pelaajat kiertelevät huoneessa sinne tänne. Kun kaksi ameebaa kohtaa, he heittävät lanttia. Sen voittaja ylenee hiireksi ja häviäjä jää ameebaksi. Kun kaksi hiirtä kohtaa, he heittävät lanttia. Sen voittaja ylenee apinaksi ja häviäjä palaa ameebaksi. Samalla lailla kahden apinan kohdatessa toinen ylenee ihmiseksi ja toinen palaa ameebaksi. Ihmiset eivät jatka peliä. Osoita, että peli päättyy joskus. 106. Anna päättymätön kasvavassa suuruusjärjestyksessä oleva jono toinen toistaan pitempiä sanoja, joista mikään ei ole toisen aito alkuosa. 107.* Laske seuraavat heikoimmat esiehdot. Taulukon A indeksialue on 1,...,n. Kolme oikein tuottaa nolla tähteä. (a) wp(i := i+1, 1 i n) (b) wp(x := y +2, x < y) (c) wp(x := a x, x a) (d) wp(a[1] := 3, 1 i n A[i] = 3) (e) wp(a[i] := 0, 1 i j n A[i] < A[j]) (f) wp(apu := A[i]; A[i] := A[j]; A[j] := apu, k;1 k < n : A[k] < A[k +1]) 108.** Laske seuraavat heikoimmat esiehdot. Taulukon A indeksialue on 1,...,n ja A 0 sisältää taulukon A arvon juuri ennen lausetta. Kaksi lähes oikein nolla tähteä, neljällä yksi ja kuudella kaksi. (a) wp(x := x 3, x 0 x 1) (b) wp(vaje := vaje 2 2b x 2 b+1 ; x := x+2 b, 0 vaje < x 2 b+1 +2 2b ) (c) wp( b := b 1 if x 2 b+1 +2 2b vaje then vaje := vaje 2 2b x 2 b+1 ; x := x+2 b, 0 vaje < x 2 b+1 +2 2b ) (d) wp(a[i] := A[i]+A[i 1], 1 < i n A[i] = i j=1 A 0[j])

MAT-71000 laskuharjoituksia AV 31.3.2016 20 (e) wp(a[i] := A[i]+A[i 1], 1 < i n A[i] = i j=1 A[j]) (f) wp(a[i] := A[i]+A[i 1], 1 < i n A[i] = i 1 j=1 A[j]) 109. Todista, ettäc (C wp(s 1,Q) C wp(s 2,Q)) jac ( C wp(s 1,Q)) (C wp(s 2,Q)) ovat yhtäpitävät. Propositiologiikka riittää tehtävän ratkaisemiseen. 110. Taulukko A indeksoidaan 1,..., n. Muuta puolitushaku sellaiseksi, että se löytää viimeisen kohdan, jossa A[i] x. Mitä sen pitää tehdä, jos x on pienempi kuin mikään A:n alkio? 111.* Osoita, että oheinen ohjelma pysähtyy, ja että lopuksi n on lukujen n 0 ja m 0 suurin yhteinen tekijä. { n = n 0 > 0 m = m 0 > 0 } while m > 0 do n := nmodm if n > 0 then m := mmodn else n := m; m := 0 112.* Lisää luvun 6.5 kekoon toiminto, jolla voi muuttaa alkiota sen ollessa keossa. Toiminto ei saa perustua alkion poistamiseen ja uudelleen lisäämiseen. 7 (Moni)graafit 113.* Määrittele matemaattisesti seuraavat graafiin liittyvät käsitteet. (a) Polku. Se on solmusta solmuun johtava, kaaria pitkin (kaarten suuntaisesti) kulkeva reitti. (b) Yksinkertainen polku. Se on polku, jossa mikään solmu ei toistu. (c) Silmukka. Se on polku, joka päättyy sinne, mistä se alkaa. (d) Yksinkertainen silmukka. Valitse sille edellisten kohtien kanssa johdonmukainen merkitys. 114.* Olkoon V = {1,...,2n}. Kun 1 i < n, niin sekä solmusta 2i 1 että solmusta 2i on kaaret solmuihin 2i + 1 ja 2i + 2, ja sekä solmusta 2n 1 että solmusta 2n on kaaret solmuihin 1 ja 2. (a) Piirrä ko. graafi, kun n = 3. (b) Kuinka monta silmukkaa graafilla on (n:n funktiona)? (c) Kuinka monta sellaista silmukkaa graafilla on (n:n funktiona), jossa mikään solmu ei toistu? (Toistumiseksi ei lasketa sitä, että silmukan umpeutuessa tullaan takaisin solmuun, josta silmukka alkoi.)

MAT-71000 laskuharjoituksia AV 31.3.2016 21 115. Graafin Eulerin kierros on silmukka, joka käyttää jokaisen kaaren täsmälleen kerran. Suunnittele ihmisten suoritettavaksi sopiva menetelmä, joka löytää Eulerin kierroksen, jos graafissa on sellainen. 116. Voiko leveyteen ensin -haussa syntyä tilanne, jossa u on jonossa, u ja kaikilla v u pätee v.found = true? 117.** Leveyteen ensin -haussa voi jonon Q sijaan käyttää kahta joukkoa Q 1 ja Q 2 siten, että ajoittain haku ottaa solmuja Q 1 :stä ja panee niiden löytämättömät seuraajat Q 2 :een, ja ajoittain tekee samaa Q 1 :n ja Q 2 :n roolit vaihdettuina. Joukkojen Q 1 ja Q 2 toteutuksella ei ole väliä. Solmujen poistamisen sijaan algoritmi voi selata Q 1 :n läpi ja sitten tyhjentää Q 1 :n. (a) Kirjoita pseudokoodi. (b) Lisätään kolmas joukko Q 3. Oletetaan, että graafi on suuntaamaton ja käytettävissä on tehokkaat testit v Q 1, v Q 2 ja v Q 3. Muuta edellisen kohdan pseudokoodia siten, että solmuissa ei tarvita.found-kenttiä. Perustele, että ratkaisusi toimii oikein. (Tämän algoritmin hyöty on siinä, että jos solmut syntyvät implisiittisesti kuten on asian laita usein esim. tekoälyssä, niin solmua ei tarvita lainkaan silloin kun se ei ole missään joukoista Q 1, Q 2 ja Q 3. Näin voidaan säästää huomattavasti muistia.) 118. Graafin solmut ovat {(i,j) 1 i 3 1 j 3}. Solmusta (i,j) on kaari solmuun ((imod3)+1,j) ja solmuun (i,(jmod3)+1). Haku alkaa solmusta (1,1) ja tutkii solmusta lähtevät kaaret siinä järjestyksessä, kuin ne on mainittu edellä. (a) Missä järjestyksessä leveyteen ensin -haku löytää solmut? (b) Missä järjestyksessä syvyyteen ensin -haku löytää solmut? 119. Lisää rekursiiviseen syvyyteen ensin -hakuun lauseet, jotka tallettavat.prevkenttiin takaperin polun haun aloitussolmusta kuhunkin solmuun. 120. Suunnittele ajassa O( V + E ) toimiva algoritmi, joka joko kertoo, että opintojaksojen esitietoketjuissa on silmukka, tai luettelee opintojaksot sellaisessa järjestyksessä, että kun opintojakso mainitaan, sen kaikki esitiedot on jo mainittu. 121.** Suuntaamattoman graafin katkossolmu on solmu, jonka ja johon liittyvien kaarten poistaminen jakaa graafin ainakin kahteen erilliseen osaan. Suunnittele ajassa O( V + E ) toimiva algoritmi, joka löytää katkossolmut. Vihje: käytä syvyyteen ensin -hakua ja numeroi solmut juoksevilla numeroilla sitä mukaa kuin haku löytää ne. Kun haku peruuttaa, se tuo pienimmän kohtaamansa numeron mukanaan kuitenkin siten, että haku ei katso numeroa siitä solmusta, josta nykyiseen solmuun alun perin tultiin. 122.* Vertaa rekursiivisen ja yleisestä hausta tehdyn syvyyteen ensin -haun ajan ja muistin kulutuksia toisiinsa.

MAT-71000 laskuharjoituksia AV 31.3.2016 22 123.* (a) Osoita vastaesimerkillä, että yleinen haku pinolla ei tuota syvyyteen ensin -hakua, jos.next-mekanismin sijaan W:hen laitetaan ja löydetyiksi merkitään ne solmut joukosta u, joita ei ole vielä löydetty. (b) Jos toimitaan muuten kuten (a)-kohdassa, mutta solmu merkitään löydetyksi vasta kun se nostetaan pinosta, niin syvyyteen ensin -haku toteutuu. Mikä huono puoli on tässä ratkaisussa? 124.** Suunnatun graafin (V, E) solmut jaetaan kahteen erilliseen joukkoon: jasolmuihin V ja tai-solmuihin V. (Siis V V = ja V V = V.) Lisäksi v 0 V. Tavoitteena on löytää osajoukkomielessä mahdollisimman pieni joukko solmuja U siten, että (1) v 0 U, (2) jos v U V niin v U, ja (3) jos v U V niin v U. Siis U:n pitää täyttää em. ehdot ja jos U U, niin U ei saa täyttää ehtoja. U:n alkioiden määrän ei tarvitse olla mahdollisimman pieni. (a) Osoita esimerkillä, että U ei välttämättä ole yksikäsitteinen. (b) Osoita esimerkillä, että haku, joka aloittaa v 0 :sta ja lisää solmuja seuraavasti ei välttämättä tuota oikeaa vastausta. Olkoon u sen löytämä solmu. Jos u V, se ottaa mukaan jokaisen v u. Jos u V, se katsoo, onko se jo ottanut mukaan ainakin yhden v u. Jollei se ole, se valitsee mielivaltaisen v u ja ottaa mukaan sen. (c) Suunnittele ajassa O( V 2 + V E ) toimiva algoritmi, joka löytää (jonkin) oikean vastauksen. Vihje: se perustuu solmujen poistamiseen. Jos poistamisen seurauksena myös v 0 pitäisi poistaa, niin poistaminen perutaan. 125.* Junilla matkustettaessa joskus tärkeintä ei ole päästä perille mahdollisimman varhain vaan minimoida matka-aikaa, johon lasketaan mukaan odotukset vaihtoasemilla mutta joka alkaa vasta ensimmäisen junan lähdöstä ja loppuu kun viimeinen juna saapuu perille. Muunna Dijkstran algoritmi ratkaisemaan tämä tehtävä. 126.* Osoita, että jos prioriteettijonon toiminta perustuu vertailemiseen, niin Dijkstran algoritmia ei saa toimimaan nopeammin kuin O( V log V ). 127.** Suunnittele graafeille esitys, joka mahdollistaa Dijkstran vahvojen komponenttien algoritmin toteuttamisen tehokkaasti. 8 Informaatioteoriaa 128. Ihmisen DNA-sekvenssissä on noin 3,23483 miljardia emäsparia (Wikipedia Human genome 3.4.2014). Emäspari on A T, T A, C G tai G C. Kuinka paljon muistia tarvitaan yhden ihmisen DNA-sekvenssin tallettamiseen? Riittääkö rekkaautollinen muistitikkuja?

MAT-71000 laskuharjoituksia AV 31.3.2016 23 129. Etsi Internetistä tietoa UTF-8-koodista. Onko se itserajaava? 130. Olkoon alkio kokonaisluku väliltä 0,..., 255. Joukossa sama alkio ei voi mutta monijoukossa voi esiintyä useasti. (a) Kuinka monta erilaista 2 alkion taulukkoa, 2 alkion joukkoa ja 2 alkion monijoukkoa on olemassa? (b) Kuinka paljon muistia joukko tarvitsee, jos se esitetään varaamalla yksi bitti mahdollista alkiota kohden niin että alkio on joukossa jos ja vain jos sen bitti on 1? (c) Enintään kuinka monen alkion joukko voidaan esittää edellisessä kohdassa tulokseksi saadulla muistin määrällä, jos esitystapana on alkioiden luetteleminen taulukossa? 131.* Olkoon erilaisia alkioita m kappaletta. (a) Kuinka monta erilaista k alkion jonoa on olemassa? (b) Kuinka monta erilaista enintään n alkion jonoa on olemassa? (c) Kuinka paljon muistia enintään n alkion jonon esittämiseen vähintään tarvitaan, jos esitystavan muistin määrä ei riipu esitettävästä jonosta? (d) Kuinka paljon rengaspuskuri, jonka kapasiteetti on n, käyttää muistia? (e) Olkoon rengaspuskurin kapasiteetti n. Kuinka monta eri esitystapaa on jonolla, jossa on k alkiota? 132. Osoita, että luennoilla esitetyssä lukujen koodissa(2n+1)-bittiset koodisanat esittävät luvut 2 n 1,...,2 n+1 2 ja että jokaiselle luonnolliselle luvulle on tasan yksi koodisana. 133.* C++:n tekstialkioihin kuuluvat <, <<, <=, =, ==, >, >= ja >>. Ne käyttävät merkkejä <, = ja >. Ajatellaan välilyönti neljänneksi merkiksi. Merkin voi siis esittää kahdella bitillä. Laske Kraftin summa. Huomaatko mitään omituista, ja keksitkö omituisuudelle selityksen? 134.* Verrataan kahta tapaa esittää joukko lukuja väliltä 0,..., 15. Yksinkertaisemmassa tavassa käytetään 16 bittiä. Bitin i arvo on 1 jos ja vain jos i kuuluu joukkoon. Monimutkaisemmassa tavassa käytetään 5 tai 17 bittiä. Jos ensimmäisen bitin arvo on 0, niin seuraavat 16 bittiä esittävät joukon yksinkertaisemmalla tavalla. Jos se on 1, niin joukossa on tasan yksi alkio, ja seuraavat 4 bittiä esittävät sen. (a) Kuinka monta erilaista joukkoa ko. luvuista on olemassa? (b) Kuinka monta bittiä monimutkaisempi esitystapa kuluttaa keskimäärin, jos jokainen joukko on yhtä todennäköinen?