Tietorakenteet ja algoritmit Hakurakenteet Ari Korhonen



Samankaltaiset tiedostot
Algoritmit 1. Luento 7 Ti Timo Männikkö

Hakupuut. tässä luvussa tarkastelemme puita tiedon tallennusrakenteina

Algoritmit 2. Luento 2 To Timo Männikkö

Algoritmit 2. Luento 2 Ke Timo Männikkö

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

A TIETORAKENTEET JA ALGORITMIT

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.

Algoritmit 2. Luento 5 Ti Timo Männikkö

Tietorakenteet ja algoritmit Hakurakenteet Ari Korhonen

Algoritmit 2. Luento 6 Ke Timo Männikkö

Algoritmit 2. Luento 6 To Timo Männikkö

Binäärihaun vertailujärjestys

Algoritmit 2. Luento 4 To Timo Männikkö

Algoritmit 2. Luento 5 Ti Timo Männikkö

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

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

Algoritmit 2. Luento 3 Ti Timo Männikkö

Algoritmit 2. Luento 3 Ti Timo Männikkö

B + -puut. Kerttu Pollari-Malmi

Algoritmit 2. Luento 4 Ke Timo Männikkö

Tietorakenteet ja algoritmit - syksy

Tietorakenteet ja algoritmit Johdanto Lauri Malmi / Ari Korhonen

Algoritmit 1. Luento 6 Ke Timo Männikkö

Algoritmit 2. Luento 7 Ti Timo Männikkö

14 Tasapainotetut puurakenteet

1.1 Tavallinen binäärihakupuu

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

Algoritmit 1. Luento 8 Ke Timo Männikkö

Algoritmit 1. Luento 12 Ke Timo Männikkö

Algoritmit 1. Luento 12 Ti Timo Männikkö

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

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

TKT20001 Tietorakenteet ja algoritmit Erilliskoe , malliratkaisut (Jyrki Kivinen)

Kierros 4: Binäärihakupuut

7. Tasapainoitetut hakupuut

811312A Tietorakenteet ja algoritmit, , Harjoitus 5, Ratkaisu

Tietorakenteet, laskuharjoitus 7, ratkaisuja

CS-A1140 Tietorakenteet ja algoritmit

Algoritmit 1. Luento 5 Ti Timo Männikkö

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

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

Algoritmit 2. Luento 9 Ti Timo Männikkö

811312A Tietorakenteet ja algoritmit, , Harjoitus 5, Ratkaisu

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.

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

ALGORITMIT 1 DEMOVASTAUKSET KEVÄT 2012

Luku 8. Aluekyselyt. 8.1 Summataulukko

4 Tehokkuus ja algoritmien suunnittelu

4. Joukkojen käsittely

D B. Harvat hakemistot. Harvat hakemistot

Datatähti 2019 loppu

Algoritmi on periaatteellisella tasolla seuraava:

Algoritmit 1. Luento 9 Ti Timo Männikkö

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

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

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

Tietorakenteet, laskuharjoitus 6,

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

811312A Tietorakenteet ja algoritmit, , Harjoitus 7, ratkaisu

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

Hakemistorakenteet. R & G Chapter Tietokannan hallinta, kevät 2006, Jan 1

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

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

10. Painotetut graafit

Hakemistotyypeistä. Hakemistorakenteet. Hakemiston toteutuksesta. Hakemiston toteutuksesta

811312A Tietorakenteet ja algoritmit II Perustietorakenteet

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

811312A Tietorakenteet ja algoritmit Kertausta jälkiosasta

private TreeMap<String, Opiskelija> nimella; private TreeMap<String, Opiskelija> numerolla;

6. Sanakirjat. 6. luku 298

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

A TIETORAKENTEET JA ALGORITMIT

1 Puu, Keko ja Prioriteettijono

Ohjelmoinnin perusteet Y Python

Algoritmit 1. Luento 3 Ti Timo Männikkö

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

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

Tietorakenteet ja algoritmit

Luku 7. Verkkoalgoritmit. 7.1 Määritelmiä

Hajautusrakenteet. R&G Chapter Tietokannan hallinta, kevät 2006, Jan 1

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

Kysymyksiä koko kurssista?

811312A Tietorakenteet ja algoritmit III Lajittelualgoritmeista

Ohjelmoinnin perusteet Y Python

Algoritmit 2. Luento 13 Ti Timo Männikkö

Tarkennamme geneeristä painamiskorotusalgoritmia

Pikalajittelu: valitaan ns. pivot-alkio esim. pivot = oikeanpuoleisin

3. Binääripuu, Java-toteutus

58131 Tietorakenteet Erilliskoe , ratkaisuja (Jyrki Kivinen)

Algoritmit 1. Luento 4 Ke Timo Männikkö

58131 Tietorakenteet ja algoritmit (kevät 2014) Uusinta- ja erilliskoe, , vastauksia

Muita linkattuja rakenteita

Algoritmit 1. Luento 13 Ti Timo Männikkö

Algoritmit 1. Luento 10 Ke Timo Männikkö

Hajautusrakenteet. Hajautukseen perustuvat tiedostorakenteet. Hajautukseen perustuvat tiedostorakenteet. Hajautukseen perustuvat tiedostorakenteet

Anna Kuikka Pyöräkatu 9 B Kuopio GSM: Opiskelijanro: 60219K. Prioriteettijonot

D B. Harvat hakemistot

Algoritmit 2. Luento 14 Ke Timo Männikkö

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

Algebralliset tietotyypit ym. TIEA341 Funktio ohjelmointi 1 Syksy 2005

Transkriptio:

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

8. HAKURAKENTEET (dictionaries) 8.1 Haku (vrt. sanakirjahaku) 8.2 Listat tallennusrakenteina 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 2015 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 2015 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 2015 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 2015 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 (webhaut, 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 2015 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 2015 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 2015 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 2015 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 2015 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 2015 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 (self-adjusting 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 2015 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 2015 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 2015 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 2015 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 2015 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 2015 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 2015 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 2015 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 2015 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 2015 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 A I J T X Kopioidaan tiedot q:sta tuhottavaan solmuun 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 2015 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 2015 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 2015 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 2015 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 2015 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 2015 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 2015 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 2015 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 2015 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 E 0 1 S 0 1 0 R A A = 001011 C = 001101 E = 001111 H = 010010 R = 011100 Poisto: C H S = 011101 Kuten binäärisessä hakupuussa Puussa ei voi olla duplikaatteja (käsitellään muutoin) 27.10. & 3.11.2015 Tietorakenteet ja algoritmit - syksy 2015 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 2015 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 2015 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 2015 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 2015 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 2015 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 2015 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 2015 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 2015 39

Merkkijonopuu Kantalukuna merkistön koko, esim. { a, b, c } = 3 27.10. & 3.11.2015 Tietorakenteet ja algoritmit - syksy 2015 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 2015 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 2015 42

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

Kertaus: binäärinen hakupuu K E S C G R U A J T X I 27.10. & 3.11.2015 Tietorakenteet ja algoritmit - syksy 2015 44

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 2015 45

8.5.1 AVL-puu (G.M. Adel son-vel skii & Y.M. Landis, An Algorithm for the Organization of Information, 1962) Korkeustasapainotettu binäärinen hakupuu (height-balanced binary search 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 binäärinen hakupuu Jos T on ei-tyhjä binäärinen hakupuu, jolla on lapsina T L ja T R, niin T on korkeustasapainotettu, jos ja vain jos 1) T L ja T R ovat korkeustasapainotettuja binäärisiä hakupuita 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 2015 46

Luentotehtävä: AVL- puut Mitkä seuraavista puista ovat AVL- puita? Vastaa yhdellä rivillä Presemoon 6 x { kyllä ei } tai komppaa jonkun muun jo antamaa vastausta 27.10. & 3.11.2015 Tietorakenteet ja algoritmit - syksy 2015 47

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 2015 48

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 2015 49

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 2015 50

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 2015 51

Kuva: ZyBooks Data Structures Essentials, 2015 27.10. & 3.11.2015 Tietorakenteet ja algoritmit - syksy 2015 52

Luentotehtävä Tee yksinkertainen rotaatio vasemmalle juuressa Vastaa yhdellä rivillä Presemoon tyyliin n1 = 60, n2= tai komppaa jonkun muun jo antamaa vastausta 27.10. & 3.11.2015 Tietorakenteet ja algoritmit - syksy 2015 53

Luentotehtävä Tee L-R-kaksoisrotaatio juuressa (ensin L ja sitten R) Vastaa yhdellä rivillä Presemoon tyyliin 1. n1 = Z, n2= ja 2. n1 = Y, n2 = tai komppaa jonkun muun jo antamaa vastausta 27.10. & 3.11.2015 Tietorakenteet ja algoritmit - syksy 2015 54

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 2015 55

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ä vain vakiotekijällä (= vähäinen merkitys) 27.10. & 3.11.2015 Tietorakenteet ja algoritmit - syksy 2015 56

Luento- /harjoitustehtävä 27.10. & 3.11.2015 Tietorakenteet ja algoritmit - syksy 2015 57

27.10. & 3.11.2015 Tietorakenteet ja algoritmit - syksy 2015 58

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 2015 59

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 2015 60

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 2015 61

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 2015 62

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 2015 63 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 2015 64

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 2015 65

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 2015 66

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 2015 67

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 2015 68

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 2015 69

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 2015 70

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 2015 71

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 2015 72

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 2015 73

Kertaus Hakurakenne on abstrakti tietotyyppi, jonka keskeiset toiminnot ovat haku (Search), lisäys (Insert) ja poisto (Delete). Myös muita toimintoja voidaan toteuttaa Lineaariset hakurakenteet: Linkitetty lista sopii pieniin dynaamisiin sovelluksiin Järjestetty taulukko sopii suuriinkin tietomääriin, jos taulukko on staattinen (tehdään vain hakuja) Binäärihaku ja interpolaatiohaku (numeerisille avaimille) Binäärinen hakupuu on perusrakenne, mutta se voi toimia dynaamisissa tilanteissa huonosti ja siksi on kehitetty tasapainotettuja hakupuita, kuten AVL-puu. Tasapainotettujen puiden ohjelmointi on tarkkaa työtä. 27.10. & 3.11.2015 Tietorakenteet ja algoritmit - syksy 2015 74

Ensi kerralla Aiheena hajautusmenetelmät 27.10. & 3.11.2015 Tietorakenteet ja algoritmit - syksy 2015 75