Tietorakenteet ja algoritmit Hakurakenteet Ari Korhonen

Samankaltaiset tiedostot
Tietorakenteet ja algoritmit Hakurakenteet Ari Korhonen

A TIETORAKENTEET JA ALGORITMIT

Hakupuut. tässä luvussa tarkastelemme puita tiedon tallennusrakenteina

v 1 v 2 v 3 v 4 d lapsisolmua d 1 avainta lapsen v i alipuun avaimet k i 1 ja k i k 0 =, k d = Sisäsolmuissa vähint. yksi avain vähint.

AVL-puut. eräs tapa tasapainottaa binäärihakupuu siten, että korkeus on O(log n) kun puussa on n avainta

Algoritmit 1. Luento 7 Ti Timo Männikkö

Lisää segmenttipuusta

Algoritmit 2. Luento 2 To Timo Männikkö

3. Hakupuut. B-puu on hakupuun laji, joka sopii mm. tietokantasovelluksiin, joissa rakenne on talletettu kiintolevylle eikä keskusmuistiin.

Algoritmit 2. Luento 2 Ke Timo Männikkö

Tehtävän V.1 ratkaisuehdotus Tietorakenteet, syksy 2003

Binäärihaun vertailujärjestys

TKT20001 Tietorakenteet ja algoritmit Erilliskoe , malliratkaisut (Jyrki Kivinen)

B + -puut. Kerttu Pollari-Malmi

Kierros 4: Binäärihakupuut

CS-A1140 Tietorakenteet ja algoritmit

14 Tasapainotetut puurakenteet

Algoritmit 2. Luento 6 To Timo Männikkö

Algoritmit 2. Luento 5 Ti Timo Männikkö

Algoritmit 2. Luento 6 Ke Timo Männikkö

Algoritmit 2. Luento 5 Ti Timo Männikkö

Algoritmit 2. Luento 7 Ti Timo Männikkö

7. Tasapainoitetut hakupuut

Algoritmit 2. Luento 3 Ti Timo Männikkö

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

Algoritmit 2. Luento 3 Ti Timo Männikkö

1.1 Tavallinen binäärihakupuu

Algoritmit 1. Luento 8 Ke Timo Männikkö

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

1.1 Pino (stack) Koodiluonnos. Graafinen esitys ...

lähtokohta: kahden O(h) korkuisen keon yhdistäminen uudella juurella vie O(h) operaatiota vrt. RemoveMinElem() keossa

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

Algoritmit 1. Luento 12 Ti Timo Männikkö

Algoritmit 2. Luento 8 Ke Timo Männikkö

Luku 8. Aluekyselyt. 8.1 Summataulukko

Aluksi Kahden muuttujan lineaarinen epäyhtälö

Tietorakenteet ja algoritmit Johdanto Lauri Malmi / Ari Korhonen

Algoritmit 2. Luento 4 To Timo Männikkö

10. Painotetut graafit

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

Algoritmit 1. Luento 12 Ke Timo Männikkö

Tietorakenteet ja algoritmit. Hajautus. Ari Korhonen Tietorakenteet ja algoritmit - syksy

Tietorakenteet ja algoritmit - syksy

58131 Tietorakenteet (kevät 2008) 1. kurssikoe, ratkaisuja

Tietorakenteet, laskuharjoitus 7, ratkaisuja

4. Joukkojen käsittely

Johdatus diskreettiin matematiikkaan Harjoitus 7,

Algoritmit 2. Luento 4 Ke Timo Männikkö

6. Sanakirjat. 6. luku 298

Algoritmi on periaatteellisella tasolla seuraava:

Tietorakenteet ja algoritmit Puurakenteet Ari Korhonen

58131 Tietorakenteet (kevät 2009) Harjoitus 6, ratkaisuja (Antti Laaksonen)

Algoritmit 2. Luento 9 Ti Timo Männikkö

Algoritmit 1. Luento 6 Ke Timo Männikkö

811312A Tietorakenteet ja algoritmit, , Harjoitus 5, Ratkaisu

Algoritmit ja tietorakenteet Copyright Hannu Laine. 1, kun n= 0. n*(n-1)!, kun n>0;

Algoritmit 1. Luento 5 Ti Timo Männikkö

4 Tehokkuus ja algoritmien suunnittelu

2. Seuraavassa kuvassa on verkon solmujen topologinen järjestys: x t v q z u s y w r. Kuva 1: Tehtävän 2 solmut järjestettynä topologisesti.

Luku 7. Verkkoalgoritmit. 7.1 Määritelmiä

Luonnollisten lukujen laskutoimitusten määrittely Peanon aksioomien pohjalta

Matematiikan tukikurssi

Luento 6. June 1, Luento 6

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

Algoritmit 1. Luento 9 Ti Timo Männikkö

Algoritmit 1. Luento 13 Ti Timo Männikkö

ALGORITMIT 1 DEMOVASTAUKSET KEVÄT 2012

811312A Tietorakenteet ja algoritmit, , Harjoitus 7, ratkaisu

D B. Harvat hakemistot. Harvat hakemistot

811312A Tietorakenteet ja algoritmit V Hash-taulukot ja binääriset etsintäpuut

811312A Tietorakenteet ja algoritmit Kertausta jälkiosasta

Miten käydä läpi puun alkiot (traversal)?

811312A Tietorakenteet ja algoritmit, , Harjoitus 5, Ratkaisu

Tietorakenteet, laskuharjoitus 6,

Ohjelmoinnin peruskurssi Y1

Datatähti 2019 loppu

Epäyhtälön molemmille puolille voidaan lisätä sama luku: kaikilla reaaliluvuilla a, b ja c on voimassa a < b a + c < b + c ja a b a + c b + c.

Käyttöjärjestelmät: Virtuaalimuisti

A TIETORAKENTEET JA ALGORITMIT

811312A Tietorakenteet ja algoritmit II Perustietorakenteet

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

58131 Tietorakenteet ja algoritmit (syksy 2015) Toinen välikoe, malliratkaisut

5. Keko. Tietorakenne keko eli kasa (heap) on tehokas toteutus abstraktille tietotyypille prioriteettijono, jonka operaatiot ovat seuraavat:

A TIETORAKENTEET JA ALGORITMIT

Tiraka, yhteenveto tenttiinlukua varten

Induktio kaavan pituuden suhteen

Algoritmit 1. Luento 3 Ti Timo Männikkö

Ohje hakulomakkeen täyttämiseen yliopistohaku.fi -palvelussa

Oletetaan, että funktio f on määritelty jollakin välillä ]x 0 δ, x 0 + δ[. Sen derivaatta pisteessä x 0 on

A TIETORAKENTEET JA ALGORITMIT KORVAAVAT HARJOITUSTEHTÄVÄT 3, DEADLINE KLO 12:00

811312A Tietorakenteet ja algoritmit, VI Algoritmien suunnitteluparadigmoja

811312A Tietorakenteet ja algoritmit III Lajittelualgoritmeista

Diskreetit rakenteet

Luku 4. Tietorakenteet funktio-ohjelmoinnissa. 4.1 Äärelliset kuvaukset

Kysymyksiä koko kurssista?

3. Binääripuu, Java-toteutus

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

1 Erilaisia tapoja järjestää

TKHJ:ssä on yleensä komento create index, jolla taululle voidaan luoda hakemisto

58131 Tietorakenteet Erilliskoe , ratkaisuja (Jyrki Kivinen)

Transkriptio:

Tietorakenteet ja algoritmit Hakurakenteet Ari Korhonen 27.10. & 3.11.2015 Tietorakenteet ja algoritmit - syksy 2014 1

8. HAKURAKENTEET (dictionaries) 8.1 Haku (vrt. sanakirjahaku) 8.2 Listat tallennusrakenteina 8.3 Taulukko tallennusrakenteena 8.4 Binäärinen hakupuu 8.5 Tasapainotetut hakupuut (balanced search trees) 8.6 Digitaaliset avaimet 27.10. & 3.11.2015 Tietorakenteet ja algoritmit - syksy 2014 2

8.1 Haku (vrt. sanakirjahaku) Haku on tietojenkäsittelyn perusongelmia, joka voidaan määritellä seuraavasti: Tiedot on esitetty tietorakenteessa, joka koostuu tietueista Kussakin tietueessa on avain (key), jonka avulla se voidaan tunnistaa. Tietueessa on lisäksi dataa tai osoitin/osoittimia dataan Haussa pyritään löytämään tietorakenteesta kaikki tietueet, joilla on annettu avain Ongelmaan tunnetaan ratkaisuina erilaisia hakurakenteita Hakurakenteisiin liittyy lisäysten, poistojen ja päivitysten tekeminen tietorakenteeseen 27.10. & 3.11.2015 Tietorakenteet ja algoritmit - syksy 2014 3

Joitakin sovellusalueita: yksinkertaiset kortistot tietokantojen hakemistot tiedostorakenteet CAD Symbolitaulut nimi puhelin sähköposti osoite postinro... Hakurakenteita (indeksejä) voi olla useita samaan 5edostoon! 27.10. & 3.11.2015 Tietorakenteet ja algoritmit - syksy 2014 4

Käsiteltävät hakurakenteet voidaan rinnastaa myös alkeellisiin tietokantoihin: vain yksi hakuavain vain yksi käyttäjä ei suojaus- eikä toipumismekanismeja ei yhtenäisyystarkistusta näihin ja muihin asioihin palataan kurssilla Tietokannat Käytännön tietokannoissa nyt käsiteltävät asiat liittyvät indeksien toteutukseen. 27.10. & 3.11.2015 Tietorakenteet ja algoritmit - syksy 2014 5

Esimerkkejä käytännön hakuongelmista: Hae taulukosta annettu alkio Hae elektronisen sanakirjan sana Hae pankkitilin saldo Hae opintosuoritusrekisteristä opiskelijan suoritustiedot Hae opintosuoritusrekisteristä tietyn kurssin suorittaneiden opiskelijoiden nimet Rajataan kurssin ulkopuolelle: Hae ne artikkelit, joissa esiintyy tämä hakusana (web-haut, tekstitietokannat) Spatiaaliset tietorakenteet (moniulotteiset avaimet) Esim. Hae ravintolat, jotka ovat sinusta korkeintaan 200 metrin päässä. 27.10. & 3.11.2015 Tietorakenteet ja algoritmit - syksy 2014 6

Etsintää varten on hyödyllistä määritellä abstrakti tietotyyppi hakurakenne (dictionary), johon liittyy ainakin seuraavia yleisiä toimintoja: Hae avainta vastaava(t) tietue(et) Lisää uusi tietue Poista avainta vastaava(t) tietue(et) Hae tietue, jolla on lähinnä seuraava / edellinen avainarvo (naapurikysely, neighbour query) Hae tietueet, joiden avainarvo on tietyllä välillä (aluekysely, range query) Lisäys ja poisto sisältävät yleensä osanaan hakutoiminnon 27.10. & 3.11.2015 Tietorakenteet ja algoritmit - syksy 2014 7

Muita toimintoja, joita voidaan tarvita: Tulosta hakurakenteessa olevat tietueet avainten mukaisessa järjestyksessä Yhdistä kaksi hakurakennetta Rakenteessa olevat duplikaatit (duplicates) eli tietueet, joilla on sama avainarvo voidaan käsitellä eri tavoin: kukin erillisenä tietueena yksi tietue ja siitä lähtevä osoitin toiseen rakenteeseen yksi tietue ja siinä laskuri (jos ainoastaan duplikaattien määrä merkitsee) 27.10. & 3.11.2015 Tietorakenteet ja algoritmit - syksy 2014 8

Hakurakenne voidaan implementoida hyvin monella tavalla. Asiaan liittyviä näkökulmia ovat ainakin: tiedon määrä hakuihin, lisäyksiin ja poistoihin liittyvät aikavaatimukset (yleisimmät operaatiot) lisäysten ja poistojen määrä (suhteessa hakuihin) tarvitaanko erityyppisiä hakuavaimia? tarvitaanko operaatioita, joissa tietoa käsitellään järjestyksessä? talletetaanko rakenne keskusmuistiin vai massamuistiin? menetelmän yksinkertaisuus/monimutkaisuus 27.10. & 3.11.2015 Tietorakenteet ja algoritmit - syksy 2014 9

8.2 Linkitetyt listat hakurakenteina Joukko yksinkertaisia hakurakenteita, joille on yhteistä seuraavat asiat: Hakuoperaatio on lineaarinen, mistä syystä rakenne soveltuu vain pieniin sovelluksiin (N < 100) Tietueiden lisäykset ja poistot haun jälkeen (kun tietueen paikka rakenteessa tiedetään) ovat nopeita, mutta hakuoperaation suoritusaika on hallitseva Voidaan toteuttaa dynaamisena rakenteena tai taulukoilla L I S T data next head z L I T S I S 2 1 6 1 1 3 7 4 0 1 2 3 4 5 6 7 27.10. & 3.11.2015 Tietorakenteet ja algoritmit - syksy 2014 10

Muunnelmia: 1. Järjestämätön lista onnistunut haku: O(N), N/2 epäonnistunut haku: O(N), N lisäys: O(1) poisto: haku + O(1) = O(N) 2. Järjestetty lista onnistunut haku: O(N), N/2 epäonnistunut haku: O(N), N/2 lisäys: haku + O(1) = O(N) poisto: haku + O(1) = O(N) 27.10. & 3.11.2015 Tietorakenteet ja algoritmit - syksy 2014 11

3. Aktiviteetin mukaan järjestetty lista Jos avainten hakufrekvenssit poikkeavat toisistaan paljon, lista voidaan järjestää hakutilaston mukaan => Painotettu keskimääräinen hakuaika lyhenee Jos hakutilasto tunnetaan ennakolta, lista järjestetään alunperin sen mukaan Muutoin voidaan toteuttaa itsejärjestyvä lista (selfadjusting list): ü Jokainen haku siirtää alkiota pykälän edemmäksi Tai Kysymys: Onko tällä virityksellä käytännön merkitystä? ü Haettu alkio siirretään listan alkuun 27.10. & 3.11.2015 Tietorakenteet ja algoritmit - syksy 2014 12

8.3 Taulukko tallennusrakenteena Yksinkertainen hakurakenne, jolla on seuraavia ominaisuuksia: Järjestetyssä taulukossa haku voidaan toteuttaa erittäin tehokkaasti suurillakin tietomäärillä Lisäykset ja poistot ovat raskaita operaatioita, O(N) => Jos paljon muutoksia, ei taulukkoa kannata käyttää Ongelmaa voidaan hieman kiertää lazy deletion menetelmällä, (ei varsinaisesti poisteta alkiota, vaan merkitään se mitättömäksi) Jos taulukko ei ole järjestyksessä, sitä ei kannata käyttää hakurakenteena 27.10. & 3.11.2015 Tietorakenteet ja algoritmit - syksy 2014 13

Hakumenetelmät järjestetyssä taulukossa: Lineaarinen haku (linear search) Haetaan taulukon alusta lähtien, kunnes alkio löytyy, tai sen paikka on ohitettu Tehokkuus O(N) Binäärihaku (binary search): Tutkittava alue jaetaan kahtia, katsotaan kummassa puoliskossa tieto on ja jatketaan hakua tässä puoliskossa. Vrt. yhtälön numeerinen ratkaisu puolitusmenetelmällä Tehokkuus O(log N) Esim. N = 1 000 000 alkiosta tieto löytyy 21 askeleella 27.10. & 3.11.2015 Tietorakenteet ja algoritmit - syksy 2014 14

#define N 1000 int a[n];... int binary_search(int key) { int left, right, probe; left = 0; right = N-1; do { probe = (left + right)/2; if (key < a[probe]) right = probe - 1; else left = probe + 1; } while ((key!= a[probe]) && (left <= right) ); } if (key == a[probe]) return probe; else return = -1; 27.10. & 3.11.2015 Tietorakenteet ja algoritmit - syksy 2014 15

Interpolaatiohaku Kehittyneempi menetelmä, jossa käytetään hyväksi tietoa tiedon jakaumasta. Puolitushaussa uusi hakupaikka lasketaan kaavalla: probe = left + right - left 2 Interpolaatiohaussa pyritään laskemaan, mistä alkiota kannattaa hakea (jakolasku katkaiseva DIV): probe = left + (what - a[left].key) * (right - left) a[right].key - [left].key 27.10. & 3.11.2015 Tietorakenteet ja algoritmit - syksy 2014 16

Interpolaatiohaku... Tehokkuus O(log (log N)), jos avainten jakauma on Huom. kohtalaisen tasainen Algoritmi soveltuu käytännössä vain kokonaislukuavaimille. Merkkijonoilla interpolaation laskeminen on raskasta Toteutus edellyttää huolellista testaamista (algoritmin tulisi toimia, vaikka jakauma ei olekaan oletetunlainen) 27.10. & 3.11.2015 Tietorakenteet ja algoritmit - syksy 2014 17

8.4 Binäärinen hakupuu (binary search tree) Binääripuu, joka on järjestetty sopivasti: Kunkin solmun vasemmassa lapsessa olevat alkiot pienempiä kuin solmu itse Oikealla puolella olevat lapset suurempia kuin solmu itse Jos puussa on duplikaatteja, ne ovat aina vain toisessa haarassa, esim. oikealla puolella K E S C G R U A J T X I 27.10. & 3.11.2015 Tietorakenteet ja algoritmit - syksy 2014 18

Lehtien lapsina voi olla NULL tai z-solmu Kannattaa käyttää myös Head-solmua, josta on osoitin juureen ja jonka avainarvo on pienempi kuin millään alkiolla puussa Head => Haun ja lisäyksen koodi yksinkertaistuu K4.4 27.10. & 3.11.2015 Tietorakenteet ja algoritmit - syksy 2014 19

8.4.1 Alkion haku: Edetään juuresta käsin alaspäin kääntyen aina vasempaan tai oikeaan haaraan, kunnes avain löytyy Palautetaan osoitin tähän solmuun. Jos avainta ei löydy, palautetaan NULL tai z-solmu Käytettäessä z-solmua haettava alkio voidaan ensin tallettaa siihen, jolloin haku päättyy aina avaimen löytymiseen. Nyt täytyy vain tarkistaa, löytyikö alkio puusta vai z:sta. Jos duplikaatit on talletettu puuhun, ne haetaan jatkamalla siitä, mihin edellinen haku päättyi: item = find(data, head); next_item = find(data,item->right); - Tässä oletetaan, että duplikaatit tallennetaan oikealle 27.10. & 3.11.2015 Tietorakenteet ja algoritmit - syksy 2014 20

8.4.2 Alkion lisäys: 1) Etsitään rekursiivisesti oikea paikka uudelle alkiolle 2) Uusi alkio lisätään aina lehdeksi 3) Haun aikana täytyy säilyttää tieto siitä, minkä solmun alle haku päättyi. K Esim. Lisätään alkio D A C D E G I J R S T U X 27.10. & 3.11.2015 Tietorakenteet ja algoritmit - syksy 2014 21

8.4.3 Alkion poisto: Monimutkaisempi toimenpide, jossa useita eri tapauksia: a) Lehti voidaan poistaa suoraan b) Jos solmulla on yksi lapsi, solmun isä asetetaan osoittamaan tähän lapseen C E G R K R Esim. Poistetaan juuri K S U c) Jos solmulla on kaksi lasta (esimerkki): Etsitään lähinnä seuraavan (tai edellisen) avainarvon sisältävä solmu q Kopioidaan tiedot q:sta tuhottavaan solmuun A I J T X Poistetaan solmu q rekursiivisesti. Tällä on korkeintaan oikea (tai vasen) lapsi Toinen ratkaisu: Lazy deletion ja ajoittain puun uudelleen rakentaminen 27.10. & 3.11.2015 Tietorakenteet ja algoritmit - syksy 2014 22

Demo: https://trak.cs.hut.fi/static/ OpenDSA/Books/CSE-A1140/ html/bst.html#bst-analysis 27.10. & 3.11.2015 Tietorakenteet ja algoritmit - syksy 2014 23

Luentotehtävä: Lisää seuraavat alkiot järjestyksessä binääriseen hakupuuhun (duplikaatit oikealle) T I E T O R A K E N N E Poista sitten rakenteesta alkiot A, K ja I 27.10. & 3.11.2015 Tietorakenteet ja algoritmit - syksy 2014 24

8.4.4 Alkioiden haku järjestyksessä: Binäärisen hakupuun sisältö saadaan lajitellussa järjestyksessä käymällä puu läpi sisäjärjestyksessä 8.4.5 Tehokkuusominaisuuksia: Ideaalisessa binäärisessä hakupuussa kaikki operaatiot voidaan tehdä ajassa O(log N) Käytännössä puun kaikki haarat eivät ole yhtä pitkiä, jolloin hakuaika riippuu polun pituudesta Pahimmassa tilanteessa puu degeneroituu listaksi, jolloin hakuaika on O(N) 27.10. & 3.11.2015 Tietorakenteet ja algoritmit - syksy 2014 25

8.4.6 Analyysi: Teoreema: keskeisten operaatioiden (haku, lisäys, poisto, minimi, maksimi, seuraaja, edeltäjä) aikavaatimus binäärisessä hakupuussa on O(h), jossa h on solmun syvyys. Esim. haku: Pahin tapaus: h = N, jolloin pahimmassa tapauksessa hakuaika O(N) Paras tapaus: h = 1, jolloin parhaassa tapauksessa hakuaika O(1) Ideaalisessa tapauksessa puu tasapainossa: h = log(n) ja hakuaika O(log N) Keskimääräinen polun pituus: Oletus: kaikki puut yhtä todennäköisiä keskimääräinen hakuaika O(log N) 27.10. & 3.11.2015 Tietorakenteet ja algoritmit - syksy 2014 26

MUTTA... Delete-operaatioista johtuen kaikki puut eivät olekaan yhtä todennäköisiä Lisäysten ja poistojen vuorottelu johtaa pitkän päälle hakuaikaan O( N) Pahimmassa tapauksessa hakuaika on O(N). alkiot järjestyksessä alkiot käänteisessä järjestyksessä vuorottelevat avainarvot, esim. 1 19 2 18 3 17... sekvenssit, esim. 1 5 9 2 6 10 3 7 11 4 8 12... Nämä tapaukset voivat hyvin esiintyä käytännössä Hakuajat voivat venyä liian pitkiksi Ratkaisu: Hakupuuta muokataan siten, että se pysyy tasapainossa 27.10. & 3.11.2015 Tietorakenteet ja algoritmit - syksy 2014 27

8.6 Digitaaliset avaimet Etsintä perustuu suoraan avaimen esitysmuodon bitteihin, ei avainten keskinäiseen vertailuun A = 00001 S = 10011 E = 00101 R = 10010 C = 00011 H = 01000 I = 01001 N = 01110 Toteutus edellyttää tehokasta pääsyä bitti-informaatioon käsiksi 27.10. & 3.11.2015 Tietorakenteet ja algoritmit - syksy 2014 28

8.6.1 Digitaalinen hakupuu (digital search tree) Hakupuu, jossa haarautuminen tapahtuu avaimen bittien perusteella vasen = 0, oikea = 1 (tai päinvastoin) vertaillaan eniten merkitsevää bittiä ensin Jokainen taso alaspäin tarkoittaa seuraavaa bittiä Muutoin toiminta muistuttaa binääristä hakupuuta 27.10. & 3.11.2015 Tietorakenteet ja algoritmit - syksy 2014 29

0 A A = 001011 0 S 1 C = 001101 E = 001111 E 1 0 R H = 010010 R = 011100 C H S = 011101 27.10. & 3.11.2015 Tietorakenteet ja algoritmit - syksy 2014 30

Haku: 1. Aloitetaan juuresta ja eniten merkitsevästä bitistä 2. Jos avain on käsiteltävässä solmussa haku päättyy 3. Jos ei, edetään puussa nykyisen bitin perusteella 4. Siirrytään seuraavaan bittiin, jatketaan kohdasta 2 Lisäys: 1. Alkio lisätään aina puun lehdeksi 2. Haetaan lisättävän alkion paikka 3. Lisätään alkio lehtisolmun alle seuraavan bitin perusteella Poisto: Kuten binäärisessä hakupuussa E 0 1 C S 0 1 0 H R A A = 001011 C = 001101 E = 001111 H = 010010 R = 011100 S = 011101 Puussa ei voi olla duplikaatteja (käsitellään muutoin) 27.10. & 3.11.2015 Tietorakenteet ja algoritmit - syksy 2014 31

Worst case on bittien määrä O(b) Jos avaimet tasaisesti jakautuneet, keskimääräinen tehokkuus O(log N) Tasapainoisempi kuin vastaava binäärinen hakupuu ei voi degeneroitua listaksi, koska hakupolku voi olla vain bittien määrän pituinen Merkkijonoavaimet eivät ole suoraan käyttökelpoisia, koska ne ovat hyvin epätasaisesti jakautuneet Menetelmä voidaan yleistää muissakin kuin kantaluvussa 2 esitettyihin avaimiin (ks. LC-trie ja merkkijonopuu) 27.10. & 3.11.2015 Tietorakenteet ja algoritmit - syksy 2014 32

Luentotehtävä Jatka seuraavassa alkioiden lisäämistä digitaaliseen hakupuuhun. Alkiot A,B ja C on jo lisätty puuhun. Lisää seuraavaksi alkiot D,E,F,G,H,I,J,K,L ja M tässä järjestyksessä: Alkioiden bittiavaimet: A A: 001011! H: 010010! 0 1 B: 001100! I: 010011! C: 001101! B 001100 J: 010100! D: 001110! K: 010101! 0 1 E: 001111! L: 010110! C 001101 F: 010000! M: 010111! G: 010001!! 27.10. & 3.11.2015 Tietorakenteet ja algoritmit - syksy 2014 33

8.6.2 Radix search trie Digitaalisen hakupuun yhtenä puutteena on se, että siinä joudutaan vertailemaan koko avainta jokaisella askelella, vaikka eteneminen tapahtuu vain bittien perusteella. Idea: erotetaan etsintäpuu ja avaimet toisistaan Radix search trie : Hakupuussa on vain linkkejä bittien perusteella Tietueet ovat puun lehtinä Puun haarat ovat vain niin pitkiä, kuin on tarpeen avainten erottamiseksi toisistaan Puun muoto ei riipu avainten tallennusjärjestyksestä 27.10. & 3.11.2015 Tietorakenteet ja algoritmit - syksy 2014 34

0 1 0 0 1 0 1 1 0 H 1 0 1 A = 001011 C = 001101 E = 001111 H = 010010 A C 0 1 E R 0 0 1 S 1 R = 011100 S = 011101 27.10. & 3.11.2015 Tietorakenteet ja algoritmit - syksy 2014 35

Haku: Aloitetaan juuresta ja eniten merkitsevästä bitistä Edetään bitti kerrallaan puussa alaspäin kääntyen vasempaan tai oikeaan haaraan, kunnes kohdataan puun lehti Katsotaan, onko alkio lehdessä 0 1 0 1 0 0 1 1 0 H 1 0 1 A = 001011 C = 001101 E = 001111 H = 010010 A C 0 1 E R 0 0 1 S 1 R = 011100 S = 011101 27.10. & 3.11.2015 Tietorakenteet ja algoritmit - syksy 2014 36

Lisäys: 1) Haetaan alkion paikka bittien perusteella 2) Jos löydetty paikka oli tyhjä, lisätään alkio tähän kohtaan puun lehdeksi 3) Jos paikassa oli lehti, tästä tulee puun sisäsolmu ja sen alle rakennetaan alipuu tai alipuut sen mukaan, että lehdessä ollut avain ja lisättävä avain eroavat toisistaan 4) Luodaan uudet lehtisolmut, joihin entisen 3)-lehden avain ja lisättävä avain talletetaan 0 1 A = 001011 0 1 C = 001101 0 1 0 1 H E = 001111 0 1 0 1 H = 010010 0 1 A R = 011100 0 1 0 1 C E S = 011101 R S 27.10. & 3.11.2015 Tietorakenteet ja algoritmit - syksy 2014 37

Luentotehtävä Lisää alkiot A, B, C, D, E, F, G, H, I, J, K, L ja M tässä järjestyksessä tyhjään radix search trie- rakenteeseen: Alkioiden bittiavaimet: A: 001011! H: 010010! B: 001100! I: 010011! C: 001101! J: 010100! D: 001110! K: 010101! E: 001111! L: 010110! F: 010000! M: 010111! G: 010001!! 27.10. & 3.11.2015 Tietorakenteet ja algoritmit - syksy 2014 38

Poisto: 1) Etsi poistettava avain 2) Poista kyseinen lehtisolmu Jos lähin sisarus on myös lehtisolmu, lyhennä puuta sen osalta, kunnes ko. solmu eroaa vain yhden bitin mittaisen matkan jostakin puun muusta haarasta Tehokkuus: Average case: O(log N) Worst case: O(b) 27.10. & 3.11.2015 Tietorakenteet ja algoritmit - syksy 2014 39

Merkkijonopuu Kantalukuna merkistön koko, esim. { a, b, c } = 3 27.10. & 3.11.2015 Tietorakenteet ja algoritmit - syksy 2014 40

Patricia-puussa on ratkaistu radix search trien ongelma, että puussa voi olla pitkiä tyhjien linkkien ketjuja Solmuissa on tieto siitä, minkä bitin mukaan haarautuminen tapahtuu Toimii hyvin myös pitkillä avaimilla, koska itse avain testataan vain kerran ja biteistäkin vain osa 0 1 0 A 0 1 0 1 0 C 1 E 1 0 H 1 0 0 R 1 0 1 S 1 A = 001011 C = 001101 E = 001111 H = 010010 R = 011100 S = 011101 27.10. & 3.11.2015 Tietorakenteet ja algoritmit - syksy 2014 41

8.6.3 Variaatioita Polun pituutta voidaan pienentää, jos verrataan kerralla M bittiä. Puu koostuu silloin solmuista, joissa on 2 M haaraa Jos M suuri, puu on matala, mutta sen hyötysuhde on huono (paljon käyttämättömiä linkkejä) Ratkaisuna hybridirakenne, jossa lähellä juurta M 1 on suuri ja lehdissä M 2 on pieni Ns. level-compressed trie (LC-trie) tiivistää puuta rekursiivisesti: Juuren aste on 2 i, jossa i on pienin luku, jolla ainakin yksi juuren lapsista on lehtisolmu. Jokainen lapsi on rakenteeltaan LC-trie LC-trie on tilankäytöltään optimaalinen 27.10. & 3.11.2015 Tietorakenteet ja algoritmit - syksy 2014 42

Seuraavalla kerralla Tasapainotetut hakupuut AVL-puu Puna-musta puu B-puu 27.10. & 3.11.2015 Tietorakenteet ja algoritmit - syksy 2014 43

8.5 Tasapainotetut hakupuut (balanced search trees) Puun käsittelyyn liittyy sopivia ehtoja ja toimintoja, jotka takaavat lähes täydellisen tasapainon (eri haarojen pituus lähes sama). Useita erilaisia rakenteita, mm.: AVL-puu Punamusta puu B-puu Näitä tarkastellaan seuraavassa lähemmin Lisäksi on olemassa ns. Splay-puu, jossa Yksittäinen operaatio voi viedä O(N) ajan Mutta: M peräkkäistä operaatiota vievät O(M log N) ajan 27.10. & 3.11.2015 Tietorakenteet ja algoritmit - syksy 2014 44

8.5.1 AVL-puu (G.M. Adel son-vel skii & Y.M. Landis, 1962) Korkeustasapainotettu puu (height-balanced tree) Puun toteutuksessa jokaiseen solmuun liittyy tasapainotekijä (balance factor), jonka arvo on h L - h R { -1, 0, 1 } Vaihtoehtoisesti talletaan kaikkiin solmuihin niiden korkeus. Huomaa, että tasapainovaatimus koskee puun kaikkia solmuja. Määrittely: Tyhjä puu on korkeustasapainotettu Jos T on ei-tyhjä binääripuu, jolla on lapsina T L ja T R, niin T on korkeustasapainotettu, jos ja vain jos 1) T L ja T R ovat korkeus-tasapainotettuja 2) h L - h R 1, jossa h L ja h R ovat alipuiden korkeudet Tasapainoehdon pitää siis toteutua kaikissa solmuissa 27.10. & 3.11.2015 Tietorakenteet ja algoritmit - syksy 2014 45

Haku: Kuten binäärisessä hakupuussa (paitsi duplikaatit) Lisäys ja poisto: Kuten binäärisessä hakupuussa, mutta sitä seuraa tasapainotekijöiden päivitys ja tarvittaessa puun tasapainotus Tasapainotus lisäyksen yhteydessä: Kun jossakin solmussa tasapainotekijän arvoksi tulee 2 tai -2, puun muotoa muutetaan tässä kohdassa rotaatioilla Rotaatioita on kahdenlaisia: yksinkertaisia rotaatioita kaksoisrotaatioita Molempia voidaan tehdä sekä vasemmalle että oikealle 27.10. & 3.11.2015 Tietorakenteet ja algoritmit - syksy 2014 46

Yksinkertainen rotaatio (single rotation) k 1 right k 2 k 2 k 1 left T 3 T 1 T 1 T 2 T 2 T 3 T 1 < k 2 < T 2 < k 1 < T 3 27.10. & 3.11.2015 Tietorakenteet ja algoritmit - syksy 2014 47

Kaksoisrotaatio (double rotation) k 1 left-right k 3 k 2 k 2 k 1 k 3 T 4 T 1 T 1 T 2 T 3 T 4 T 2 T 3 Kaksoisrotaatio voidaan ymmärtää myös kahtena yksinkertaisena rotaationa, jotka tehdään peräkkäin Rotaatiot säilyttävät puun avainten järjestyksen. 27.10. & 3.11.2015 Tietorakenteet ja algoritmit - syksy 2014 48

Rotaatio tehdään alimmassa solmussa, jossa on epätasapainoa Se, kumpi rotaatio tehdään, määräytyy siitä, mihin haaraan epätasapainon aiheuttava lisäys on tullut a) Jos lisäys tuli epätasapainoisen solmun vasemman- tai oikeanpuoleisimman lapsenlapsen alle, tehdään yksinkertainen rotaatio päinvastaiseen suuntaan b) Jos lisäys tuli ko. solmun sisempään alipuuhun, tehdään kaksoisrotaatio, joka nostaa alipuuta ylemmäs puussa a) +2-2 +2-2 b) 27.10. & 3.11.2015 Tietorakenteet ja algoritmit - syksy 2014 49

Esimerkki Lisätään alun perin tyhjään AVL- puuhun avaimia järjestyksessä A, B, C, D, E, F, G http://trakla.cs.hut.fi/ebook_fi/ebook- Esimerkkianimaatio_AVL_puun.html 27.10. & 3.11.2015 Tietorakenteet ja algoritmit - syksy 2014 50

Lisäyksen jälkeen tarvitaan aina korkeintaan 1 rotaatio. Poiston jälkeen voidaan tarvita O(log N) rotaatiota. Poistoalgoritmia ei käsitellä tässä tarkemmin. AVL-puussa haku, lisäys ja poisto tehdään ajassa O(log N). Tasapainotus ja tasapainotekijöiden asetus hidastavat puun käsittelyä vakiotekijällä (vähäinen merkitys) 27.10. & 3.11.2015 Tietorakenteet ja algoritmit - syksy 2014 51

Luentotehtävä Tallenna seuraavat avaimet tässä järjestyksessä yksitellen alunperin tyhjään AVL- puuhun. Duplikaatit menevät oikealle. T I E T O R A K E N N E Esitä puun rakenne kunkin rotaation jälkeen 27.10. & 3.11.2015 Tietorakenteet ja algoritmit - syksy 2014 52

Luentotehtävä Tarkastellaan AVL- puuta, jossa jokaisessa sisäsolmussa oikea alipuu on korkeampi kuin vasen alipuu. Tällainen AVL- puu sisältää minimimäärän avaimia suhteessa puun korkeuteen. Sitä kutsutaan nimellä Fibonacci- puu (vrt. binäärinen hakupuu, joka voi degeneroitua listaksi). Tehtävä: Muodosta Fibonacci- puu, jonka korkeus on h=5 (olkoon tässä tyhjän alipuun korkeus h=0 ja yksisolmuisen puun korkeus h=1). 27.10. & 3.11.2015 Tietorakenteet ja algoritmit - syksy 2014 53

8.5.2 Punamusta puu Punamusta puu on binäärinen hakupuu, jossa on voimassa seuraavat säännöt 1) Jokainen solmu on joko punainen tai musta 2) Juuri on musta 3) Jos solmu on punainen, sen lapset ovat mustia 4) Jokainen polku juuresta NULL-pointteriin / Z-solmuun sisältää saman määrän mustia solmuja Voidaan käyttää myös määritelmää, jossa värit liitetään kaariin, esim. 1) Jokainen kaari on joko punainen tai musta 2) NULLiin / Z-solmuun johtavat kaaret ovat mustia 3) Millään polulla juuresta lehteen ei saa olla kahta peräkkäistä punaista kaarta 4) Jokainen polku juuresta NULLiin / Z-solmuun sisältää saman määrän mustia kaaria 27.10. & 3.11.2015 Tietorakenteet ja algoritmit - syksy 2014 54

Haku: Tapahtuu kuin binäärisessä hakupuussa Lisäys: (bottom-up menetelmä) Isäkaari tarkoittaa solmun yläpuolella olevaan kaarta (isästä solmuun) Haetaan alkion paikka puussa ja lisätään se uudeksi lehdeksi u. Merkitään u:n isäsolmua nimellä t. u:n isäkaari merkitään punaiseksi. Jos t:n isäkaari on musta, ei tarvita muuta Jos t:n isäkaari on punainen, täytyy tehdä jompikumpi seuraavista operaatioista A (värinvaihto) tai B (rotaatio) 27.10. & 3.11.2015 Tietorakenteet ja algoritmit - syksy 2014 55

A) Värinvaihto Jos ennen lisäystä sekä t:n että sen sisaruksen v:n isäkaaret ovat punaisia, tehdään värien vaihto, jossa t:n isän p:n isäkaari muuttuu punaiseksi ja t:n ja v:n isäkaaret mustiksi. Tarvittaessa tasapainotusta jatketaan ylempänä puussa, jos p:n isän isäkaari on punainen. p 1. p t v t v u u 27.10. & 3.11.2015 Tietorakenteet ja algoritmit - syksy 2014 56

B) Rotaatio Jos t:n isäkaari on punainen ja v:n musta, tarvitaan rotaatio, joka poistaa peräkkäiset punaiset kaaret. Lisäksi p ja uusi juuri (p:n uusi isä) vaihtavat väriä. Rotaation jälkeen punaiset kaaret eivät ole enää peräkkäin. Joko yksinkertainen rotaatio (punaiset kaaret samaan suuntaan) tai kaksoisrotaatio (punaiset kaaret eri suuntiin) p t t v => u p u v p u t u v => t 27.10. & 3.11.2015 Tietorakenteet ja algoritmit - syksy 2014 57 p v

Luentotehtävä Lisää seuraavat avainarvot tässä järjestyksessä tyhjään punamustaan puuhun: E X A M P L E T R E E Duplikaattiarvot talletetaan oikealle. 27.10. & 3.11.2015 Tietorakenteet ja algoritmit - syksy 2014 58

Lisäys: (top-down menetelmä) Tasapainotus tehdään jo matkalla kohti lehteä, jonka alle uusi alkio lisätään Jos kohdataan solmu t, jonka lapsikaaret ovat punaisia, ne vaihdetaan mustiksi ja t:n isäkaari muuttuu punaiseksi Jos tällöin t:n isän u:n isäkaari on punainen, tehdään rotaatio Tilanne, jossa rotaation jälkeen olisi kaksi peräkkäistä punaista kaarta, on mahdoton, koska t:n isän u:n sisaren isäkaari ei voi olla punainen. Se on ehkäisty ennakolta. 27.10. & 3.11.2015 Tietorakenteet ja algoritmit - syksy 2014 59

Poisto: Voidaan toteuttaa samantyyppisten periaatteiden avulla sekä bottom-up että top-down -algoritmeina Punamustan puun korkeus on korkeintaan n. 2logN Haku, lisäys ja poisto voidaan toteuttaa ajassa O(log N). Kustannus 1 bitti / solmu 27.10. & 3.11.2015 Tietorakenteet ja algoritmit - syksy 2014 60

8.5.3 B-puu (R. Bayer & E. McCreight, 1972) B-puu on tasapainotettu hakupuu, jossa yhdellä solmulla voi olla useita lapsia eli sen haarautumisaste (m) voi vaihdella muutamasta aina tuhansiin. Määritelmä: Juuri on joko lehti tai sillä on 2...m lasta Kaikilla sisäsolmuilla on ((m+1) div 2)... m lasta Kaikki lehdet ovat samalla syvyydellä Solmuissa on osoittimia varsinaisiin tietueisiin Esimerkkitapaus: 2-3-4-puu (m=4) 27.10. & 3.11.2015 Tietorakenteet ja algoritmit - syksy 2014 61

Käsittelysäännöt: Haku: Sama idea kuin binäärisessä hakupuussa, mutta lavennettuna useampihaaraiseen puuhun E K R A C D E G M S V X 27.10. & 3.11.2015 Tietorakenteet ja algoritmit - syksy 2014 62

Lisäys: 1) Haetaan uuden alkion paikka 2) Jos solmussa on tilaa, avain lisätään siihen 3) Jos solmu on täynnä (haun aikana = top-down-tasapainotus), se jaetaan (split) kahdeksi solmuksi, joihin talletetaan: Toiseen pienet avaimet ja toiseen suuret Pienet ja suuret erottava arvo talletetaan isäsolmuun (kohta 2) 4) Jos juurikin joudutaan halkaisemaan, luodaan uusi juuri, jonka lapsiksi tulevat vanhan puolikkaat VAIN NÄIN PUUN KORKEUS VOI KASVAA! => Puu pysyy tasapainossa ja kaikki lehdet ovat samalla tasolla 27.10. & 3.11.2015 Tietorakenteet ja algoritmit - syksy 2014 63

Luentotehtävä Lisää seuraavat avainarvot tässä järjestyksessä tyhjään 2-3- 4- puuhun T I E T O R A K E N N E Duplikaattiarvot talletetaan oikealle. 27.10. & 3.11.2015 Tietorakenteet ja algoritmit - syksy 2014 64

Poisto: Melko monimutkainen toimenpide, jossa voidaan joutua myös siirtämään alkioita solmusta toiseen Jos solmuun jää liian vähän tietueita, täytyy etsiä solmu, jonka kanssa k.o. solmu voi sulautua Tällöin isäsolmusta häviää yksi osoitin, jne. Voi johtaa juuren häviämiseen, jolloin puun korkeus pienenee 27.10. & 3.11.2015 Tietorakenteet ja algoritmit - syksy 2014 65

Ominaisuudet: haku ajassa O(log N) lisäys ja poisto: O(M log N) Todellinen hyöty B-puista saadaan levymuistitoteutuksissa M valitaan niin, että solmujen koko vastaa levyblokin kokoa Levyhakuja tarvitaan puun korkeuden verran 27.10. & 3.11.2015 Tietorakenteet ja algoritmit - syksy 2014 66

Eri versioita B + -puu: avaimia talletetaan vain lehtisolmuihin Sisäsolmut sisältävät vain ns. viittoja (router) Splitin jälkeen sisäsolmuun luodaan uusi viitta. Käytännössä yleisin versio B*-puu: sisäsolmut vähintään 2/3-täynnä B link -puu, jossa samalla tasolla olevien lehtien ja sisäsolmujen välillä vaakasuorat linkit (level link) Hyödyllinen sovelluksissa, joissa vaaditaan rinnakkaisuutta. 2-3-4-puu voidaan keskusmuistirakenteena toteuttaa punamustana puuna 2-3-4-puun solmuja erottavat mustat kaaret Solmun sisällä (binääripuun) solmuja yhdistävät punaiset kaaret. 27.10. & 3.11.2015 Tietorakenteet ja algoritmit - syksy 2014 67

Kertaus Hakurakenne on abstrak5 5etotyyppi, jonka keskeiset toiminnot ovat Search, Insert ja Delete. Myös muita toimintoja voidaan toteucaa Lineaariset hakurakenteet: LinkiteCy lista sopii pieniin dynaamisiin sovelluksiin JärjesteCy taulukko sopii suuriinkin 5etomääriin, jos taulukko on staaenen (tehdään vain hakuja) Binäärihaku ja interpolaa5ohaku (numeerisille avaimille) Binäärinen hakupuu on perusrakenne, muca se voi toimia dynaamisissa 5lanteissa huonos5 ja siksi on kehitecy tasapainotecuja hakupuita, kuten AVL- puu. TasapainoteCujen puiden ohjelmoin5 on tarkkaa työtä. 27.10. & 3.11.2015 Tietorakenteet ja algoritmit - syksy 2014 68

Ensi kerralla Aiheena hajautusmenetelmät 27.10. & 3.11.2015 Tietorakenteet ja algoritmit - syksy 2014 69