Hakupuut. tässä luvussa tarkastelemme puita tiedon tallennusrakenteina

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

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

Algoritmit 1. Luento 7 Ti Timo Männikkö

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

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

TKT20001 Tietorakenteet ja algoritmit Erilliskoe , malliratkaisut (Jyrki Kivinen)

Algoritmit 2. Luento 2 To Timo Männikkö

Algoritmit 1. Luento 8 Ke Timo Männikkö

Algoritmit 2. Luento 2 Ke Timo Männikkö

1.1 Tavallinen binäärihakupuu

Algoritmit 2. Luento 4 To Timo Männikkö

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

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

A TIETORAKENTEET JA ALGORITMIT

Algoritmit 2. Luento 5 Ti Timo Männikkö

Algoritmit 2. Luento 4 Ke Timo Männikkö

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

811312A Tietorakenteet ja algoritmit, , Harjoitus 5, Ratkaisu

Tietorakenteet, laskuharjoitus 6,

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ö

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

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

Binäärihaun vertailujärjestys

Kysymyksiä koko kurssista?

811312A Tietorakenteet ja algoritmit, , Harjoitus 5, Ratkaisu

6. Hakupuut. Hakupuu (engl. search tree) on listaa huomattavasti edistyneempi tapa toteuttaa abstrakti tietotyyppi joukko

Kierros 4: Binäärihakupuut

Algoritmit 2. Luento 6 To Timo Männikkö

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.

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

ALGORITMIT 1 DEMOVASTAUKSET KEVÄT 2012

CS-A1140 Tietorakenteet ja algoritmit

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

Tietorakenteet, laskuharjoitus 7, ratkaisuja

Algoritmit 2. Luento 7 Ti Timo Männikkö

Algoritmit 1. Luento 6 Ke Timo Männikkö

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

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

Algoritmi on periaatteellisella tasolla seuraava:

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

14 Tasapainotetut puurakenteet

58131 Tietorakenteet ja algoritmit (kevät 2013) Kurssikoe 1, , vastauksia

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

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

Algoritmit 2. Luento 6 Ke Timo Männikkö

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

811312A Tietorakenteet ja algoritmit, , Harjoitus 7, ratkaisu

1 Puu, Keko ja Prioriteettijono

58131 Tietorakenteet Erilliskoe , ratkaisuja (Jyrki Kivinen)

811312A Tietorakenteet ja algoritmit III Lajittelualgoritmeista

4. Joukkojen käsittely

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

Algoritmit 1. Luento 12 Ke Timo Männikkö

9.3 Algoritmin valinta

811312A Tietorakenteet ja algoritmit II Perustietorakenteet

Algoritmit 1. Luento 13 Ma Timo Männikkö

Algoritmit 1. Luento 13 Ti Timo Männikkö

Luku 7. Verkkoalgoritmit. 7.1 Määritelmiä

Algoritmit 2. Luento 3 Ti Timo Männikkö

B + -puut. Kerttu Pollari-Malmi

Algoritmit 1. Luento 12 Ti Timo Männikkö

Algoritmit 2. Luento 3 Ti Timo Männikkö

Luku 8. Aluekyselyt. 8.1 Summataulukko

Ei-yhteydettömät kielet [Sipser luku 2.3]

58131 Tietorakenteet ja algoritmit Uusinta- ja erilliskoe malliratkaisut ja arvosteluperusteet

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

Algoritmit 1. Luento 5 Ti Timo Männikkö

Datatähti 2019 loppu

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

811312A Tietorakenteet ja algoritmit Kertausta kurssin alkuosasta

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

Kierros 3: Puut. Tommi Junttila. Aalto University School of Science Department of Computer Science

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

A ja B pelaavat sarjan pelejä. Sarjan voittaja on se, joka ensin voittaa n peliä.

Oikeasta tosi-epätosi -väittämästä saa pisteen, ja hyvästä perustelusta toisen.

4 Tehokkuus ja algoritmien suunnittelu

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

Tietorakenteet ja algoritmit Hakurakenteet Ari Korhonen

Algoritmit 2. Luento 9 Ti Timo Männikkö

8. Puna-mustat puut ja tietorakenteiden täydentäminen

Tarkennamme geneeristä painamiskorotusalgoritmia

Algoritmit 1. Luento 3 Ti Timo Männikkö

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

Tietorakenteet, laskuharjoitus 3, ratkaisuja

7. Tasapainoitetut hakupuut

Esimerkkejä polynomisista ja ei-polynomisista ongelmista

Muita linkattuja rakenteita

Algoritmit 1. Luento 4 Ke Timo Männikkö

Algoritmit 2. Luento 14 Ke Timo Männikkö

CS-A1140 Tietorakenteet ja algoritmit

Algoritmit 1. Demot Timo Männikkö

Fibonacci-kasoilla voidaan toteuttaa samat operaatiot kuin binomikasoilla.

TIE Tietorakenteet ja algoritmit 261

811312A Tietorakenteet ja algoritmit Kertausta kurssin alkuosasta

V. V. Vazirani: Approximation Algorithms, luvut 3-4 Matti Kääriäinen

Johdatus graafiteoriaan

3. Binääripuu, Java-toteutus

Pienin virittävä puu (minimum spanning tree)

Tietorakenteet ja algoritmit

Transkriptio:

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 hakupuulla O(n) kaikilla operaatioilla käyttämällä tasapainotusta saadaan kaikki operaatiot aikaan O(log n) tämä on eräs keskeisimpiä tuloksia tietorakenteiden teoriassa, ja menetelmät ovat tärkeitä myös sovelluksissa hakupuun perusversio on helppo toteuttaa, tasapainotus hivenen monimutkaista 1

Puu on käsitteenä tärkeä muutenkin kuin joukko-toteutuksena verkkojen (eli graafien) teoriassa puu tarkoittaa yleensä yhtenäistä syklitöntä verkkoa verkkoteoriassa tässä luvussa käsiteltävä puu olisi lähinnä juurellinen järjestetty puu puu on hyvä malli erilaisille hierarkioille dokumentti, sen luvut, aliluvut jne. organisaatiokaavio... algoritmiikassa se on hyvä malli haarautuvan suorituksen logiikalle 2

Peruskäsitteitä solmu, kaari (vastaavat käsitteet kuin verkkoteoriassa) juuri, alipuu, alipuun juuri vanhempi, lapsi, edeltäjä, jälkeläinen,... sisäsolmu, lehti polun pituus on sen kaarten lukumäärä solmusta itseensä on aina nollan pituinen polku solmun syvyys eli taso on siihen juuresta johtavan polun pituus siis juuren syvyys on nolla solmun korkeus on pisimmän polun pituus solmusta sen alipuussa sijaitsevaan lehteen siis lehden korkeus on nolla puun korkeus on sen juuren korkeus 3

Puun rekursiivinen määritelmä On olemassa tyhjä puu (merkitään yleensä NIL) Jos r on mikä tahansa solmu ja T 1,..., T k ovat puita, niin r, T 1,..., T k on puu, jonka juuri on r ja alipuut T 1,..., T k. Tämä rekursiisivinen formaali määritelmä ei ehkä ole kovin intuitiivinen, mutta antaa rungon monille rekursiivisille algoritmeille Huomaa, että alipuiden järjestyksellä on väliä. 4

Binääripuu binääripuussa solmulla on korkeintaan kaksi lasta, tarkemmin, solmulla voi olla vasen ja oikea lapsi, joista toinen tai molemmat voi puuttua yksilapsisen solmun tapauksessa on eri asia, onko lapsi vasen vai oikea käytännön toteutuksessa on yleensä järkevää ajatella, että jokaisella solmulla on aina tasan kaksi alipuuta, joista toinen tai molemmat voi olla NIL solmun x vasemman alipuun juureen osoittaa x. left ja oikean alipuun juureen x. right jos alipuu puuttuu, vastaava osoitin on NIL 5

Binäärihakupuu solmussa x on avain x. key, joka on kokonaisluku tai muun järjestetyn joukon alkio (esim. merkkijono) lisäksi solmuun voi liittyä muuta dataa, jonka taas jätämme merkitsemättä solmusta x. left alkavassa alipuussa kaikki avaimet ovat korkeintaan x. key solmusta x. right alkavassa alipuussa kaikki avaimet ovat vähintään x. key usein on kätevää liittää solmuun myös x. parent puun T juureen osoittaa T. root puuttuvaa lasta vastaava osoitin on NIL, samoin juuren parent 6

Binääripuun läpikäynti sisäjärjestys (inorder) 1. käsittele vasen alipuu 2. käsittele juuri 3. käsittele oikea alipuu esijärjestys (preorder) 1. käsittele juuri 2. käsittele vasen alipuu 3. käsittele oikea alipuu jälkijärjestys (postorder) 1. käsittele vasen alipuu 2. käsittele oikea alipuu 3. käsittele juuri 7

Esimerkki Solmujen tulostaminen sisäjärjestyksessä tulosta-alkiot(x) if x NIL tulosta-alkiot(x. left) print x. key tulosta-alkiot(x. right) Erityisesti jos puu T on hakupuu, niin tulosta-alkiot(t. root) tulostaa sen solmut järjestyksessä pienimmästä suurimpaan. Esimerkki Binääripuun solmujen laskeminen lukumäärä(x) if x = NIL return 0 else return lukumäärä(x. left) + lukumäärä(x. right) + 1 8

Lause Binääripuun tasolla i on korkeintaan 2 i solmua. Lause Jos binääripuun korkeus on h, siinä on enintään 2 h+1 1 solmua. Lause Jos binääripuun solmujen lukumäärä on n, sen korkeus on enintään n 1. Lause Jos binääripuun solmujen lukumäärä on n, sen korkeus on vähintään log 2 (n + 1) 1. 9

täysi (full) binääripuu: jokaisella solmulla nolla tai kaksi lasta (tai ei-tyhjää alipuuta) täydellinen (complete) binääripuu: täysi, ja lisäksi kaikki lehdet samalla tasolla melkein täydellinen: täydellinen paitsi ehkä alin taso 10

Joukko-operaatioiden toteuttaminen search: Lähdetään liikkeelle juuresta. Edetään puussa alaspäin, kunnes osutaan solmuun, jossa on haluttu avain, ja palautetaan osoitin solmuun; tai päädytään tyhjään alipuuhun ja palautetaan NIL Alaspäin mennessä valitaan oikea tai vasen haara sen mukaan, onko solmun avain pienempi vai suurempi kuin valittu. 11

Esimerkin vuoksi esitetään tämä pseudokoodina. Avain k etsitään puusta T kutsulla search(t. root, k). Rekursiivinen toteutus: search(x,k) if x == NIL or x.key == k return x if k < x.key return search(x.left,k) else return search(x.right,k) Rekursio on tässä helppo välttää: search(x,k) while x NIL and x.key k if k < x.key x = x.left // siirretään x viittaamaan vasempaan lapseen else x = x.right // siirretään x viittaamaan oikeaan lapseen return x Pahimman tapauksen aikavaativuus on O(h), missä h on puun korkeus. Tilavaativuus on O(h) rekursiivisessa ja O(1) iteratiivisessa toteutuksessa. 12

min: edetään puussa alas vasemmalle niin pitkälle kuin pääsee max: edetään puussa alas oikealle niin pitkälle kuin pääsee succ: solmua x seuraavan solmun löytämiseksi jos solmulla x on ei-tyhjä oikea alipuu, etsitään sen min muuten edetään puussa ylöspäin (seuraten parent-osoittimia) niin kaun kun vastaantulevat avaimet ovat pienempiä kuin x. key ensimmäinen y, jolla y. key on suurempi kuin x. key, on x:n seuraaja pred: edellisen peilikuva 13

insert : oletamme, että avain ei ole puussa (tarkista tämä tekemällä search ennen insertiä jos aiheellista) edetään alaspäin kuten search koska avain ei ole puussa, päädytään tyhjään alipuuhun laitetaan tyhjän alipuun paikalle solmu, jossa lisättävä avain huom. täytyy pitää muistissa osoitin lisäyskohdan vanhempaan, että osoittimet saadaan paikalleen 14

delete : monimutkaisin operaatio oletetaan annetuksi osoitin x poistettavaan solmuun jos x on lehti, solmu voidaan poistaa ilman komplikaatioita jos x:llä on tasan yksi lapsi, se voidaan ohittaa puussa tyyliin x.left.parent = x.parent x.parent.right = x.left (pari eri tapausta sen mukaan, mitkä ovat vasempia ja oikeita lapsia) jos x:llä on kaksi lasta, tilanne on hieman monimutkaisempi 15

delete(x) kun x:llä on kaksi lasta: idea on säilyttää solmuun x liittyvät linkit osana puurakennetta, mutta vaihtaa avain jos y on solmun x seuraaja, niin haluttu lopputulos saadaan asettamalla x. key = y. key ja poistamalla solmu y koska solmujen x ja y avaimet ovat peräkkäiset, niin x:n avaimen korvaaminen y:n avaimella ei riko hakupuun ehtoja seuraajasolmulla y on korkeintaan yksi lapsi, joten sen poistaminen palautuu edellä käsiteltyihin helppoihin tapauksiin koska x:llä on kaksi lasta, y on x:n oikeassa alipuussa nyt y:llä ei voi olla vasenta lasta, koska se olisi järjestyksessä x:n ja y:n välissä 16

kaikkien operaatioiden aikavaativuus on O(h), missä h on puun korkeus, ja tilavaativuus O(1) h on parhaimmillaan O(log n) ja pahimmillaan O(n), missä n on avainten lukumäärä puussa voidaan osoittaa (ei kuulu tämän kurssin asioihin), että jos avaimet lisätään satunnaisessa järjestyksessä, niin h on keskimäärin O(log n) kuitenkin h = Ω(n) esim. jos avaimet lisätään suuruusjärjestyksessä n-solmuinen hakupuu voidaan aina uudelleenorganisoida niin, että korkeudeksi tulee O(log n), mutta tämä vie aikaa hakupuun tasapainottamisessa puuhun lisätään kirjanpitotietoa, jonka avulla sen rakennetta voidaan insert- ja delete-operaatioiden yhteydessä tarvittaessa korjata niin, että korkeus pysyy O(log n):ssä hakupuiden tasapainotusmenettelyistä esitämme tällä kurssilla AVL-puut; vaihtoehtoja ovat esim. punamustat puut ja B-puut (tärkeitä tietokannoissa) siis tasapainotetuilla hakupuilla kaikki joukko-operaatiot toimivat ajassa O(log n) 17