1 / 20

BFák

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

hunter
Download Presentation

BFák

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  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. BFák M Q T X D H • 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 B C F G J K L N P R S V W Y Z

  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 ki egy kulcs, amelyik a gyerek[i] részfában van, akkor: k1<=kulcs[1]<=k2<=kulcs[2]<=…<=kulcs[n]<= kn+1

  5. BFa Definíciója • 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 !)

  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<=logt(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+2t2+…+2th-1=1+(t-1)*i=1Σh 2ti-1 ==1+2(t-1)(th-1)/(t-1)=2th-1 • Vagyis más fákran>=2th-1 logt(n+1)/2>=h

  7. Keresés BFában Többutas elágaztató döntés • BFaKeres(k)i=1while i<=n és k>kulcs[i] i=i+1if i<=n és k=kulcs[i] then return (Me,i)if levél then return NILelse LemezrőlOlvas(gyerek[i]) return gyerek[i].BFaKeres(k) Ha megtaláltuk csúcs és index visszaadása Jobbrekurzív algoritmus: HF: átírni ciklikussá

  8. Üres BFa készítése Lemezen helyfoglalás • ÚjBFa()bfa=CsúcsotElhelyez()bfa.levél=Igazbfa.n=0LemezreÍr(bfa)return(bfa)

  9. BFa egy csúcsának kettévágása Új csúcs kezdőértékezése Csúcs fokszáma feleződik • 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élcsúcs.n=t-1for 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]=újkulcs[i]=csúcs.kulcs[i]n=n+1LemezreÍr(csúcs), LemezreÍr(új), LemezreÍr(Me) Gyerekek, kulcsok átmásolása Új csúcs beszúrása apa csúcsai közé

  10. Csúcs kettévágása N W N S W P Q R S T U V P Q R T 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. Kulcs beszúrása BFába A fa gyökere telítetlen • TelítetlenBFábaBeszúr(k) i=n if levél then while i>=1 és k<kulcs[i] kulcs[i+1]=kulcs[i] i=i-1 kulcs[i+1]=k n=n+1 LemezreÍr(Me) else while i>=1 és k<kulcs[i] i=i-1 i=i+1 LemezrőlOlvas(gyerek[i]) if gyerek[i].n=2t+1 then BFaVágásGyerek(i,gyerek[i]) if k>kulcs[i] then i=i+1 gyerek[i].TelítetlenBFábaBeszúr(k) Beszúrás levélelembe Ha a gyerek telített, akkor felhasítjuk Meghatározzuk, hogy a rekurziót melyik gyerekkel folytassuk

  13. Kulcs beszúrása BFába Ezt csak a bfa gyökerére hívjuk meg • 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)

  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 T X C G M N O A B D E F J K L Q R S U V Y Z • 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 P T X C G M A B D E J K L N O Q R S U V Y Z

  16. P T X C G M A B D E J K L N O Q R S U V Y Z P T X C G L A B D E J K N O Q R S U V Y Z • 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…

  17. P T X C G L A B D E J K N O Q R S U V Y Z • 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 T X C L A B D E J K N O Q R S U V Y Z

  18. Kulcs törlése BFából • 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

  19. P C L P T X A B E J K N O Q R S U V Y Z CL és TX egyesítése, P lemozdítása T X C L A B D E J K N O Q R S U V Y Z C L P T X A B D E J K N O Q R S U V Y Z A fa magassága csökken

  20. C L P T X A B E J K N O Q R S U V Y Z E L P T X A C J K N O Q R S U V Y Z • 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

More Related