adatszerk-08-fak

Download Report

Transcript adatszerk-08-fak

Hierarchikus adatszerkezetek
A szekveniális adatszerkezetek általánosítása.
Minden adatelemnek pontosan 1 megelőzője van,
de akárhány rákövetkezője lehet, kivéve egy
speciális elemet.
 Fa (tree)
 Hierarchikus lista: olyan, mint a fa, csak más a
reprezentációja.
23:56:40
1
Fa adatszerkezet


dinamikus, homogén, hierarchikus adatszerkezet
Speciális fogalmakat értelmez:




Gyökér(elem): az az elem a fában, amelynek nincs
megelőzője.
levél elem: az az elem a fában, amelynek nincs
rákövetkezője;
közbenső elem: az összes többi elem,
(néha ide tartoznak a levél elemek is)
él: irányított élek: 2 elem között, „szülő”-től a „gyermek”
felé
gyökérelem
csúcs  O
 út
1. szint
O
O
2. szint
csúcs  O
O
él O
O
23:56:40
0. szint
O
O
O
3. szint
4
(a fa mélysége)
2
Fa adatszerkezet





23:56:40
út: gráfelméleti út fogalom: fában: 2 elem közötti
élsorozat; itt (fa adatszerkezetben) az út is irányított
szint: a fában: egy adott elem szintje = az adott elem
távolsága a gyökértől. A gyökértől az adott elemhez
vezető út hossza.
magasság: a fa szintjeinek a száma, a
gyökérelemtől a levélelemekig vezető utak mentén
lévő elemek számának a maximuma.
csúcs, csomópont: az elemek a fában (gráfelméleti
fogalom)
részfa: az eredeti fának egy eleméből (a részfa
gyökere) és a belőle elérhető további elemekből
(gyermekei, unokái, …) álló része.
(Az egész eredeti fa is egy részfa, egyetlen elem
(levélelem) is lehet részfa.)
3
Részfa
a
c
d
f
a
b
e
Pl. ez
is egy
részfa!
b
f
c
De ez
nem
részfa!
e
d
És ez is!
g
g
Meg
ez is!
23:56:40
4
Rendezetlen Fa


rendezetlen fa: az élek sorrendje tetszőleges
ha rendezetlen ez a 2 fa, akkor ekvivalensek
egymással.
a
c
d
f
g
23:56:40
a
b
e
b
c
f
e
d
g
5
Rendezett Fa, Bináris Fa



Rendezett fa: Számít az élek sorrendje. Így az előző
2 fa nem ekvivalens.
A továbbiakban csak rendezett fákkal foglalkozunk.
(A reprezentáció többnyire automatikusan létrehoz egy
sorrendet az élek között.)
Bináris fa: fontos az informatikában. Bármely
elemének legfeljebb 2 rákövetkezője van (vagy 0,
vagy 1, vagy 2)
Szigorú értelemben vett bináris fa: a fa bármely
elemének vagy 0, vagy 2 rákövetkezője van.
Rendezett, bináris fák esetén értelmezettek a
következő fogalmak: baloldali / jobboldali
részfa

23:56:40
Pl. baloldali részfa: részfa, melynek gyökere az
adott elem baloldali rákövetkezője. Az elemtől balra
van.
6
„Bináris” reprezentáció

Minden nem bináris fa (tetszőleges fa),
reprezentálható bináris fával. (binarizáljuk)
1.
2.
3.
4.
23:56:40
a bináris fa gyökéreleme a nem bináris fa
gyökéreleme lesz.
a binárisfa egy elemének bal oldali rákövetkezője
a nem bináris fa legbaloldalibb rákövetkezője lesz.
a nem bináris fa azonos szinten lévő elemeit
(testvérelemeket), a most leképezett elem
jobboldali rákövetkezőjeként, és azok jobboldali
rákövetkezőjeként fűzzűk fel a bináris fában.
2. és 3. lépés a binfa minden elemére, mint
gyökérelemre megismételjük.
7
„Bináris” reprezentáció
a
b
a
c
f
g
e
b
d

a
c
f
b
e
d
c
=
g
f
g
e
d
Az algoritmus pszeudo-kódja: gyakorlaton!
23:56:40
8
A bináris fa adatszerkezet műveletei





Létrehozás: üres fát hozunk létre, majd utána
bővítjük.
Bővítés: lehet részfával, vagy 1 elemmel.
Általában levél elemnél bővítünk
(nem mindig, a fa típusától függ)
Törlés: részfát vagy 1 elemet.
(Ekkor a megmaradt elemeket át kell rendezni,
hogy továbbra is fa maradjon.
Csere: van, elérés alapján történik.
Rendezés: nincs
(illetve bővítés közben előfordulhat)
23:56:40
9
A bináris fa adatszerkezet műveletei


Keresés és elérés: a bejárás alapján történik.
Bejárás: adott adatszerkezet elemeit
leképezzük egy sorra. 3 algoritmusa van,
preorder, inorder és postorder bejárás.

Preorder:


Inorder:


A két részfa bejárása között dolgozzuk fel a
gyökérelemet.
Postorder:

23:56:40
A gyökérelemet a két részfa előtt dolgozzuk fel.
A gyökérelemet a két részfa után dolgozzuk fel.
10
Bináris fa preorder bejárása
(A gyökérelemet a 2 részfa bejárása előtt
dolgozzuk fel.)

Preorder bejárás algoritmusa:




1. Ha a bejárandó fa üres, akkor a bejárás kész.
2. Különben feldolgozzuk a gyökérelemet,
3. majd preorder módon bejárjuk a baloldali
részfáját a gyökérelemnek,
4. majd a jobboldali részfáját járjuk be preorder
módon.
Rekurzív algoritmus, de maga a fa adatszerkezet
is erősen rekurzív adatszerkezet
23:56:40
11
Bináris fa preorder bejárása
a
1
b
c
e
d
i
2
f
g
3
h
5
4
6
7
8
9
abcdeifgh
23:56:40
12
Bináris fa inorder bejárása
(A gyökérelemet a 2 részfa bejárása között
dolgozzuk fel.)

Inorder bejárás algoritmusa:

Ha a bejárandó fa üres, akkor vége.

Különben inorder módon bejárjuk a baloldali
részfáját a gyökérelemnek.

Majd feldolgozzuk a gyökérelemet.

Ezután bejárjuk a gyökér jobboldali részfáját inorder
módon.
23:56:40
13
Bináris fa inorder bejárása
a
4
b
c
e
d
i
2
f
g
1
h
6
3
5
8
7
9
cbdaiegfh
23:56:40
14
Bináris fa postorder bejárása


(A gyökérelemet a 2 részfa bejárása után
dolgozzuk fel.)
Postorder bejárás algoritmusa:

Ha a bejárandó fa üres, akkor a bejárás
befejeződik.

Különben posztorder módon bejárjuk a gyökérelem
baloldali részfáját.

Majd posztorder módon bejárjuk a jobboldali
részfáját is a gyökérelemnek.

Végül feldolgozzuk a gyökérelemet.
23:56:40
15
Bináris fa postorder bejárása
a
9
b
c
e
d
i
3
f
g
1
h
8
2
4
7
5
6
cdbighfea
23:56:40
16
Reprezentáció

Mint minden adatszerkezetet, a fát is lehet folytonosan
is és szétszórtan is ábrázolni. Ezzel együtt a
kézenfekvő és sokkal gyakrabban alkalmazott, a
szétszórt ábrázolás.
a
gyökér
b
c
i
c
f
g
23:56:40
b
e
d
a
h
e
d
i
f
g
h
17
Reprezentáció
Index Adat

Folytonos ábrázolást 3
vektorral szokás megoldani

Az egyik tartalmazza az
adatokat

A másik kettő a bal illetve
jobboldali részfa
gyökérelemeihez tartozó
indexeket, illetve 0-t, ha
nincs ilyen rákövetkezője az
aktuális elemnek. (Ezek az
indexek veszik át a szétszórt
ábrázolás mutatóinak
szerepét.)
23:56:40
Bal
Jobb
1
a
2
5
2
b
3
4
3
c
0
0
4
d
0
0
5
e
6
7
6
i
0
0
7
f
8
9
8
g
0
0
9
h
0
0
18
Reprezentáció
Index Adat
a
b
c
e
d
i
f
g
23:56:40
h
Bal
Jobb
1
a
2
5
2
b
3
4
3
c
0
0
4
d
0
0
5
e
6
7
6
i
0
0
7
f
8
9
8
g
0
0
9
h
0
0
19
Kifejezések kiértékelése

A fa adatszerkezet egyik
alkalmazási területe:
kifejezések kiértékelésénél
kifejezés fákat használnak;
Unáris, bináris operátorokkal
felírt kifejezést lehet ábrázolni
bináris fával.
Pl: a/b+c*(d-e)
+
/
a
*
b
c
d
23:56:40
e
20
Kifejezések kiértékelése

Aszerint, hogy milyen módon járjuk be ezt a fát,
megkülönböztetünk prefix, infix és posztfix
kifejezéseket:

prefix: +/ab*c-de

infix: a/b+c*d-e

postfix: ab/cde-*+
(maga a kifejezés, de zárójelek nélkül)
(fordított lengyel ábrázolás)

A prefix és a postfix alak egyértelmű.

Az infix alak viszont nem egyértelmű.

23:56:40
Zárójelezéssel és speciális szabályokkal az infix forma is
egyértelművé tehető.
21
Kifejezések kiértékelése
Az alábbi három kifejezésfa infix alakjai megegyeznek.
Pedig eltérő kifejezéseket ábrázolnak.
a/b+c*(d-e)
+
*
b
c
/
-
d
23:56:40
*
+
/
a
(a/b+c)*(d-e)
a/b+c*d-e
a
e
+
b
*
c
/
e
d
a
c
d
e
b
22
Speciális fa adatszerkezetek

Minimális magasságú fa: akkor ilyen egy fa, ha az
aktuális számú elem nem lenne elhelyezhető egy
kisebb magasságú fában.


Egy lehetséges megvalósítás, ha a levélelemek mindegyike
a legalsó két szinten található és a legalsó szint kivételével
minden szintre a lehető legtöbb elemet tesszük. Ahogy
jönnek az új elemek egyenletesen osztjuk meg őket a bal és
a jobb oldalon.
Kiegyensúlyozott fa: ha minden elem esetén a bal
és jobboldali részfáknak a magasságkülönbsége
legfeljebb 1.
23:56:40
23
Tökéletesen kiegyensúlyozott fa
létrehozása

Tökéletesen kiegyensúlyozott fa: ha a fa
bármely elemének bal és jobboldali részfájában
az elemek száma legfeljebb eggyel tér el.

Egy lehetséges algoritmus a létrehozására:
(tudjuk, hogy összesen n darab elem lesz a fában.)



23:56:40
Az első elem legyen a gyökérelem.
Előállítjuk a gyökérnek az nb=[n/2] elemből álló baloldali
részfáját ugyanezzel az algoritmussal (rekurzió).
Majd előállítjuk a gyökérnek az nj=n-1-nb elemből álló
jobboldali részfáját ugyanezzel az algoritmussal.
24
Példa: n=21, nb=10 ……
8, 9, 11, 15, 19, 20, 21, 27, 30, 32, 41, 45, 46, 49, 53, 54, 58, 62, 67, 76, 78
8
9
45
11
15
19
23:56:40
27
20
21
30
32
46
41
49
53
62
64
58
67
78
76
25
Tökéletesen kiegyensúlyozott fa
létrehozása

Egy lehetséges -másik- algoritmus a létrehozására:
(Nem kell tudnunk, hogy összesen hány darab elem lesz a fában.)



23:56:40
Ha üres a fa, az első elem legyen a gyökérelem.
Egyébként, ha a baloldali részfa elemszáma nem
nagyobb a jobboldali részfáénál, akkor helyezzük el a
következő elemet ugyanezzel az algoritmussal a baloldali
részfában (rekurzió).
És végül, ha a baloldali részfa elemszáma nagyobb a
jobboldali részfáénál, akkor helyezzük el a következő
elemet ugyanezzel az algoritmussal a jobboldali
részfában (rekurzió).
26
Példa: n=21, nb=10 ……
8, 9, 11, 15, 19, 20, 21, 27, 30, 32, 41, 45, 46, 49, 53, 54, 58, 62, 67, 76, 78
8
9
11
15
27
54
23:56:40
20
45
76
32
62
19
49
30
58
21
46
78
41
53
67
27
Tökéletesen kiegyensúlyozott fa
Minimális magasságú fa
Kiegyensúlyozott fa
23:56:40
28
Keresőfa



Keresőfa (rendezőfa): az elemeket kulcsuk alapján
rendezzük és kulcs alapján visszakeressük őket.
Egy fa akkor keresőfa, ha bármely elemére igaz, hogy
az adott elem kulcsa

nagyobb, mint az elem baloldali részfájában lévő
kulcsok,

és kisebb, mint a jobboldali részfájában lévő
kulcsok.
Tehát a keresőfában nem lehet két azonos kulcsú
elem.
23:56:40
29
Keresőfa műveletei

Létrehozása: üres fát hozunk létre.

Bővítés algoritmusa:
(Mindig levélelemmel bővítünk.)

ha üres a fa, akkor gyökérelemnek helyezzük el az
új elemet.

Egyébként az új elemet,

23:56:40

ha kisebb mint a gyökér, a baloldali részfába ,

ha nagyobb, akkor a jobboldali részfába rakjuk.
Majd ezt ismételjük a részfára.
30
8, 9, 11, 15, 19, 20, 21, 7, 3, 2, 1, 5, 6, 4, 13, 14, 10, 12
17, 16, 18
8
7
9
3
2
1
11
5
4
10
6
13
12
23:56:41
15
19
14
17
16
20
18
21
31
Keresőfa műveletei


Keresés: Egy ilyen fában triviálisan alkalmazhatjuk a
bináris keresés algoritmusát. Itt a középső elem a
gyökérelem lesz. Ha nem tudok továbbmenni és még
nem találtam meg a keresett elemet, akkor nincs
benne a fában.
(Nem feltétlen olyan hatékony, mint a vektorokban.)
Törlés keresőfából: kereséssel kezdődik, ugyanúgy
mint a beszúrásnál. Ha nincs benne, nem tudom
törölni. Ha benne van három eset lehet a
rákövetkezők száma (0, 1, 2) alapján.
23:56:41
32
Keresőfa műveletei

A törlés három esete
1.
Levélelem: kitörlöm, a szülő megfelelő mutatóját NIL-re
állítom
2.
Egy rákövetkezője van: az egy rákövetkezőjét
felcsúsztatjuk (rácsúsztatjuk) a törlendő elem helyére.
3.
Két rákövetkezője van: meg kell keresni a törlendő elem
baloldali részfájának a legjobboldalibb elemét. Ennek az
értékével írjuk felül a törlendő elem értékét (csere). Majd
töröljük a baloldali részfa legjobboldalibb elemét.
(Az is jó, ha a jobboldali részfa legbaloldalibb elemével
csináljuk ugyanezt.)
23:56:41
33
8
7
9
2
3
2
1
11
5
4
1
10
6
3
15
13
12
19
14
17
16
23:56:41
20
18
21
34
8
7
9
2
3
2
1
11
5
4
1
10
6
3
14
13
12
19
14
17
16
23:56:41
Itt 15 volt a
törlés előtt.
20
18
21
35
Tökéletesen kiegyensúlyozott fa
Minimális magasságú fa
Kiegyensúlyozott fa
23:56:41
36
AVL-fa (G.M. Adelson-Velsky, E.M. Landis)

Kiegyensúlyozott keresőfa (AVL-fa):

A tökéletesen kiegyensúlyozott keresőfában a beszúrás és a
törlés végrehajtása után a tökéletes kiegyensúlyozottság
visszaállítása nagyon bonyolult .

Az AVL-fában ugyanezek a műveletek egyszerűbben
végrehajthatóak. Ez az oka, hogy az AVL-fákat elterjedten
alkalmazzák.

A kiegyensúlyozott fa magassága elemszámtól függetlenül
legfeljebb 45%-kal nagyobb, mint a tökéletesen kiegyensúlyozott
fáé.
23:56:41
37
Az AVL fa műveletei

Új elem beszúrása az AVL-fába:

Keresés végrehajtása a fában a keresőfa szabályai szerint.
Ha az elem már a fában van: vége (két egyforma elemet
nem helyezhetünk el a keresőfában.)

Ha nincs a fában, levélelemként szúrjuk be a megfelelő
helyre és kiegyensúlyozzuk a fát, ha szükséges.
Beszúrás előtt valahogy így néz ki a fa:
H-1
23:56:41
H-2
H
38
Az AVL fa műveletei (beszúrás)
Ha jobboldalra írunk be, nőhet a jobboldali részfa
magassága. Így ugyanolyan magas lesz a két részfa.
(Ha egyforma magas lett volna, akkor sem lenne
gond, mert eggyel magasabb lenne a jobb, mint a bal
a beszúrás után, ami még mindig megfelel a
kiegyensúlyozottság feltételeinek.)

23:56:41
Gond akkor van, ha a magasabb részfába szúrjuk
be az újabb elemet és ennek hatására tovább nő a
részfa magassága.
39
Az AVL fa műveletei (beszúrás)

1. eset: [LL]

A részfa gyökérelemére nézve elromlik a kiegyensúlyozottság,
mivel a különbség 2 lesz a két részfa között.
H
23:56:41
H-2
H
40
Az AVL fa műveletei (beszúrás)

2. eset [LR]:

a baloldali részfa jobboldali részfájába szúrjuk be az új
elemet.
H
23:56:41
H-2
H
41
Az AVL fa műveletei (beszúrás)

Természetesen ezen esetek szimmetrikus
párjai is előfordulhatnak
H-2
23:56:41
H-1
H
42
Az AVL fa műveletei (beszúrás)

3. eset [RL]:

a baloldali részfa H-2-es és a jobboldali részfa H-s
magassága rontja el a kiegyensúlyozottságot.
H-2
23:56:41
H
H
43
Az AVL fa műveletei (beszúrás)

4. eset [RR]:

a jobboldali részfa jobboldali részfájába szúrúnk be. Az első
és a negyedik eset, illetve a második és harmadik eset
egymásnak szimmetrikus párjai.
H-2
23:56:41
H
H
44
Az AVL fa műveletei (beszúrás)

Első és negyedik eset: külső beszúrás, külső bővítés

Második és harmadik eset: belső bővítés, belső beszúrás

Először a külső bővítéssel elrontott fát egyensúlyozzuk ki.
1. Külső bővítés utáni kiegyensúlyozás



LL-forgatás (left left)

(Szimmetrikus párja az RR-forgatás (right right).)
A részfa új gyökéreleme a régi gyökér baloldali
rákövetkezője lesz;
A régi baloldali rákövetkező jobboldali részfája az új
jobboldali rákövetkező (a régi gyökér) baloldali részfája
lesz.
23:56:41
45
k1<k2

A
B
C
A
B
C
12
12
8
4
2
23:56:41
1
10
6
16
4
16
2
14
1
8
6
14
10
46
Az AVL fa műveletei (beszúrás)
2. Belső bővítés utáni kiegyensúlyozás:

a belső bővítés után egy forgatással nem lehet megoldani
a kiegyensúlyozást.

A
23:56:41
B
C
A
B
C
47
Az AVL fa műveletei (beszúrás)

A belülre beírt új elemet először kihozzuk, de a magasság
még mindig nem lesz jó

LR-forgatás: a baloldali részfa jobboldali részfáját forgatjuk
helyre;


D
A
D
B
A
C
23:56:41
B
C
A
B
D
C
C
48


D
A
D
B
C
A
B
A
B
D
C
C
C
12
12
16
8
4
2
23:56:41
10
16
8
6
14
4
6
5
12
2
10
14
8
4
2
5
16
6
5
14
10
49
Az AVL fa műveletei (beszúrás)



A 3. eset a második esetnek a szimmetrikus párja: a
harmadik esetet megoldó két forgatás együttesen RL
forgatás (RL= Right + Left).
A jobboldali részfa baloldali részfájába való beszúrás
rontotta el a kiegyensúlyozottságot. Ennek
megfelelően zajlik a helyrehozás is.
Beszúrás után két lépésben minden AVL-fa
kiegyensúlyozható.
23:56:41
50
Az AVL fa műveletei (törlés)

Törlés kiegyensúlyozott fából:

Megkeressük a törlendő elemet, majd töröljük a kereső
fából. Ha kiegyensúlyozott maradt a fa, akkor készen
vagyunk.

Ha nem, akkor az előbbi négy eset valamelyike következik
be. Ezeket már tudjuk kezelni.

Esetleg:

A
D
B.
23:56:41
A
B
C
D
C
51
Az AVL fa műveletei (törlés)

Törlés kiegyensúlyozott fából:

Megkeressük a törlendő elemet, majd töröljük a kereső
fából. Ha kiegyensúlyozott maradt a fa, akkor készen
vagyunk.

Ha nem, akkor az előbbi négy eset valamelyike következik
be. Ezeket már tudjuk kezelni.

Esetleg:

A
D
B.
23:56:41
A
B
C
D
C
52
Piros-Fekete Fa




Piros-Fekete-fa: olyan bináris kereső fa, melyben minden
elemnek színe van, amely vagy piros vagy fekete.
Az elemek szinezésének szabályozásával biztosítható,
hogy benne valamely a gyökértől levélig vezető út hossza
nem lehet nagyobb, mint a legrövidebb ilyen út
hosszának a kétszerese.
Ez biztosítja, hogy bármely n db adatelemet tartalmazó
piros–fekete fa magassága legfeljebb 2*log2(n+1).
A piros-fekete fát ezért megközelítőleg
kiegyensúlyozottnak tekinthetjük.
23:56:41
53
Piros-Fekete Fa

Egy kereső fát piros-fekete fának nevezünk, ha
teljesülnek rá a következő piros-fekete tulajdonságok:
1.
Minden elem színe piros vagy fekete
2.
A gyökérelem színe fekete
3.
Minden levélelem színe fekete
4.
Minden piros elemnek mindkét rákövetkezője
fekete
5.
Bármely két, azonos elemből induló és levélelemig
vezető úton ugyanannyi fekete színű elem van.
(A levélemekben nem tárolunk adatokat.)
23:56:41
54
Piros-Fekete Fa
26
41
17
21
14
47
30
NIL
10
7
3
NIL
16
12
NIL
NIL
20
NIL
NIL
28
23
NIL
15
NIL
19
NIL
NIL
38
NIL
NIL
NIL
33
39
NIL
NIL
NIL
NIL
NIL
NIL
NIL
23:56:41
NIL
55
Piros-Fekete Fa
(a gyakorlatban leginkább)
26
41
17
21
14
10
7
16
12
15
19
23
20
47
30
28
38
33
39
3
23:56:41
NIL
56
Piros-Fekete Fa műveletei


Beszúrás és törlés: úgy történik, mint korábban (a pirosfekete fa is kereső fa), de ez megsértheti a piros-fekete
tulajdonságokat. Ezért módosítás után lehet, hogy
bizonyos elemek színét meg kell változtatni, esetleg
forgatással a fa szerkezetét is meg kell változtatni.
Bővítés: a piros-fekete fát mint kereső fát bővítjük.
Mindig levélelemmel bővíthető. A beszúrt elem színe
legyen:

fekete, ha ez az első elem (gyökérelem) és

piros, egyébként (általában).
Ezt követően meg kell vizsgálni, mely tulajdonságai
sérültek a piros-fekete fának?
23:56:41
57
Piros-Fekete Fa műveletei (bővítés)
1.
Minden elem színe piros vagy fekete
OK
2.
A gyökérelem színe fekete
OK
3.
Minden levélelem színe fekete
OK (két fekete NIL kapcsolódik hozzá)
4.
Minden piros elemnek mindkét rákövetkezője fekete
Beszúrt elemnél teljesül, de a szülőjénél sérülhet.
(Csak akkor sérül, ha az elem, amihez beszúrtuk az újat, piros
színű. Ekkor a fát át kell szervezni.)
5.
23:56:41
Bármely két, azonos elemből induló és levélelemig
vezető úton ugyanannyi fekete színű elem van.
Teljesül, mert piros elemet szúrtunk be.
58
Piros-Fekete Fa műveletei (bővítés)

A beszúrt elem szülője fekete: KÉSZ vagyunk

A beszúrt elem szülője és nagybátyja piros:

Átszínezéssel lokálisan megoldható, vagy a fa gyökere felé
tolható a probléma
t
t
1
x
0
uj
0
1
y
x
0
1
y
1
uj
0
23:56:41
A probléma tovább gyűrűzhet a fa gyökere irányába
59
1. A problémás elem szülője fekete: KÉSZ vagyunk
2. A problémás elem szülője és nagybátyja piros:

Átszínezéssel megoldható, vagy a fa gyökere felé tolható a
probléma
t
t
n
n+1
n
x
y
n-1
z
C
n-1
A
n-1
B
n-1
n-1
x
n-1
D
n-1
y
n
z
E
C
n-1
n-1
A
n-1
n
n-1
D
n-1
E
n-1
B
n-1
23:56:41
60
A,B,C,D: Fekete gyökerű, azonos fekete-magasságú részfák
Piros-Fekete Fa műveletei (bővítés)
3. A problémás csúcs és a szülője nem azonos oldali
gyermekek:

1 forgatással átalakítható a következő esetre:
4. A problémás csúcs és a szülője azonos oldali
gyermekek:

1 forgatás, plussz átszínezés: helyreállnak a tulajdonságok.
3
z
z
n
n
x
y
D
n-1
n-1
y
A
n-1
C
x
n-1
n-1
D
n-1
n-1
n-1
23:56:41
61
B
n-1
C
n-1
A
n-1
B
n-1
3
z
z
n
n
x
y
D
n-1
n-1
y
A
C
B
C
A
n-1
B
n-1
n-1
3
x
x
n
n
y
D
n-1
n-1
n-1
n-1
n-1
y
A
z
A
B
n-1
n-1
n-1
23:56:41 n-1
n-1
x
n-1
n-1
D
n-1
n-1
z
B
n-1
n-1
C
n-1
C
n-1
A,B,C,D: Fekete gyökerű, azonos fekete-magasságú részfák
D
n-1
62
4a
z
y
n
y
D
n-1
A
B
A
n-1
n
n-1
C
n-1
z
x
n-1
x
4b
?
n-1
n-1
D
C
n-1
n-1
4b
B
n-1
n-1
y
A
n-1
n-1
n-1
B
n-1
D
C
n-1
n-1
z
n-1
n
z
C
n-1
x
n-1
23:56:41
A
?
n-1
n-1
n-1
y
B
z
x
n
n-1
n
4a
x
A
y
B
n-1
C
n-1
D
n-1
D
n-1
A,B,C,D: Fekete gyökerű, azonos fekete-magasságú részfák
63
Törlés Piros-Fekete fából


Binfából való törléssel megegyező módon
(törlendőnek 0, 1, 2 gyermeke van).
Ha 2 gyerek van, áttranszformálással jár.
A piros-fekete fa tulajdonságainak helyreállításához a
ténylegesen törölt (fizikai-logikai) csomópontot kell
figyelembe venni.
23:56:41
64
8
7
9
3
2
1
11
5
4
10
6
14
13
12
19
14
17
16
23:56:42
20
18
21
65
Törlés Piros-Fekete fából

Jelölje V a ténylegesen törölt elemet!
(V legalább egyik gyermekének levélelemnek kell lennie.)
Ha V-nek van egy nem levél gyereke, akkor V helyét ez a
gyerek, egyébként egy levélelem veszi át.
1. Ha V piros volt: KÉSZen vagyunk
2. Ha V fekete volt, több tulajdonság is sérül, ill. sérülhet:
2.
A gyökérelem színe fekete
Talán sérül. (Ha V gyökérelem volt és a gyermeke piros.)
4.
Minden piros elemnek mindkét rákövetkezője fekete
Talán sérül. (Ha V gyermeke és a szülője is piros)
Bármely két, azonos elemből induló és levélelemig vezető úton
ugyanannyi fekete színű elem van.
Majdnem bizonyosan sérül.
23:56:42
66
(Az egyetlen kivétel, ha V a gyökér elem volt.)
5.
Törlés Piros-Fekete fából
2. Jelölje U azt az elemet, amely átveszi a ténylegesen
törölt fekete elem helyét!
(Ha az U levél volt, tudjuk róla, hogy fekete.)


V törlése után egy fekete tokent rendeljünk hozzá
ahhoz a csúcshoz, ami V helyére került (U). Ezen a
tokenen átmenő, levélig vezető utak eggyel kevesebb
fekete elemet tartalmaznak, mint kellene. A token ezt
jelzi.
Cél: ezt a fekete tokent mind feljebb mozgassuk a
fában, vagy teljesen eltüntessük.
23:56:42
67
Törlés Piros-Fekete fából


Ha egy csomópont fekete színű és rendelkezik ezzel a
fekete tokennel, ezt duplán fekete elemnek nevezzük.
Fizikai szinten nem jelenik meg a fában a fekete token,
csak koncepcionális (fogalmi) szinten.
5 esetet különböztethetünk meg, melyek kölcsönösen
kizárják egymást:
a)
A token egy piros elemnél, vagy a fa gyökerénél van
b)
A duplán fekete elem testvére piros
c)
A duplán fekete elem testvére, és mindkét unokaöccse fekete
d)
A duplán fekete elem testvére és távolabbi unkaöccse fekete, de
a közelebbi unokaöccse piros.
A duplán fekete elem testvére fekete, de a távolabbi unkaöccse
23:56:42
68
piros.
e)
Törlés Piros-Fekete fából
2a, A tokennel rendelkező csúcspont piros színű, vagy a
fa gyökere, esetleg mindkettő:
Ekkor a csúcspont színét feketére váltjuk és vége.

Ez a lépés a második és negyedik tulajdonságot azonnal
helyreállítja.

Az ötödik tulajdonságot is helyreállítja: Pl. az úgynevezett
(hiányzó) fekete csúcspontot megkapták azok az utak,
amelyekből ez hiányzott.

Ha a gyökérben van a token, és a gyökér fekete, akkor
csökken a fa fekete-magassága.
y
y■
n+1
n+1
n
23:56:42
A
n
B
n
A
n
A,B: Azonos fekete-magasságú részfák
B
n
69
Törlés Piros-Fekete fából
2b, Ha a duplán fekete elem testvére piros, akkor egy
forgatást és egy színcserét kell végrehajtani. A duplán
fekete elem szülője körül forgatunk, a testvért és a
szülőt színezzük át. Ez a lépés biztosítja, hogy a
duplán fekete csúcspont testvére fekete lesz, így egy
lépés múlva, vagy a c, d, e esetek valamelyike fog
előállni.
A token a forgatással egy szinttel távolabb kerül
ugyan a gyökértől, de most már a duplán fekete
csúcspont szülője piros, testvére pedig fekete:

23:56:42
Ha távolabb kerül a token, a gyökértől, onnantól 4 lépésen
belül már el lehet tüntetni (közel vagyunk a megoldáshoz).
70
2b
y
n
z
x■
n-1
n-2
A
n-3
B
n-3
D
C
n-1
n-1
z
z
n
?
y
y
n
n-1
D
D
n-1
x■
n-1
x■
C
n-2
C
n-2
n-1
A
n-3
B
n-3
n-1
A
n-3
23:56:42
B
n-3
2 ?c,d,e?
71
C,D: Fekete gyökerű részfák
Törlés Piros-Fekete fából
2c, Tegyük fel, hogy a duplán fekete testvére és mindkét
unokaöccse fekete. Ekkor a testvért pirosra színezzük,
a tokent egy csúcsponttal feljebb visszük a gyökér
irányába.
A testvér átszínezésével az utakból (rajta keresztül)
egy fekete kitörlődik. y-ba felvisszük a tokent: az y
alatti rész eggyel kevesebb feketét tartalmaz, mint
kellene. Még fennáll a probléma, de már eggyel
feljebb toltuk a tokent.
(Ezt csak akkor lehet végrehajtani, ha mindkét
unokaöccs fekete.)
23:56:42
72
2c
y
y■
?
?
z
x■
n-1
A
n-2
B
n-2
C
n-1
z
x
n
n-1
n-1
D
n-1
A
n-2
23:56:42
B
n-2
C
n-1
D
n-1
73
C,D,: Fekete gyökerű részfák
Törlés Piros-Fekete fából
2d, A duplán fekete csúcspontnak fekete a testvére és
a távolabbi unokaöccse, de a közeli unokaöccse piros.
y
y
?
y
?
w
x■
?
z
x■
n
n-1
?
n-1
z
x■
n
n-1
w
A
n-2
B
n-2
z
E
n-1
n-1
A
n-2
B
n
C
n-2
D
C
n-1
D
A
n-2 n-1
n-1
B
w
n-1
C
n-2 n-1
E
D
n-1
E
n-1
n-1
2e
n-1
23:56:42
74
C,D, E: Fekete gyökerű részfák
Törlés Piros-Fekete fából
2e, A duplán fekete elem testvére fekete, de a távolabbi
unkaöccse piros.
(A közelebbi unokaöccse bármilyen színű lehet.)
y
x■
C
D
n-1
n-1
x
n-1
C
n-1
E
A
n-1 n-2
n
n
x■
w
w
y
w
?
n-1
n-2 n-1
n-2
y
n
n-1
A
?
n
z
B
z
z
?
D
n-1
n-1
E
C
n-1
n-1
B
n-2
23:56:42
A
n-2
D
n-1
E
n-1
B
n-2
75
D, E: Fekete gyökerű részfák
Tökéletesen kiegyensúlyozott fa
Kiegyensúlyozott fa
23:56:42
13:23:20
Minimális magasságú fa
Bináris kupac
76
A bináris kupac tulajdonságai
 A kupac gráfja:


A minden szintje teljesen kitöltött, kivéve a
legalacsonyabb szintet,
ahol balról jobbra haladva csak egy adott csúcsig
vannak elemek
Azaz, egyértelmű kapcsolat van a kupac
elemszáma, és az őt ábrázoló fa gráfja között
 A “kupac-tulajdonság” (maximum kupac esetén)

23:56:42
A kupac minden i gyökértől különböző elemére teljesül,
hogy:
Szülő( i ).adat ≥ i.adat
Azaz, egy részfa legnagyobb értékű eleme mindig a
részfa gyökerében található.
77
A maximum kupac műveletei

Létrehozás:



Bővítés:


Létrehozhatunk üres kupacot, vagy
Építhetünk kupacot előre megadott elemekből
Új elem elhelyezése a kupacban (tulajdonságok megőrzésével)
Törlés:


Gyökérelemet törlünk (és átszervezés, a tulajdonságok megőrzéséért)
Csere:
 Általában csak valamely elem értékének növelése
támogatott (Elsőbbségi sorként való alkalmazás estén.)
23:56:42
78
A maximum kupac műveletei

Rendezés:


Keresés:



Szekvenciális
Bejárás:


Nem szokásos
Vajon csak teljes keresés lehetséges?
Elérés:


Csak a kupac-tulajdonság erejéig
Az ábrázolás módjától függően -- alapvetően szekvenciális
Feldolgozás:

23:56:42

Tipikusan a gyökérelemre korlátozódik, és
tipikusan törléssel folytatódik
79
A kupac ábrázolása

Szétszórtan (Bár nem lehetetlen, de nem alkalmazzák)


Fa és
cirkuláris lista
(hogy a fa gráfjának speciális formája könnyen
megőrizhatő legyen törlésnél és beszúrásnál.)
Elemenként: 4 mutató
BAL (fa)
 JOBB (fa)
 SZÜLŐ (fa) – Mivel a műveletei gyakran igénylik.
 ELŐZŐ (cirkuláris lista)
(A gyökérelemnél ELŐZŐ a kupac “utolsó” elemére mutat.)
(Láthatóan nagyon körülményes.
Pl. bővítésnél még ilyen sok
segégmutatóval is nehéz megtalálni
az új elem helyét a fában.)

23:56:42
80
A kupac ábrázolása

Folytonosan (Ez a tipikus.)

Egy vektort szokás alkalmazni. (pl. K)
Ekkor beszélhetünk:


A vektor méretéről: méret(K)
A kupac méretéről: kupac_méret(K)
Utóbbi a kupacban aktuálisan található elemek száma.

A fa szerkezet ábrázolása a K vektorban:




Gyökérelem: K[1] (ha kupac_méret(K)>0)
BAL(i)
= i+i
JOBB(i) = i+i+1
SZÜLŐ(i) = [i / 2]
(egészrész)
Ez a fajta (folytonos) ábrázolás csak addig hatékony, amíg a fa
szerkezete (gráfja) megegyezik a kupac adatszerkezetével.
(Más (pl. kereső-) fákra nem célszerű alkalmazni.)
23:56:42
81
A kupac tulajdonság fenntartása
Feltételezés: Egy bizonyos i elem gyermekeinek részfáira már teljesül a
kupac tulajdonság.
Feladat: Elérni, hogy az i elemhez tartozó részfára is teljesüljön a
tulajdonság.
16
1
10
4
3
2
14
7
4
2
9
5
3
6
7
8
8
9
16
16
10
14
4
2
23:56:42
7
8
9
10
14
8
3
2
7
9
3
4
82
A kupac tulajdonság fenntartása
Feltételezés: Egy bizonyos i-nél nagyobb indexekre már teljesül a kupac
tulajdonság.
Feladat: Elérni, hogy az i indexben tárolt elemhez tartozó részfára is
teljesüljön a tulajdonság.
(Esetleg összehasonlításokban: K[i] <== K[i].kulcs)
procedure KUPACOL(K,i)
8. if r ≤ kupac_méret(K)
1. l  BAL(i)
és K[r]>K[max] then
2. r  JOBB(i)
9. max  r
3. if l≤kupac_méret(K)
és K[l]>K[i] then 10. end if
11. if max≠i then
4. max  l
12.
Csere K[i] és K[max]
5. else
13. KUPACOL(K,max)
6. max  i
16
1
14. end if
7. end if 4
10
3
2
14
7
9
3 end procedure
4
5
6
7
23:56:42
83
2
8
8
9
A kupac alkalmazása elsőbbségi
sorok ábrázolására

Elsőbbségi sor:



Alapvető algoritmusok:




Minden elemhez tartozik egy kulcs (prioritás)
Az elemek feldolgozása a kulcsok
csökkenő/növekvő sorrendjében történik
BESZÚR(S,x): az x elemet hozzáadja az S sorhoz.
MAXIMUM(S): Megadja S legnagyobb elemét.
KIVESZ_MAX(S): Megadja és törli S legnagyobb
elemét.
Alkalmazása pl.


23:56:42

Operációs rendszer ütemezési feladatainál,
Esemény vezérelt szimuláció
......
84
Az elsőbbségi sor algoritmusai: BESZÚR
16
10
14
8
2
7
4
9
3
BESZÚR(S,15)
-- Hová kell elhelyezni az új elemet?
15
16
16
8
2
15
4
23:56:42
7
9
10
15
10
14
8
3
2
14
4
9
3
7
85
Az elsőbbségi sor algoritmusai
procedure BESZÚR(S,x)
1. if kupac_méret(S) =méret(S) then
2. KIVÉTEL “Kupacméret túlcsordulás”
3. end if -- pl. folytonos ábrázolás esetén
4. ikupac_méret(S)  kupac_méret(S)+1
5. while i>1 és S[SZÜLŐ(i)].kulcs<x.kulcs do
6. S[i]  S[SZÜLŐ(i)]
16
7. i  SZÜLŐ(i)
10
14
8. end while
8
7
9
3
9. S[i]  x
2
4
15
23:56:42
end procedure
86
Az elsőbbségi sor algoritmusai
function KIVESZ_MAX(S)
1. if kupac_méret(S) <1 then
2. KIVÉTEL “Kupacméret alulcsordulás”
3. end if
4. max  S[1]
5. S[1]  S[kupac_méret(S)]
6. S[kupac_méret(S)]  S[kupac_méret(S)]-1
7. KUPACOL(S,1)
8. return max
end function
23:56:42
87
A kupac alkalmazása rendezéshez
1. változat
procedure KUPACRENDEZÉS_1(K)
1. kupac_méret(K)  1
2. for i  2 to méret(K) do
3. BESZÚR(K,K[i])
4. end for
5. while kupac_méret(K) > 1 do
6. Csere K[1] és K[kupac_méret(K)]
7. kupac_méret(K)  kupac_méret(K)-1
8. KUPACOL(K,1)
9. end while
end procedure
23:56:42
88
A kupac alkalmazása rendezéshez
2. változat
procedure KUPACRENDEZÉS_2(K)
1. kupac_méret(K)  méret(K)
2. i  méret(K)/2
3. while i>0 do
4. KUPACOL(K,i)
5. i  i-1
6. end while
7.
while kupac_méret(K) > 1 do
8.
Csere K[1] és K[kupac_méret(K)]
9.
kupac_méret(K)  kupac_méret(K)-1
10.
KUPACOL(K,1)
11. end while
23:56:42
end procedure
89
A kupac alkalmazása rendezéshez
1. változat
A szürkével jelölt elemekrél lesz a legtöbb dolga.
~ 1*0+2*1+4*2+…+(n/4)*(log n -1) +(n/2)* log n ~
n*log n
2. változat
A feketével jelölt elemeknél semmi dolga.
nem volt.
23:56:42
~ (n/2)* 0 + (n/4)*1 + (n/8)*2 + … + 1*log n ~
n
90
A kupac alkalmazása rendezéshez
3. változat
procedure KUPACRENDEZÉS(K)
1. KUPACOT_ÉPíT(K)
2. while kupac_méret(K) > 1 do
3.
Csere K[1] és
K[kupac_méret(K)]
4.
kupac_méret(K) 
kupac_méret(K)-1
5.
KUPACOL(K,1)
6. end while
end procedure
23:56:42
procedure KUPACOT_ÉPíT(K)
1. kupac_méret(K) 
méret(K)
2. i  méret(K)/2
3. while i>0 do
4.
KUPACOL(K,i)
5.
i  i-1
6. end while
end procedure
91
B-fák (Bayer-fák)

B-fa:

A B-fák lapokból épülnek fel.

A lapokon mutatók és adatelemek helyezkednek el.

Az adatelemek a kulcsaik szerint növekvő sorrendben
vannak egy lapon.

A B-fa is kereső fa. Tehát két azonos kulcsú adatelem nincs
benne.

A p-vel jelölt mutatók levéllapokon NIL értékűek, egyébként
mindig olyan lapot címeznek, amely a B-fa egy olyan
részfájának a gyökereként képzelhető el, ahol minden
adatelem kulcsa a mutatót körülvevő adatelemek kulcsai
közé esnek:
p0
23:56:42
a1
p1
a2
p2
a3
p3
...
pm-1
am
k1
<
k2
<
k3
<
...
<
km
pm
92
B-fák

További tulajdonsággai:

A fának van rendje (n), pl. másodrendű

Minden lap legfeljebb 2n adatot tartalmazhat

A gyökérlapot kivéve minden lapon legalább n adat van

A gyökérlapon lehet ennél kevesebb is
(legalább egy elem van ott, ha nem üres a fa)

Egy lap, vagy levéllap, vagy m+1 rákövetkezője van. m a
lapon elhelyezett adatok száma

Minden levéllap ugyanazon a szinten helyezkedik el.
23:56:42
93
Példa B-fára. (A fa rendje: 2)
M
E H
B D
23:56:42
F G
P T X
I K L
N O
Q S
V W
Y Z
94
Keresés a B-fában:
A keresés minden esetben a gyökérlapon indul (kivéve,
ha üres a fa).

A gyökérlapon végrehajtunk egy lineáris keresést. Ha az
elem meg van, KÉSZ.

Ha nem találtuk meg, a lineáris keresés megáll valahol.

Ha a lineáris keresés úgy áll meg, hogy a vizsgált elem
nagyobb, mint a keresett, akkor az előtte lévő mutató által
mutatott lapon folytatjuk tovább a keresést.

Ha a végére értünk (minden kulcs kisebb volt a keresettnél)
és nincs meg, az utolsó mutatóval megyünk tovább.

Ha utolsó szinten vagyunk és a mutatók értéke NIL és nincs
meg az elem, akkor az nincs is a fában.
23:56:42
95
B-fa bővítése
A bővítés is kereséssel kezdődik. Meg kell határozni azt
a levéllapot, ahol a bővítendő elemet el tudjuk
helyezni.
B-fát új elemmel mindig csak a levéllapon bővíthetünk.

Ha a lapon m<2n, akkor a rendezettség megmarad, a lapon
elhelyezzük az új elemet.

Ha a lap tele van (m=2n) ugyan, de az új elemet erre a lapra
kellene elhelyezni, a fa szerkezete meg kell, hogy változzon.
Az új elemet elhelyezzük a már telített levéllapon. Így itt
2n+1 lesz az elemek száma. Meghatározzuk a középső
elemet, ezt kiemeljük a 2n+1 elem közül, és megpróbáljuk a
szülő lapján elhelyezni.
23:56:42
96
B-fa bővítése

A lap e mentén ketté fog válni:

a középső elem egy szinttel feljebb vándorol.

Két levéllapra két mutatót kell a szülőből állítani. A feljebb
csúsztatott elem baloldali mutatóját a nála kisebb levéllapra
állítjuk, a jobboldalit a nála nagyobb elemeket tartalmazó
levéllapra.

Ha a probléma többször megismétlődik, és felgyűrűzik a
gyökérig, a gyökér is kettéválik, egy elem (a középső)
eggyel feljebb kerül, azaz új gyökérlap jön létre egyetlen
elemmel. Ez az egyetlen eset, hogy a fa magassága
növekszik.
23:56:42
97
Példa B-fa bővítésére
C1 N2 G3 A4 H5 E6 K7 Q8 M9 F10
W11 L12 T13 Z14 D15 P16 R17 X18 Y19 S20
0. lépés: Üres B-fa
4. lépés:
ACGN
5. lépés:
G
AC
8. lépés:
ACE
23:56:42
G
9. lépés:
HKNQ
ACE
HN
GM
HK
NQ
98
Példa B-fa bővítésére
C1 N2 G3 A4 H5 E6 K7 Q8 M9 F10
W11 L12 T13 Z14 D15 P16 R17 X18 Y19 S20
13. lépés:
ACEF
GM
HKL
14. lépés:
NQTW
15. lépés:
AC EF
23:56:42
ACEF
GMT
HKL
NQ WZ
DGMT
HKL
NQ WZ
99
Példa B-fa bővítésére
C1 N2 G3 A4 H5 E6 K7 Q8 M9 F10
W11 L12 T13 Z14 D15 P16 R17 X18 Y19 S20
19. lépés:
AC EF
DGMT
HKL NPQR
20. lépés:
M
DG
23:56:42
AC
EF
WXYZ
QT
HKL
NP
RS
WXYZ
100
Törlés B-fából

Törlés B-fából:

Ha a törlendő elem levéllapon van. Ekkor fizikailag kitöröljük.

Ha nem levéllapon van, akkor ezt az adatot helyettesíteni kell
egy levéllapbeli elemmel, amely a rendezettséget megtartja.
(Pl. jobboldal legbaloldalibb eleme.)
Mindkét esetben az egyik levéllapon csökken az elemek
száma.

Ha a levéllapon nem csökken n alá az adatok száma: KÉSZ

Ha n alá csökken, de valamelyik szomszédnál (ugyanebben a
részfában) legalább n+1 elem van, akkor a szomszéd laptól
elemeket veszünk át a B-fa jelleg megőrzésével. Szokás úgy
vágni, hogy az elemek egyenlően oszoljanak meg. Ez a
művelet természetesen érinti az előd lapot is.
23:56:42
101
Törlés B-fából

Ha a törléssel n alá csökken az elemek száma, és minden
szomszédos lapon n elem van, az egyikkel összevonható a
törölt elemet tartalmazó lap: (n-1)+n=2n-1. Az elődlapon
eggyel kevesebb mutató kell, így eggyel kevesebb elem is:
ezt az elemet rárakjuk az összeolvasztott lapra, így 2n db
elem lesz a levéllapon. Mivel ilyenkor csökken az előd
elemeinek száma, ez felgyűrűződhet a gyökérlapig:
a fa magassága ebben az egy esetben csökkenhet.
A B-fa magassága csak a gyökér felől
csökkenhet, illetve nőhet, nem pedig a
levéllapok felől.
23:56:42
102
Példa törlésre B-fából
20. lépés:
M
DG
AC
EF
QT
HKL
T törlése:
NP
23:56:42
EF
WXYZ
M
DG
AC
RS
QW
HKL
R törlése:
NP
RS
XYZ
103
Példa törlésre B-fából
R törlése:
M
DG
AC
EF
QX
HKL
H törlése: ?
NP
23:56:42
EF
YZ
M
DG
AC
SW
QX
KL
E törlése: ?
NP
SW
YZ
104
Példa törlésre B-fából
E törlése 1. lépés:
M
G
ACDF
QX
KL
E törlése 2. lépés:
ACDF
23:56:42
NP
SW
YZ
GMQX
KL
NP
SW
YZ
105
B-fák (egy alternatív lehetőség)

B-fa:

A B-fák lapokból épülnek fel.

A lapokon mutatók és adatelemek helyezkednek el.

Az adatelemek a kulcsaik szerint növekvő sorrendben
vannak egy lapon.

A B-fa is kereső fa. Tehát két azonos kulcsú adatelem nincs
benne.

A p-vel jelölt mutatók levéllapokon NIL értékűek, egyébként
mindig olyan lapot címeznek, amely a B-fa egy olyan
részfájának a gyökereként képzelhető el, ahol minden
adatelem kulcsa a mutatót körülvevő adatelemek kulcsai
közé esnek:
p0
23:56:42
a1
p1
a2
p2
a3
p3
...
pm-1
am
k1
<
k2
<
k3
<
...
<
km
pm
106
B-fák (egy alternatív lehetőség)


További tulajdonsággai:

A fának van rendje (n), pl. másodrendű

Minden lap legfeljebb 2n mutatót (2n-1 adatot) tartalmazhat

A gyökérlapot kivéve minden lapon legalább n mutató van

A gyökérlapon lehet ennél kevesebb is
(legalább egy elem van ott, ha nem üres a fa)

Egy lap, vagy levéllap, vagy m+1 rákövetkezője van. m a
lapon elhelyezett adatok száma

Minden levéllap ugyanazon a szinten helyezkedik el.
Így elkerülhetőek a visszalépések
23:56:42
107
Példa B-fa bővítésére (n=2)
C1 N2 G3 A4 H5 E6 K7 Q8 M9 F10
W11 L12 T13 Z14 D15 P16 R17 X18 Y19 S20
0. lépés: Üres B-fa
3. lépés:
CGN
4. lépés:
(4/1)
C
4. lépés:
(4/2)
G
N
8. lépés:
(8/1)
7. lépés:
A C
N
GK
G
ACE
ACE
G
HKN
8. lépés:
(8/2)
H
N
GK
23:56:42
108
ACE
H
NQ
Példa B-fa bővítésére (n=2)
C1 N2 G3 A4 H5 E6 K7 Q8 M9 F10
W11 L12 T13 Z14 D15 P16 R17 X18 Y19 S20
9. lépés:
GK
ACE
H
10. lépés:
(10/1)
CGK
A
23:56:42
E
MNQ
10. lépés:
(10/2)
H
MNQ
A
CGK
EF
H
MNQ
109
Példa B-fa bővítésére (n=2)
C1 N2 G3 A4 H5 E6 K7 Q8 M9 F10
W11 L12 T13 Z14 D15 P16 R17 X18 Y19 S20
10. lépés:
A
11. lépés:
(11/1)
CGK
EF
H
G
C
MNQ
A
11. lépés:
(11/2)
G
A
23:56:42
EF
EF
11. lépés:
(11/3)
C
KN
H
M
K
H
G
C
Q
A
MNQ
EF
KN
H
M
QW
110
Példa B-fa bővítésére (n=2)
C1 N2 G3 A4 H5 E6 K7 Q8 M9 F10
W11 L12 T13 Z14 D15 P16 R17 X18 Y19 S20
13. lépés:
G
C
A
KN
EF
H
LM
14. lépés:
(14/1)
QTW
G
C
A
23:56:42
EF
KNT
H
LM
Q
W
111
Példa B-fa bővítésére (n=2)
C1 N2 G3 A4 H5 E6 K7 Q8 M9 F10
W11 L12 T13 Z14 D15 P16 R17 X18 Y19 S20
14. lépés:
(14/2)
G
C
A
KNT
EF
H
LM
15. lépés:
Q
G
C
23:56:42
A
WZ
DEF
KNT
H
LM
Q
WZ
112
Példa B-fa bővítésére (n=2)
C1 N2 G3 A4 H5 E6 K7 Q8 M9 F10
W11 L12 T13 Z14 D15 P16 R17 X18 Y19 S20
16. lépés:
(16/1)
GN
C
A
K
DEF
H
16. lépés:
(16/2)
T
LM
Q
GN
C
23:56:42
A
WZ
DEF
K
H
LM
T
PQ
WZ
113