CS-A1140 Tietorakenteet ja algoritmit
|
|
- Tuomo Manninen
- 8 vuotta sitten
- Katselukertoja:
Transkriptio
1 CS-A1140 Tietorakenteet ja algoritmit Kierros 5: Hajautus Tommi Junttila Aalto-yliopisto Perustieteiden korkeakoulu Tietotekniikan laitos Syksy 016
2 Materiaali kirjassa Introduction to Algorithms, 3rd ed. (online via Aalto lib): Kappaleet Vastaavaa materiaalia muualla: Linkkejä: kappale 3.4 kirjassa Algorithms, 4th ed. ja nämä kalvot (neliöinen kokeilu ei kirjassa) Kappale hashing OpenDSA-kirjassa MIT OCW video on hashing with chaining MIT OCW video on open addressing and cryptographic hashing /49
3 Monessa sovelluksessa joukoille ja kuvauksille riittää rajapinnan INSERT, SEARCH ja DELETE tehokas toteuttaminen Hajautuksen avulla yllä mainitut saadaan toimimaan keskimäärin vakioajassa pahimman tapauksen aikavaatimus on Θ(n) mutta hyvällä suunnittelulla erittäin epätodennäköistä pienimmän ja suurimman avaimen löytäminen jne ovat kuitenkin lineaariaikaisia operaatioita Toteutuksia: C++11-standardikirjastossa unordered set ja unordered map Javassa HashSet ja HashMap Scalassa HashSet ja HashMap... 3/49
4 Johdattelu: pienet avainjoukot ja suorahakutaulukot Oletetaan, että mahdollisten avainten joukko on pieni Esimerkiksi ISO alpha--standardissa maakoodit muodostetaan kahdesta aakkoston {A, B,..., Z} 6 kirjaimesta ja mahdollisia koodeja on siis 6 6 = 676, joista 49, kuten FI ja UK, ovat käytössä Voidaan helposti toteuttaa kuvaus koodeilta olioille (esim. pääkaupunkien nimille) tekemällä suorahakutaulukko, jossa on 676 alkiota Koodiin c 1 c assosioitu arvo v talletetaan taulukon alkioon kohdassa index(c 1 c ) = f (c 1 ) 6 + f (c ), missä f (A) = 0,f (B) = 1,...,f (Z) = 5 INSERT, SEARCH ja DELETE on nyt helppoa toteuttaa toimimaan vakioajassa 4/49
5 Esimerkki: Maakoodien indeksointi suorahakutaulukkossa arr: arr 0 AA 1 AB AC DE FI UK US ZZ /49
6 Maakoodikuvausten toteuttaminen Scala-kielellä: import scala. r e f l e c t. ClassTag class CountryMap [ B >: N u l l ] ( ) ( i m p l i c i t tag : ClassTag [ B ] ) { private val a r r = new Array [ B] ( ) private def f ( c : Char ) = c. t o I n t A. t o I n t private def isvalidcode ( code : S t r i n g ) = code. length == && 0 <= f ( code ( 0 ) ) && f ( code ( 0 ) ) < 6 && 0 <= f ( code ( 1 ) ) && f ( code ( 1 ) ) < 6 def index ( code : S t r i n g ) : I n t = { require ( isvalidcode ( code ) ) f ( code ( 0 ) ) * 6 + f ( code ( 1 ) ) } def apply ( code : S t r i n g ) : Option [ B ] = { val v = a r r ( index ( code ) ) i f ( v == null ) None else Some( v ) } def update ( code : String, value : B) = { r e q u i r e ( value!= null ) a r r ( index ( code ) ) = value } def delete ( code : S t r i n g ) = { a r r ( index ( code ) ) = null } } 6/49
7 Huom: null-arvon käyttöä tulee yleisesti ottaen välttää Scala-kielessä (käytetään Option-luokkaa) mutta anteeksiannettavissa tietorakenteiden sisäisissä toteutuksissa Luokan laajentaminen vakioajassa toimivalla size-metodilla on helppoa Esimerkki: Pääkaupunki nimien assosiointi maakoodeihin: val c a p i t a l = new CountryMap [ S t r i n g ] ( ) c a p i t a l ( "DE" ) = " B e r l i n " c a p i t a l ( " FI " ) = " H e l s i n k i " c a p i t a l ( "UK" ) = " London " c a p i t a l ( "US" ) = " Washington " p r i n t l n ( c a p i t a l ( " FI " ) ) tuottaa Some( H e l s i n k i ) AA AB AC DE FI UK arr... Berlin Helsinki London US 538. Washington ZZ /49
8 Hajautus ja hajautustaulukot Laajennetaan suorahakutaulukoiden ideaa suurille (tai jopa äärettömille) avainjoukoille U Kunakin ajanhetkenä vain osajoukko K U mahdollisista avaimista on käytössä Perusideana on varata m-alkioinen hajautustaulukko ja käyttää hajautusfunktiota h : U {0,1,...,m 1} kuvaamaan avaimet taulukon indekseille Ideaalitapauksessa jokainen käytössä oleva avain kuvautuisi eri indeksille... mutta yleisesti ottaen tämä on vaikeaa toteuttaa tehokkaasti ja täten tapahtuu yhteentörmäyksiä (engl. collision) kun kaksi avainta kuvautuu samalle indeksille Palataan hajautusfunktioiden suunnitteluun myöhemmin 8/49
9 Esimerkki: Oletetaan, että käytössä on hajautustaulukko, jossa on tilaa m = 13 alkiolle ja hajautusfunktio merkkijonoille, joka on toteutettu Scalalla (.11.8) seuraavasti: def h(s: String) = math.abs(s.hashcode) % 13 Monet merkkojonot kuvautuvat eri indekseille ja perusidea toimii ongelmitta Germany Finland United States Denmark United Kingdom Sweden arr Berlin Helsinki Washington Copenhagen London Stockholm Mutta jotkin merkkijonot kuvautuvat samoille indekseille ja tuloksena on yhteentörmäyksiä Germany Finland United States Denmark Austria United Kingdom Sweden arr Berlin Helsinki Washington London Stockholm 9/49
10 Kuinka todennäköisiä yhteentörmäykset ovat? Oletetaan hajautusfunktio h, jossa satunnaisella avaimella on sama todennäköisyys kuvautua mille tahansa indeksille {0, 1,..., m 1} toisistaan riippumatta (engl. simple uniform hashing assumption) Tällöin pitää lisätä mln ( 1 ) 1 p avainta, jotta tapahtuu todennäköisyydellä p vähintään yksi yhteentörmäys Esimerkiksi hajautustauluun, jonka koko on m = , tarvitsee lisätä vain 1178 satunnaista avainta jotta saadaan todennäköisyydellä 0.5 vähintään yksi yhteentörmäys Eli yhteentörmäykset ovat yleisiä Yllä olevan erikoistapaus on niin sanottu syntymäpäiväongelma (engl. birthday paradox): vuodessa on 365 päivää mutta jos samaan tilaan kokoontuu 3 satunnaisesti valittua henkilöä, niin todennäköisyys sille, että vähintään kahdella näistä on sama syntymäpäivä on vähintään 0.5 (olettaen, että syntymäpäivät ovat tasaisesti jakautuneet vuoden jokaiselle päivälle) 10/49
11 Yhteentörmäysten käsittely 11/49
12 Vääjäämättä tapahtuvien yhteentörmäysten käsittelyyn tarvitaan jokin strategia Seuraavassa tarkastellaan ketjutusta ja avointa osoittamista Tarvitaan yksi lisämäärittely: jos hajautustaulukkoon, jonka koko on m, on talletettu n avainta, niin taukon täyttösuhde (engl. load factor) on α = n/m 1/49
13 Ketjutus Myös avoin hajautus ; (engl. chaining, open hashing) Perusidea: hajautustaulukon jokaisesta indeksistä alkaa linkitetty lista, johon siihen indeksiin kuvautuvat avaimet (avain/arvo-parit) tallennetaan Indeksin h(k) laskemisen jälkeen jatko on kuten muuttuvatilaisilla linkitetyillä listoilla: SEARCH: etsitään avainta k listasta alkio kerrallaan INSERT: etsitään avainta listasta ja jos sitä ei löydy, lisätään se listan alkuun/loppuun lisäämäällä uusi lista-alkio DELETE: käydään listaa läpi ja poistetaan listan alkio, mikäli se sisältää poistettavan avaimen k 13/49
14 Esimerkki: Yhteentörmäysten käsittely ketjutuksella Listojen alkiot ovat muotoa key value next entry, missä key on avain (tai viittaus siihen) value on avaimeen liitetty arvo (tai viittaus siihen) ja next entry on viittaus listan seuraavaan alkioon (null jos viimeinen) Germany Finland 0 1 arr Germany Berlin Finland Helsinki United States 3 4 United States Washington Denmark Austria 8 9 Denmark Copenhagen Austria Vienna United Kingdom 10 United Kingdom London Sweden 11 1 Sweden Stockholm 14/49
15 Esimerkki: Joukkojen toteutus hajautuksella ja ketjutuksella Jos ei olla kiinnostuttu kuvauksista vaan joukoista, jätetään vain kenttä value pois ja listan alkiot ovat muotoa key next entry. Lisätään luvut 131, 9833, 344, 6, 17, 434, 653 ja -13 alunperin tyhjään hajautustaulukkoon käyttäen hajautusfunktiota h(k) = k mod m: 0 1 arr /49
16 unordered sets C++11-standardikirjastossa GNU ISO C++ -kirjasto toteuttaa järjestämättömät joukot ketjutuksella Hajautusfunktiot ja avainten yhtäsuuruus toteutettu valmiiksi perustyypeille # include <iostream > # include <unordered_set > i n t main ( ) { / / A set of small prime numbers std : : unordered_set < i n t > myset = {3,5,7,11,13,17,19,3,9}; myset. erase ( 1 3 ) ; / / erasing by key myset. erase ( myset. begin ( ) ) ; / / erasing by i t e r a t o r std : : cout << " myset contains : " ; f o r ( const i n t & x : myset ) std : : cout << " " << x ; std : : cout << std : : endl ; r e t u r n 0; } Eräs mahdollinen lopputulos (huomaa järjestämättömyys): myset contains : Vastaavasti unordered multisets, maps ja multimaps 16/49
17 Analyysiä Olkoon lisätty n satunaista avainta hajautustaulukkoon, jossa on m alkiota Oletetaan kuten aiemminkin, että hajautusfunktio jakaa avaimet tasaisesti ja toisistaan riippumattomasti eri indekseille Hajautustaulukon indeksistä i alkavassa listassa on nyt keskimäärin n m avainta Oletetaan, että arvon h(k) laskenta voidaan tehdä vakioajassa Avaimen etsimiseen listasta kuluu aikaa keskimäärin O(1 + n m ), eli O(1 + α), sekä silloin kun avain löytyy että kun sitä ei löydy Jos avainten määrä n on suoraan verrannollinen taulukon kokoon m, eli n cm jollekin vakiolle c, niin α c ja avaimen etsintä vie keskimäärin ajan O(1 + cm m ) = O(1) Jos/kun avainten lisääminen ja poistaminen etsivät ensin avainta listasta, myös niiden aikavaatimus on sama 17/49
18 Pahimman tapauksen aikavaatimus toteutuu kun kaikki avaimet (tai suuri osa) kuvautuvat samalle indeksille: hajautustaulu muuntuu käytännössä linkitetyksi listaksi ja avainten etsiminen jne vaatii lineaarisen ajan hyvien hajautusfunktioiden suunnittelu on tärkeää 18/49
19 Uuudelleenhajautus Kuinka suuri taulukko pitäisi varata alussa kun ei välttämättä tiedetä, kuinka monta avainta siihen tullaan tallentamaan myöhemmin? Tai mitä tehdään, kun taulukon täyttösuhde kasvaa liian suureksi? Vastaus on uudelleenhajautus: aloitetaan pienehköllä taulukolla ja kasvatetaan sen kokoa aina kun täyttösuhde kasvaa jotain tiettyä raja-arvoa suuremmaksi Kun taulukon kokoa kasvatetaan, kaikki vanhan taulukon avaimet (tai avain/arvo-parit) täytyy lisätä uuteen taulokkoon koska niiden indeksit suuremmassa taulukossa ovat luultavasti erilaiset kuin vanhassa Mikä on hyvä raja-arvo uudelleenhajautuksen käynnistämiseksi? Ei ole yhtä parasta vastausta; GNU ISO C++ -kirjaston versio 4.6 tekee oletuksena uudelleenhajautuksen kun täyttösuhde kasvaa yli arvon 1,0 ja kasvattaa tällöin taulukon koon kaksinkertaiseksi 19/49
20 Avoin osoittaminen Myös suljettu hajauttaminen (engl. open addressing, closed hashing) Toinen törmäyksien käsittelymenetelmä Idea: taulukko pidetään niin suurena, että kaikki lisätyt avaimet mahtuvat siihen Jokainen taulukon alkio sisältää yhden avaimen (tai avain/arvo-parin) tai on null tms jos se on vapaa Eli täyttösuhde on korkeintaan 1,0 avoimessa osoittamisessa Kun avainta lisättäessä tapahtuu törmäys, kokeillaan (engl. probe) jotain toista taulukon indeksiä kunnes vapaa paikka löytyy Samoin avainta etsittäessä kokeillaan indeksejä kunnes avain löytyy tai löytyy tyhjä alkio 0/49
21 Kokeilemista varten täytty määrittää, mitä indeksiä kokeillaan seuraavaksi Tätä varten määritellään hajautusfunktio muotoon h : U {0,1,...,m 1} {0,1,...m 1} missä toinen argumentti kertoo kokeilun järjestysnumeron Jokaiselle avaimelle k saadaan siten kokeilujono h(k,0),h(k,1),...,h(k,m 1) Jotta kokeiltaisiin jokaista indeksiä vuorollaan, tulee kokeilujonon olla joukon {0, 1,..., m 1} permutaatio jokaiselle avaimelle k 1/49
22 Lineaarinen kokeilu Yksinkertaisin tapa muodostaa kokeilujonoja Olkoon apuhajautusfunktio h : U {0,1,...,m 1} h on yleensä avaimen luokan tai käyttäjän määrittelemä alkuperäinen hajautusfunktio (esim. hashcode Scala-kielessä) Määritellään nyt hajautusfunktio Selvästikin kokeilujono h(k,i) = (h (k) + i) mod m h(k,0),h(k,1),...,h(k,m 1) on nyt joukon {0,1,...,m 1} permutaatio /49
23 Esimerkki: Törmäysten käsittely lineaarisella kokeilulla Taulukon alkiot ovat muotoa key value, missä jälleen key on avain (tai viittaus siihen) ja value on avaimeen liitetty arvo (tai viittaus siihen). Lisätään kuvaukset Finland Helsinki United States Washington United Kingdom London Denmark Copenhagen Austria Vienna Sweden Stockholm tässä järjestyksessä taulukkoon, jonka koko on 13, käyttämällä aiemmin esitettyä hajautusfunktiota ja lineaarista kokeilua Tulos on oikealla Lisättäessä kuvaus Austria Vienna huomataan indeksin 8 olevan jo varattu avaimelle Denmark. Kokeillaan seuraavaa, ja koska se oli vapaa, lisätään avain/arvo-pari siihen arr Germany Berlin Finland Helsinki United States Washington Denmark Copenhagen Austria Vienna United Kingdom London Sweden Stockholm 3/49
24 Esimerkki: Joukot hajautuksella ja lineaarisella kokeilulla Jos toteutetaan joukkoja, taulukon alkiot ovat vain avaimia (tai viittauksia niihin). Lisätään kokonaislukuavaimet 131, 9833, 344, 6, 17, 434, 653 ja -13 käyttämällä apuhajautusfunktiota h (k) = k: lisätään indeksiin h(131,0) = ( ) mod 13 = lisätään kohtaan h(9833,0) = ( ) mod 13 = lisätään kohtaan h(344,0) = ( ) mod 13 = lisätään kohtaan h(6,0) = (6 + 0) mod 13 = lisätään kohtaan h(17,0) = (17 + 0) mod 13 = 4 6. koska indeksi h(434,0) = ( ) mod 13 = 9 on varattu, kokeillaan indeksiä h(434,1) = ( ) mod 13 = 10 ja lisätään 434 siihen 7. koska indeksi h(653,0) = ( ) mod 13 = 3 kuten myös kaksi seuraavaa h(653, 1) = 4 ja h(653, ) = 5 ovat varattuja, lisätään 653 kohtaan h(653,3) = 6 8. koska h( 13, 0) = 0 on varattu, avain 13 lisätään kohtaan h( 13,1) = arr /49
25 Seuraavissa esimerkeissä tarkastellaan esityksen yksinkertaisuuden vuoksi vain kokonaislukujoukkoja yleistys muille avaintyypeille ja kuvauksille on suoraviivaista Lineaarinen kokeilu kärsii ilmiöstä nimeltä primäärinen kasautuminen (engl. primary clustering): vapaa indeksi, jonka edeltäjistä i on varattuja, tulee täytetyksi todennäköisyydellä (i + 1)/m eikä 1/m, ja täten varatut indeksit alkavat kasautumaan Esimerkki: Olkoon h (k) = k kokonaislukuavaimille ja m = 17. Lisätään avaimet 1, 50,, 0, 38 ja 35 tässä järjestyksessä lineaarisella kokeilulla ja saadaan missä nuolet visualisoivat avaimen 35 kokeilujonon. Huomaa, että vain avaimet 1, 50 ja 35 kuvautuvat samalle indeksille. 5/49
26 Neliöinen kokeilu Päästään eroon primäärisestä kasautumisesta käyttämällä monimutkaisempaa kokeilujonoa Määritellään h(k,i) = (h (k) + c 1 i + c i ) mod m missä c 1 ja c ovat positiivisia vakioita Jotta kokeilujonot olisivat joukon {0, 1,..., m 1} permutaatioita, tulee arvojen c 1, c ja m olla hyvin valittuja Esimerkki: Olkoon m = 11 (eli alkuluku) ja h(k,i) = (h (k) + i + i ) mod m Jos h (k) = 0, niin kokeilujono 0,,6,1,9,8,9,1,6,,0 ei ole joukon {0, 1,..., 10} permutaatio vaan kokeilee vain 6 indeksiä 11 mahdollisesta. Jos taulukon täyttösuhde on suurehko, tämä kokeilujono ei välttämättä löydä vapaita indeksejä. 6/49
27 Esimerkki: Olkoon m jokin kahden potenssi. Tässä tapauksessa voidaan todistaa, että hajautusfunktio h(k,i) = (h (k) + i(i + 1) ) mod m = (h (k) + 0.5i + 0.5i ) mod m tuottaa kokeilujonoja, jotka ovat joukon {0, 1,..., m} permutaatioita. Esimerkiksi jos m = 3 = 8 ja h (k) = 0, niin kokeilujono on 0,1,3,6,,7,5,4. Esimerkki: Olkoon h (k) = k kokonaislukuavaimille ja m = 16. Lisätään avaimet 1, 50,, 0, 38 ja 35 tässä järjestyksessä käyttämällä neliöistä kokeilua ja hajautusfunktiota h(k) = (h (k) + i(i+1) ) mod m. Nuolet kuvaavat jälleen kokeilujonoja /49
28 Esimerkki: Olkoon m jokin kahden potenssi. Tässä tapauksessa voidaan todistaa, että hajautusfunktio h(k,i) = (h (k) + i(i + 1) ) mod m = (h (k) + 0.5i + 0.5i ) mod m tuottaa kokeilujonoja, jotka ovat joukon {0, 1,..., m} permutaatioita. Esimerkiksi jos m = 3 = 8 ja h (k) = 0, niin kokeilujono on 0,1,3,6,,7,5,4. Esimerkki: Olkoon h (k) = k kokonaislukuavaimille ja m = 16. Lisätään avaimet 1, 50,, 0, 38 ja 35 tässä järjestyksessä käyttämällä neliöistä kokeilua ja hajautusfunktiota h(k) = (h (k) + i(i+1) ) mod m. Nuolet kuvaavat jälleen kokeilujonoja /49
29 Esimerkki: Olkoon m jokin kahden potenssi. Tässä tapauksessa voidaan todistaa, että hajautusfunktio h(k,i) = (h (k) + i(i + 1) ) mod m = (h (k) + 0.5i + 0.5i ) mod m tuottaa kokeilujonoja, jotka ovat joukon {0, 1,..., m} permutaatioita. Esimerkiksi jos m = 3 = 8 ja h (k) = 0, niin kokeilujono on 0,1,3,6,,7,5,4. Esimerkki: Olkoon h (k) = k kokonaislukuavaimille ja m = 16. Lisätään avaimet 1, 50,, 0, 38 ja 35 tässä järjestyksessä käyttämällä neliöistä kokeilua ja hajautusfunktiota h(k) = (h (k) + i(i+1) ) mod m. Nuolet kuvaavat jälleen kokeilujonoja /49
30 Esimerkki: Olkoon m jokin kahden potenssi. Tässä tapauksessa voidaan todistaa, että hajautusfunktio h(k,i) = (h (k) + i(i + 1) ) mod m = (h (k) + 0.5i + 0.5i ) mod m tuottaa kokeilujonoja, jotka ovat joukon {0, 1,..., m} permutaatioita. Esimerkiksi jos m = 3 = 8 ja h (k) = 0, niin kokeilujono on 0,1,3,6,,7,5,4. Esimerkki: Olkoon h (k) = k kokonaislukuavaimille ja m = 16. Lisätään avaimet 1, 50,, 0, 38 ja 35 tässä järjestyksessä käyttämällä neliöistä kokeilua ja hajautusfunktiota h(k) = (h (k) + i(i+1) ) mod m. Nuolet kuvaavat jälleen kokeilujonoja /49
31 Esimerkki: Olkoon m jokin kahden potenssi. Tässä tapauksessa voidaan todistaa, että hajautusfunktio h(k,i) = (h (k) + i(i + 1) ) mod m = (h (k) + 0.5i + 0.5i ) mod m tuottaa kokeilujonoja, jotka ovat joukon {0, 1,..., m} permutaatioita. Esimerkiksi jos m = 3 = 8 ja h (k) = 0, niin kokeilujono on 0,1,3,6,,7,5,4. Esimerkki: Olkoon h (k) = k kokonaislukuavaimille ja m = 16. Lisätään avaimet 1, 50,, 0, 38 ja 35 tässä järjestyksessä käyttämällä neliöistä kokeilua ja hajautusfunktiota h(k) = (h (k) + i(i+1) ) mod m. Nuolet kuvaavat jälleen kokeilujonoja /49
32 Esimerkki: Olkoon m jokin kahden potenssi. Tässä tapauksessa voidaan todistaa, että hajautusfunktio h(k,i) = (h (k) + i(i + 1) ) mod m = (h (k) + 0.5i + 0.5i ) mod m tuottaa kokeilujonoja, jotka ovat joukon {0, 1,..., m} permutaatioita. Esimerkiksi jos m = 3 = 8 ja h (k) = 0, niin kokeilujono on 0,1,3,6,,7,5,4. Esimerkki: Olkoon h (k) = k kokonaislukuavaimille ja m = 16. Lisätään avaimet 1, 50,, 0, 38 ja 35 tässä järjestyksessä käyttämällä neliöistä kokeilua ja hajautusfunktiota h(k) = (h (k) + i(i+1) ) mod m. Nuolet kuvaavat jälleen kokeilujonoja /49
33 Esimerkki: Olkoon m jokin kahden potenssi. Tässä tapauksessa voidaan todistaa, että hajautusfunktio h(k,i) = (h (k) + i(i + 1) ) mod m = (h (k) + 0.5i + 0.5i ) mod m tuottaa kokeilujonoja, jotka ovat joukon {0, 1,..., m} permutaatioita. Esimerkiksi jos m = 3 = 8 ja h (k) = 0, niin kokeilujono on 0,1,3,6,,7,5,4. Esimerkki: Olkoon h (k) = k kokonaislukuavaimille ja m = 16. Lisätään avaimet 1, 50,, 0, 38 ja 35 tässä järjestyksessä käyttämällä neliöistä kokeilua ja hajautusfunktiota h(k) = (h (k) + i(i+1) ) mod m. Nuolet kuvaavat jälleen kokeilujonoja /49
34 Neliöllinen kokeilu ei kärsi primäärisestä kasautumisesta Mutta edelleen kahdella avaimella k 1 ja k, joilla on sama hajautusarvo h (k 1 ) = h (k ), on myös sama kokeilujono Tämä (vähemmän haitallinen) ongelma on nimeltään sekundäärinen kasautuminen Yleisemminkin lineaarinen ja neliöinen kokeilu ovat epäoptimaalisia koska m-alkioisille hajautustaulukoille on olemassa m! erilaista kokeilujonoa mutta lineaarinen ja neliöinen kokeilu tuottavat vain m kokeilujonoa (kun apuhajautusfunktio h ja vakiot ovat kiinnitettyjä) 34/49
35 Kaksoishajautus Tuottaa enemmän kokeilujonoja käyttämällä kahta apuhajautusfunktiota Yleinen muoto on h(k,i) = (h 1 (k) + i h (k)) mod m Kaksoishajauttaminen voi tuottaa m erilaista kokeilujonoa Jotta kokeilujonot olisivat permutaatioita, täytyy funktiolla h olla tiettyjä ominaisuuksia Vaaditaan, että arvoilla h (k) ei saa olla yhteisiä tekijöitä taulukon koon m kanssa (engl. relatively prime) 35/49
36 Esimerkki: Eräs helppo tapa pakottaa kokeilujonot h(k,0),h(k,1),...,h(k,m 1) olemaan joukon {0, 1,..., m 1} permutaatioita on vaatia, että m on kahden potenssi ja h (k) on pariton luku. Esimerkki: Toinen tapa saada kokeilujonot h(k,0),h(k,1),...,h(k,m 1) joukon {0, 1,..., m 1} permutaatioiksi on asettaa m alkuluvuksi ja h (k) positiivikseksi luvuksi, joka on pienempi kuin m. Esimerkiksi kokonaislukuvaimille voidaan asettaa h 1 (k) = k mod m ja h (k) = 1 + (k mod m ) jollekin arvolle m, joka on jonkin verran pienempi kuin m. 36/49
37 Avainten poistaminen Avainten poistaminen ketjutuksessa oli helppoa Avoimessa osoittamisessa täytyy pitää huoli, ettei avainten poistaminen jätä aukkoja taulukkoon ja muiden avainten kokeilujonoihin Esimerkki: Olkoon h (k) = k kokonaislukuavaimille, m = 16 ja käytetään neliöistä kokeilua hajautusfunktiolla h(k) = (h (k) + i(i+1) ) mod m. Lisätään avaimet 3, 0 ja 35 taulukkoon. Tulos on Jos nyt poistettaisiin avain 0 vain tuhoamalla se, tulos on Mutta nyt avainten hakeminen ei enää löydä avainta 35 koska se kokeilee vain indeksejä 3 sekä 4 ja tämän jälkeen lopettaa havaittuaan vapaan indeksin 4. 37/49
38 Eräs ratkaisu on korvata poistettu avain erikoissymbolilla del Haku ja poistaminen kohtelevät näitä oikeina avaimina mutta avainten lisääminen voi kirjoittaa niiden päälle Jos taulukossa on monta tällaista arvoa, operaatiot hidastuvat ja taulukon avaimet kannattanee uudelleenhajauttaa samaan taulukkoon Esimerkki: Tarkastellaan edellisen esimerkin taulukkoa Poistetaan avain 0 edellä kuvatulla tavalla: del 35 Nyt haku toimii kuten aiemminkin ja löytää avaimen 35 kokeiltuaan indeksejä 3, 4 ja 6. Jos lisätään avain 19, kokeillaan indeksejä 3 sekä 4 ja lisätään avain indeksiin 4. 38/49
39 Analyysiä Analyysiä varten oletetaan, että jokaisen avaimen kokeilujono on yhtä todennäköisesti mikä tahansa joukon {0, 1,..., m 1} m! permutaatiosta Esitetyistä kokeilumenetelmistä kaksoishajautus on lähimpänä vaatimusta Teoreema 11.6 kirjasta Introduction to Algorithms, 3rd ed. (online via Aalto lib) Edellisellä oletuksella avaimen hakeminen tekee keskimäärin korkeintaan 1/(1 α) kokeilua silloin kun avainta ei löydy. Täyttösuhde α on pienempi kuin 1 ei-täysillä hajautustaulukoilla avointa osoittamista käytettäessä ja täten 1/(1 α) = 1 + α + α + α Epämuodollinen selitys: 1 tulee ensimmäisestä aina tehtävästä kokeilusta Ensimmäinen kokeiltu indeksi oli varattu todennäköisyydellä α ja täten toinen kokeilu tehdään todennäköisyydellä α Ensimmäinen ja toinen kokeiltu indeksi olivat varattuja todennäköisyydellä α ja täten kolmas kokeilu tehdään todennäköisyydellä α... 39/49
40 Eli jos täyttösuhde pidetään pienempänä kuin jokin vakioraja-arvo, niin avainten lisääminen, etsiminen ja poistaminen vievät keskimäärin vakioajan Esimerkiksi jos täyttösuhde pidetään alle arvon 0.5, niin kokeilujen lukumäärä on keskimäärin korkeintaan Huom: poistetut arvot ( del -symboli) lesketaan mukaan täyttöasteeseen tässä yhteydessä. Jos avainten poistot ovat erittäin yleisiä, ketjutus voi olla parempi törmäystenkäsittelyratkaisu. Jälleen jos täyttösuhde nousee liian suureksi, tehdään uudelleenhajautus: kasvatetaan taulukon kokoa ja lisätään kaikki avaimet uuteen taulukkoon Kuten dynaamisten taulukoiden tapauksessa, taulukon kokoa kasvatetaan tyypillisesti kaksinkertaiseksi Mikä on hyvä raja-arvo täyttösuhteelle? Jälleen ei ole yksiselitteisesti parasta arvoa mutta tyypillisesti avoimessa osoittamisessa käytetään arvoja 0.50 tai /49
41 Hajautusfunktioiden suunnittelusta 41/49
42 Aiemmin oletettiin hajautusfunktio h, jossa satunnaisella avaimella on sama todennäköisyys kuvautua mille tahansa indeksille {0, 1,..., m 1} toisistaan riippumatta Mutta ei välttämättä tiedetä etukäteen lisättävien avainten jakaumaa eikä niitä välttämättä valita toisistaan riippumattomasti Pyritään laskemaan hajautusarvot h(k) niin, että ne odotusarvoisesti ovat riippumattomia avaimissa mahdollisesti esiintyvistä säännönmukaisuuksista Esimerkiksi kääntäjän symbolitaulukossa ei tahdota yleisesti esiintyvien merkkijonojen i ja j hajautusarvojen olevan lähellä toisiaan jos käytetään suljettua hajautusta lineaarisella kokeilulla Karkea ohje voisi olla: mitä satunnaisemmalta hajautusfunktion arvot näyttävät, sen parempi Avaimen k hajautusarvon tulisi myös olla tehokkaasti laskettavissa 4/49
43 Kokonaislukujen hajautus Tarkastellaan ensin hajautusfunktioita kokonaisluvuille Ollaan jo nähty yleinen jakolaskumenetelmä, missä hajautusarvo h(k) on jakojäännös kun jaetaan avaimen arvo taulukon koolla m: h(k) = k mod m Tämä on tehokkaasti laskettavissa, tarvitaan vain yksi jakolasku Mutta tämä tapa ei välttämättä ole paras jos m on kahden potenssi eli m = p : vain p vähiten merkitsevää bittiä vaikuttaa hajautusfunktion arvoon Jos mahdollista, m pitäisi mieluummin olla alkuluku, joka ei ole liian lähellä kahden potenssia 43/49
44 Kertolaskumenetelmä tuottaa hajautusarvon w-bittiselle kokonaislukuavaimelle k kertomalla sen hyvin valitulla w-bittisellä vakioluvulla A, jolloin tulokseksi saadaan w-bittinen kokonaisluku r = r w 1 r w...r 0 = ka ja ottamalla tämän tuloksen vähemmän merkitsevän osuuden r w 1...r 0 eniten merkitsevistä biteistä tarvittavan määrän bittejä tulokseksi Nyt m on yleensä kahden potenssi, m = p, joten voidaan cain ottaa p eniten merkitsevää bittiä osuudesta r w 1...r 0 käyttämällä shift- ja and-operaatioita Tarkastellaan esimerkiksi Scala-funktiota def h(x: Int): Int = (x * L).toInt Nyt h(1).tohexstring = 9e3779b9 h().tohexstring = 3c6ef37 h(3).tohexstring = daa66db jne; arvot vaikuttavat kohtuullisen satunnaisilta 44/49
45 Merkkijonojen hajautus Tulkitaan merkkijono s = c 0...c n 1 kokonaisluvuksi prosessoimalla sen merkit c i yksi kerrallaan Esim. nykyisissä Javan toteutuksissa käytetään hajautusfunktiota n 1 h(s) = i=0 c i 31 n 1 i Toteutuksesta openjdk Java 8 (huomaa ohjelmallinen välimuisti hajautusarvolle eli sitä ei aina lasketa uudelleen): p u b l i c f i n a l class S t r i n g implements java. i o. S e r i a l i z a b l e, Comparable<String >, CharSequence { / * * The value i s used f o r character storage. * / p r i v a t e f i n a l char value [ ] ; / * * Cache the hash code f o r the s t r i n g * / private i n t hash ; / / Default to 0... p u b l i c i n t hashcode ( ) { i n t h = hash ; i f ( h == 0 && value. length > 0) { char va l [ ] = value ; f o r ( i n t i = 0; i < value. length ; i ++) { h = 31 * h + v a l [ i ] ; } hash = h ; } r e t u r n h ; } } 45/49
46 Rakenteellisten olioiden hajautus Taulukoille ja rakenteellisille olioille, joilla on useita kenttiä jne, voidaan laskea hajautusarvo samalla lailla yhdistämällä komponenttien hajautusarvot yhdeksi Esimerkiksi hajautusarvon laskenta taulukoille toteutuksessa openjdk Java 6 p u b l i c s t a t i c i n t hashcode ( i n t a [ ] ) { i f ( a == n u l l ) r e t u r n 0; i n t r e s u l t = 1; f o r ( i n t element : a ) r e s u l t = 31 * r e s u l t + element ; return r e s u l t ; } 46/49
47 Tällä hetkellä Scala käyttää hieman monimutkaisempaa hajautusfunktiota, joka pohjautuu MurMurHash 3-funktioon Se pyrkii tuottamaan hyviä hajautusarvoja sekoittamalla avaintaulukon alkioiden arvojen bittejä tehokkaasti ja olemaan myös nopea Scalan lähdekoodista: f i n a l def arrayhash [@s p e c i a l i z e d T ] ( a : Array [ T ], seed : I n t ) : I n t = { var h = seed var i = 0 while ( i < a. length ) { h = mix ( h, a ( i ). ## ) / / ## i s hashcode i += 1 } f i n a l i z e H a s h ( h, a. length ) } f i n a l def mix ( hash : I n t, data : I n t ) : I n t = { var h = mixlast ( hash, data ) h = r o t l ( h, 13) / / r o t l i s I n t e r g e r. r o t a t e L e f t h * 5 + 0xe6546b64 } 47/49
48 f i n a l def mixlast ( hash : I n t, data : I n t ) : I n t = { var k = data k * = 0xcc9ed51 k = r o t l ( k, 15) k * = 0x1b hash ^ k } / * * F i n a l i z e a hash to i n c o r p o r a t e the length and make sure a l l b i t s avalanche. * / f i n a l def f i n a l i z e H a s h ( hash : I n t, le ngth : I n t ) : I n t = avalanche ( hash ^ length ) / * * Force a l l b i t s of the hash to avalanche. Used f o r f i n a l i z i n g the hash. * / private f i n a l def avalanche ( hash : I n t ) : I n t = { var h = hash h ^= h >>> 16 h * = 0x85ebca6b h ^= h >>> 13 h * = 0xcbae35 h ^= h >>> 16 h } 48/49
49 Lisää Hyvien hajautusfunktioiden tärkeydestä johtuen useita erilaisia hajautusfunktioita on kehitetty eri tarkoituksiin vuosien aikana Katso esim. seuraavia sivustoja: B-v3/libsupc%B%B/hash_bytes.cc?view=markup#l74 49/49
Kierros 5: Hajautus. Tommi Junttila. Aalto University School of Science Department of Computer Science
Kierros 5: Hajautus Tommi Junttila Aalto University School of Science Department of Computer Science CS-A1140 Data Structures and Algorithms Autumn 017 Tommi Junttila (Aalto University) Kierros 5 CS-A1140
Hajautus. operaatiot insert ja search pyritään tekemään erittäin nopeiksi
Hajautus eräs (osittainen) toteutus joukko-tietotyypille operaatiot insert ja search pyritään tekemään erittäin nopeiksi tärkeä tekniikka käytännön ohjelmoinnissa valmiita toteutuksia on, mutta väärät
Algoritmit 2. Luento 4 To Timo Männikkö
Algoritmit 2 Luento 4 To 21.3.2019 Timo Männikkö Luento 4 Hajautus Yhteentörmäysten käsittely Avoin osoitteenmuodostus Hajautusfunktiot Puurakenteet Solmujen läpikäynti Algoritmit 2 Kevät 2019 Luento 4
Algoritmit 2. Luento 3 Ti Timo Männikkö
Algoritmit 2 Luento 3 Ti 20.3.2018 Timo Männikkö Luento 3 Järjestäminen eli lajittelu Kekorakenne Kekolajittelu Hajautus Yhteentörmäysten käsittely Ketjutus Algoritmit 2 Kevät 2018 Luento 3 Ti 20.3.2018
Algoritmit 2. Luento 4 Ke Timo Männikkö
Algoritmit 2 Luento 4 Ke 22.3.2017 Timo Männikkö Luento 4 Hajautus Yhteentörmäysten käsittely Avoin osoitteenmuodostus Hajautusfunktiot Puurakenteet Solmujen läpikäynti Algoritmit 2 Kevät 2017 Luento 4
Algoritmit 2. Luento 3 Ti Timo Männikkö
Algoritmit 2 Luento 3 Ti 21.3.2017 Timo Männikkö Luento 3 Järjestäminen eli lajittelu Kekorakenne Kekolajittelu Hajautus Yhteentörmäysten käsittely Ketjutus Algoritmit 2 Kevät 2017 Luento 3 Ti 21.3.2017
5. Hajautus. Tarkastellaan edelleen sivulla 161 esitellyn joukkotietotyypin toteuttamista
5. Hajautus Tarkastellaan edelleen sivulla 161 esitellyn joukkotietotyypin toteuttamista Useissa sovelluksissa riittää että operaatiot insert, delete ja search toimivat nopeasti esim. sivun 30 puhelinluetteloesimerkissä
A274101 TIETORAKENTEET JA ALGORITMIT
A274101 TIETORAKENTEET JA ALGORITMIT HAJAUTUS, JÄRJESTÄMISESTÄ HAJAUTTAMISEN IDEA Jos avaimet (tai data) ovat kokonaislukuja välillä 1 N, voidaan niitä käyttää suoraan indeksointiin Järkevä rakenne on
Tietorakenteet ja algoritmit. Hajautus. Ari Korhonen Tietorakenteet ja algoritmit - syksy
Tietorakenteet ja algoritmit Hajautus Ari Korhonen 10.11.2015 Tietorakenteet ja algoritmit - syksy 2015 1 9 Hajautus 9.1 Yleistä 9.2 Hajautusfunktio 9.3 Erillinen ketjutus 9.4 Avoin osoitus 9.4.1 Lineaarinen
4. Hajautus. Hajautus (hashing) on vaihtoehto tasapainoisille puille dynaamisen joukon toteuttamisessa:
4. Hajautus Hajautus (hashing) on vaihtoehto tasapainoisille puille dynaamisen joukon toteuttamisessa: Search, Insert ja Delete yleensä ajassa O(1) (tasapainoisella puulla O(log n)) pahimmassa tapauksessa
(a) L on listan tunnussolmu, joten se ei voi olla null. Algoritmi lisäämiselle loppuun:
Tietorakenteet ja algoritmit, kevät 201 Kurssikoe 1, ratkaisuja 1. Tehtävästä sai yhden pisteen per kohta. (a) Invariantteja voidaan käyttää algoritmin oikeellisuustodistuksissa Jokin väittämä osoitetaan
Algoritmit 2. Demot Timo Männikkö
Algoritmit 2 Demot 2 3.-4.4.2019 Timo Männikkö Tehtävä 1 Avoin osoitteenmuodostus: Hajautustaulukko t (koko m) Erikoisarvot VAPAA ja POISTETTU Hajautusfunktio h(k,i) Operaatiot: lisaa etsi poista Algoritmit
Algoritmit 2. Luento 7 Ti Timo Männikkö
Algoritmit 2 Luento 7 Ti 4.4.2017 Timo Männikkö Luento 7 Joukot Joukko-operaatioita Joukkojen esitystapoja Alkiovieraat osajoukot Toteutus puurakenteena Algoritmit 2 Kevät 2017 Luento 7 Ti 4.4.2017 2/26
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.
Ohjelmoinnin peruskurssien laaja oppimäärä
Ohjelmoinnin peruskurssien laaja oppimäärä Luento 5: Sijoituslause, SICP-oliot, tietorakenteen muuttaminen (mm. SICP 33.1.3, 3.33.3.2) Riku Saikkonen 6. 11. 2012 Sisältö 1 Muuttujan arvon muuttaminen:
Kierros 4: Binäärihakupuut
Kierros 4: Binäärihakupuut Tommi Junttila Aalto University School of Science Department of Computer Science CS-A1140 Data Structures and Algorithms Autumn 2017 Tommi Junttila (Aalto University) Kierros
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
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
CS-A1140 Tietorakenteet ja algoritmit
CS-A1140 Tietorakenteet ja algoritmit Kierros 4: Binäärihakupuut Tommi Junttila Aalto-yliopisto Perustieteiden korkeakoulu Tietotekniikan laitos Syksy 2016 Sisältö Binäärihakupuut Avainten lisääminen,
811312A Tietorakenteet ja algoritmit V Hash-taulukot ja binääriset etsintäpuut
811312A Tietorakenteet ja algoritmit 2018-2019 V Hash-taulukot ja binääriset etsintäpuut Sisältö 1. Hash-taulukot 2. Binääriset etsintäpuut 811312A TRA, Hash-taulukot, binääripuut 2 V.1 Hash-taulukot Käytetään
Algoritmit 2. Luento 2 To Timo Männikkö
Algoritmit 2 Luento 2 To 14.3.2019 Timo Männikkö Luento 2 Tietorakenteet Lineaarinen lista, binääripuu Prioriteettijono Kekorakenne Keko-operaatiot Keon toteutus taulukolla Algoritmit 2 Kevät 2019 Luento
Tietorakenteet, laskuharjoitus 8, malliratkaisut
Tietorakenteet, laskuharjoitus 8, malliratkaisut 1. Seuraavassa on yksi tapa toteuttaa metodit hashcode ja equals: public int hashcode() { return this.x * 31 + this.y; public boolean equals(object o) {
A TIETORAKENTEET JA ALGORITMIT
A274105 TIETORAKENTEET JA ALGORITMIT HARJOITUSTEHTÄVÄT 6 DEADLINE 1.4.2009 KLO 9:00 Kynätehtävät tehdään kirjallisesti ja esitetään harjoituksissa. Välivaiheet näkyviin! Ohjelmointitehtävät sähköisesti
811312A Tietorakenteet ja algoritmit II Perustietorakenteet
811312A Tietorakenteet ja algoritmit 2017-2018 II Perustietorakenteet Sisältö 1. Johdanto 2. Pino 3. Jono 4. Lista 811312A TRA, Perustietorakenteet 2 II.1. Johdanto Tietorakenne on tapa, jolla algoritmi
Hajautusrakenteet. R&G Chapter Tietokannan hallinta, kevät 2006, Jan 1
Hajautusrakenteet R&G Chapter 11 16.02.06 Tietokannan hallinta, kevät 2006, Jan 1 Hajautukseen perustuvat tiedostorakenteet Hajautukseen perustuvissa tiedostorakenteissa on tavoitteena yksittäisen tietueen
58131 Tietorakenteet ja algoritmit (kevät 2013) Kurssikoe 1, , vastauksia
58131 Tietorakenteet ja algoritmit (kevät 2013) Kurssikoe 1, 25.2.2013, vastauksia 1. (a) O-merkintä Ω-merkintä: Kyseessä on (aika- ja tila-) vaativuuksien kertalukumerkinnästä. O-merkintää käytetään ylärajan
811312A Tietorakenteet ja algoritmit, , Harjoitus 5, Ratkaisu
1312A Tietorakenteet ja algoritmit, 2018-2019, Harjoitus 5, Ratkaisu Harjoituksen aihe ovat hash-taulukot ja binääriset etsintäpuut Tehtävä 5.1 Tallenna avaimet 10,22,31,4,15,28,17 ja 59 hash-taulukkoon,
List-luokan soveltamista. Listaan lisääminen Listan läpikäynti Listasta etsiminen Listan sisällön muuttaminen Listasta poistaminen Listan kopioiminen
1 List-luokan soveltamista List-luokan metodeja Listaan lisääminen Listan läpikäynti Listasta etsiminen Listan sisällön muuttaminen Listasta poistaminen Listan kopioiminen 1 List-luokan metodeja List-luokan
811312A Tietorakenteet ja algoritmit, , Harjoitus 5, Ratkaisu
1312A Tietorakenteet ja algoritmit, 2016-2017, Harjoitus 5, Ratkaisu Harjoituksen aihe ovat hash-taulukot ja binääriset etsintäpuut Tehtävä 5.1 Tallenna avaimet 10,22,31,4,15,28,17 ja 59 hash-taulukkoon,
Hajautusrakenteet. Hajautukseen perustuvat tiedostorakenteet. Hajautukseen perustuvat tiedostorakenteet. Hajautukseen perustuvat tiedostorakenteet
Hajautusrakenteet R&G Chapter Hajautukseen perustuvissa tiedostorakenteissa on tavoitteena yksittäisen tietueen nopea haku. Tähän pyritään siten, että tietueen sijoituspaikan eli solun (cell, bucket) osoite
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
Tietorakenteet, laskuharjoitus 3, ratkaisuja
Tietorakenteet, laskuharjoitus 3, ratkaisuja 1. (a) Toistolauseen runko-osassa tehdään yksi laskuoperaatio, runko on siis vakioaikainen. Jos syöte on n, suoritetaan runko n kertaa, eli aikavaativuus kokonaisuudessaan
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
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
Operaattoreiden ylikuormitus. Operaattoreiden kuormitus. Operaattoreiden kuormitus. Operaattoreista. Kuormituksesta
C++ - perusteet Java-osaajille luento 5/7: operaattoreiden ylikuormitus, oliotaulukko, parametrien oletusarvot, komentoriviparametrit, constant, inline, Operaattoreiden ylikuormitus Operaattoreiden kuormitus
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
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.
private TreeMap<String, Opiskelija> nimella; private TreeMap<String, Opiskelija> numerolla;
Tietorakenteet, laskuharjoitus 7, ratkaisuja 1. Opiskelijarekisteri-luokka saadaan toteutetuksi käyttämällä kahta tasapainotettua binäärihakupuuta. Toisen binäärihakupuun avaimina pidetään opiskelijoiden
4 Tehokkuus ja algoritmien suunnittelu
TIE-20100 Tietorakenteet ja algoritmit 52 4 Tehokkuus ja algoritmien suunnittelu Tässä luvussa pohditaan tehokkuuden käsitettä ja esitellään kurssilla käytetty kertaluokkanotaatio, jolla kuvataan algoritmin
Tekijä Pitkä Matematiikka 11 ratkaisut luku 2
Tekijä Pitkä matematiikka 11 0..017 170 a) Koska 8 = 4 7, luku 8 on jaollinen luvulla 4. b) Koska 104 = 4 6, luku 104 on jaollinen luvulla 4. c) Koska 4 0 = 80 < 8 ja 4 1 = 84 > 8, luku 8 ei ole jaollinen
811312A Tietorakenteet ja algoritmit , Harjoitus 2 ratkaisu
811312A Tietorakenteet ja algoritmit 2017-2018, Harjoitus 2 ratkaisu Harjoituksen aiheena on algoritmien oikeellisuus. Tehtävä 2.1 Kahvipurkkiongelma. Kahvipurkissa P on valkoisia ja mustia kahvipapuja,
Ohjelmointi 1 Taulukot ja merkkijonot
Ohjelmointi 1 Taulukot ja merkkijonot Jussi Pohjolainen TAMK Tieto- ja viestintäteknologia Johdanto taulukkoon Jos ohjelmassa käytössä ainoastaan perinteisiä (yksinkertaisia) muuttujia, ohjelmien teko
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
Olio-ohjelmointi Syntaksikokoelma
C++-kielen uusia ominaisuuksia Olio-ohjelmointi Syntaksikokoelma 31.10.2008 Bool-tietotyyppi: Totuusarvo true (1), jos ehto on tosi ja false (0) jos ehto epätosi. Dynaaminen muistinvaraus: Yhden muuttuja
(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ä.
Loppu seuraa suoralla laskulla: n n Tave TR = p j (1 + b (i, j)) j=1 = 1 + 1 i
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ä.
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
Algoritmit 1. Luento 5 Ti Timo Männikkö
Algoritmit 1 Luento 5 Ti 24.1.2017 Timo Männikkö Luento 5 Järjestetty lista Järjestetyn listan operaatiot Listan toteutus taulukolla Binäärihaku Binäärihaun vaativuus Algoritmit 1 Kevät 2017 Luento 5 Ti
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
Harjoitustyö: virtuaalikone
Harjoitustyö: virtuaalikone Toteuta alla kuvattu virtuaalikone yksinkertaiselle olio-orientoituneelle skriptauskielelle. Paketissa on testaamista varten mukana kaksi lyhyttä ohjelmaa. Ohjeita Noudata ohjelman
Osoitin ja viittaus C++:ssa
Osoitin ja viittaus C++:ssa Osoitin yksinkertaiseen tietotyyppiin Osoitin on muuttuja, joka sisältää jonkin toisen samantyyppisen muuttujan osoitteen. Ohessa on esimerkkiohjelma, jossa määritellään kokonaislukumuuttuja
Algoritmit 1. Luento 12 Ke Timo Männikkö
Algoritmit 1 Luento 12 Ke 15.2.2017 Timo Männikkö Luento 12 Pikalajittelu Pikalajittelun vaativuus Osittamisen tasapainoisuus Lajittelumenetelmien vaativuus Laskentalajittelu Lokerolajittelu Kantalukulajittelu
TKHJ:ssä on yleensä komento create index, jolla taululle voidaan luoda hakemisto
Indeksin luonti ja hävitys TKHJ:ssä on yleensä komento create index, jolla taululle voidaan luoda hakemisto Komentoa ei ole standardoitu ja niinpä sen muoto vaihtelee järjestelmäkohtaisesti Indeksi voidaan
Algoritmit 1. Luento 12 Ti Timo Männikkö
Algoritmit 1 Luento 12 Ti 19.2.2019 Timo Männikkö Luento 12 Osittamisen tasapainoisuus Pikalajittelun vaativuus Lajittelumenetelmien vaativuus Laskentalajittelu Lokerolajittelu Kantalukulajittelu Algoritmit
Tietorakenteet ja algoritmit syksy Laskuharjoitus 1
Tietorakenteet ja algoritmit syksy 2012 Laskuharjoitus 1 1. Tietojenkäsittelijä voi ajatella logaritmia usein seuraavasti: a-kantainen logaritmi log a n kertoo, kuinka monta kertaa luku n pitää jakaa a:lla,
Tietorakenteet ja algoritmit
Tietorakenteet ja algoritmit Merkintöjen tulkintoja *++Pstack->top = item *Pstack->top++ = item (*Pstack->top)++ *(Pstack++)->top = item *(++Pstack)->top = item Lisää pinon toteutuksia Dynaaminen taulukko
Ohjelmoinnin peruskurssien laaja oppimäärä
Ohjelmoinnin peruskurssien laaja oppimäärä Luento 4: Symbolit, derivojaesimerkki, kierroksen 1 ratkaisut (mm. SICP 2.32.3.2) Riku Saikkonen 1. 11. 2011 Sisältö 1 Symbolit ja sulkulausekkeet 2 Lisää Schemestä:
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
Ohjelmassa muuttujalla on nimi ja arvo. Kääntäjä ja linkkeri varaavat muistilohkon, jonne muuttujan arvo talletetaan.
Osoittimet Ohjelmassa muuttujalla on nimi ja arvo. Kääntäjä ja linkkeri varaavat muistilohkon, jonne muuttujan arvo talletetaan. Muistilohkon koko riippuu muuttujan tyypistä, eli kuinka suuria arvoja muuttujan
Algoritmit 2. Luento 2 Ke Timo Männikkö
Algoritmit 2 Luento 2 Ke 15.3.2017 Timo Männikkö Luento 2 Tietorakenteet Lineaarinen lista, binääripuu Prioriteettijono Kekorakenne Keko-operaatiot Keon toteutus taulukolla Algoritmit 2 Kevät 2017 Luento
STL:n uudistukset. Seppo Koivisto TTY Ohjelmistotekniikka
STL:n uudistukset Seppo Koivisto TTY Ohjelmistotekniikka 2012-05-04 Sisältö 1 Muutokset säiliöihin ja uudet säiliötyypit 2 3 4 5 STL:n säiliöt Viitteet ja osoittimet ovat muuttuneet: Allocator::reference
Sisällys. 18. Abstraktit tietotyypit. Johdanto. Johdanto
Sisällys 18. bstraktit tietotyypit Johdanto abstrakteihin tietotyyppeihin. Pino ja jono. Linkitetty lista. Pino linkitetyllä listalla toteutettuna. 18.1 18.2 Johdanto Javan omat tietotyypit ovat jo tuttuja:
6. Sanakirjat. 6. luku 298
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
7.4 Sormenjälkitekniikka
7.4 Sormenjälkitekniikka Tarkastellaan ensimmäisenä esimerkkinä pitkien merkkijonojen vertailua. Ongelma: Ajatellaan, että kaksi n-bittistä (n 1) tiedostoa x ja y sijaitsee eri tietokoneilla. Halutaan
18. Abstraktit tietotyypit 18.1
18. Abstraktit tietotyypit 18.1 Sisällys Johdanto abstrakteihin tietotyyppeihin. Pino ja jono. Linkitetty lista. Pino linkitetyllä listalla toteutettuna. 18.2 Johdanto Javan omat tietotyypit ovat jo tuttuja:
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
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
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...
Tietorakenteet ja algoritmit
Tietorakenteet ja algoritmit Rekursio Rekursion käyttötapauksia Rekursio määritelmissä Rekursio ongelmanratkaisussa ja ohjelmointitekniikkana Esimerkkejä taulukolla Esimerkkejä linkatulla listalla Hanoin
815338A Ohjelmointikielten periaatteet Harjoitus 3 vastaukset
815338A Ohjelmointikielten periaatteet 2015-2016. Harjoitus 3 vastaukset Harjoituksen aiheena ovat imperatiivisten kielten muuttujiin liittyvät kysymykset. Tehtävä 1. Määritä muuttujien max_num, lista,
Tietorakenteet ja algoritmit
Tietorakenteet ja algoritmit Taulukon edut Taulukon haitat Taulukon haittojen välttäminen Dynaamisesti linkattu lista Linkatun listan solmun määrittelytavat Lineaarisen listan toteutus dynaamisesti linkattuna
Taulukot. Jukka Harju, Jukka Juslin 2006 1
Taulukot Jukka Harju, Jukka Juslin 2006 1 Taulukot Taulukot ovat olioita, jotka auttavat organisoimaan suuria määriä tietoa. Käsittelylistalla on: Taulukon tekeminen ja käyttö Rajojen tarkastus ja kapasiteetti
Ohjelmoinnin perusteet Y Python
Ohjelmoinnin perusteet Y Python T-106.1208 17.2.2010 T-106.1208 Ohjelmoinnin perusteet Y 17.2.2010 1 / 41 Sanakirja Monissa sovelluksissa on tallennettava rakenteeseen avain arvo-pareja. Myöhemmin rakenteesta
58131 Tietorakenteet ja algoritmit (syksy 2015)
58131 Tietorakenteet ja algoritmit (syksy 2015) Harjoitus 2 (14. 18.9.2015) Huom. Sinun on tehtävä vähintään kaksi tehtävää, jotta voit jatkaa kurssilla. 1. Erään algoritmin suoritus vie 1 ms, kun syötteen
Algoritmit 2. Luento 6 Ke Timo Männikkö
Algoritmit 2 Luento 6 Ke 29.3.2017 Timo Männikkö Luento 6 B-puun operaatiot B-puun muunnelmia Nelipuu Trie-rakenteet Standarditrie Pakattu trie Algoritmit 2 Kevät 2017 Luento 6 Ke 29.3.2017 2/31 B-puu
Tietorakenteet, laskuharjoitus 7, ratkaisuja
Tietorakenteet, laskuharjoitus, ratkaisuja. Seuraava kuvasarja näyttää B + -puun muutokset lisäysten jälkeen. Avaimet ja 5 mahtuvat lehtisolmuihin, joten niiden lisäys ei muuta puun rakennetta. Avain 9
Ohjelmoinnin peruskurssien laaja oppimäärä
Ohjelmoinnin peruskurssien laaja oppimäärä Luento 2: SICP kohdat 22.2.3 Riku Saikkonen 2. 11. 2010 Sisältö 1 Linkitetyt listat 2 Listaoperaatioita 3 Listarakenteet 4 Gambit-C:n Scheme-debuggeri Linkitetyt
811120P Diskreetit rakenteet
811120P Diskreetit rakenteet 2016-2017 2. Lukujen esittäminen ja aritmetiikka 2.1 Kantajärjestelmät ja lukujen esittäminen Käytettävät lukujoukot: Luonnolliset luvut IN = {0,1,2,3,... } Positiiviset kokonaisluvut
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,
Algoritmit 2. Luento 6 To Timo Männikkö
Algoritmit 2 Luento 6 To 28.3.2019 Timo Männikkö Luento 6 B-puun operaatiot Nelipuu Trie-rakenteet Standarditrie Pakattu trie Algoritmit 2 Kevät 2019 Luento 6 To 28.3.2019 2/30 B-puu 40 60 80 130 90 100
A ja B pelaavat sarjan pelejä. Sarjan voittaja on se, joka ensin voittaa n peliä.
Esimerkki otteluvoiton todennäköisyys A ja B pelaavat sarjan pelejä. Sarjan voittaja on se, joka ensin voittaa n peliä. Yksittäisessä pelissä A voittaa todennäköisyydellä p ja B todennäköisyydellä q =
Rekursiolause. Laskennan teorian opintopiiri. Sebastian Björkqvist. 23. helmikuuta Tiivistelmä
Rekursiolause Laskennan teorian opintopiiri Sebastian Björkqvist 23. helmikuuta 2014 Tiivistelmä Työssä käydään läpi itsereplikoituvien ohjelmien toimintaa sekä esitetään ja todistetaan rekursiolause,
Algoritmit 1. Demot Timo Männikkö
Algoritmit 1 Demot 1 31.1.-1.2.2018 Timo Männikkö Tehtävä 1 (a) Algoritmi, joka tutkii onko kokonaisluku tasan jaollinen jollain toisella kokonaisluvulla siten, että ei käytetä lainkaan jakolaskuja Jaettava
815338A Ohjelmointikielten periaatteet Harjoitus 6 Vastaukset
815338A Ohjelmointikielten periaatteet 2015-2016. Harjoitus 6 Vastaukset Harjoituksen aiheena on funktionaalinen ohjelmointi Scheme- ja Haskell-kielillä. Voit suorittaa ohjelmat osoitteessa https://ideone.com/
AVL-puut. eräs tapa tasapainottaa binäärihakupuu siten, että korkeus on O(log n) kun puussa on n avainta
AVL-puut eräs tapa tasapainottaa binäärihakupuu siten, että korkeus on O(log n) kun puussa on n avainta pohjana jo esitetyt binäärihakupuiden operaatiot tasapainotus vie pahimmillaan lisäajan lisäys- ja
Demo 6 vastauksia. 1. tehtävä. #ifndef #define D6T1 H D6T1 H. #include <iostream> using std::ostream; using std::cout; using std::endl;
Demo 6 vastauksia 1. tehtävä #ifndef #define D6T1 H D6T1 H #include using std::ostream; using std::cout; using std::endl; #include using std::string; 10 template class
Sekvenssi: kokoelma peräkkäisiä alkioita (lineaarinen
Sekvenssi Sekvenssi: kokoelma peräkkäisiä alkioita (lineaarinen järjestys) Timo Esim. pino, jono ja kaksiloppuinen jono ovat sekvenssin erikoistapauksia sekvenssejä, jotka kohdistavat operaationsa ensimmäiseen/viimeiseen
Tässä tehtävässä käsittelet metodeja, listoja sekä alkulukuja (englanniksi prime ).
Tehtävä 1: Metodit, listat, alkuluvut (4p) Tässä tehtävässä käsittelet metodeja, listoja sekä alkulukuja (englanniksi prime ). Alkuluvut ovat lukuja, jotka ovat suurempia kuin yksi ja jotka ovat jaollisia
Tietorakenteet. JAVA-OHJELMOINTI Osa 5: Tietorakenteita. Sisällys. Merkkijonot (String) Luokka String. Metodeja (public)
Tietorakenteet JAVA-OHJELMOINTI Osa 5: Tietorakenteita Eero Hyvönen Tietojenkäsittelytieteen laitos Helsingin yliopisto Olioita ja tietoja voidaan organisoida määrämuotoisiksi tietorakenteiksi Hyödyllisiä
Ohjelmoinnin peruskurssien laaja oppimäärä
Ohjelmoinnin peruskurssien laaja oppimäärä Keskeneräinen luento 3: Listat (mm. SICP 22.2.3) Riku Saikkonen 31. 10. 2011 Sisältö 1 Linkitetyt listat 2 Linkitetyt listat (SICP 2.1.1, 2.2.1) funktionaalinen
Algoritmit 2. Luento 14 Ke Timo Männikkö
Algoritmit 2 Luento 14 Ke 3.5.2017 Timo Männikkö Luento 14 Ositus ja rekursio Rekursion toteutus Kertaus ja tenttivinkit Algoritmit 2 Kevät 2017 Luento 14 Ke 3.5.2017 2/30 Ositus Tehtävän esiintymä ositetaan
815338A Ohjelmointikielten periaatteet 2014-2015. Harjoitus 7 Vastaukset
815338A Ohjelmointikielten periaatteet 2014-2015. Harjoitus 7 Vastaukset Harjoituksen aiheena on funktionaalinen ohjelmointi Scheme- ja Haskell-kielillä. Voit suorittaa ohjelmat osoitteessa https://ideone.com/
9.3 Algoritmin valinta
TIE-20100 Tietorakenteet ja algoritmit 218 9.3 Algoritmin valinta Merkittävin algoritmin valintaan vaikuttava tekijä on yleensä sen suorituskyky käyttötilanteessa. Muitakin perusteita kuitenkin on: toteutuksen
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
Tieto- ja tallennusrakenteet
Tieto- ja tallennusrakenteet Sisältö Tyyppi, abstrakti tietotyyppi, abstraktin tietotyypin toteutus Tallennusrakenteet Taulukko Linkitetty rakenne Abstraktit tietotyypit Lista (Puu) (Viimeisellä viikolla)
13 Operaattoreiden ylimäärittelyjä
248 13 C++-kielessä voidaan operaattoreita ylimäärittää. Ylimääriteltävää operaattoria voidaan pitää ikäänkuin metodina, joka esitellään luokan esittelyssä ja määritellään luokan ulkopuolella kuten metoditkin.
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
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
Hakupuut. tässä luvussa tarkastelemme puita tiedon tallennusrakenteina
Hakupuut tässä luvussa tarkastelemme puita tiedon tallennusrakenteina hakupuun avulla voidaan toteuttaa kaikki joukko-tietotyypin operaatiot (myös succ ja pred) pahimman tapauksen aikavaativuus on tavallisella
Kirjoita oma versio funktioista strcpy ja strcat, jotka saavat parametrinaan kaksi merkkiosoitinta.
Tehtävä 63. Kirjoita oma versio funktiosta strcmp(),joka saa parametrinaan kaksi merkkiosoitinta. Tee ohjelma, jossa luetaan kaksi merkkijonoa, joita sitten verrataan ko. funktiolla. Tehtävä 64. Kirjoita