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 Ke 22.3.2017 2/30
Hajautus Tallennettavia alkioita n Taulukon koko m (vähintään n, jotta kaikki alkiot mahtuvat) Hajautusfunktio h : {mahdolliset avaimet} {0, 1,..., m 1} Avainta a vastaavan alkion indeksi on h(a) (avaimen a kotiosoite) Mahdollisia avaimia paljon enemmän kuin m Usealla avaimella on sama kotisoite Algoritmit 2 Kevät 2017 Luento 4 Ke 22.3.2017 3/30
Hajautus Yhteentörmäys: Jos a b, mutta h(a) = h(b) Sanotaan, että a ja b ovat synonyymejä Synonyymeja ei voida tallentaa kaikkia samaan paikkaan Yhteentörmäykset täytyy käsitellä jotenkin Algoritmit 2 Kevät 2017 Luento 4 Ke 22.3.2017 4/30
Hajautusfunktio Hyvä hajautusfunktio: Mahdollisimman vähän yhteentörmäyksiä Jos todellisista avaimista ei tiedetä mitään etukäteen, yhteentörmäyksiä ei voi välttää Hajauttaa alkiot tasaisesti taulukkoon Vaikeaa, jos todellisten avaimien jakaumaa ei tunneta Helppo laskea Helppo ohjelmoida, nopea laskea (mielellään vakioaikainen Θ(1)) Algoritmit 2 Kevät 2017 Luento 4 Ke 22.3.2017 5/30
Yhteentörmäysten käsittely Ketjutus: Jokaiselle kotiosoitteelle lineaarinen lista Hajautustaulukossa osoittimet listojen ensimmäisiin alkioihin Algoritmit yksinkertaisia lista-algoritmeja Mutta: Tarvitaan aputilaa (listat) Avoin osoitteenmuodostus: Tallennukseen käytetään vain hajautustaulukkoa Algoritmit 2 Kevät 2017 Luento 4 Ke 22.3.2017 6/30
Avoin osoitteenmuodostus Alkiot tallennetaan suoraan hajautustaulukkoon Paikka riippuu avaimen lisäksi myös siitä, mitkä paikat taulukossa ovat vielä vapaina Tallennettavia alkioita n, hajautustaulukon koko m Täyttösuhde: n/m Algoritmit 2 Kevät 2017 Luento 4 Ke 22.3.2017 7/30
Avoin osoitteenmuodostus Lineaarinen etsintä: Ensin yritetään paikkaa h(k) Seuraavaksi yritetään paikkaa h(k) + 1 Seuraavaksi yritetään paikkaa h(k) + 2 Jne. Yleisesti hajautusfunktio on muotoa h(k, i) = (h(k) + i) mod m, i = 0, 1, 2,... Arvo i kertoo, montako yhteentörmäystä on tapahtunut kyseisen kotiosoitteen kohdalla Algoritmit 2 Kevät 2017 Luento 4 Ke 22.3.2017 8/30
Avoin osoitteenmuodostus Uuden alkion lisäys: Hajautetaan avain k indeksiksi h(k) Etsitään siitä alkaen ensimmäinen vapaa paikka Jos tullaan taulukon loppuun, jatketaan etsintää taulukon alusta Tallennetaan alkio löydettyyn paikkaan Hajautustaulukossa oltava vähintään yksi vapaa paikka Vapaat paikat täytyy pystyä tunnistamaan Algoritmit 2 Kevät 2017 Luento 4 Ke 22.3.2017 9/30
Avoin osoitteenmuodostus Alkion haku: Hajautetaan avain k indeksiksi h(k) Etsitään siitä alkaen alkio, jossa on sama avain (peräkkäishaku) Jos tullaan taulukon loppuun, jatketaan etsintää taulukon alusta Jos vastaan tulee tyhjä paikka, alkiota ei ole Algoritmit 2 Kevät 2017 Luento 4 Ke 22.3.2017 10/30
Avoin osoitteenmuodostus Alkion poisto: Hajautetaan avain k indeksiksi h(k) Etsitään siitä alkaen poistettava alkio Merkitään paikka poistetuksi Lisäämisessä poistettu paikka vastaa tyhjää paikkaa (siihen voidaan tallentaa normaalisti) Haussa poistettu paikka hypätään yli ja etsintää jatketaan (sillä paikan jälkeen voi olla vielä saman listan alkioita) Algoritmit 2 Kevät 2017 Luento 4 Ke 22.3.2017 11/30
Avoin osoitteenmuodostus Etu: Ei tarvita aputilaa (lineaarisia listoja) Haitta: Kun taulukko alkaa täyttyä, hakemisto tulee lähes käyttökelvottomaksi Lineaarinen etsintä voi aiheuttaa ensisijaista kasautumista: Taulukkoon tulee pitkiä yhtenäisiä täytettyjä osia Algoritmit 2 Kevät 2017 Luento 4 Ke 22.3.2017 12/30
Avoin osoitteenmuodostus Neliöllinen etsintä: Hajautusfunktio yleisesti muotoa h(k, i) = (h(k) + c 1 i + c 2 i 2 ) mod m missä c 1 ja c 2 sopivia vakioita Esimerkiksi h(k, i) = (h(k) + i 2 ) mod m Vähentää ensisijaista kasautumista Mutta voi esiintyä toissijaista kasautumista: Käydään aina läpi samat alkioketjut Algoritmit 2 Kevät 2017 Luento 4 Ke 22.3.2017 13/30
Avoin osoitteenmuodostus Kaksoishajautus: Kaksi eri hajautusfunktiota h 1 ja h 2 Hajautusfunktio yleisesti muotoa h(k, i) = (h 1 (k) + i h 2 (k)) mod m Funktio h 2 ei saa saada arvoa 0 Esimerkiksi h 2 (k) = q (k mod q) missä q on alkuluku ja q < m Algoritmit 2 Kevät 2017 Luento 4 Ke 22.3.2017 14/30
Hajautus Avoin hajautus: Ehdoton maksimi alkioiden lukumäärälle hajautustaulukon koko Lineaarinen etsintä: Oletetaan, että hajautus tapahtuu tasaisesti Haettava alkio taulukossa Tutkitaan keskimäärin (1 + 1/(1 n/m))/2 alkiota Haettava alkio ei taulukossa Tutkitaan keskimäärin (1 + 1/(1 n/m) 2 )/2 alkiota Jos täyttösuhde yli 0.75, avoin hajautus ei toimi enää hyvin Algoritmit 2 Kevät 2017 Luento 4 Ke 22.3.2017 15/30
Hajautus Ketjutus lineaarisilla listoilla: Oletetaan, että hajautus tapahtuu tasaisesti Yhteen kotiosoitteeseen hajautuu keskimäärin n/m alkiota Lisäys, poisto ja haku voidaan tehdä keskimäärin ajassa Θ(1 + n/m) Mutta: Pahimmassa tapauksessa kaikki alkiot hajautuvat samaan paikkaan Aikavaativuus Θ(n) Algoritmit 2 Kevät 2017 Luento 4 Ke 22.3.2017 16/30
Hajautusfunktiot Ihanteellinen hajautuminen: Hajautuminen samalla todennäköisyydellä mihin tahansa hajautustaulukon paikkaan Alkioiden jakautuminen noudattaa likimäärin Poissonin jakaumaa Voidaan laskea hajautumisen ja yhteentörmäysten todennäköisyyksiä Esimerkiksi: Jos täyttösuhde 1, niin noin 37 %:iin paikoista ei hajaudu mikään avain (joten muihin paikkoihin hajautuu useampia) Algoritmit 2 Kevät 2017 Luento 4 Ke 22.3.2017 17/30
Hajautusfunktiot Universaali hajautus: Avaimet kokonaislukuja väliltä [0, T 1] Hajautusfunktiot h : [0, T 1] [0, m 1] Hajautusfunktioiden perhe (joukko) H Perhe H on universaali, jos mille tahansa j, k [0, T 1] ja satunnaiselle h H on Pr(h(j) = h(k)) 1/m Hajautusfunktio valitaan satunnaisesti universaalista perheestä H Algoritmit 2 Kevät 2017 Luento 4 Ke 22.3.2017 18/30
Hajautusfunktiot Universaali hajautus: Valittuna n avainta, valitaan uusi avain j Odotettavissa olevien yhteentörmäysten määrä j:n ja aikaisempien avaimien kesken enintään n/m Esimerkki: p alkuluku, T p < 2T, 0 < a < p, 0 b < p Silloin perhe H, joka koostuu muotoa h a,b (k) = ((ak + b) mod p) mod m olevista hajautusfunktioista, on universaali Algoritmit 2 Kevät 2017 Luento 4 Ke 22.3.2017 19/30
Hajautusfunktiot Täydellinen hajautusfunktio: Ei lainkaan yhteentörmäyksiä Mahdollista vain, jos tunnetaan etukäteen tallennettavien alkioiden avaimet Minimaalinen täydellinen hajautusfunktio: Edellisen lisäksi hajautustaulukon koko sama kuin tallennettavien alkioiden määrä Algoritmit 2 Kevät 2017 Luento 4 Ke 22.3.2017 20/30
Puurakenteet 7 Yleinen puu: Juurisolmu, jolla alipuita Alipuut yleisiä puita Puu voi olla tyhjä Algoritmit 2 Kevät 2017 Luento 4 Ke 22.3.2017 21/30
Puurakenteet 7 7 Binääripuu: Erikoistapaus yleisestä puusta Solmuilla kaksi alipuuta, vasen ja oikea Puu voi olla tyhjä Algoritmit 2 Kevät 2017 Luento 4 Ke 22.3.2017 22/30
Puihin liittyviä termejä Solmun alipuiden juurisolmut ovat solmun lapsia (jälkeläisiä) Solmu on lastensa vanhempi Saman solmun lapset ovat sisaruksia Solmun edeltäjiä ovat solmun vanhempi, tämän vanhempi jne. Solmun seuraajia ovat solmun lapset, näiden lapset jne. Lapseton solmu on lehtisolmu Muut kuin lehtisolmut ovat haarautumissolmuja (sisäsolmuja) Algoritmit 2 Kevät 2017 Luento 4 Ke 22.3.2017 23/30
Solmujen järjestys Yleisesti lapsisolmuille ei välttämättä tarvita järjestystä Käytännössä kuitenkin joku järjestys määritellään Solmujen läpikäynti jossain yksikäsitteisessä järjestyksessä vaatii, että lapsisolmujen järjestys määritelty yksikäsitteisesti Algoritmit 2 Kevät 2017 Luento 4 Ke 22.3.2017 24/30
Solmujen läpikäynti Etenevä järjestys, esijärjestys (preorder): Käsitellään juurisolmu Käsitellään alipuut etenevässä järjestyksessä Takeneva järjestys, jälkijärjestys (endorder, postorder): Käsitellään alipuut takenevassa järjestyksessä Käsitellään juurisolmu Algoritmit 2 Kevät 2017 Luento 4 Ke 22.3.2017 25/30
Solmujen läpikäynti Binääripuille voidaan määritellä myös: Sisäjärjestys (inorder): Käsitellään vasen alipuu sisäjärjestyksessä Käsitellään juurisolmu Käsitellään oikea alipuu sisäjärjestyksessä Algoritmit 2 Kevät 2017 Luento 4 Ke 22.3.2017 26/30
Puun toteutus Dynaamisesti: Solmussa osoittimet kaikkiin lapsiin (lapsien lukumäärä yleensä rajoitettu) Mahdollisesti osoitin solmun vanhempaan Mahdollisesti kytketään saman solmun lapset renkaaksi (osoitin seuraavaan sisarukseen) Algoritmit 2 Kevät 2017 Luento 4 Ke 22.3.2017 27/30
Puun toteutus Taulukolla: Tallennetaan solmut etenevässä järjestyksessä Jokaiselle solmulle lisätiedot: Onko nuorempia sisaruksia Onko lapsia Tai: Montako lasta solmulla on Algoritmit 2 Kevät 2017 Luento 4 Ke 22.3.2017 28/30
Yleinen puu binääripuuksi Lapsisolmut järjestetty vasemmalta oikealle (vanhimmasta nuorimpaan) Solmun vasen alipuu: Vanhin lapsi, jos solmulla on lapsia null, jos solmulla ei lapsia Solmun oikea alipuu: Seuraavaksi nuorin sisarus, jos solmulla on sellainen null, jos nuorempaa sisarusta ei ole Algoritmit 2 Kevät 2017 Luento 4 Ke 22.3.2017 29/30
Esimerkki 11 21 22 23 31 32 33 34 35 11 21 31 22 32 23 33 34 35 Algoritmit 2 Kevät 2017 Luento 4 Ke 22.3.2017 30/30