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 To 21.3.2019 2/33
Hajautus Tallennettavia alkioita n Taulukon koko m Hajautusfunktio h : {mahdolliset avaimet} {0, 1,..., m 1} Avainta k vastaavan alkion indeksi on h(k) (avaimen k kotiosoite) Mahdollisia avaimia paljon enemmän kuin m Usealla avaimella on sama kotisoite Algoritmit 2 Kevät 2019 Luento 4 To 21.3.2019 3/33
Hajautus Yhteentörmäys: Jos k 1 k 2, mutta h(k 1 ) = h(k 2 ) Sanotaan, että k 1 ja k 2 ovat synonyymejä Synonyymeja vastaavia alkioita ei voida tallentaa kaikkia samaan muistipaikkaan Yhteentörmäykset täytyy käsitellä jotenkin Algoritmit 2 Kevät 2019 Luento 4 To 21.3.2019 4/33
Hajautusfunktio Hyvä hajautusfunktio: Mahdollisimman vähän yhteentörmäyksiä Jos tallennettavien alkioiden avaimia ei tunneta etukäteen, yhteentörmäyksiä ei voi välttää Hajauttaa alkiot tasaisesti taulukkoon Vaikea toteuttaa, jos tallennettavien alkioiden avaimien jakaumaa ei tunneta etukäteen Helppo laskea Helppo ohjelmoida, nopea laskea (mielellään vakioaikainen Θ(1)) Algoritmit 2 Kevät 2019 Luento 4 To 21.3.2019 5/33
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 2019 Luento 4 To 21.3.2019 6/33
Avoin osoitteenmuodostus Alkiot tallennetaan suoraan hajautustaulukkoon Samaan kotiosoitteeseen hajautuu useita avaimia Alkioille täytyy määrittää muu paikka taulukossa Paikka riippuu avaimen lisäksi myös siitä, mitkä paikat taulukossa ovat vielä tyhjiä Tallennettavia alkioita n, hajautustaulukon koko m (oltava m n) Täyttösuhde: n/m Algoritmit 2 Kevät 2019 Luento 4 To 21.3.2019 7/33
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 taulukkoindeksin laskennan yhteydessä Algoritmit 2 Kevät 2019 Luento 4 To 21.3.2019 8/33
Avoin osoitteenmuodostus Alkiot lisätään ensimmäiseen hajautusfunktion antamaan tyhjään paikkaan Samaan kotiosoitteeseen liittyvät alkiot muodostavat alkioketjun, joka päättyy tyhjään paikkaan Haku: Riittää käydä läpi alkion avainta vastaava alkioketju Poisto: Merkitään paikka poistetuksi (ei siirrellä alkioita) Lisäyksessä kuin mikä tahansa tyhjä paikka Haussa hypätään yli ja hakua jatketaan (sillä haettava alkio voi olla alkioketjussa vasta sen jälkeen) Algoritmit 2 Kevät 2019 Luento 4 To 21.3.2019 9/33
Avoin osoitteenmuodostus Eräs ratkaisu: Määritellään kaksi erityyppistä tyhjää Vapaa: Paikka, jossa ei vielä ole ollut yhtään alkiota Poistettu: Paikka, jossa on ollut ainakin yksi alkio, mutta tällä hetkellä tyhjä Vapaat ja poistetut paikat täytyy pystyä tunnistamaan Algoritmit 2 Kevät 2019 Luento 4 To 21.3.2019 10/33
Avoin osoitteenmuodostus Alkion haku: 1. Hajautetaan haettavan alkion avain k indeksiksi h(k) väliltä [0, m 1] 2. Etsitään alkio: Käydään läpi paikat h(k, i), i = 0, 1, 2,..., kunnes avainta k vastaava alkio löytyy Jos vastaan tulee vapaa paikka, alkiota ei ole Jos taulukko täynnä, vapaata paikkaa ei ole Etsintä voidaan lopettaa viimeistään sitten kun kaikki paikat on käyty läpi Algoritmit 2 Kevät 2019 Luento 4 To 21.3.2019 11/33
Avoin osoitteenmuodostus Alkion lisäys: 1. Hajautetaan lisättävän alkion avain k indeksiksi h(k) väliltä [0, m 1] 2. Etsitään paikka: Käydään läpi paikat h(k, i), i = 0, 1, 2,..., kunnes löytyy vapaa tai poistettu paikka Tallennetaan alkio löydettyyn paikkaan Jos paikkaa ei löydy, alkiota ei voi lisätä Jos halutaan alkioiden yksikäsitteisyys: Tutkitaan ennen lisäystä, onko avainta k vastaava alkio jo tallennettuna Algoritmit 2 Kevät 2019 Luento 4 To 21.3.2019 12/33
Avoin osoitteenmuodostus Alkion poisto: 1. Hajautetaan poistettavan alkion avain k indeksiksi h(k) väliltä [0, m 1] 2. Etsitään alkio: Käydään läpi paikat h(k, i), i = 0, 1, 2,..., kunnes avainta k vastaava alkio löytyy Merkitään paikka poistetuksi Jos vastaan tulee vapaa paikka, alkiota ei ole Etsintä voidaan lopettaa viimeistään sitten kun kaikki paikat on käyty läpi Algoritmit 2 Kevät 2019 Luento 4 To 21.3.2019 13/33
Avoin osoitteenmuodostus Lineaarinen etsintä voi aiheuttaa ensisijaista kasautumista: Hajautustaulukkoon muodostuu pitkiä yhtenäisiä täytettyjä osia Jos jokin avain hajautuu yhtenäisen osan alkuun, vastaavan alkion lisääminen aiheuttaa koko yhtenäisen osan tutkimisen Algoritmit 2 Kevät 2019 Luento 4 To 21.3.2019 14/33
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: Sama kotiosoite Käydään läpi sama alkioketju Algoritmit 2 Kevät 2019 Luento 4 To 21.3.2019 15/33
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 2019 Luento 4 To 21.3.2019 16/33
Huomioita hajautuksesta Avoin osoitteenmuodostus: Ei tarvita erillisiä lineaarisia listoja Ehdoton maksimi alkioiden lukumäärälle hajautustaulukon koko Kun taulukko alkaa täyttyä, hakemiston käytettävyys heikkenee Algoritmit 2 Kevät 2019 Luento 4 To 21.3.2019 17/33
Huomioita hajautuksesta Avoin osoitteenmuodostus ja 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 osoitteenmuodostus ei toimi enää kovin hyvin Algoritmit 2 Kevät 2019 Luento 4 To 21.3.2019 18/33
Huomioita hajautuksesta Ketjutus lineaarisilla listoilla: Oletetaan, että hajautus tapahtuu tasaisesti Yhteen kotiosoitteeseen hajautuu keskimäärin n/m alkiota Haussa tutkitaan keskimäärin 1 + n/m alkiota Mutta: Pahimmassa tapauksessa kaikki alkiot hajautuvat samaan paikkaan Tutkitaan n:n pituinen lista kokonaan Algoritmit 2 Kevät 2019 Luento 4 To 21.3.2019 19/33
Hajautusfunktiot Ihanteellinen hajautuminen: Hajautuminen samalla todennäköisyydellä mihin tahansa hajautustaulukon paikkaan Alkioiden jakautuminen noudattaa likimäärin Poissonin jakaumaa Voidaan analysoida hajautusta ja yhteentörmäysten todennäköisyyksiä Esimerkiksi: Jos täyttösuhde on 1, noin 37 %:iin paikoista ei hajaudu yhtään avainta Vastaavasti muihin paikkoihin hajautuu useampia Algoritmit 2 Kevät 2019 Luento 4 To 21.3.2019 20/33
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 millä tahansa j, k [0, T 1], j k, ja satunnaisella h H on voimassa Pr( h(j) = h(k) ) 1/m Hajautusfunktio valitaan satunnaisesti universaalista perheestä H Algoritmit 2 Kevät 2019 Luento 4 To 21.3.2019 21/33
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 2019 Luento 4 To 21.3.2019 22/33
Hajautusfunktiot Täydellinen hajautusfunktio: Ei lainkaan yhteentörmäyksiä Minimaalinen täydellinen hajautusfunktio: Lisäksi hajautustaulukon koko sama kuin tallennettavien alkioiden lukumäärä Mahdollista vain jos tunnetaan etukäteen tallennettavien alkioiden avaimet Algoritmit 2 Kevät 2019 Luento 4 To 21.3.2019 23/33
Puurakenteet 7 Yleinen puu: Äärellinen joukko solmuja Puu voi olla tyhjä Epätyhjässä puussa juurisolmu, jolla 0 tai useampia alipuita Alipuut epätyhjiä yleisiä puita Algoritmit 2 Kevät 2019 Luento 4 To 21.3.2019 24/33
Puurakenteet 7 7 Binääripuu: Erikoistapaus yleisestä puusta Solmuilla kaksi alipuuta, vasen ja oikea Algoritmit 2 Kevät 2019 Luento 4 To 21.3.2019 25/33
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 2019 Luento 4 To 21.3.2019 26/33
Solmujen järjestys Yleisesti lapsisolmuille ei välttämättä tarvita järjestystä Käytännössä kuitenkin joku järjestys määritellään Vasemmanpuoleisin lapsisolmu vanhin, oikeanpuoleisin lapsisolmu nuorin Solmujen läpikäynti jossain yksikäsitteisessä järjestyksessä vaatii, että lapsisolmujen järjestys määritelty yksikäsitteisesti Algoritmit 2 Kevät 2019 Luento 4 To 21.3.2019 27/33
Solmujen läpikäynti Yleisille puille voidaan määritellä: Esijärjestys (preorder): Käsitellään juurisolmu Käsitellään alipuut esijärjestyksessä Jälkijärjestys (postorder): Käsitellään alipuut jälkijärjestyksessä Käsitellään juurisolmu Algoritmit 2 Kevät 2019 Luento 4 To 21.3.2019 28/33
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 2019 Luento 4 To 21.3.2019 29/33
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 2019 Luento 4 To 21.3.2019 30/33
Puun toteutus Taulukolla: Tallennetaan solmut esijärjestyksessä Jokaiselle solmulle lisätieto: Montako lasta solmulla on Tai kaksi lisätietoa: Onko nuorempia sisaruksia Onko lapsia Algoritmit 2 Kevät 2019 Luento 4 To 21.3.2019 31/33
Yleinen puu binääripuuksi Lapsisolmut järjestetty vasemmalta oikealle (vanhimmasta nuorimpaan) Solmun vasemmaksi lapseksi: Vanhin lapsi, jos solmulla on lapsia null, jos solmulla ei ole lapsia Solmun oikeaksi lapseksi: Seuraavaksi nuorin sisarus, jos solmulla on sellainen null, jos nuorempaa sisarusta ei ole Algoritmit 2 Kevät 2019 Luento 4 To 21.3.2019 32/33
Esimerkki 11 21 22 23 31 32 33 34 35 11 21 31 22 32 23 33 34 35 Algoritmit 2 Kevät 2019 Luento 4 To 21.3.2019 33/33