Előadást letölteni
Az előadás letöltése folymat van. Kérjük, várjon
KiadtaBalázs Budai Megváltozta több, mint 10 éve
1
BFák Kiegyensúlyozott keresőfák Hatékonyság: O(lg(n)), de a nagy fokszám miatt igen alacsony szorzótényezővel Alkalmazás: Lemezen tárolt adatbázisoknál Mágneslemezen hatékony tárolásra lett tervezve Ki/Be műveletek minimalizálása Elágazási tényező: néhány ezerig is terjedhet Időszükséglet=Ki/Be idő+memória számolás ideje
2
Egy csúcs n db kulcsot tartalmaz a kulcstartomány felosztása a csúcsnak n+1 gyereke van. Levélcsúcs: egyetlen gyereke sincs BFák M D H Q T X B CF GY ZV WR SN PJ K L
3
Lemezműveletek modellezése x: egy adathivatkozás, nem tudni, hogy hol van Ha x a lemezen van, akkor x mezői nem elérhetők LemezrőlOlvas(x) ha lemezen van, akkor beolvassa. Egyébként hatástalan, LemezreÍr(x) kiírja a lemezre, ha történt módosítás. Egyébként hatástalan. Egy csúcs mérete = lemez blokkmérete. Ez az elágazási tényező felső korlátja is.
4
BFa Definíciója A T BFa olyan gyökeres fa, amelyre: 1. Minden x csúcsnak a következő mezői vannak: –n: az x csúcsban tárolt kulcsok száma –n db kulcs úgy, hogy kulcs[1]<=…<=kulcs[n] –levél=Igaz, ha x levél, Hamis egyébként 2. Ha x belső csúcs, akkor gyerek[i] vektor, ahol i<=n a gyerekekre mutató vektor. Ha x levél, akkor a vektor tartalma meghatározatlan 3. Ha k i egy kulcs, amelyik a gyerek[i] részfában van, akkor: k 1 <=kulcs[1]<=k 2 <=kulcs[2]<=…<=kulcs[n]<= k n+1
5
Minden levél magassága egyenlő, ez a fa h magassága Minimális fokszám: t>=2, maximális fokszám: 2t –Minden nem gyökér csúcsnak legalább t-1 kulcsa van –Minden csúcsnak legfeljebb 2t-1 kulcsa van –Egy csúcs telített, ha pontosan 2t-1 kulcsa van Gyökércsúcsnak legalább 1 kulcsa 2 gyereke van Legegyszerűbb eset: t=2 minden csúcsnak 2,3 vagy 4 gyereke lehet 2-3-4 fának nevezzük (gyakorlatban t>>>2 !) BFa Definíciója
6
BFa magassága Tétel: Ha n>=1 és T egy n kulcsos BFa, magassága h és min.fokszáma t>=2 h<=log t (n+1)/2 Biz: egy h magasságú bfa csúcsszáma akkor minimális, ha minden nem gyökér belső csúcsnak éppen t-1 kulcsa van. Ilyenkor: n=1+2t+2t 2 +…+2t h-1 =1+(t-1)* i=1 Σ h 2t i-1 = =1+2(t-1)(t h -1)/(t-1)=2t h -1 Vagyis más fákra n>=2t h -1 log t (n+1)/2>=h
7
Keresés BFában BFaKeres(k) i=1 while i kulcs[i] i=i+1 if i<=n és k=kulcs[i] then return (Me,i) if levél then return NIL else LemezrőlOlvas(gyerek[i]) return gyerek[i].BFaKeres(k) Jobbrekurzív algoritmus: HF: átírni ciklikussá Többutas elágaztató döntés Ha megtaláltuk csúcs és index visszaadása
8
Üres BFa készítése ÚjBFa() bfa=CsúcsotElhelyez() bfa.levél=Igaz bfa.n=0 LemezreÍr(bfa) return(bfa) Lemezen helyfoglalás
9
BFa egy csúcsának kettévágása Me: nem telített csúcs, csúcs=gyerek[i], ami telített (2t gyereke van) BFaVágásGyerek(i,csúcs) új=CsúcsotElhelyez() új.levél=csúcs.levél csúcs.n=t-1 for j=1 to t-1 új.kulcs[j]=csúcs.kulcs[j+t] if not csúcs.levél then for j=1 to t új.gyerek[j]=csúcs.gyerek[j+t] for j=n downto i gyerek[n+2]=gyerek[n+1] kulcs[n+1]=kulcs[n] gyerek[i+1]=új kulcs[i]=csúcs.kulcs[i] n=n+1 LemezreÍr(csúcs), LemezreÍr(új), LemezreÍr(Me) Új csúcs kezdőértékezése Gyerekek, kulcsok átmásolása Csúcs fokszáma feleződik Új csúcs beszúrása apa csúcsai közé
10
Csúcs kettévágása N W P Q R S T U V N S W P Q RT U V
11
Kulcs beszúrása BFába Beszúrás mindig levélelemnél történik a fa magassága nem változik (egyfajta kiegyenlítettség megmarad) Ha a beszúrási ponthoz vezető út bármelyik eleme telített, akkor felhasad két fele méretű csúcsra A fa nem a levelénél, hanem a gyökerénél nő
12
TelítetlenBFábaBeszúr(k) i=n if levél then while i>=1 és k =1 és k kulcs[i] then i=i+1 gyerek[i].TelítetlenBFábaBeszúr(k) Kulcs beszúrása BFába Beszúrás levélelembe Ha a gyerek telített, akkor felhasítjuk Meghatározzuk, hogy a rekurziót melyik gyerekkel folytassuk A fa gyökere telítetlen
13
Kulcs beszúrása BFába BFábaBeszúr(k) if n=2t+1 then új=CsúcsotElhelyez() új.levél=Hamis új.n=0 új.gyerek[1]=Me új.BFaVágásGyerek(1,Me) új.TelítetlenBFábaBeszúr(k) else TelítetlenBFábaBeszúr(k) Ezt csak a bfa gyökerére hívjuk meg
14
Kulcs törlése BFából Hasonlít a beszúrásra, de kicsit bonyolultabb A minimális fokszámnál szélesebb csúcsokból törlünk. A keskenyebbeket egyesíteni próbáljuk A rekurzió során lefelé menőben minden egyesíthető csúcsot egyesítünk, felfelé pedig törlünk a pontos algoritmust nem adjuk meg, ez HF!!
15
P C G M T X A BD E FY ZU VQ R S N O J K L P C G M T X A BD EY ZU VQ R SN OJ K L 0. t=3 legalább t-1=2 kulcs legfeljebb 2t-1=5 kulcs csomópontonként 1. Ha a k kulcs az x levélelemben van kulcs törlése levélelemből
16
2. Ha a k kulcs az x belső csúcsban van (megtaláltuk), és a megelőző k’ kulcsot tartalmazó gyerek fokszáma legalább t+1 –a. megelőző k’ kulcsot rekurzívan töröljük a gyerekből, majd a k’ kulcsot beemeljük az x csúcsba –b. Szimmetrikusan: ha a rákövetkező k” kulcsot tartalmazó gyerek fokszáma legalább t+1… P C G M T X A BD EY ZU VQ R SN OJ K L P C G L T X A BD EY ZU VQ R SN OJ K
17
2.c. 2a-2b után: ha mindkét gyerek fokszáma minimális, akkor a megelőző és a következő gyerek egyesíthető, ebbe levisszük a törlendő k kulcsot ezután töröljük a k csúcsot P C L T X A BD E J KY ZU VQ R SN O P C G L T X A BD EY ZU VQ R SN OJ K
18
3. Ha a k kulcs az x belső csúcsban nincs, akkor meghatározzuk annak a részfájának a csúcsát, amelyikben benne lehet. A rekurzív hívást csak legalább t kulccsal (1 extra kulccsal) rendelkező részfákon hajtjuk végre, hogy legyen mit törölni. Ha mégis csak t-1 kulcsa lenne, akkor –a. Ha van olyan testvére, amelynek legalább t gyereke van, akkor az x csúcsból a megelőző vagy rákövetkező elemet vigyük a gyerekbe, a testvéréből pedig 1 kulcsot vigyünk az x csúcsba. –b. Ha nincs ilyen testvére, akkor egyesítsük a két testvért. –c. Ha a gyökér két utolsó gyerekét egyesítjük, akkor a gyökérkulcsot is vigyük ide le, ilyenkor csökken a fa fokszáma Kulcs törlése BFából
19
P C L T X A BD E J KY ZU VQ R SN O C L P T X A BD E J KY ZU VQ R SN O C L P T X A BE J KY ZU VQ R SN O CL és TX egyesítése, P lemozdítása A fa magassága csökken
20
C L P T X A BE J KY ZU VQ R SN O E L P T X A CJ KY ZU VQ R SN O A B törlése megsértené a minimális fokszám elvét, viszont a testvérének van egy extra kulcsa a testvérétől 1-et felviszünk, fentről egyet lehozunk, és ekkor már törölhetjük az elemet
Hasonló előadás
© 2024 SlidePlayer.hu Inc.
All rights reserved.