Järjestetyn sanakirjan tehokas toteutus: binäärihaku Binäärihaku (esimerkkikuassa aain = nimi) op Eea 5 op 5 op op 8 op 5 6 7 8 op Eea 5 op 5 op op 8 op 5 6 7 8 op Eea 5 op 5 op op 8 op 5 6 7 8 op Eea 5 op 5 op op 8 op 5 6 7 8 Järjestetyn sanakirjan tehokas toteutus: binäärihaku Binäärihaun ertailujärjestys 5 6 7 8 Eea 5 op 5 op op 8 op op Eea op 5 op Eea op 5 op Eea op 5 op k < 5 op 5 op 5 op op op op k > 8 op 8 op 8 op k < k > k < k > k > k > k > k > nopeat haut: O(log(n)) järjestetty taulukko hitaat päiitykset: O(n) Tietorakenteet, syksy 7 Tietorakenteet, syksy 7 Järjestetyn sanakirjan tehokas toteutus: binäärihaku Vertailuhierarkia 5 6 7 8 Eea 5 op 5 op op 8 op op Eea op 5 op Eea op 5 op Eea op 5 op 5 op 5 op 5 op op op op 8 op 8 op 8 op Vertailuhierarkia binäärihakupuu ertailu solmussa (alkaen juurisolmusta) Key() = k: löytyi solmusta Key() > k: jatka :n asempaan lapseen Key() < k: jatka :n oikeaan lapseen op 5 op Esim. haun k = hakupolku op 8 op Eea 5 op Tietorakenteet, syksy 7 Tietorakenteet, syksy 7
Binäärihakupuu: binääripuu, jossa jokaiselle solmulle pätee: solmun asemman alipuun kukin aain solmun aain solmun oikean alipuun kukin aain solmun aain Esimerkkipuu, jonka alkioiden aaimina luut,,,..., ja taanomainen lukujen ertailu 5 7 8 6 Tietorakenteet, syksy 7 5 Tietorakenteet, syksy 7 6 Toinen esimerkkipuu, jonka alkioiden aaimina luut,,,..., Tietorakenteet, syksy 7 7 5 6 7 8 Binäärihakupuun metodit: TreeSearch(k, ) FindElem(k) solmun alipuussa FindElem(k) = TreeSearch(k, root) palauttaa sellaisen solmun u, jollakey(u) = k palautusaro null, jos :n alipuun minkään alkion aain ei ole k TreeSearch(k, ) if = null tai k = Key() return if k < Key() return TreeSearch(k,LeftChild()) return TreeSearch(k,RightChild()) FindElem() FindElem() null haun FindElem(k) aikaaatiuus? O(h) 8 Tietorakenteet, syksy 7 8
Binäärihakupuun metodit: TreeInsert(k, x, ) InsertItem(k, x) = TreeInsert(k, x, root) lisää solmun alipuuhun aain-alkioparin (k, x) sisältään uuden lehtisolmun TreeInsert(k, x, ) (oletus: null) if k Key() if LeftChild() null TreeInsert(k, x,leftchild()) solmulle uusi asen lapsi, johon (k, x) if RightChild() null TreeInsert(k, x,rightchild()) solmulle uusi oikea lapsi, johon (k, x) aaimen omaaan alkion lisäys 8 Tietorakenteet, syksy 7 Binäärihakupuun metodit: TreeRemoe(k, ) Remoe(k) = TreeRemoe(k, root) poistaa solmun alipuusta aaimen k sisältään solmun 8 Remoe() Puun korjaaminen ehyeksi? 8 Tietorakenteet, syksy 7 helppoa, jos poistettaalla solmulla alle lasta linkitä lapsi (tai null) poistetun anhempaan 8 8 hieman hankalampaa, jos poistettaalla lasta 8 Remoe() 8 Tietorakenteet, syksy 7 siirretään poistetun solmun tilalle sen oikean alipuun pienin (= poistettua seuraaa ) alkio 8 8 apufunktio FindMin(): hakee solmun alipuun pienimmän aaimen omaaan solmun FindMin() (oletus: null) res while LeftChild(res) null) res LeftChild(res) return res Tietorakenteet, syksy 7
TreeRemoe(k, ) u TreeSearch(k, )) if u = null return null res Elem(u) if LeftChild(u) = null koraa solmu u sen oikealla lapsella if RightChild(u) = null koraa solmu u sen asemmalla lapsella w = FindMin(RightChild(u)) siirrä solmun w alkio solmuun u koraa solmu w sen oikealla lapsella poista solmu w return res 8 7 8 w 8 Tietorakenteet, syksy 7 7 7 Binäärihakupuun tehokkuus Edellisten binäärihakupuun metodien aikaaatiuus: O(h) parhaimmillaan O(log(n)) ( täydellinen binääripuu) pahimmillaan O(n) ( lineaarinen sekenssi) keskimäärin O(log(n)) ( satunnainen binääripuu, hankalahko todistaa) 8 8 Tietorakenteet, syksy 7 Tasapainotettu binäärihakupuu: puun korkeus pidetään suuruusluokassa log(n) esim. AVL-puu (Adelson-Velskii, Landis), toinen yleinen: puna-musta puu (Red-Black tree) AVL-puun tasapainotussääntö: solmu on tasapainossa, jos H(LeftChild()) H(RightChild()) tilansäästämiseksi lyhenne H() = Height() tasapaino: :n alipuiden korkeuksien ero tyhjä alipuu: korkeus = - Tietorakenteet, syksy 7 5 AVL-puu on tasapainossa, jos sen kaikki solmut oat Mitkä seuraaista puista AVL-tasapainoisia? 8 5 8 ainoastaan oikealla ylhäällä olea Tietorakenteet, syksy 7 6 8
AVL-tasapainoisen puun korkeus on O(log(n)) Löyhä korkeuden h ja solmujen määrän n ertailu: merkintä: min n (h) = pienin mahdollinen solmujen lukumäärä h-korkuisessa AVL-puussa selästi min n () =,min n () =,min n () = eli pätee raja min n (h) h kun h < h-korkuisen AVL-puun juuren kummankin alipuun korkeus ähintään h (tasapaino) induktio: min n (h) min n (h ) h = h + = h, joten aina min n (h) h jos n min n (h) h, niin log (n) h eli h log (n) = O(log(n)) Tietorakenteet, syksy 7 7 Tasapainon ylläpito: kussakin solmussa talletettuna aro H() = Height() -5-5 päiitys solmun lisäyksen/poiston jälkeen? Lisäys 8 8 8 Poisto: Poisto: lapsi lasta 5 5 5 8 8 8 8 8 8 Tietorakenteet, syksy 7 8 korkeudet oiat muuttua alimman lisätyn/koratun solmun yläpuolella polulla juureen oletus: alimman muutetun solmun anhempi, eli lisäyksessä = solmu, jolle luotiin uusi lapsi, ja poistossa = (alemman) koratun solmun anhempi UpdateHeights() u while u null i max{h(leftch(u)),h(rightch(u))} SetHeight(u, i + ) u Parent(u) return Aikaaatiuus O(h) Poisto 8 8 pienin alempi pienin 8 korkeuden muutokset tämän yläpuolella Tietorakenteet, syksy 7