6. Sanakirjat. 6. luku 298

Koko: px
Aloita esitys sivulta:

Download "6. Sanakirjat. 6. luku 298"

Transkriptio

1 6. Sanakirjat Tässä luvussa tarkastellaan käsitettä sanakirja (dictionary). Tällaisen tietorakenteen tehtävä on tallettaa alkioita niin, että tiedonhaku rakenteesta on tehokasta. Nimi vastaa melko hyvin todellista sanakirjaa, mutta on lisäksi dynaaminen; ovathan alkion lisäys ja poisto keskeisiä toimintoja. Käsitellään sanakirjojen toteuttamista binääripuun ja sekvenssin avulla. Nämä ovat yksinkertaisia, mutta eivät kovin tehokkaita. Parempia ovat mm. AVL puut ja hajautustaulut. 6. luku 298

2 6.1. Sanakirjan abstrakti tietotyyppi Sanakirjassa on talletettuna avain alkio pareja (k,e), joita tässä kutsutaan tietoyksiköiksi (item). Yleisyyden sallimiseksi avaimet ja alkiot voivat olla mitä tahansa tyyppiä. Sanakirja voisi sisältää esim. opiskelijatietueita käsittäen opiskelijan nimen, osoitteen ja kurssitiedot, jolloin avain olisi opiskelijan henkilötunnus. Avaimena saattaisi olla myös itse alkio. Esim. käytettäessä sanakirjaa alkulukujen tallettamiseen voitaisiin itse lukuja käyttää myös avaimina. Sanakirjoja on kahta tyyppiä, järjestämätön (unordered) ja järjestetty (ordered). Jälkimmäiselle oletetaan täydellisen järjestyksen relaation olevan voimassa avainten suhteen. Järjestetty sanakirja määrää kahden avaimen suhteellisen järjestyksen vertaimen avulla (luku 5.1.). Järjestämättömän sanakirjan tapauksessa mitään järjestysrelaatiota ei sovelleta, vaan ainoastaan yhtäsuuruutta testataan avainten välillä. 6. luku 299

3 Yleisyyden vuoksi sanakirjan määrittely sallii useiden tietoyksiköiden tallettamisen samalla avaimella. On tietysti sellaisiakin sovelluksia, joissa tätä ei sallita ja avaimet ovat yksikäsitteisiä, kuten edeltävässä opiskelijasanakirjassa kukin henkilötunnus olisi yksikäsitteinen. Tällöin niitä voidaan kutsua myös osoitteiksi. Sanakirjan metodit Geneerinen järjestämätön sanakirja D tukee abstraktina tietotyyppinä seuraavia operaatioita: size(): Palauttaa sanakirjan D tietoyksiköiden lukumäärän. Tulos: kokonaisluku isempty(): Testaa, onko D tyhjä. Tulos: totuusarvo 6. luku 300

4 findelement(k): Jos D sisältää tietoyksikön, jonka avain on k, niin palauttaa sen alkion, mutta muuten (sanakirjassa ei ole kyseistä avainta) palauttaa erikoisalkion EI_AVAINTA epäonnistuneen haun ilmoittamiseksi. Syöte: avain Tulos: alkio findallelements(k): Palauttaa sanakirjan kaikkien niiden alkioiden luettelon, joiden avain on k. Syöte: avain Tulos: alkioiden luettelo insertitem(k,e): avain k. Lisää sanakirjaan D tietoyksikön, jonka alkio on e ja Syöte: avain k ja alkio e 6. luku 301

5 remove(k): Poistaa sanakirjasta D tietoyksikön, jonka avain on k ja palauttaa alkion. Jos D:ssä ei ollut mainittua, niin palauttaa erikoisalkion EI_AVAINTA. Syöte: avain k Tulos: alkio removeall(k): Poistaa sanakirjasta D kaikki tietoyksiköt, joiden avain on k, ja palauttaa näiden alkioiden luettelon. Syöte: avain Tulos: alkioiden luettelo Kahdessa metodissa käytettiin erikoisalkiota EI_AVAINTA, jota kutsutaan vartijaksi (sentinel). Tyhjääkin alkiota voitaisiin käyttää, mutta on mielekästä erottaa em. tapaus tyhjästä, jotta voidaan käyttää myös varsinaista tyhjää alkiota sanakirjassa. Mikäli sanakirja sisältäisi samalle avaimelle useita tietoyksiköitä, operaatiot findelement(k) ja remove(k) palauttaisivat mielivaltaisesti valitun alkion niistä, joilla tuo avain on. 6. luku 302

6 Esim Katsotaan operaatioiden sarjan vaikutusta alunperin tyhjään sanakirjaan, johon talletetaan kokonaislukuavaimia ja yksimerkkisiä alkioita. operaatio tulos sanakirja insertitem(5,a) { (5,A) } insertitem(7,b) { (5,A),(7,B) } insertitem(2,c) { (5,A),(7,B),(2,C) } insertitem(8,d) { (5,A),(7,B),(2,C),(8,D) } insertitem(2,e) { (5,A),(7,B),(2,C),(8,D),(2,E) } findelement(7) B { (5,A),(7,B),(2,C),(8,D),(2,E) } findelement(4) EI_AVAINTA { (5,A),(7,B),(2,C),(8,D),(2,E) } findelement(2) C { (5,A),(7,B),(2,C),(8,D),(2,E) } findallelements(2) C, E { (5,A),(7,B),(2,C),(8,D),(2,E) } 6. luku 303

7 (jatkoa) size() 5 { (5,A),(7,B),(2,C),(8,D),(2,E) } remove(5) A { (7,B),(2,C),(8,D),(2,E) } removeall(2) C, E { (7,B),(8,D) } findelement(2) EI_AVAINTA { (7,B),(8,D) } Yhtäsuuruuden testaajat Jokainen em. metodeista edellyttää luonnollisesti, että on olemassa mekanismi kahden avaimen yhtäsuuruuden tutkimiseksi. Jos sanakirja on järjestetty, niin vertaimen metodi areequal (luku 5.1.) sanakirjaan liitettynä palvelee tätä tarkoitusta. Muuten, so. geneeriselle sanakirjalle, sovelletaan yhtäsuuruuden testaajaa, joka tukee avaimille käytettävää operaatiota areequal. 6. luku 304

8 Esitetty sanakirjan määritelmä on yleisempi kuin Javan abstrakti sanakirjaluokka (java.util.dictionary), sillä tämä ei salli useita tietoyksiköitä samalle avaimelle. Edellä esitettyjen metodien lisäksi järjestetylle sanakirjalle voidaan määritellä muita metodeja, sellaisia, jotka antavat esim. järjestyksessä edeltävän tai seuraavan avaimen syötetyn avaimen suhteen Sanakirjan toteuttaminen sekvenssillä Sanakirja on helppoa tehdä sekvenssin avulla. Jälleen kun se on yksinkertainen vaihtoehto, se ei ole kuitenkaan tehokkain. Järjestämättömät (lajittelemattomat) ja järjestetyt (lajitellut) sekvenssit Sanakirja voidaan toteuttaa usealla tavalla sekvenssiä soveltaen. 6. luku 305

9 Järjestämätön sekvenssitoteutus Yksinkertaisinta toteuttaa n tietoyksikön sanakirja D sekvenssiä S soveltaen on tallettaa tietoyksiköt sekvenssiin mielivaltaisesti valitussa järjestyksessä (kuva 6.1.(a)). Sekvenssi olkoon puolestaan toteutettu taulukkona tai kahteen suuntaan linkitettynä listana (ks. luku 4.3.). Tämä sanakirjan D toteutus on järjestämätön sekvenssitoteutus (unordered sequence implementation), sillä avaimilla ei ole mitään vaikutusta tietoyksikön lineaariseen järjestämiseen sekvenssissä S (a) (b) Kuva 6.1. Sanakirjan toteuttaminen sekvenssinä: (a) järjestämätön sekvenssi ja (b) järjestetty (yksinkertaisuuden takia vain avaimet esitetty, ilman alkioita). 6. luku 306

10 Järjestämättömän sekvenssin tapauksessa tilavaatimus on Θ(n), jos sekvenssi on tehty kahteen suuntaan linkitettynä listana, ja Θ(N), jos se on tehty taulukolla kokoa N n. Operaatio insertitem(k,e) voidaan toteuttaa tehokkaasti käyttäen S:n metodien insertfirst tai insertlast yhtä kutsua, jolloin suoritusaika on kaikkiaan O(1) sanakirjan D lisäykselle. Tosin tämä toteutus ei mahdollista tehokasta hakua metodilla findelement(k), sillä tällöin täytyy selata sekvenssiä S läpi, kunnes haluttu löydetään tai tullaan sekvenssin loppuun. Pahimmassa tapauksessa suoritusaika on O(n). Samoin lineaarinen aika tulee poistolle remove(k) pahimmassa tapauksessa, koska poistettava on selattava esiin. Operaatiot findallelements ja removeall vaativat aina koko sekvenssin selaamisen läpi, joten niiden suoritusaika on Θ(n). Yhteenvetona todetaan järjestämättömän sekvenssitoteutuksen aikaansaavan sanakirjalle nopeat lisäykset hitaiden hakujen ja poistojen kustannuksella. Tällöin tämä toteutusvaihtoehto on mielekäs, kun sanakirja on suppea tai oletetaan lisäysten määrän olevan sangen suuri verrattuna hakujen ja poistojen määrään. 6. luku 307

11 Järjestetty sekvenssitoteutus Jos sanakirja D on järjestetty, tietoyksiköt voidaan tallettaa avainten eivähenevään järjestykseen sekvenssiin S (kuva 6.1.(b)). S on jälleen toteutettu taulukkona tai kahteen suuntaan linkitettynä listana. Nimetään tämä järjestetyksi sekvenssitoteutukseksi (ordered sequence implementation), kun avaimet määräävät lineaarisen järjestyksen sekvenssissä S. Aivan edellisen toteutuksen lailla tilavaatimus on Θ(n), mikäli sekvenssi tehdään kahteen suuntaan linkitetyn listan avulla, ja Θ(N), jos se tehdään taulukolla kooltaan N n. Järjestämättömästä sekvenssitoteutuksesta eroten operaatio insertitem(k,e) tarvitsee nyt ajan O(n) pahimmassa tapauksessa. Jos S toteutetaan kahteen suuntaan linkitettynä listana, näin paljon tarvitaan suoritusaikaa enimmillään uuden tietoyksikön (k,e) lisäyspaikan löytämiseksi. Taulukkoa sovellettaessa näin paljon aikaa kuluu enimmillään siirtää kaikki avainta k suurempien avainten tietoyksiköt tilan tekemiseksi uudelle tietoyksikölle. 6. luku 308

12 Samankaltainen tilanne pätee operaatioille remove(k) ja removeall(k). Jos S toteutetaan kahteen suuntaan linkitettynä listana, tarvitaan suoritusaikaa O(n) pahimmassa tapauksessa poistettavan tietoyksikön tai yksiköiden löytämiseksi. Taulukkoa käytettäessä sama aika menee tietoyksikön tai yksiköiden siirtämiseen poistetun jättämän aukon täyttämiseksi. Jos sekvenssi S laaditaan kahteen suuntaan linkitettynä listana, niin tietoyksikön haku avaimella k vaatii selauksen sekvenssin läpi ja kestää ajan O(n) pahimmassa tapauksessa eli haun epäonnistuessa (tätä avainta ei ole sanakirjassa). Näin ollen operaatiot findelement ja findallelements toimivat ajassa O(n), kuten on minkä tahansa operaation tapauksessa, jolla suoritetaan siinä hakua. Niinpä tällainen toteutus on melko tehoton. Haut ovat tehtävissä paljon nopeammin muodostettaessa sekvenssi S taulukon avulla. 6. luku 309

13 Binäärihaku Huomattava hyöty taulukon käyttämisessä sekvenssiä varten sanakirjan D yhteydessä on se, että alkion saanti sanakirjasta soveltaen astetta (rank) eli yksinkertaisesti indeksiä on tehtävissä ajassa O(1). Tällöin (luku 3.6.) n alkioisen sekvenssin ensimmäisen alkion on astetta 0 ja viimeinen n 1. Sekvenssin alkiot ovat yhtä kuin sanakirjan tietoyksiköt. Kun sekvenssi S on järjestetty avainten mukaan, S:n tietoyksiköllä astetta i on avain, joka ei ole pienempi kuin tietoyksiköiden avaimet astetta 0,.., i 1 ja ei suurempi kuin avaimet astetta i+1,, n 1. Tämä havainto mahdollistaa metodin findelement(k) suorituksen nopeuttamisen. Nyt sekvenssin täydellisen haun sijasta voidaan ikään kuin haarukoida kohtaa, jossa haettava avain k on sekvenssissä. Annetaan tässä alkukohta low ja loppukohta high, joiden väliin avainta paikallistetaan. Kutsutaan sanakirjan D sellaisia tietoyksiköitä, joita ei vielä ole haarukoitu pois, ehdokkaiksi (candidate). Ylläpidetään kahta em. hakuparametria niin, että ehdokastietoyksiköiden asteet ovat parametrien low ja high arvojen välistä sekvenssissä S. 6. luku 310

14 Aluksi ovat low = 0 ja high = n 1. Verrataan sitten avainta k sekvenssin S keskimmäiseen avaimeen, jonka aste on mid = (low + high)/2. Olkoot key(mid) keskimmäisen tietoyksikön avain ja elem(mid) alkio. On kolme tapausta: Jos on k = key(mid), niin etsitty alkio on löydetty ja haku päättyy menestyksellisesti palauttaen alkion elem(mid). Jos on k < key(mid), niin haetaan sekvenssin ensimmäisestä puoliskosta, jonka asteet ovat arvosta low arvoon mid 1. Jos k > key(mid), niin haetaan alueesta, jonka asteet ulottuvat arvosta mid+1 arvoon high. Esitettyä hakutekniikkaa kutsutaan binäärihauksi (binary search). Sitä varten on pseudokoodi kuvattu koodissa 6.1. ja esimerkki kuvassa luku 311

15 Algorithm BinarySearch(S,k,low,high): Input: Sekvenssi S, jossa on n tietoyksikköä avainten ei vähenevässä järjestyksessä, ja hakuavain k sekä kokonaisluvut low ja high. Output: Sekvenssin S alkio, jonka avain on k ja aste muuttujien low ja high arvojen välistä, mikäli tällainen alkio on olemassa, ja muuten erikoisalkio EI_AVAINTA. if low > high then return EI_AVAINTA else mid (low + high)/2 if k = key(mid) then return elem(mid) else if k < key(mid) then return BinarySearch(S,k,low,mid 1) else return BinarySearch(S,k,mid+1,high) Koodi 6.1. Binäärihaku järjestetystä sekvenssistä. 6. luku 312

16 low mid high low mid high low mid high low=mid=high Kuva 6.1. Esimerkki binäärihaun suorittamisesta operaatiolla findelement(22) sanakirjassa, jonka avaimet ovat kokonaislukuja ja joka on toteutettu taulukkopohjaisena järjestettynä sekvenssinä. Ainoastaan avaimet on kuvattu. 6. luku 313

17 Operaatio findelement(k) käsittää kutsun BinarySearch(S, k, 0, n 1). Havaitaan kullakin rekursiivisella metodin BinarySearch kutsulla suoritettavan vakiomäärän alkeisoperaatioita. Tästä seuraa, että suoritusaika on suhteessa tehtyjen rekursiivisten kutsujen lukumäärään. Rekursiivisen kutsun sisältämä ehdokastietoyksiköiden määrä on high low + 1. Jokaisella kutsulla ehdokkaiden määrä ainakin puoliintuu. Muuttujan mid määritelmästä tulee, että jäljellä olevien ehdokkaiden määrä on joko (mid 1) low + 1 = (low + high)/2 low (high low + 1)/2 tai high (mid + 1) + 1 = high (low + high)/2 (high low + 1)/2. 6. luku 314

18 Ehdokkaiden määrä on aluksi n. Metodin BinarySearch ensimmäisen kutsun jälkeen se on enintään n/2, toisen kutsun jälkeen enintään n/4 jne. Yleisesti i:nnen kutsun jälkeen ehdokkaiden määrä on enintään n/2 i. Pahimmassa tapauksessa (epäonnistunut haku) rekursiiviset kutsut loppuvat ehdokkaiden loppuessa. Rekursiivisten kutsujen maksimimäärä on pienin kokonaisluku m, jolle on n/2 m < 1. Tästä saadaan m > log n. Edelleen tulee m = log n + 1, 6. luku 315

19 joka osoittaa, että BinarySearch(S, k, 0, n 1) ja samalla findelement toimii ajassa O(log n). Binäärihaun yksinkertainen muunnelma findallelements(k) toimii ajassa O(log n + s), missä s on palautettujen alkioiden määrä. Taulukko 6.1. vertaa sanakirjojen metodien suoritusaikoja, kun nämä on toteutettu järjestämättömällä ja järjestetyllä sekvenssillä (joko kahteen suuntaan linkitetty lista tai taulukko). Järjestämätön sekvenssi sallii nopeat lisäykset, mutta hitaat haut ja poistot, kun taas järjestetty taulukkopohjainen sekvenssi sallii nopeat haut, mutta hitaat lisäykset ja poistot. Järjestetty sekvenssi kahteen suuntaan linkitettynä listana on hidas kaikille operaatioille. 6. luku 316

20 Taulukko 6.1. Sanakirjaoperaatioiden suoritusaikojen vertailu. Sekvenssin tietoyksiköiden määrä on n metodia suoritettaessa. Operaatioiden findallelements ja removeall palauttamien alkioiden määrä on s. Kahteen suuntaan linkitettyä listaa sovellettaessa tilavaatimus on O(n) ja taulukolle O(N), missä N n. metodi järjestämätön sekvenssi järjestetty sekvenssi taulukko linkitetty lista taulukko linkitetty lista size, Θ(1) Θ(1) Θ(1) Θ(1) isempty findelement O(n) O(n) O(log n) O(n) findall Θ(n) Θ(n) O(log n + s) O(n) Elements insertitem Θ(1) Θ(1) O(n) O(n) remove O(n) O(n) O(n) O(n) removeall Θ(n) Θ(n) O(n) O(n) 6. luku 317

21 6.3. Binäärihakupuut Binääriset hakupuut ovat vaihtoehto tiedon tallettamista varten järjestettyyn sanakirjaan. Kuten edellä esitettiin (luku 4.3.) binäärihakupuu (binary search tree) T on sellainen, jossa jokainen sisäsolmu v käsittää tietoyksikön (k,e) ja solmun v vasempaan alipuuhun talletetut avaimet ovat pienempiä tai yhtä suuria kuin k sekä solmun v oikeaan alipuuhun talletetut avaimet ovat suurempia tai yhtä suuria kuin k. Huomattakoon, että lehdet eivät tässäkään sisällä tietoa, vaan ovat pelkästään paikanpitäjiä. Helposti on todettavissa, että välijärjestyskulkeminen (luku 4.3.) käy puun T avaimet ei vähenevässä järjestyksessä (kuva 6.3.(a)). 6. luku 318

22 Haku Operaation findelement(k) suorittamiseksi sanakirjassa D, joka on tehty binäärihakupuuna T, käytetään tätä tavallaan päätöspuuna. Tutkitaan puun sisäsolmussa v, onko hakuavain k pienempi, yhtä suuri tai suurempi kuin sisäsolmun v avain key(v). Jos vastaus on pienempi, hakua jatketaan vasempaan alipuuhun. Jos vastaus on yhtä suuri, haku päättyy menestyksellisesti. Jos vastaus on suurempi, jatketaan hakua oikeaan alipuuhun. Jos lopulta tullaan lehteen, haku on epäonnistunut eli avainta ei puussa esiintynyt. (kuva 6.3.(b)) 6. luku 319

23 (a) Kuva 6.3. (a) Järjestettyä sanakirjaa D kuvaava binäärihakupuu T, jossa avaimet ovat kokonaislukuja (yksinkertaisuuden takia vain nämä esitetty). 6. luku 320

24 find(25) find(76) (b) Kuva 6.3.(b) Kuljetut solmut suoritettaessa operaatiot findelement(76) (onnistunut haku) ja findelement(25) (epäonnistunut haku) sanakirjaan. 6. luku 321

25 Koodissa 6.2. on rekursiivinen metodi TreeSearch, joka käsittää binäärihakupuuhaun. Olkoot hakuavain k ja solmu v puusta T. Metodi TreeSearch palauttaa solmun (paikan) w alipuusta T(v), jonka juuri on v, jolloin jompikumpi seuraavista tapauksista esiintyy: w on avaimen k sisältävän alipuun T(v) sisäsolmu. w on alipuun T(v) lehti, alipuun T(v) kaikilla sisäsolmuilla, jotka edeltävät solmua w välijärjestyskulkemisessa, on avaimet pienempiä kuin k ja alipuun T(v) kaikilla sisäsolmuilla, jotka seuraavat solmua w välijärjestyskulkemisessa, on avaimet suurempia kuin k. Metodi findelement(k) voidaan siis suorittaa sanakirjalle D kutsumalla metodia TreeSearch(k,T.root()) puulle T. Olkoon w puun T solmu, jonka tämä metodin TreeSearch kutsu palauttaa. Jos w on sisäsolmu, palautetaan alkio, joka on talletettu solmuun w. Muussa tapauksessa, kun w on lehti, palautetaan erikoisalkio EI_AVAINTA. 6. luku 322

26 Algorithm TreeSearch(k,v): Input: Hakuavain k ja binäärihakupuun T solmu v. Output: Alipuun T(v) (juurena v) solmu w, kun joko w on sisäsolmu avaimena k tai w on lehti, johon päädytään alipuun T(v) välijärjestyskulkemisessa kaikkien avainta k pienempien sisäsolmujen avainten käynnin jälkeen, mutta ennen kaikkia avainta k suurempia sisäsolmujen avaimia. if v on lehti then return v if k = key(v) then return v else if k < key(v) then return TreeSearch(k,T.leftChild(v)) else { tiedetään, että k > key(v) } return TreeSearch(k,T.rightChild(v)) Koodi 6.2. Rekursiivinen haku binäärihakupuusta. 6. luku 323

27 Suoritusajan pahimman tapauksen analyysi on yksinkertainen. Algoritmi TreeSearch on rekursiivinen ja suorittaa jokaisella rekursiivisella kutsulla vakiomäärän alkeisoperaatioita. Jokainen rekursiivinen kutsu koskee edellisen solmun lasta. Tästä johtuen metodia TreeSearch kutsutaan puun T erään polun solmuissa ja näiden määrää rajoittaa h+1, missä h on korkeus. Siispä metodi findelement suoriutuu ajassa O(h), missä h on sanakirjan D binäärihakupuun korkeus. Edellisen algoritmin muunnelma findallelements(k) toimii ajassa O(h+s), missä s on palautettujen alkioiden määrä. Puun T korkeus h voi olla enimmillään n, mutta keskimäärin se on huomattavasti pienempi. Luvussa 6.4. esitetään, kuinka voidaan taata yläraja O(log n) hakupuun korkeudelle. 6. luku 324

28 Päivitysoperaatiot Binäärihakupuu tukee operaatioiden insertitem ja remove toteutuksia soveltaen algoritmeja, jotka ovat hivenen sekvenssitoteutuksia monimutkaisempia. Lisäys Operaation insertitem(k,e) suorittamiseksi binäärihakupuulla T toteutetulle sanakirjalle D aloitetaan kutsumalla metodia TreeSearch(k,T.root()) puulle T. Olkoon w tämän palauttama solmu. Jos w on lehti (puuhun T ei ole talletettu tietoyksikköä avaimella k), korvataan w uudella sisäsolmulla, joka tallettaa parin (k,e) ja kaksi lehtilasta operaation expandexternal(w) avulla puuhun T. Jos w on sisäsolmu (solmuun w talletettu tietoyksikkö avaimella k), kutsutaan metodia TreeSearch(k,rightChild(w)) ja rekursiivisesti sovelletaan algoritmia metodin TreeSearch palauttamaan solmuun. 6. luku 325

29 Huomaa, että edellisessä olisi voinut yhtä hyvin olla kutsu TreeSearch(k,leftChild(w)), sillä lisättävä avain k on tällöin yhtä suuri kuin solmun w avain. Esitetty menettely tuottaa polun juuresta lehteen, joka muutetaan sisäsolmuksi ja tälle tulee uusi solmu lapseksi. Täten lisäysoperaatio lisää uuden tietoyksikön hakupuun pohjalle. Esimerkki on kuvattu kuvassa 6.4. Lisäysalgoritmin analyysi on analoginen haulle. Aikaa kulutetaan O(1) jokaisessa käytävässä solmussa ja pahimmassa tapauksessa käytyjen solmujen lukumäärä on suhteessa puun T korkeuteen h. Sanakirjan D lisäysmetodi toimii näin ollen ajassa O(h), missä h on puun korkeus. 6. luku 326

30 (a) Kuva 6.4. Avaimeen 78 liittyvän alkion lisääminen binäärihakupuuhun: (a) lisäyspaikan etsiminen. 6. luku 327

31 Kuva 6.4.(b) Binäärihakupuu lisäyksen jälkeen. (b) luku 328

32 Poisto Poiston remove(k) toteutus binäärihakupuuhun T perustuvasta sanakirjasta D on hieman lisäystä monimutkaisempi, koska puuhun ei voi jättää reikiä. Operaatio alkaa yksinkertaisesti. Suoritetaan algoritmi TreeSearch(k,T,root()) puulle T avaimen k sisältävän solmun löytämiseksi. Jos TreeSearch palauttaa lehden, sanakirjassa D ei ole avaimella k solmua ja palautetaan erikoisalkio EI_AVAINTA. Jos TreeSearch palauttaa sisäsolmun w, tämä sisältää etsityn, poistettavaksi tarkoitetun tietoyksikön. Erotetaan kaksi tapausta: Jos solmun w lapsista toinen on lehti, olkoon se z, poistetaan yksinkertaisesti solmut w ja z puusta T operaation removeaboveexternal(z) avulla. Tämä rakentaa T:n uudelleen korvaamalla solmun w solmun z sisaruksella ja poistamalla solmut w ja z. Tätä esittää kuva luku 329

33 w z Kuva 6.5. Poisto binäärihakupuusta, missä poistetaan avaimen 32 solmu w ja tämän lehtilapsi z: (a) Ennen poistoa. 78 (a) 6. luku 330

34 Kuva 6.5. (b) Poiston jälkeen. 78 (b) 6. luku 331

35 Jos solmun w molemmat lapset ovat sisäsolmuja, ei voi yksinkertaisesti poistaa solmua w puusta T, sillä tämä jättäisi reiän. Toimitaan sen sijaan seuraavasti (kuva 6.6.): Etsitään ensimmäinen sisäsolmu y, joka seuraa solmua w kuljettaessa puuta välijärjestyksessä. Solmu y on solmun w oikean alipuun vasemmanpuoleinen sisäsolmu. Se löydetään menemällä ensin solmun w oikeaan lapseen ja siitä sitten alaspäin puuta pitkin vasemmanpuoleisia lapsia. Solmun y vasen lapsi x on lehti, joka seuraa välittömästi solmua w välijärjestyskulkemisessa. Talletetaan solmun w alkio väliaikaismuuttujaan t, ja siirretään solmun y tietoyksikkö solmuun w. Tällöin samalla poistetaan w:n aiempi sisältö. Poistetaan solmut x ja y puusta T operaation removeaboveexternal(x) avulla. Tämä korvaa y:n solmun x sisaruksella ja poistaa solmut x ja y. Palautetaan muuttujasta t alkio, joka oli aiemmin talletettuna solmuun w. 6. luku 332

36 w y x 80 Kuva 6.6. Poisto binäärihakupuusta, jossa poistettavan solmun avain on 65 ja poistettavan molemmat lapset ovat sisäsolmuja: (a) Ennen poistoa. 78 (a) 6. luku 333

37 w (b) Kuva 6.6. (b) Poiston jälkeen. 6. luku 334

38 Poistoalgoritmin analyysi on analoginen lisäykselle ja haulle. Jokaisessa solmussa käytäessä käytetään aikaa O(1) ja pahimmassa tapauksessa käytyjen solmun lukumäärä on suhteessa puun T korkeuteen h. Sanakirjaan D tehty metodin remove suoritus toimii ajassa O(h), missä h on puun korkeus. Edellisen poistometodin muunnelma removeall(k) toimii ajassa O(h+s), missä s on palautettujen eli puusta löydettyjen alkioiden määrä. Yhteenvetona todetaan binäärihakupuun T olevan tehokas n tietoyksikköä sisältävän järjestetyn sanakirjan toteutuksessa edellyttäen, että puun T korkeus on pieni. Parhaassa tapauksessa puun korkeus on h = log(n+1), joka antaa logaritmisen suoritusajan kaikille sanakirjaoperaatioille. Pahimmassa tapauksessa korkeus on n, mikä näyttää järjestetyltä sekvenssiltä. Tällainen esiintyy, mikäli esim. lisätään kasvavassa tai vähenevässä järjestyksessä joukko avaimia. 6. luku 335

39 Keskimäärin operaatiot toimivat ajassa O(log n) (monimutkaista perustelua ei tässä tarkastella). Operaatiot toimivat hyvin puun ollessa tasapainossa, missä ei ole erillisiä korkeita haaroja. Näin ollen tämä sanakirjatoteutus on käyttökelpoinen, jos sallitaan satunnaisesti hitaasti toimivat operaatiot lähellä pahimpaa tapausta olevissa tilanteissa AVL puut Edellä binäärihakupuun tilanteessa pahin tapaus tuotti lineaarisia suoritusaikoja sanakirjaoperaatioille, mikä on samaa luokkaa kuin sekvensseillä. Nyt kuvataan yksinkertainen menettely korjata tämä ongelma logaritmisen suoritusajan saamiseksi keskeisille sanakirjaoperaatioille. Suoraviivainen menettely on lisätä sääntö binäärihakupuun määrittelyyn puun logaritmisen korkeuden ylläpitämiseksi puussa T suhteessa solmujen määrään. Sääntö on seuraava korkeuden tasapainoisuus ominaisuus, joka luonnehtii binäärihakupuun T rakennetta sisäsolmujen korkeuden suhteen solmun v korkeus on pisin polku solmusta v lehteen. 6. luku 336

40 Korkeuden tasapainoisuusominaisuus: Jokaiselle T:n sisäsolmulle v sen lasten korkeudet eroavat toisistaan enintään yhden verran. Mitä tahansa binäärihakupuuta T, joka toteuttaa tämän ominaisuuden, kutsutaan AVL puuksi, mikä käsite on nimetty keksijöidensä nimien alkukirjainten mukaisesti (Adelson Velskij ja Landis). Esimerkki tästä on kuvassa 6.7. Korkeuden tasapainoisuusominaisuuden välitön seuraus on, että AVLpuun alipuu itse on AVL puu. Luonnollisesti on myös tärkeää sen seuraus, että korkeus pysyy pienenä, kuten seuraavassa esitetään. Lause 6.1. AVL puun T korkeus, kun puussa on n solmua, on O(log n). Perustelu jätetään esittämättä, mutta on helposti ymmärrettävissä lauseen tuloksen tuottava rinnastus, että AVL puu on likimain kuin täydellinen puu, jossa ei ole tyhjiä solmunpaikkoja. 6. luku 337

41 Kuva 6.7. Esimerkki AVL puusta. Avaimet on esitetty solmuissa ja näiden korkeudet solmujen vieressä. 6. luku 338

42 Lisäys Lisäyksen suorittaminen AVL puuhun alkaa operaation insertitem suorittamisella, kuten on kuvattu luvussa 6.3. (yleiselle) binäärihakupuulle. Tämä operaatio lisää uuden tietoyksikön puun T solmuun w, joka oli aiemmin lehti, ja tekee siitä sisäsolmun operaatiolla expandexternal. Se lisää siis kaksi lehtilasta solmulle w. Tämä toimenpide saattaa vahingoittaa korkeuden tasapainoisuusominaisuutta joidenkin solmujen korkeuksien kasvaessa yhdellä (kuva 6.8.(a)). Solmu w ja mahdollisesti jotkut sen esivanhemmat kasvattavat korkeuksiaan yhdellä. Kuvataan, kuinka T korjataan korkeuden tasapainoisuusominaisuuden säilyttämiseksi. Binäärihakupuun T solmu v on tasapainoitettu (balanced), jos sen lasten korkeuksien ero on enintään yksi; muussa tapauksessa se on epätasapainoitettu (unbalanced). Täten korkeuden tasapainoisuusominaisuus on ekvivalentti sen kanssa, että jokainen sisäsolmu on tasapainoitettu. Jos jokainen solmu on tasapainoitettu, niin selvästi T on tasapainoitettu ja lauseen 6.1. mukaan binäärihakupuun T korkeus on O(log n). 6. luku 339

43 Oletetaan puun T toteuttavan korkeuden tasapainoisuusominaisuuden ja on siis AVL puu alkutilanteessa, ennen lisäystä. Operaation expandexternal(w) suorittamisen puulle T jälkeen solmun w sekä joidenkin muiden solmujen korkeudet kasvavat. Ne kaikki sjaitsevat polulla solmusta w puun juureen. Ne ovat ainoat solmut, jotka voivat näin tulla epätasapainoitetuiksi (kuva 6.8.(a)). Mikäli näin tapahtuu, T ei ole tässä tilanteessa enää AVL puu. Niinpä tarvitaan mekanismi aiheutetun epätasapainon korjaamiseksi. Solmujen tasapaino palautetaan AVL puussa T yksioikoisella hae jakorjaa menettelyllä. Olkoon x ensimmäinen kohdattava solmu mentäessä ylös solmusta w kohti juurta, kun solmun x isovanhempi z on epätasapainoitettu (kuva 6.8.(a)). Solmu w voisi olla itse x. Olkoon y solmun x vanhempi, jolloin y on solmun z lapsi. Koska z tulee epätasapainoitetuksi lisäyksen tähden alipuuhun, jonka juuri y on, solmun y korkeus on yhtä kuin kaksi lisättynä solmun y sisaren korkeudella. Nyt uudelleentasapainoitetetaan alipuu (juurena z) suorittamalla rotaatio eli kierto (rotation). Tämä tehdään koodin 6.3. algoritmilla restructure kuvien 6.8. ja 6.9. mukaisesti. 6. luku 340

44 z y 50 x T w T 2 T 3 Kuva 6.8. Esimerkki alkion avaimella 54 lisäyksestä AVL puuhun: (a) Uuden solmun lisäyksen jälkeen avainta 54 varten, jolloin avaimet 78 ja 44 sisältävät solmut tulevat epätasapainoitetuiksi. T 1 6. luku 341

45 x y 50 z T 2 T 0 T 1 T 3 Kuva 6.8. (jatkoa) (b) (Kaksois)rotaatio korjaa korkeuden tasapainoisuusominaisuuden. Solmujen korkeudet on esitetty ja pitää tunnistaa solmut x, y ja z. 6. luku 342

46 Rotaatio nimeää uudelleen väliaikaisesti solmut x, y ja z solmuiksi a, b ja c, jolloin a edeltää solmua b ja tämä solmua c välijärjestyskulkemisessa. On neljä erilaista mahdollista tapaa kuvata x, y ja z solmuiksi a, b ja c, kun esitettyjen edeltämisehtojen pitää olla voimassa. Nämä on annettu kuvassa 6.9. Rotaatio korvaa silloin solmun z solmulla b, tekee tämän lapsiksi solmut a ja c sekä tekee solmujen a ja c lapsiksi solmujen x, y ja z aiemmat lapset (muut kuin x ja y). Samalla ylläpidetään välijärjestyssuhde puun kaikille solmuille. Uudelleentasapainoittamisoperaatiota kutsutaan rotaatioksi tämän geometrisen rakentamistavan takia. Jos on b = y (koodi 6.3.), metodin restructure suoritusta sanotaan yksittäisrotaatioksi (single rotation), sillä se voidaan esittää solmun y kiertona yli solmun z (kuva 6.9. (a) ja (b)). Jos on b = x, tätä operaatiota kutsutaan kaksoisrotaatioksi (double rotation), koska se voidaan kuvata ensin solmun x kiertona solmun y yli ja sitten yli solmun z (kuva 6.9. (c) ja (d) sekä kuva 6.8.). Rotaatio muokkaa vanhempi lapsi suhteet puussa T ajassa O(1) säilyttäessään välijärjestyksen kaikille solmuille. 6. luku 343

47 Algorithm restructure(x): Input: Binäärihakupuun T solmu x, jolla on olemassa sekä vanhempi y ja isovanhempi z. Output: Puu T rotaatiolla korjattuna (joko yksittäis tai kaksoisrotaatio), missä mukana ovat x, y ja z. 1. Olkoon (a, b, c) solmujen x, y ja z välijärjestysesitys vasemmalta oikealle. Olkoon (T 0, T 1, T 2, T 3 ) solmujen x, y ja z neljän alipuun (juurena ei mikään solmuista x, y tai z) välijärjestysesitys vasemmalta oikealle. 2. Korvaa juureltaan z oleva alipuu uudella alipuulla, jonka juuri on b. 3. Olkoon a solmun b vasen lapsi, ja olkoot T 0 ja T 1 solmun a vasen ja oikea alipuu. 4. Olkoon c solmun b oikea lapsi. Olkoot T 2 ja T 3 solmun c vasen ja oikea alipuu. Koodi 6.3. Binäärihakupuun rotaatio, jolla puu korjataan jälleen AVLpuuksi. 6. luku 344

48 a=z b=y c=x yksittäisrotaatio a=z b=y c=x T 0 T 1 T2 T 3 (a) T 0 T 1 T 2 T 3 a=x b=y c=z yksittäisrotaatio a=x b=y c=z T 0 T 1 T 2 T 3 T 0 T 1 T 2 T 3 (b) Kuva 6.9. Rotaation kaavamainen esitys (koodista 6.6.): (a) ja (b) yksittäisrotaatiot. 6. luku 345

49 a=z b=x c=y kaksoisrotaatio a=z b=x c=y T 0 T 2 T 3 (c) T 0 T 1 T 2 T 3 T 1 a=y b=x c=z kaksoisrotaatio a=y b=x c=z T 0 T 1 T 2 T 3 (d) T 0 T 1 T 2 T 3 Kuva 6.9. (jatkoa) (c) ja (d) Kaksoisrotaatiot. 6. luku 346

50 Rotaatiota tarvitaan puun T solmujen korkeuksien muuttamiseksi, jotta tasapainoisuus palautuu. Rotaatio suoritetaan kutsulla restructure(x) solmun x isovanhemman z epätasapainoisuuden vuoksi. Tämä johtuu siitä, että toisella solmun x lapsista on nyt liian suuri korkeus suhteessa solmun z toiseen lapseen. Rotaation tuloksena siirretään ylös solmun x korkea lapsi samalla, kun solmun z matalaa lasta työnnetään alas. Tämän jälkeen kaikki juureltaan b alipuun solmut tulevat tasapainoisiksi (kuva 6.9.). Itse asiassa kysymyksessä on lokaali (local) palautus korkeuden tasapainoisuusominaisuudelle solmuissa x, y ja z. Lisäksi kun uuden tietoyksikön lisäyksen jälkeen alipuu juurenaan b korvaa aiemman juureltaan z, joka oli yhden verran korkeampi, solmun z kaikki aiemmat epätasapainoitetut esivanhemmat tulevat tasapainoitetuiksi. Tämä rotaation vaikutus on näin myös globaali (global) korkeuden tasapainoisuusominaisuuden palautus. 6. luku 347

51 Poisto Jälleen lähdetään muodostamaan operaatiota AVL puulle käyttäen säännöllisen binäärihakupuun algoritmia hyväksi. Tämä lähestymistapa saattaa kuitenkin rikkoa korkeuden tasapainoisuuden, kun sisäsolmun poiston jälkeen operaatiolla removeaboveexternal ja toisen lapsen noston jälkeen sisäsolmun sijaan, epätasapainoinen solmu voi esiintyä puun T polulla tuhotun solmun vanhemmasta w juureen (kuva 6.10.(a)). Sellaisia solmuja voi olla enintään yksi. Käytetään jälleen rotaatiota tasapainoisuuden palauttamiseksi AVLpuuhun. Olkoon z ensimmäinen tasapainottamaton solmu, joka kohdataan lähdettäessä solmusta w kohti juurta. Olkoon y solmun z lapsi, jonka korkeus on suurempi kuin toisen (y ei ole solmun w esivanhempi). Olkoon x solmun y lapsi, jonka korkeus on toista suurempi. Tämä ei ole välttämättä yksikäsitteinen, koska solmun y alipuut voivat olla yhtä korkeita. Joka tapauksessa suoritetaan restructure(x), joka palauttaa lokaalisesti korkeuden tasapainoisuusominaisuuden alipuussa alkuperäiseltä juureltaan z ja nyt väliaikaiselta nimeltään b (kuva 6.10.(b)). 6. luku 348

52 z y 62 3 w 2 50 x 78 2 T T 2 (a) T 1 T 3 Kuva (alku) Alkion avaimeltaan 32 poisto kuvan 6.7. AVL puusta: (a) avaimen 32 sisältäneen solmun poiston jälkeen juuri tulee epätasapainoitetuksi. 6. luku 349

53 y 4 62 z x T T 0 T 3 (b) T 1 Kuva (loppu) (b) Yksittäisrotaatio palauttaa korkeuden tasapainoisuusominaisuuden. 6. luku 350

54 Rotaatio saattaa vähentää alipuun juureltaan b korkeutta yhdellä ja tästä johtuen tehdä solmun b esivanhemman epätasapainoitetuksi. Tämän vuoksi yksi rotaatio ei ehkä riitä, vaan niitä on toistettava ylöspäin puussa T, kunnes ei ole enää epätasapainoitettuja solmuja. Kun puun korkeus on O(log n) lauseen 6.1. mukaan, O(log n) rotaatiota on riittävästi palauttamaan korkeuden tasapainoisuusominaisuuden. Analyysi Melko suoraviivaisesti on selvitettävissä, että sanakirjaoperaatiot insertitem ja remove tarvitsevat aikaa käymissään solmuissa O(1) kussakin. Solmut ovat puun T polulla juuresta lehteen. Kun puun korkeus on O(log n), niin se on samalla näiden operaatioiden aikakompleksisuus AVL puutoteutukselle sanakirjaa varten. Operaatio findelement on samaa luokkaa. Taulukossa 6.2. on yhteenveto suoritusajoista. 6. luku 351

55 Taulukko 6.2. AVL puuna toteutetun, n alkioisen sanakirjan suorituskyvyt eri metodien tapauksissa, missä s on palautettujen samaa avainta olevien alkioiden määrä. Tilavaatimus on O(n). operaatio size, isempty suoritusaika Θ(1) findelement, insertitem, remove O(log n) findallelements, removeall O(log n + s) 6.5. Hajautustaulut Sanakirjan toteuttamisessa hajautustauluna (hash table) hyödynnetään avaimia, jotka ovat järjestämättömiä niillä annetaan alkion osoite. Sovellusesimerkkinä on kääntäjän symbolitaulu. 6. luku 352

56 Vaikka sanakirjan toteutus hajautustaululla vaatii pahimmassa tapauksessa suoritusajan O(n), missä n on tietoyksiköiden lukumäärä, hyvin toteutetun hajautustaulun pitäisi kyetä suorittamaan nämä operaatiot keskimäärin ajassa O(1). Hajautustaulu sisältää kaksi osaa, hajautustaulukon ja hajautusfunktion. Hajautustaulukko Hajautus tai lokerotaulukko (hash, bucket array) on kokoa N oleva taulukko A, jonka jokainen alkio mielletään lokeroksi. Kokonaisluku N määrittelee taulukon kapasiteetin (capacity). Jos sanakirjassa käsiteltävät avaimet ovat kokonaislukuja väliltä [0,N 1], tämä hajautustaulukko on kaikki, mitä tarvitaan. Alkio e, jonka avain on k, talletetaan yksinkertaisesti lokeroon A[k]. Jokainen lokero, johon ei ole talletettu kyseisellä hetkellä mitään, merkitään tiedolla EI_AVAINTA. Jos avaimet eivät ole yksikäsitteisiä, kaksi alkiota voivat saada saman lokeron taulukosta. Tällöin tapahtuu törmäys (collision), joka on hoidettava sopivasti. 6. luku 353

57 Jos taulukon A jokainen lokero sisältää ainoastaan yhden alkion, ongelma esiintyy törmäyksen muodossa eli saman avaimen sattuessa kahdelle eri alkiolle. Tämä hoidetaan tehokkaasti tallettamalla alkioiden sekvenssi lokeroon A[k], kun jokaisen sekvenssin alkion avain on kyseinen k. Tämä törmäysratkaisu tunnetaan ketjutuksena (chaining). Nyt sanakirjaoperaatiot ovat suoritettavissa seuraavasti: Operaatio findelement(k) palauttaa mielivaltaisesti valitun alkion sekvenssistä A[k], kunhan tämä lokero ei ole tyhjä. Jos lokero on tyhjä, se palauttaa erikoisalkion EI_AVAINTA. Operaatio insertitem(k,e) käsittää alkion e lisäyksen sekvenssiin A[k]. Operaatio remove(k) poistaa ja palauttaa tuloksenaan sekvenssin A[k] mielivaltaisesti valitun alkion, kunhan tämä lokero ei ole tyhjä. Mikäli lokero on tyhjä, operaatio palauttaa erikoisalkion EI_AVAINTA. 6. luku 354

58 Mikäli avaimet ovat yksikäsitteisiä, haut, lisäykset ja poistot vaativat pahimmassa tapauksessa ajan O(1). Vaikka tämä on optimaalisen tehokasta, hajautustauluihin liittyy kaksi heikkoutta. Ne vaativat tilaa Θ(N), joka ei välttämättä ole suhteessa tietoyksiköiden todelliseen määrään n sanakirjassa. Jos niiden ero on suuri, tietorakenne tuhlaa tilaa. Toisena heikkoutena on se, että hajautustaulukko vaatii kokonaislukuavaimia väliltä [0,N 1], mikä ei toisinaan tule kysymykseen. Hajautusfunktiot Haluttaessa tallettaa mielivaltaisesti (arbitrary) valittuja avaimia hajautustaulukkoon on löydettävä menetelmä kuvata avain k kokonaislukuvuksi väliltä [0,N 1]. Tätä varten on oltava yhtenäinen tapa määrätä kokonaisluku kullekin avaimelle. Tätä kokonaislukua kutsutaan avaimen k hajautuskoodiksi (hash code). 6. luku 355

59 Avaimella k tulee olla ominaisuus f(k 1 ) = f(k 2 ), jos avaimet k 1 ja k 2 ovat samoja (geneerisessä mielessä). Tietysti voi olla f(k 1 ) = f(k 2 ), vaikka on k 1 k 2. Kun avainten k 1 ja k 2 yhtäsuuruus riippuu yhtäsuuruuden vertaamisesta, hajautuskoodien määrääminen avaimille riippuu myös tästä. Esim Seuraavien avaintyyppien yhtenäisiä hajautuskoodeja ovat: Liukuluku (floating point number): Lasketaan mantissa ja eksponentti yhteen käsitellen niitä kuin kokonaislukuja. Merkkijono (string): Lasketaan merkkijonojen merkkien ASCII (tai muu) koodiarvot yhteen. Avainsana arvo pari (keyword value pair): Käytetään avainsanan (merkkijono) hajautuskoodia. 6. luku 356

60 Kun hajautuskoodi on käytettävissä, hajautustaulukkomenetelmää voidaan soveltaa mielivaltaisesti valituille avaimille käyttäen hajautuskoodia f(k) avaimen k sijasta. Talletetaan tietoyksikkö (k,e) sekvenssiin, johon viitataan alkiolla A[f(k)] indeksoituna hajautuskoodilla f(k). Tällöin törmäysten esiintyminen tekee sanakirjaoperaatiot findelement ja remove pelkkien avaimien soveltamisen tapausta monimutkaisemmaksi. Kaksi eri avainta, k 1 ja k 2, saattavat kuvautua samalle hajautuskoodille, i = f(k 1 ) = f(k 2 ), ja mennä näin samaan lokeroon A[i]. Suoritettaessa operaatiota findelement(k 1 ) ei voi yksinkertaisesti palauttaa mielivaltaisesti valitun tietoyksikön alkiota lokerosta A[i], koska tällä voisi olla avaimena k 2. Lokeroa A[i] pitää käsitellä kuin sanakirjaa ja suorittaa operaatio findelement(k 1 ) sille. Samaa pitää paikkansa poisto operaatiolle remove. Kokoa N oleva hajautustaulukko voidaan nähdä täten kokoelmana sekvenssiperusteisia sanakirjoja, joista kukin tallettaa saman hajautusfunktioarvon tuottavien avainten tietoyksiköt. 6. luku 357

61 Miten käsitellään tilanne, että hajautustaulukon kapasiteetti N ei riitä, kun käytettäisiin taulukon ulkopuolelle menevää hajautusfunktion f(k) arvoa? Ei riitä määrätä kokonaislukuarvo hajautuskoodiksi, vaan pitää kuvata se vielä välille [0,N 1]. Tätä tiivistystä kutsutaan hajautukseksi (hashing). Sen tulisi kuvata hajautuskoodit tasaisen (uniform) jakauman mukaisesti. Tiivistyksen tuottaa hajautusfunktio (hash function). Kun sanakirjaoperaatiot sekvenssitoteutuksessa vaativat aikaa suhteessa sekvenssin kokoon (luku 6.2.), pitää tähdätä siihen, että kuhunkin lokeroon talletettaisiin mahdollisimman vähän avaimia. Pahimmassa tapauksessa avainten määrä yhdessä lokerossa voi olla kuitenkin n. Näin käy silloin, kun sanakirjan kaikki avaimet törmäävät eli niillä on sama hajautuskoodi. 6. luku 358

62 Jos hajautuskoodit ovat tasaisesti jakautuneet välille [0,N 1], lokeron avainten lukumäärän odotusarvo (keskiarvo) on n/n, mikä on O(1), jos n on O(N). Luku n/n, joka on tietoyksiköiden ja lokerojen määrien suhde, on hajautustaulun täyttöaste (load factor). Törmäysten todennäköisyyksien pienentämiseksi täyttöasteen tulee olla tyypillisesti alle 1 ja tavallinen valinta on Jos täyttöaste nousee selvästi määrätyn rajan yli, taulukko pitää tavallisesti muodostaa uudelleen lisätilan saamista varten. Yleensä taulukko suurennetaan kaksinkertaiseksi. Tällöin pitää kaikkien lokerojen alkiot uudelleenhajauttaa (rehash). Tasaisen jakauman saamiseksi hajautuskoodeilla välille [0,N 1] hajautusfunktio on valittava sopivasti. Yksinkertaisessa tapauksessa, jossa käytetään suoraan kokonaislukuavaimia, voidaan soveltaa hajautusfunktiota H(k) = k mod N. 6. luku 359

63 Kun N on alkuluku (prime number), tämä hajautusfunktio levittää hajautettujen arvojen jakaumaa. Jos se ei ole alkuluku, todennäköistä on, että jakaumassa toistuu samoja hajautuskoodeja aiheuttaen törmäyksiä. Jos esimerkiksi hajautetaan avaimet {200, 205, 210, 215, 220,, 595} hajautustaulukkoon kooltaan 100, niin jokainen hajautuskoodi törmää kolmen muun kanssa. Jos sama avainjoukko hajautetaan taulukkoon kooltaan 101, ei esiinny yhtään törmäystä. Kun hajautusfunktio valitaan hyvin, sen tulisi taata, että kahden eri avaimen hajautuksen todennäköisyys samaan lokeroon olisi enintään 1/N. Yksinkertainen hajautustaulukko on esitetty kuvassa Koon N valinta alkuluvuksi ei aina riitä, sillä jos avaimia esiintyy toistuvasti muodossa in + j useille eri arvoille i, törmäyksiä esiintyy yhä. Niinpä parempi hajautusfunktio on h(k) = (ak + b) mod N, missä N on alkuluku, a 0 ja a mod N 0. Lisäksi a ja b ovat einegatiivisia kokonaislukuja, jotka valitaan satunnaisesti. 6. luku 360

64 A Kuva Esimerkki hajautustaulusta kooltaan 13, missä on 10 kokonaislukuavainta ketjutettuna. Hajautusfunktio on h(k) = k mod luku 361

65 Tällainen hajautusfunktio levittää n alkiota melko tasaisesti välille [0,N 1]. Operaatioiden findelement, insertitem ja remove keskimääräinen suoritusaika on tällöin O( n/n ). Hyvällä hajautusfunktiolla ja taulukolla voidaan tavalliset sanakirjaoperaatiot toteuttaa toimiviksi keskimäärin ajassa O(1) edellyttäen, että n on O(N). Vaihtoehtoisia törmäystenkäsittelytapoja Edellä oletettiin törmäykset käsiteltävän ketjutussäännön mukaan. Vaikka ketjutussäännöllä on useita hyviä puolia, sillä on muuan heikkous. Se tarvitsee aputietorakenteen, sekvenssin, törmäysten vuoksi. Yhtenä vaihtoehtona on tallettaa jokaiseen lokeroon ainoastaan yksi tietoyksikkö. Tämä säästää tilaa, kun aputietorakennetta ei tarvita, mutta törmäystenkäsittely on aiempaa mutkikkaampaa. 6. luku 362

66 Lineaarisessa hajautuksessa (linear probing) törmäyksessä yritetään lisätä tietoyksikkö (k,e), mutta lokero A[i] on jo täynnä, missä i = f(k), jolloin yritetään lokeroa A[(i+1) mod N]. Jos tämäkin on varattu, yritetään lokeroa A[(i+2) mod N] jne., kunnes löydetään tyhjä lokero, johon uusi tietoyksikkö talletetaan. Täyttöasteen on aina oltava enintään 1, siis n N. Huonoina puolina ovat poistojen hankaluus ja tietoyksiköiden ryvästyminen. Toinen vaihtoehto on neliöllinen (quadratic) hajautusfunktio, joka iteratiivisesti yrittää lokeroihin A[(i+f(j)) mod N] arvoilla j = 1,2,3,, missä f(j) = j 2. Se vähentää ryvästyksen muodostumista (tosin niitä tulee erilaisina), mutta poistot ovat monimutkaisia. Kolmas vaihtoehto on kaksoishajautus (double hashing). Normaalisti käytetyn hajautusfunktion lisäksi käytetään törmäysten sattuessa toista hajautinta, joka ei saa saada arvoja 0. Nämä esitetyt hajauttimet edustavat suljettua (closed) hajautusta, kun taas edellä olevat ketjutusta käyttävät ovat avoimia (open). 6. luku 363

A274101 TIETORAKENTEET JA ALGORITMIT

A274101 TIETORAKENTEET JA ALGORITMIT A274101 TIETORAKENTEET JA ALGORITMIT PUURAKENTEET, BINÄÄRIPUU, TASAPAINOTETUT PUUT MIKÄ ON PUUTIETORAKENNE? Esim. Viereinen kuva esittää erästä puuta. Tietojenkäsittelytieteessä puut kasvavat alaspäin.

Lisätiedot

8. Lajittelu, joukot ja valinta

8. Lajittelu, joukot ja valinta 8. Lajittelu, joukot ja valinta Yksi tietojenkäsittelyn klassisista tehtävistä on lajittelu (järjestäminen) (sorting) jo mekaanisten tietojenkäsittelylaitteiden ajalta. Lajiteltua tietoa tarvitaan lukemattomissa

Lisätiedot

Tiraka, yhteenveto tenttiinlukua varten

Tiraka, yhteenveto tenttiinlukua varten Tiraka, yhteenveto tenttiinlukua varten TERMEJÄ Tietorakenne Tietorakenne on tapa tallettaa tietoa niin, että tietoa voidaan lisätä, poistaa, muokata ja hakea. Tietorakenteet siis säilövät tiedon niin,

Lisätiedot

10. Painotetut graafit

10. Painotetut graafit 10. Painotetut graafit Esiintyy monesti sovelluksia, joita on kätevä esittää graafeina. Tällaisia ovat esim. tietoverkko tai maantieverkko. Näihin liittyy erinäisiä tekijöitä. Tietoverkkoja käytettäessä

Lisätiedot

Pinot, jonot, yleisemmin sekvenssit: kokoelma peräkkäisiä alkioita (lineaarinen järjestys) Yleisempi tilanne: alkioiden hierarkia

Pinot, jonot, yleisemmin sekvenssit: kokoelma peräkkäisiä alkioita (lineaarinen järjestys) Yleisempi tilanne: alkioiden hierarkia Pinot, jonot, yleisemmin sekvenssit: kokoelma peräkkäisiä alkioita (lineaarinen järjestys) Yleisempi tilanne: alkioiden hierarkia Kukin alkio (viite) talletettuna solmuun (node) vastaa paikan käsitettä

Lisätiedot

Koe ma 1.3 klo 16-19 salissa A111, koeaika kuten tavallista 2h 30min

Koe ma 1.3 klo 16-19 salissa A111, koeaika kuten tavallista 2h 30min Koe Koe ma 1.3 klo 16-19 salissa A111, koeaika kuten tavallista 2h 30min Kokeessa saa olla mukana A4:n kokoinen kaksipuolinen käsiten tehty, itse kirjoitettu lunttilappu 1 Tärkeää ja vähemmäntärkeää Ensimmäisen

Lisätiedot

811312A Tietorakenteet ja algoritmit, 2014-2015, Harjoitus 7, ratkaisu

811312A Tietorakenteet ja algoritmit, 2014-2015, Harjoitus 7, ratkaisu 832A Tietorakenteet ja algoritmit, 204-205, Harjoitus 7, ratkaisu Hajota ja hallitse-menetelmä: Tehtävä 7.. Muodosta hajota ja hallitse-menetelmää käyttäen algoritmi TULOSTA_PUU_LASKEVA, joka tulostaa

Lisätiedot

Tietorakenteet ja algoritmit Johdanto Lauri Malmi / Ari Korhonen

Tietorakenteet ja algoritmit Johdanto Lauri Malmi / Ari Korhonen Tietorakenteet ja algoritmit Johdanto Lauri Malmi / Ari 1 1. JOHDANTO 1.1 Määritelmiä 1.2 Tietorakenteen ja algoritmin valinta 1.3 Algoritmit ja tiedon määrä 1.4 Tietorakenteet ja toiminnot 1.5 Esimerkki:

Lisätiedot

Tietorakenteet ja algoritmit - syksy 2015 1

Tietorakenteet ja algoritmit - syksy 2015 1 Tietorakenteet ja algoritmit - syksy 2015 1 Tietorakenteet ja algoritmit - syksy 2015 2 Tietorakenteet ja algoritmit Johdanto Ari Korhonen Tietorakenteet ja algoritmit - syksy 2015 1. JOHDANTO 1.1 Määritelmiä

Lisätiedot

811312A Tietorakenteet ja algoritmit, 2015-2016. VI Algoritmien suunnitteluparadigmoja

811312A Tietorakenteet ja algoritmit, 2015-2016. VI Algoritmien suunnitteluparadigmoja 811312A Tietorakenteet ja algoritmit, 2015-2016 VI Algoritmien suunnitteluparadigmoja Sisältö 1. Hajota ja hallitse-menetelmä 2. Dynaaminen taulukointi 3. Ahneet algoritmit 4. Peruuttavat algoritmit 811312A

Lisätiedot

A274101 TIETORAKENTEET JA ALGORITMIT

A274101 TIETORAKENTEET JA ALGORITMIT A274101 TIETORAKENTEET JA ALGORITMIT ALGORITMIEN ANALYYSISTÄ 1.ratkaisu Laskentaaika hakkeri - optimoitu ALGORITMIANALYYSIÄ hyvä algoritmi hakkeri -optimoitu hyvä algoritmi Tehtävän koko Kuva mukailtu

Lisätiedot

puuta tree hierarkkinen hierarchical

puuta tree hierarkkinen hierarchical 4. Puut Seuraavaksi käsitellään yhtä tärkeimmistä tietojenkäsittelytieteen ei-lineaarisista käsitteistä, puuta (tree). Puut ovat olleet keksintönä todellinen läpimurto, koska niissä luotiin tehokas eilineaari

Lisätiedot

Tietorakenteet ja algoritmit Hakurakenteet Ari Korhonen

Tietorakenteet ja algoritmit Hakurakenteet Ari Korhonen Tietorakenteet ja algoritmit Hakurakenteet Ari Korhonen 27.10. & 3.11.2015 Tietorakenteet ja algoritmit - syksy 2015 1 8. HAKURAKENTEET (dictionaries) 8.1 Haku (vrt. sanakirjahaku) 8.2 Listat tallennusrakenteina

Lisätiedot

Algoritmit 1. Luento 13 Ti 23.2.2016. Timo Männikkö

Algoritmit 1. Luento 13 Ti 23.2.2016. Timo Männikkö Algoritmit 1 Luento 13 Ti 23.2.2016 Timo Männikkö Luento 13 Suunnittelumenetelmät Taulukointi Kapsäkkiongelma Ahne menetelmä Verkon lyhimmät polut Dijkstran menetelmä Verkon lyhin virittävä puu Kruskalin

Lisätiedot

1 Erilaisia tapoja järjestää

1 Erilaisia tapoja järjestää TIE-20100 Tietorakenteet ja algoritmit 1 1 Erilaisia tapoja järjestää Käsitellään seuraavaksi järjestämisalgoritmeja, jotka perustuvat muihin kuin vertailuun alkioiden oikean järjestyksen saamiseksi. Lisäksi

Lisätiedot

A274101 TIETORAKENTEET JA ALGORITMIT

A274101 TIETORAKENTEET JA ALGORITMIT A274101 TIETORAKENTEET JA ALGORITMIT PERUSTIETORAKENTEET LISTA, PINO, JONO, PAKKA ABSTRAKTI TIETOTYYPPI Tietotyyppi on abstrakti, kun se on määritelty (esim. matemaattisesti) ottamatta kantaa varsinaiseen

Lisätiedot

Tietotyypit ja operaattorit

Tietotyypit ja operaattorit Tietotyypit ja operaattorit Luennossa tarkastellaan yksinkertaisten tietotyyppien int, double ja char muunnoksia tyypistä toiseen sekä esitellään uusia operaatioita. Numeeriset tietotyypit ja muunnos Merkkitieto

Lisätiedot

Ohjelmoinnin peruskurssi Y1

Ohjelmoinnin peruskurssi Y1 Ohjelmoinnin peruskurssi Y1 CSE-A1111 30.9.2015 CSE-A1111 Ohjelmoinnin peruskurssi Y1 30.9.2015 1 / 27 Mahdollisuus antaa luentopalautetta Goblinissa vasemmassa reunassa olevassa valikossa on valinta Luentopalaute.

Lisätiedot

811312A Tietorakenteet ja algoritmit 2015-2016. V Verkkojen algoritmeja Osa 2 : Kruskalin ja Dijkstran algoritmit

811312A Tietorakenteet ja algoritmit 2015-2016. V Verkkojen algoritmeja Osa 2 : Kruskalin ja Dijkstran algoritmit 811312A Tietorakenteet ja algoritmit 2015-2016 V Verkkojen algoritmeja Osa 2 : Kruskalin ja Dijkstran algoritmit Sisältö 1. Johdanto 2. Leveyshaku 3. Syvyyshaku 4. Kruskalin algoritmi 5. Dijkstran algoritmi

Lisätiedot

Ohjelmoinnin perusteet Y Python

Ohjelmoinnin perusteet Y Python Ohjelmoinnin perusteet Y Python T-106.1208 25.2.2009 T-106.1208 Ohjelmoinnin perusteet Y 25.2.2009 1 / 34 Syötteessä useita lukuja samalla rivillä Seuraavassa esimerkissä käyttäjä antaa useita lukuja samalla

Lisätiedot

1.1 Tavallinen binäärihakupuu

1.1 Tavallinen binäärihakupuu TIE-20100 Tietorakenteet ja algoritmit 1 1 Puurakenteet http://imgur.com/l77fy5x Tässä luvussa käsitellään erilaisia yleisiä puurakenteita. ensin käsitellään tavallinen binäärihakupuu sitten tutustutaan

Lisätiedot

1 Puu, Keko ja Prioriteettijono

1 Puu, Keko ja Prioriteettijono TIE-20100 Tietorakenteet ja algoritmit 1 1 Puu, Keko ja Prioriteettijono Tässä luvussa käsitellään algoritmien suunnitteluperiaatetta muunna ja hallitse (transform and conquer) Lisäksi esitellään binääripuun

Lisätiedot

SQL-perusteet, SELECT-, INSERT-, CREATE-lauseet

SQL-perusteet, SELECT-, INSERT-, CREATE-lauseet SQL-perusteet, SELECT-, INSERT-, CREATE-lauseet A271117, Tietokannat Teemu Saarelainen teemu.saarelainen@kyamk.fi Lähteet: Leon Atkinson: core MySQL Ari Hovi: SQL-opas TTY:n tietokantojen perusteet-kurssin

Lisätiedot

Luku 7. Verkkoalgoritmit. 7.1 Määritelmiä

Luku 7. Verkkoalgoritmit. 7.1 Määritelmiä Luku 7 Verkkoalgoritmit Verkot soveltuvat monenlaisten ohjelmointiongelmien mallintamiseen. Tyypillinen esimerkki verkosta on tieverkosto, jonka rakenne muistuttaa luonnostaan verkkoa. Joskus taas verkko

Lisätiedot

Luku 6. Dynaaminen ohjelmointi. 6.1 Funktion muisti

Luku 6. Dynaaminen ohjelmointi. 6.1 Funktion muisti Luku 6 Dynaaminen ohjelmointi Dynaamisessa ohjelmoinnissa on ideana jakaa ongelman ratkaisu pienempiin osaongelmiin, jotka voidaan ratkaista toisistaan riippumattomasti. Jokaisen osaongelman ratkaisu tallennetaan

Lisätiedot

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

Graafit ja verkot. Joukko solmuja ja joukko järjestämättömiä solmupareja. eli haaroja. Joukko solmuja ja joukko järjestettyjä solmupareja eli kaaria Graafit ja verkot Suuntamaton graafi: eli haaroja Joukko solmuja ja joukko järjestämättömiä solmupareja Suunnattu graafi: Joukko solmuja ja joukko järjestettyjä solmupareja eli kaaria Haaran päätesolmut:

Lisätiedot

etunimi, sukunimi ja opiskelijanumero ja näillä

etunimi, sukunimi ja opiskelijanumero ja näillä Sisällys 1. Algoritmi Algoritmin määritelmä. Aiheen pariin johdatteleva esimerkki. ja operaatiot (sijoitus, aritmetiikka ja vertailu). Algoritmista ohjelmaksi. 1.1 1.2 Algoritmin määritelmä Ohjelmointi

Lisätiedot

Ohjelmoinnin perusteet Y Python

Ohjelmoinnin perusteet Y Python Ohjelmoinnin perusteet Y Python T-106.1208 15.3.2010 T-106.1208 Ohjelmoinnin perusteet Y 15.3.2010 1 / 56 Tiedostoista: tietojen tallentaminen ohjelman suorituskertojen välillä Monissa sovelluksissa ohjelman

Lisätiedot

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

1. (a) Seuraava algoritmi tutkii, onko jokin luku taulukossa monta kertaa: Tietorakenteet, laskuharjoitus 10, ratkaisuja 1. (a) Seuraava algoritmi tutkii, onko jokin luku taulukossa monta kertaa: SamaLuku(T ) 2 for i = 1 to T.length 1 3 if T [i] == T [i + 1] 4 return True 5 return

Lisätiedot

Informaatioteknologian laitos Olio-ohjelmoinnin perusteet / Salo 15.2.2006

Informaatioteknologian laitos Olio-ohjelmoinnin perusteet / Salo 15.2.2006 TURUN YLIOPISTO DEMO III Informaatioteknologian laitos tehtävät Olio-ohjelmoinnin perusteet / Salo 15.2.2006 1. Tässä tehtävässä tarkastellaan erääntyviä laskuja. Lasku muodostaa oman luokkansa. Laskussa

Lisätiedot

815338A Ohjelmointikielten periaatteet 2015-2016. Harjoitus 5 Vastaukset

815338A Ohjelmointikielten periaatteet 2015-2016. Harjoitus 5 Vastaukset 815338A Ohjelmointikielten periaatteet 2015-2016. Harjoitus 5 Vastaukset Harjoituksen aiheena ovat aliohjelmat ja abstraktit tietotyypit sekä olio-ohjelmointi. Tehtävät tehdään C-, C++- ja Java-kielillä.

Lisätiedot

Kääreluokat (oppikirjan luku 9.4) (Wrapper-classes)

Kääreluokat (oppikirjan luku 9.4) (Wrapper-classes) Kääreluokat (oppikirjan luku 9.4) (Wrapper-classes) Kääreluokista Javan alkeistietotyypit ja vastaavat kääreluokat Autoboxing Integer-luokka Double-luokka Kääreluokista Alkeistietotyyppiset muuttujat (esimerkiksi

Lisätiedot

Oliosuunnitteluesimerkki: Yrityksen palkanlaskentajärjestelmä

Oliosuunnitteluesimerkki: Yrityksen palkanlaskentajärjestelmä Oliosuunnitteluesimerkki: Yrityksen palkanlaskentajärjestelmä Matti Luukkainen 10.12.2009 Tässä esitetty esimerkki on mukaelma ja lyhennelmä Robert Martinin kirjasta Agile and Iterative Development löytyvästä

Lisätiedot

C-ohjelma. C-ohjelma. C-ohjelma. C-ohjelma. C-ohjelma. C-ohjelma. Operaatioiden suoritusjärjestys

C-ohjelma. C-ohjelma. C-ohjelma. C-ohjelma. C-ohjelma. C-ohjelma. Operaatioiden suoritusjärjestys Loogisia operaatioita - esimerkkejä Tänään on lämmin päivä ja perjantai Eilen satoi ja oli keskiviikko tai tänään on tiistai. On perjantai ja kello on yli 13 Ei ole tiistai tai ei sada. Ei pidä paikkaansa,

Lisätiedot

Tietueet. Tietueiden määrittely

Tietueet. Tietueiden määrittely Tietueet Tietueiden määrittely Tietue on tietorakenne, joka kokoaa yhteen eri tyyppistä tietoa yhdeksi asiakokonaisuudeksi. Tähän kokonaisuuteen voidaan viitata yhteisellä nimellä. Auttaa ohjelmoijaa järjestelemään

Lisätiedot

3. Binääripuu, Java-toteutus

3. Binääripuu, Java-toteutus 3. Binääripuu, Java-toteutus /*-------------------------------------------------------------/ / Rajapinta SearchTree: binäärisen hakupuun käsittelyrajapinta / / Metodit: / / void insert( Comparable x );

Lisätiedot

811312A Tietorakenteet ja algoritmit 2015-2016. I Johdanto

811312A Tietorakenteet ja algoritmit 2015-2016. I Johdanto 811312A Tietorakenteet ja algoritmit 2015-2016 I Johdanto Sisältö 1. Algoritmeista ja tietorakenteista 2. Algoritmien analyysistä 811312A TRA, Johdanto 2 I.1. Algoritmeista ja tietorakenteista I.1.1. Algoritmien

Lisätiedot

Listarakenne (ArrayList-luokka)

Listarakenne (ArrayList-luokka) Listarakenne (ArrayList-luokka) Mikä on lista? Listan määrittely ArrayList-luokan metodeita Listan läpikäynti Listan läpikäynti indeksin avulla Listan läpikäynti iteraattorin avulla Listaan lisääminen

Lisätiedot

Opintojakso TT00AA11 Ohjelmoinnin jatko (Java): 3 op. Tietorakenneluokkia 2: HashMap, TreeMap

Opintojakso TT00AA11 Ohjelmoinnin jatko (Java): 3 op. Tietorakenneluokkia 2: HashMap, TreeMap Opintojakso TT00AA11 Ohjelmoinnin jatko (Java): 3 op Tietorakenneluokkia 2: HashMap, TreeMap Tietorakenneluokkia ja -rajapintoja Java tarjoaa laajan kokoelman tietorakennerajapintoja ja - luokkia. Aiemmin

Lisätiedot

Ohjelmoinnin perusteet Y Python

Ohjelmoinnin perusteet Y Python Ohjelmoinnin perusteet Y Python T-106.1208 16.2.2010 T-106.1208 Ohjelmoinnin perusteet Y 16.2.2010 1 / 41 Kännykkäpalautetteen antajia kaivataan edelleen! Ilmoittaudu mukaan lähettämällä ilmainen tekstiviesti

Lisätiedot

Tutkimusmenetelmät-kurssi, s-2004

Tutkimusmenetelmät-kurssi, s-2004 Algoritmitutkimuksen menetelmistä Tutkimusmenetelmät-kurssi, s-2004 Pekka Kilpeläinen Kuopion yliopisto Tietojenkäsittelytieteen laitos Algoritmitutkimuksen menetelmistä p.1/20 Sisällys Tänään Tietojenkäsittelytiede

Lisätiedot

Neljän alkion kunta, solitaire-peli ja

Neljän alkion kunta, solitaire-peli ja Neljän alkion kunta, solitaire-peli ja taikaneliöt Kalle Ranto ja Petri Rosendahl Matematiikan laitos, Turun yliopisto Nykyisissä tietoliikennesovelluksissa käytetään paljon tekniikoita, jotka perustuvat

Lisätiedot

Harjoitustyö: virtuaalikone

Harjoitustyö: virtuaalikone Harjoitustyö: virtuaalikone Toteuta alla kuvattu virtuaalikone yksinkertaiselle olio-orientoituneelle skriptauskielelle. Paketissa on testaamista varten mukana kaksi lyhyttä ohjelmaa. Ohjeita Noudata ohjelman

Lisätiedot

Algoritmit 1. Luento 14 Ke 25.2.2015. Timo Männikkö

Algoritmit 1. Luento 14 Ke 25.2.2015. Timo Männikkö Algoritmit 1 Luento 14 Ke 25.2.2015 Timo Männikkö Luento 14 Heuristiset menetelmät Heuristiikkoja kapsäkkiongelmalle Kauppamatkustajan ongelma Lähimmän naapurin menetelmä Kertaus ja tenttivinkit Algoritmit

Lisätiedot

Matematiikan mestariluokka, syksy 2009 7

Matematiikan mestariluokka, syksy 2009 7 Matematiikan mestariluokka, syksy 2009 7 2 Alkuluvuista 2.1 Alkuluvut Määritelmä 2.1 Positiivinen luku a 2 on alkuluku, jos sen ainoat positiiviset tekijät ovat 1 ja a. Jos a 2 ei ole alkuluku, se on yhdistetty

Lisätiedot

Pienin virittävä puu (minimum spanning tree)

Pienin virittävä puu (minimum spanning tree) Pienin virittävä puu (minimum spanning tree) Jatkossa puu tarkoittaa vapaata puuta (ks. s. 11) eli suuntaamatonta verkkoa, joka on yhtenäinen: minkä tahansa kahden solmun välillä on polku syklitön: minkä

Lisätiedot

Luento 2: Tiedostot ja tiedon varastointi

Luento 2: Tiedostot ja tiedon varastointi HELIA 1 (19) Luento 2: Tiedostot ja tiedon varastointi Muistit... 2 Päämuisti (Primary storage)... 2 Apumuisti (Secondary storage)... 2 Tiedon tallennuksen yksiköitä... 3 Looginen taso... 3 Fyysinen taso...

Lisätiedot

Solmu 3/2001 Solmu 3/2001. Kevään 2001 ylioppilaskirjoitusten pitkän matematiikan kokeessa oli seuraava tehtävä:

Solmu 3/2001 Solmu 3/2001. Kevään 2001 ylioppilaskirjoitusten pitkän matematiikan kokeessa oli seuraava tehtävä: Frégier n lause Simo K. Kivelä Kevään 2001 ylioppilaskirjoitusten pitkän matematiikan kokeessa oli seuraava tehtävä: Suorakulmaisen kolmion kaikki kärjet sijaitsevat paraabelilla y = x 2 ; suoran kulman

Lisätiedot

Ohjelmoinnin peruskurssien laaja oppimäärä

Ohjelmoinnin peruskurssien laaja oppimäärä Ohjelmoinnin peruskurssien laaja oppimäärä Luento 3: SICP kohdat 2.22.3, 33.1 ja 3.33.3.2 Riku Saikkonen 8. 11. 2010 Sisältö 1 Lisää listoista 2 Symbolit ja sulkulausekkeet 3 Derivoijaesimerkki 4 Muuttujan

Lisätiedot

TIEA241 Automaatit ja kieliopit, syksy 2015. Antti-Juhani Kaijanaho. 3. joulukuuta 2015

TIEA241 Automaatit ja kieliopit, syksy 2015. Antti-Juhani Kaijanaho. 3. joulukuuta 2015 TIEA241 Automaatit ja, syksy 2015 Antti-Juhani Kaijanaho TIETOTEKNIIKAN LAITOS 3. joulukuuta 2015 Sisällys Formaalisti Määritelmä Nelikko G = (V, Σ, P, S) on kontekstiton kielioppi (engl. context-free

Lisätiedot

Esimerkkejä polynomisista ja ei-polynomisista ongelmista

Esimerkkejä polynomisista ja ei-polynomisista ongelmista Esimerkkejä polynomisista ja ei-polynomisista ongelmista Ennen yleisempiä teoriatarkasteluja katsotaan joitain tyypillisiä esimerkkejä ongelmista ja niiden vaativuudesta kaikki nämä ongelmat ratkeavia

Lisätiedot

Tarvitaanko adaptoituvia tietorakenteita

Tarvitaanko adaptoituvia tietorakenteita Heikki Heikkinen Tarvitaanko adaptoituvia tietorakenteita Tietotekniikan (ohjelmistotekniikka) pro gradu -tutkielma 30. marraskuuta 2011 Jyväskylän yliopisto Tietotekniikan laitos Jyväskylä Tekijä: Heikki

Lisätiedot

Ohjelmoinnin perusteet Y Python

Ohjelmoinnin perusteet Y Python Ohjelmoinnin perusteet Y Python T-106.1208 1.4.2009 T-106.1208 Ohjelmoinnin perusteet Y 1.4.2009 1 / 56 Tentti Ensimmäinen tenttimahdollisuus on pe 8.5. klo 13:00 17:00 päärakennuksessa. Tämän jälkeen

Lisätiedot

Harjoitus 6: Simulink - Säätöteoria. Syksy 2006. Mat-2.2107 Sovelletun matematiikan tietokonetyöt 1

Harjoitus 6: Simulink - Säätöteoria. Syksy 2006. Mat-2.2107 Sovelletun matematiikan tietokonetyöt 1 Harjoitus 6: Simulink - Säätöteoria Mat-2.2107 Sovelletun matematiikan tietokonetyöt Syksy 2006 Mat-2.2107 Sovelletun matematiikan tietokonetyöt 1 Harjoituksen aiheita Tutustuminen säätötekniikkaan Takaisinkytkennän

Lisätiedot

Taulukot. Taulukon määrittely ja käyttö. Taulukko metodin parametrina. Taulukon sisällön kopiointi toiseen taulukkoon. Taulukon lajittelu

Taulukot. Taulukon määrittely ja käyttö. Taulukko metodin parametrina. Taulukon sisällön kopiointi toiseen taulukkoon. Taulukon lajittelu Taulukot Taulukon määrittely ja käyttö Taulukko metodin parametrina Taulukon sisällön kopiointi toiseen taulukkoon Taulukon lajittelu esimerkki 2-ulottoisesta taulukosta 1 Mikä on taulukko? Taulukko on

Lisätiedot

Luku 3. Listankäsittelyä. 3.1 Listat

Luku 3. Listankäsittelyä. 3.1 Listat Luku 3 Listankäsittelyä Funktio-ohjelmoinnin tärkein yksittäinen tietorakenne on lista. Listankäsittely on paitsi käytännöllisesti oleellinen aihe, se myös valaisee funktio-ohjelmoinnin ideaa. 3.1 Listat

Lisätiedot

Tietokannan indeksointi: B puun ja hajautusindeksin tehokkuus

Tietokannan indeksointi: B puun ja hajautusindeksin tehokkuus Tietokannan indeksointi: B puun ja hajautusindeksin tehokkuus Tuomas Kortelainen 28.4.2008 Joensuun yliopisto Tietojenkäsittelytiede Pro gradu tutkielma Tiivistelmä Tässä tutkielmassa esitellään tietokannan

Lisätiedot

Esimerkkiprojekti. Mallivastauksen löydät Wroxin www-sivuilta. Kenttä Tyyppi Max.pituus Rajoitukset/Kommentit

Esimerkkiprojekti. Mallivastauksen löydät Wroxin www-sivuilta. Kenttä Tyyppi Max.pituus Rajoitukset/Kommentit Liite E - Esimerkkiprojekti E Esimerkkiprojekti Olet lukenut koko kirjan. Olet sulattanut kaiken tekstin, Nyt on aika soveltaa oppimiasi uusia asioita pienen, mutta täydellisesti muotoiltuun, projektiin.

Lisätiedot

Muita rekisteriallokaatiomenetelmiä

Muita rekisteriallokaatiomenetelmiä TIE448 Kääntäjätekniikka, syksy 2009 Antti-Juhani Kaijanaho TIETOTEKNIIKAN LAITOS 23. marraskuuta 2009 Sisällys Sisällys Seuraava deadline Vaihe E tiistai 1.12. klo 10 koodigenerointi (ilman rekisteriallokaatiota)

Lisätiedot

Ohjelmoinnin perusteet Y Python

Ohjelmoinnin perusteet Y Python Ohjelmoinnin perusteet Y Python T-106.1208 11.2.2009 T-106.1208 Ohjelmoinnin perusteet Y 11.2.2009 1 / 33 Kertausta: listat Tyhjä uusi lista luodaan kirjoittamalla esimerkiksi lampotilat = [] (jolloin

Lisätiedot

v 8 v 9 v 5 C v 3 v 4

v 8 v 9 v 5 C v 3 v 4 Verkot Verkko on (äärellinen) matemaattinen malli, joka koostuu pisteistä ja pisteitä toisiinsa yhdistävistä viivoista. Jokainen viiva yhdistää kaksi pistettä, jotka ovat viivan päätepisteitä. Esimerkiksi

Lisätiedot

Stabilointi. arvosana. arvostelija. Marja Hassinen

Stabilointi. arvosana. arvostelija. Marja Hassinen hyväksymispäivä arvosana arvostelija Stabilointi Marja Hassinen Helsinki 28.10.2007 Hajautetut algoritmit -seminaari HELSINGIN YLIOPISTO Tietojenkäsittelytieteen laitos Sisältö 1 1 Johdanto 1 2 Resynkroninen

Lisätiedot

finnish BOI 2015, päivä 1. Muistiraja: 256 MB. 30.04.2015

finnish BOI 2015, päivä 1. Muistiraja: 256 MB. 30.04.2015 Tehtävä: BOW Keilaus finnish BOI 0, päivä. Muistiraja: 6 MB. 30.04.0 Jarkka pitää sekä keilauksesta että tilastotieteestä. Hän on merkinnyt muistiin muutaman viimeisimmän keilapelin tulokset. Valitettavasti

Lisätiedot

Ehto- ja toistolauseet

Ehto- ja toistolauseet Ehto- ja toistolauseet 1 Ehto- ja toistolauseet Uutena asiana opetellaan ohjelmointilauseet / rakenteet, jotka mahdollistavat: Päätösten tekemisen ohjelman suorituksen aikana (esim. kyllä/ei) Samoja lauseiden

Lisätiedot

FUNKTIONAALIANALYYSIN PERUSKURSSI 1. 0. Johdanto

FUNKTIONAALIANALYYSIN PERUSKURSSI 1. 0. Johdanto FUNKTIONAALIANALYYSIN PERUSKURSSI 1. Johdanto Funktionaalianalyysissa tutkitaan muun muassa ääretönulotteisten vektoriavaruuksien, ja erityisesti täydellisten normiavaruuksien eli Banach avaruuksien ominaisuuksia.

Lisätiedot

Algoritmit 1. Luento 10 Ke 11.2.2015. Timo Männikkö

Algoritmit 1. Luento 10 Ke 11.2.2015. Timo Männikkö Algoritmit 1 Luento 10 Ke 11.2.2015 Timo Männikkö Luento 10 Algoritminen ongelman ratkaisu Suunnittelumenetelmät Raaka voima Järjestäminen eli lajittelu Kuplalajittelu Väliinsijoituslajittelu Valintalajittelu

Lisätiedot

Luku 1. Ohjelmointitekniikka. 1.1 Kielen valinta

Luku 1. Ohjelmointitekniikka. 1.1 Kielen valinta Osa I Perusasiat 1 Luku 1 Ohjelmointitekniikka Kisakoodaus eroaa monella tavalla perinteisestä ohjelmoinnista. Koodit ovat lyhyitä, syötteet ja tulosteet on määritelty tarkasti, eikä koodeja tarvitse

Lisätiedot

Muuttujatyypit ovat Boolean, Byte, Integer, Long, Double, Currency, Date, Object, String, Variant (oletus)

Muuttujatyypit ovat Boolean, Byte, Integer, Long, Double, Currency, Date, Object, String, Variant (oletus) VISUAL BASIC OHJEITA Kutsuttava ohjelma alkaa kometoparilla Sub... End Sub Sub ohjelmanimi()...koodia... End Sub Muuttujat Muuttujan esittely Muuttujatyypit ovat Boolean, Byte, Integer, Long, Double, Currency,

Lisätiedot

9. Graafit. 9.1. Graafin abstrakti tietotyyppi

9. Graafit. 9.1. Graafin abstrakti tietotyyppi 9. Graafit Graafeilla eli verkoilla esitetään yhteystietoja. Esimerkkejä niistä ovat kaupunkikartan kadut ja tietoverkon tietokoneet. Tämä luku tarkastelee verkkojen perusasioita. 9.1. Graafin abstrakti

Lisätiedot

XXIII Keski-Suomen lukiolaisten matematiikkakilpailu 23.1.2014, tehtävien ratkaisut

XXIII Keski-Suomen lukiolaisten matematiikkakilpailu 23.1.2014, tehtävien ratkaisut XXIII Keski-Suomen lukiolaisten matematiikkakilpailu 23.1.2014, tehtävien ratkaisut 1. Avaruusalus sijaitsee tason origossa (0, 0) ja liikkuu siitä vakionopeudella johonkin suuntaan, joka ei muutu. Tykki

Lisätiedot

Sukupuu -ohjelma. Ossi Väre (013759021) Joni Virtanen (013760641)

Sukupuu -ohjelma. Ossi Väre (013759021) Joni Virtanen (013760641) Sukupuu -ohjelma Ossi Väre (013759021) Joni Virtanen (013760641) 7.11.2011 1 Johdanto Toteutimme C -kielellä sukupuuohjelman, johon käyttäjä voi lisätä ja poistaa henkilöitä ja määrittää henkilöiden välisiä

Lisätiedot

Ohjelmoinnin jatkokurssi, kurssikoe 28.4.2014

Ohjelmoinnin jatkokurssi, kurssikoe 28.4.2014 Ohjelmoinnin jatkokurssi, kurssikoe 28.4.2014 Kirjoita jokaiseen palauttamaasi konseptiin kurssin nimi, kokeen päivämäärä, oma nimi ja opiskelijanumero. Vastaa kaikkiin tehtäviin omille konsepteilleen.

Lisätiedot

a b c d + + + + + + + + +

a b c d + + + + + + + + + 28. 10. 2010!"$#&%(')'+*(#-,.*/1032/465$*784 /(9:*;9."$ *;5> *@9 a b c d 1. + + + 2. 3. 4. 5. 6. + + + + + + + + + + P1. Valitaan kannaksi sivu, jonka pituus on 4. Koska toinen jäljelle jäävistä sivuista

Lisätiedot

LUKUTEORIA A. Harjoitustehtäviä, kevät 2013. (c) Osoita, että jos. niin. a c ja b c ja a b, niin. niin. (e) Osoita, että

LUKUTEORIA A. Harjoitustehtäviä, kevät 2013. (c) Osoita, että jos. niin. a c ja b c ja a b, niin. niin. (e) Osoita, että LUKUTEORIA A Harjoitustehtäviä, kevät 2013 1. Olkoot a, b, c Z, p P ja k, n Z +. (a) Osoita, että jos niin Osoita, että jos niin (c) Osoita, että jos niin (d) Osoita, että (e) Osoita, että a bc ja a c,

Lisätiedot

11.4. Context-free kielet 1 / 17

11.4. Context-free kielet 1 / 17 11.4. Context-free kielet 1 / 17 Määritelmä Tyypin 2 kielioppi (lauseyhteysvapaa, context free): jos jokainenp :n sääntö on muotoa A w, missäa V \V T jaw V. Context-free kielet ja kieliopit ovat tärkeitä

Lisätiedot

k=1 b kx k K-kertoimisia polynomeja, P (X)+Q(X) = (a k + b k )X k n+m a i b j X k. i+j=k k=0

k=1 b kx k K-kertoimisia polynomeja, P (X)+Q(X) = (a k + b k )X k n+m a i b j X k. i+j=k k=0 1. Polynomit Tässä luvussa tarkastelemme polynomien muodostamia renkaita polynomien ollisuutta käsitteleviä perustuloksia. Teemme luvun alkuun kaksi sopimusta: Tässä luvussa X on muodollinen symboli, jota

Lisätiedot

Java-kielen perusteet

Java-kielen perusteet Java-kielen perusteet String-merkkijonoluokka 1 Ohjelmointikielten merkkijonot Merkkijonot ja niiden käsittely on välttämätöntä ohjelmoinnissa Valitettavasti ohjelmointikielten tekijät eivät tätä ole ottaneet

Lisätiedot

5.1 Semanttisten puiden muodostaminen

5.1 Semanttisten puiden muodostaminen Luku 5 SEMNTTISET PUUT 51 Semanttisten puiden muodostaminen Esimerkki 80 Tarkastellaan kysymystä, onko kaava = (( p 0 p 1 ) (p 1 p 2 )) toteutuva Tätä voidaan tutkia päättelemällä semanttisesti seuraavaan

Lisätiedot

Muuttujien roolit Kiintoarvo cin >> r;

Muuttujien roolit Kiintoarvo cin >> r; Muuttujien roolit Muuttujilla on ohjelmissa eräitä tyypillisiä käyttötapoja, joita kutsutaan muuttujien rooleiksi. Esimerkiksi muuttuja, jonka arvoa ei muuteta enää kertaakaan muuttujan alustamisen jälkeen,

Lisätiedot

Opintojakso TT00AA11 Ohjelmoinnin jatko (Java): 3 op Taulukot & Periytyminen

Opintojakso TT00AA11 Ohjelmoinnin jatko (Java): 3 op Taulukot & Periytyminen Opintojakso TT00AA11 Ohjelmoinnin jatko (Java): 3 op Taulukot & Periytyminen Taulukot: Array Taulukko Javassa pitää aina perustaa (new) Yksinkertaisessa tilanteessa taulukon koko tiedetään etukäteen ja

Lisätiedot

Olion elinikä. Olion luominen. Olion tuhoutuminen. Olion tuhoutuminen. Kissa rontti = null; rontti = new Kissa();

Olion elinikä. Olion luominen. Olion tuhoutuminen. Olion tuhoutuminen. Kissa rontti = null; rontti = new Kissa(); Sisällys 7. Oliot ja viitteet Olio Java-kielessä. Olion luominen, elinikä ja tuhoutuminen. Viitteiden käsittelyä: sijoitus, vertailu ja varautuminen null-arvoon. Viite metodin paluuarvona.. 7.1 7.2 Olio

Lisätiedot

Pyramidi 9 Trigonometriset funktiot ja lukujonot 15.4.2011 HK1-1. Dsin3 x. 3cos3x. Dsinx. u( x) sinx ja u ( x) cosx. Dsin. Dsin

Pyramidi 9 Trigonometriset funktiot ja lukujonot 15.4.2011 HK1-1. Dsin3 x. 3cos3x. Dsinx. u( x) sinx ja u ( x) cosx. Dsin. Dsin Pyramidi 9 Trigonometriset funktiot ja lukujonot 5.4.0 HK- a) Dsin3 us ( ) cos3 3 us( ) s( ) 3cos3 s( ) 3 ja s( ) 3 u( ) sin ja u( ) cos b) Dsin 3 3 Dsin us ( ) s( ) sin ja s( ) cos 3 u( ) ja u( ) 3 3sin

Lisätiedot

Nimittäin, koska s k x a r mod (p 1), saadaan Fermat n pienen lauseen avulla

Nimittäin, koska s k x a r mod (p 1), saadaan Fermat n pienen lauseen avulla 6. Digitaalinen allekirjoitus Digitaalinen allekirjoitus palvelee samaa tarkoitusta kuin perinteinen käsin kirjotettu allekirjoitus, t.s. Liisa allekirjoittaessaan Pentille lähettämän viestin, hän antaa

Lisätiedot

Reaaliluvut 1/7 Sisältö ESITIEDOT:

Reaaliluvut 1/7 Sisältö ESITIEDOT: Reaaliluvut 1/7 Sisältö Reaalilukujoukko Reaalilukujoukkoa voidaan luonnollisimmin ajatella lukusuorana, molemmissa suunnissa äärettömyyteen ulottuvana suorana, jonka pisteet ja reaaliluvut vastaavat toisiaan:

Lisätiedot

Metodit. Metodien määrittely. Metodin parametrit ja paluuarvo. Metodien suorittaminen eli kutsuminen. Metodien kuormittaminen

Metodit. Metodien määrittely. Metodin parametrit ja paluuarvo. Metodien suorittaminen eli kutsuminen. Metodien kuormittaminen Metodit Metodien määrittely Metodin parametrit ja paluuarvo Metodien suorittaminen eli kutsuminen Metodien kuormittaminen 1 Mikä on metodi? Metodi on luokan sisällä oleva yhteenkuuluvien toimintojen kokonaisuus

Lisätiedot

TIETORAKENTEET JA ALGORITMIT

TIETORAKENTEET JA ALGORITMIT TIETORAKENTEET JA ALGORITMIT Timo Harju 1999-2004 1 typedef link List; /* Vaihtoehtoisia nimiä */ typedef link Stack; /* nodepointterille */ typedef link Queue typedef struct node Node; /* itse nodelle

Lisätiedot

Ohjelmoinnin perusteet Y Python

Ohjelmoinnin perusteet Y Python Ohjelmoinnin perusteet Y Python T-106.1208 14.2.2011 T-106.1208 Ohjelmoinnin perusteet Y 14.2.2011 1 / 55 Kännykkäpalautetteen antajia kaivataan edelleen! Ilmoittaudu mukaan lähettämällä ilmainen tekstiviesti

Lisätiedot

Sisällys. 3. Pseudokoodi. Johdanto. Johdanto. Johdanto ja esimerkki. Pseudokoodi lauseina. Kommentointi ja sisentäminen.

Sisällys. 3. Pseudokoodi. Johdanto. Johdanto. Johdanto ja esimerkki. Pseudokoodi lauseina. Kommentointi ja sisentäminen. Sisällys 3. Pseudokoodi Johdanto ja esimerkki. Pseudokoodi lauseina. Kommentointi ja sisentäminen. Ohjausrakenteet: Valinta if- ja if--rakenteilla. oisto while-, do-while- ja for-rakenteilla. 3.1 3.2 Johdanto

Lisätiedot

Palmikkoryhmät kryptografiassa

Palmikkoryhmät kryptografiassa Palmikkoryhmät kryptografiassa Jarkko Peltomäki 27. marraskuuta 2010 Palmikkoryhmät ovat epäkommutatiivisia äärettömiä ryhmiä. Niillä on monimutkainen rakenne, mutta toisaalta niillä on geometrinen tulkinta

Lisätiedot

LUKU II HOMOLOGIA-ALGEBRAA. 1. Joukko-oppia

LUKU II HOMOLOGIA-ALGEBRAA. 1. Joukko-oppia LUKU II HOMOLOGIA-ALGEBRAA 1. Joukko-oppia Matematiikalle on tyypillistä erilaisten objektien tarkastelu. Tarkastelu kohdistuu objektien tai näiden muodostamien joukkojen välisiin suhteisiin, mutta objektien

Lisätiedot

Tutki ja kirjoita -kurssi, s-2005

Tutki ja kirjoita -kurssi, s-2005 Teoreettisen tutkimuksen raportoinnista Tutki ja kirjoita -kurssi, s-2005 Pekka Kilpeläinen Kuopion yliopisto Tietojenkäsittelytieteen laitos Teoreettisen tutkimuksen raportoinnista p.1/14 Sisältö Algoritmisten

Lisätiedot

5.2 Ensimmäisen asteen yhtälö

5.2 Ensimmäisen asteen yhtälö 5. Ensimmäisen asteen ytälö 5. Ensimmäisen asteen yhtälö Aloitetaan antamalla nimi yhtälön osille. Nyt annettavat nimet eivät riipu yhtälön tyypistä tai asteesta. Tarkastellaan seuraavaa yhtälöä. Emme

Lisätiedot

Koottu lause; { ja } -merkkien väliin kirjoitetut lauseet muodostavat lohkon, jonka sisällä lauseet suoritetaan peräkkäin.

Koottu lause; { ja } -merkkien väliin kirjoitetut lauseet muodostavat lohkon, jonka sisällä lauseet suoritetaan peräkkäin. 2. Ohjausrakenteet Ohjausrakenteiden avulla ohjataan ohjelman suoritusta. peräkkäisyys valinta toisto Koottu lause; { ja } -merkkien väliin kirjoitetut lauseet muodostavat lohkon, jonka sisällä lauseet

Lisätiedot

A* Reitinhaku Aloittelijoille

A* Reitinhaku Aloittelijoille A* Reitinhaku Aloittelijoille Alkuperäisen artikkelin kirjoittanut Patrick Lester, suomentanut Antti Veräjänkorva. Suom. huom. Tätä kääntäessäni olen pyrkinyt pitämään saman alkuperäisen tyylin ja kerronnan.

Lisätiedot

Kirjasto Relaatiotietokannat Kevät 2001. Auvinen Annemari Niemi Anu Passoja Jonna Pulli Jari Tersa Tiina

Kirjasto Relaatiotietokannat Kevät 2001. Auvinen Annemari Niemi Anu Passoja Jonna Pulli Jari Tersa Tiina Kirjasto Kevät 2001 Auvinen Annemari Niemi Anu Harjoitustyö 7.4.2001 Sisällysluettelo 1. Yleiskuvaus... 3 2. Vaatimukset... 3 2.1. Toiminnalliset... 3 2.1.1. Sisäänkirjautuminen... 3 2.1.2. Nimikkeiden

Lisätiedot

f(x, y) = x 2 y 2 f(0, t) = t 2 < 0 < t 2 = f(t, 0) kaikilla t 0.

f(x, y) = x 2 y 2 f(0, t) = t 2 < 0 < t 2 = f(t, 0) kaikilla t 0. Ääriarvon laatu Jatkuvasti derivoituvan funktion f lokaali ääriarvokohta (x 0, y 0 ) on aina kriittinen piste (ts. f x (x, y) = f y (x, y) = 0, kun x = x 0 ja y = y 0 ), mutta kriittinen piste ei ole aina

Lisätiedot

D B. Levykön rakenne. pyöriviä levyjä ura. lohko. Hakuvarsi. sektori. luku-/kirjoituspää

D B. Levykön rakenne. pyöriviä levyjä ura. lohko. Hakuvarsi. sektori. luku-/kirjoituspää Levyn rakenne Levykössä (disk drive) on useita samankeskisiä levyjä (disk) Levyissä on magneettinen pinta (disk surface) kummallakin puolella levyä Levyllä on osoitettavissa olevia uria (track), muutamasta

Lisätiedot

10.2. Säteenjäljitys ja radiositeettialgoritmi. Säteenjäljitys

10.2. Säteenjäljitys ja radiositeettialgoritmi. Säteenjäljitys 10.2. Säteenjäljitys ja radiositeettialgoritmi Säteenjäljitys Säteenjäljityksessä (T. Whitted 1980) valonsäteiden kulkema reitti etsitään käänteisessä järjestyksessä katsojan silmästä takaisin kuvaan valolähteeseen

Lisätiedot

Sisällys. 12. Näppäimistöltä lukeminen. Yleistä. Yleistä 12.1 12.2 12.3 12.4

Sisällys. 12. Näppäimistöltä lukeminen. Yleistä. Yleistä 12.1 12.2 12.3 12.4 Sisällys 12. Näppäimistöltä lukeminen Arvojen lukeminen näppäimistöltä yleisesti. Arvojen lukeminen näppäimistöltä Java-kielessä.. Luetun arvon tarkistaminen. Tietovirrat ja ohjausmerkit. Scanner-luokka.

Lisätiedot

MS-A0202 Differentiaali- ja integraalilaskenta 2 (SCI) Luento 4: Ketjusäännöt ja lineaarinen approksimointi

MS-A0202 Differentiaali- ja integraalilaskenta 2 (SCI) Luento 4: Ketjusäännöt ja lineaarinen approksimointi MS-A0202 Differentiaali- ja integraalilaskenta 2 (SCI) Luento 4: Ketjusäännöt ja lineaarinen approksimointi Antti Rasila Aalto-yliopisto Syksy 2015 Antti Rasila (Aalto-yliopisto) MS-A0202 Syksy 2015 1

Lisätiedot