Rendezettminta-fa Minden p ponthoz tároljuk a p gyökerű fa belső pontjainak számát (méretét) Adott elem rangja: az elem sorszáma (sorrendben hányadik az adatszekezetben) Adott rangú elem keresése - T[r] Adott elem rangjának meghatározása Egyéb bővítési lehetőségek (pl. intervallumfák) [] 7-77 [] 79-85
Példa 6 rang=3 0 4 7 7 4 méret 30 5 4 7 47 7 0 4 5 6 9 0 8 rang=4 35 38 3 39 3
Fapont tárolása első megközelítés, a gyakorlatban nem így tároljuk! struct fapont{!!!int key, v, meret ;!!!fapont bal, jobb, apa ;! } apa key balfiu v meret jobbfiu
Adott rangú elem keresése 6 rang 4 7 7 30 5 4 méret 47 8 3 38 3 5 rmkeres(p,x) {!!r=p.bal.meret+ ;! 35 39!if (x==r) return p ;!!if (x<r) return rmkeres(p.bal,x) ;!!else return rmkeres(p.jobb,x-r) ;! } O(h)
Elem rangjának meghatározása 30 5 4 7 47 rmrang(p) {!!r=p.bal.meret+ ;!!q=p ;!!while (q!=gyoker) {!!!if (q==q.apa.jobb) r+=q.apa.bal.meret+;!!!q=q.apa ;!!}!!return r ;! } 8 35 38 3 39 O(h)
Méret információ fenntartása beszjav(p) {!!while (p!=gyoker) {!!!p=p.apa;!!!p.meret++ ;!!}! } 30 56 8 38 34 4 78 47 torljav(p) {!!while (p!=gyoker) {!!!p=p.apa;!!!p.meret-- ;!!}! 35 39 40 } O(h)
Elem rákövetkezője 9 9 4 7 4 37 3 0 7 3 43
p rákövetkezője p p p O(h)
p rákövetkezője fapont kovetkezo(fapont p) {!!! if (p.jobb!=nil) {!!!!! //ha van jobb fiú!!! p=p.jobb ;!!!!!!!! //akkor a jobb részfa!!! while (p.bal!=nil) p=p.bal;!//bal szélső eleme!!! return p;!!! } else {!!!!!!!!!! // ha nincs jobb fiú!!! while (p.apa!=nil) {!!!! // amíg van apa!!!!! if (p.apa.bal==p)!!!! // ha p bal gyerek!!!!!! return p.apa;!!!! // p apja a rákövetkező!!!!! p=p.apa ;!!!!!!! // megyünk felfelé p-vel!!! };!!!! return nil ;!!!!!!! // nincs rákövetkező!!! }! } O(h)
Törlés bináris keresőfából p q O(h)
void torol(fapont p) {!!! if (p.jobb!=nil) {!!!!!!!!! fapont q=kovetkezo(p) ;!!!!!!!!!!!! p.key=q.key ; p.value=q.value ;!!!!! q.apa.bal=q.jobb ;!!!! q.jobb.apa=q.apa ;!!!! delete q ;! q!! } else {!!!!!!!!!!!!!...!!!!! }! } p 4 9 37 7 3 43 O(h)
void torol(fapont p) {!!! if (p.jobb!=nil) {!!!!!!!!! fapont q=kovetkezo(p) ;!!!!!!!! p.key=q.key ; p.value=q.value ;!!!! q.apa.bal=q.jobb ;!!!! q.jobb.apa=q.apa ;!!!! delete q ;!!! } else {!!!!!!!!!!!!! if (p.apa.jobb==p) p.apa.jobb=p.bal ;!!!! else p.apa.bal=p.bal ;!!!! p.bal.apa=p.apa ;!!!! delete p ;!!!! }! } p O(h)
Elem törlése példa 9 9 4 7 4 37 3 0 7 3 43
Futási idők elemzése Keresés Beszúrás Mennyi a futási idő? O(h) Törlés
Rendezettmintafa Műveletek: bool beszúr(<k> key, <V> value) O(h) fapont keres(<k> x) bool töröl(fapont p) fapont rákövetkező(fapont p) mindetkiir(fapont p) mindenttöröl(fapont p) int elemszám(fapont p) int rang(fapont p) fapont rangkeres(int x) O(h) O(h) O(h) O(n) O(h) O() O(h) O(h)
9 9 4 7 4 37 3 0 7 3 43
Teljes bináris keresőfa h n(h) 3 4 3 7 8 4 5 6 5 3 3 k
n pontot tartalmazó teljes bináris keresőfa magassága h n(h) 3 4 3 7 8 4 5 6 5 3 3 h h=o(logn)
Lehet-e egy bináris keresőfa teljesen kiegyensúlyozott??? n= n=3 n=7 n=? n=4 n=5 n=6? n=8...?
Majdnem teljes bináris keresőfa h n(h) 3 4 4 4 8 8 5 6 6 k
n pontot tartalmazó majdnem teljes bináris keresőfa magassága h n(h) 3 4 4 4 8 8 5 6 6 k h=o(logn)
Véletlen építésű bináris keresőfa Adott n egymástól különböző kulcs, melyekből bináris keresőfát építünk úgy, hogy a kulcsokat valamilyen sorrendben egymás után beszúrjuk a kezdetben üres fába. Ha itt minden sorrend, vagyis az n kulcsnak mind az n! permutációja egyformán valószínű, akkor a kapott fát véletlen építésű bináris keresőfának nevezzük. Tétel: Egy n különböző kulcsot tartalmazó véletlen építésű bináris keresőfa várható magassága: O(log n). [] 4-44
Szúrjuk be rendre az 3 4 5... n elemeket 3 4 5 n Legrosszabb eset h=n
Kiegyensúlyozott bináris keresőfák
Hogy lehetne javítani? 3 4 5 6 7 8 9 0 3 4 5 más sorrendben kell beszúrni: f(i,j) {!! if (i<=j) {!!! f=int((i+j)/) ;!!! beszur(t[f]) ;!!! f(i,f-) ;!!! f(f+,j) ;!! }! } 4 6 8 0 4 3 5 7 9 3 5
Optimális bináris keresőfa Adott kulcsoknak egy K=(k,...,kn) sorozata Minden ki kulcshoz ismert annak pi előfordulási valószínűsége és Minden di=(ki,ki+) intervallumhoz ismert annak qi előfordulási valószínűsége, hogy arra az intervallumra keresünk, d0= (-,ki), dn= (kn, ) Optimális bináris keresőfa építhető (pl. dinamikus programozás módszerével) Építés: O(n ) [] 34-3
De az elemek egyesével is jöhetnek!
Hogy lehetne javítani? Mivel az elemek egyesével jönnek Minden beszúrás (és törlés) után rögtön javítani kellene 5 6 3 3
AVL fák
Az AVL-fa alatt egy ön-kiegyensúlyozó bináris keresőfát értünk." " Egy AVL-fában bármely csúcspont két részfájának magassága közti különbség legfeljebb egy. Az AVL-fa nevét két feltalálójáról G. M. Adelson-Velsky-ről és E. M. Landis -ról kapta, akik 963 -ban publikálták [4] An algorithm for the organization of information (Egy algoritmus az információ szervezettségéhez) című cikkükben. [3]
p pont egyensúlyfaktora egy(p)=h(p.jobb)-h(p.bal) x+-x= P x--(x-)=0 x+-x= x- x- x x+ [] 78
Példa h(p)=+max{h(p.jobb),h(p.bal)} egy(p)=h(p.jobb)-h(p.bal) 3 0
Példa 0 4 0 0 3 0 0 egy(p)=h(p.jobb)-h(p.bal) h(p)=+max{h(p.jobb),h(p.bal)} 0
AVL fa
Legkevesebb pontot tartalmazó h mf()= magasságú AVL fa mf(3)=+mf()+mf()=4 mf()= x+-x= P mf(p)=+mf(p.bal)+mf(p.jobb) mf(h)=+mf(n-)+mf(n-) =fib(h)+ x x+ fib(n)=fib(n-)+fib(n-) [] 76
[]
Műveletek []
Forgatás 3 3 [] 79-80
x Forgatás y x 3 3 void balraforgat(fapont x) {!!! fapont y ;!!! y=x.jobb ;!!! x.jobb=y.bal ;!!! if (x.jobb!=nil) x.jobb.apa=x;!!! y.apa=x.apa;!!! if (y.apa==nil) gyoker=y ;!!! else {!!!! if (x==y.apa.bal) y.apa.bal=y ;!!!! else y.apa.jobb=y ;!!! }!!!!! y.bal=x ;!!! x.apa=y ;! } O() [] 79-8
Példa 0 9 9 4 7 4 37 0 7 3 43 0 46
Egy érdekes eset 5 6 3 3 5 4 4 6
5 6 3 4
5 3 6 4
3 5 4 6
. eset innen törlök α β A 0 B - C γ δ innen törlök α A β B γ C 0 δ α 0 A β 0 B γ C 0 δ α=β=γ=δ
. eset α β A - B - C γ δ α A β B γ C δ α 0 A β 0 B γ C δ α=β=(γ+)=δ
3. eset α β A B - C γ δ α A β B γ C δ α - A β 0 B γ C 0 δ α=(β+)=γ=δ
4. eset A α B 0 B β γ - C δ α 0 A β γ C - δ α=β=γ=(δ+)
Összes eset α A -,0, B β - C γ δ α A β B γ -,0, C δ α -,0 A β 0, B γ -,0, C δ α=β=γ=δ α=β=(γ+)=δ α=(β+)=γ=δ α=β=γ=δ α=β=(γ+)=δ α=β=γ=(δ+) α=(β-)=γ=δ fj(p,q) És ezek tükörképei
Egyensúlyfaktorok javítása beszúrás α=β α<β α>β α P β α β x 0 - bal: eb(x) - 0 - jobb: ej(x) 0 beszúrás előtt beszúrás után beszúrás után
Fapont tárolása második megközelítés, a gyakorlatban nem így tároljuk! struct fapont{!!!int key, v, egy ;!!!fapont bal, jobb, apa ;! } apa key bal value egy jobb
Egyensúlyfaktorok javítása kezdetben p a beszúrt vagy törölt elem while (p!=gyoker && cv) {! x 0 -! q=p.apa ;! eb(x) - 0 -! if (p==q.jobb) {! ej(x) 0!! egyq=++q.egy ;!!! if (egyq==) {!!!! if (p.egy==-) {! törlésnél (testver(p)==-)!!!! jobbraforgat(p) ;!!!! }!!!! balraforgat(q) ;!!!! fj(p,q) ;!!! //egyensúlyfaktorokat rendbetesz!!!! cv=false ;! //kilép!!!!! }!! } else...!!!! // bal eset!! p=p.apa ;! } α β A B q - C γ p δ O(logn)
Példa while (p!=gyoker && cv) {!! q=p.apa ;!! if (p==q.jobb) {!!! egyq=++q.egy ;!!! if (egyq==) {!!!! if (p.egy==-) jobbraforgat(p);!!!! balraforgat(q);!!!! cv=false; fj(p,q) ;!!! }!! } else {!!! egyq=--q.egy;!!! if (egyq==-) {!!!! if (p.egy==)!balraforgat(p);!!!! jobbraforgat(q);!!!! cv=false;!!!! fj(p,q) ;!!! }!! }!! p=p.apa;! } 0 0 0 3 q eset - - 5 4 p - 0-0 0 6
fj(p,q) α A -,0, B β q - C γ p δ α A β q 0, B γ p -,0, C δ α -,0 A β B γ -,0, C δ α=β=γ=δ α=β=(γ+)=δ α=(β+)=γ=δ α=β=γ=δ α=β=(γ+)=δ α=β=γ=(δ+) α=(β-)=γ=δ És ezek tükörképei