Hierarchikus adatszerkezetek A szekvenilis adatszerkezetek ltalnostsa Minden adatelemnek

  • Slides: 113
Download presentation
Hierarchikus adatszerkezetek A szekveniális adatszerkezetek általánosítása. Minden adatelemnek pontosan 1 megelőzője van, de akárhány

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: 45: 21 1

Fa adatszerkezet dinamikus, homogén, hierarchikus adatszerkezet Speciális fogalmakat értelmez: Gyökér(elem): az az elem a

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: 45: 21 0. szint O O O 3. szint 4 (a fa mélysége) 2

Fa adatszerkezet 23: 45: 21 út: gráfelméleti út fogalom: fában: 2 elem közötti élsorozat;

Fa adatszerkezet 23: 45: 21 ú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 a c d f b e Pl. ez is egy részfa! b

Részfa a a c d f 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: 45: 21 4

Rendezetlen Fa rendezetlen fa: az élek sorrendje tetszőleges ha rendezetlen ez a 2 fa,

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: 45: 22 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

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: 45: 22 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.

„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: 45: 22 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 c f a

„Bináris” reprezentáció a b a c f g e b d c f a b e d c = g f g e d Az algoritmus pszeudo-kódja: gyakorlaton! 23: 45: 23 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:

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: 45: 23 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

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: 45: 23 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. )

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: 45: 23 11

Bináris fa preorder bejárása a 1 b c e d i 2 f g

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: 45: 23 12

Bináris fa inorder bejárása (A gyökérelemet a 2 részfa bejárása között dolgozzuk fel. )

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. 13 23: 45: 24

Bináris fa inorder bejárása a 4 b c e d i 2 f g

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: 45: 24 14

Bináris fa postorder bejárása (A gyökérelemet a 2 részfa bejárása után dolgozzuk fel. )

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: 45: 24 15

Bináris fa postorder bejárása a 9 b c e d i 3 f g

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: 45: 24 16

Reprezentáció Mint minden adatszerkezetet, a fát is lehet folytonosan is és szétszórtan is ábrázolni.

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: 45: 25 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

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: 45: 25 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: 45: 25

Reprezentáció Index Adat a b c e d i f g 23: 45: 25 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,

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: 45: 25 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

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: 45: 26 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)

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: 45: 26 * + / 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ú

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: 45: 27 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

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: 45: 27 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,

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: 45: 27 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

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: 45: 28 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,

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: 45: 28 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: 45: 28 28

Tökéletesen kiegyensúlyozott fa Minimális magasságú fa Kiegyensúlyozott fa 23: 45: 28 28

Keresőfa Keresőfa (rendezőfa): az elemeket kulcsuk alapján rendezzük és kulcs alapján visszakeressük őket. Egy

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: 45: 29 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

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: 45: 29 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,

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: 45: 29 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

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: 45: 29 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

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: 45: 29 33

8 7 9 2 3 2 1 11 5 4 1 10 6 3

8 7 9 2 3 2 1 11 5 4 1 10 6 3 15 13 12 19 14 17 16 23: 45: 29 20 18 21 34

8 7 9 2 3 2 1 11 5 4 1 10 6 3

8 7 9 2 3 2 1 11 5 4 1 10 6 3 14 13 12 19 14 17 16 23: 45: 29 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: 45: 30 36

Tökéletesen kiegyensúlyozott fa Minimális magasságú fa Kiegyensúlyozott fa 23: 45: 30 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

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: 45: 32 37

Az AVL fa műveletei Új elem beszúrása az AVL-fába: Keresés végrehajtása a fában a

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: 45: 32 H-2 H 38

Az AVL fa műveletei (beszúrás) Ha jobboldalra írunk be, nőhet a jobboldali részfa magassága.

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: 45: 32 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

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: 45: 32 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

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: 45: 33 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:

Az AVL fa műveletei (beszúrás) Természetesen ezen esetek szimmetrikus párjai is előfordulhatnak H-2 23: 45: 34 H-1 H 42

Az AVL fa műveletei (beszúrás) 3. eset [RL]: a baloldali részfa H-2 -es és

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: 45: 34 H H 43

Az AVL fa műveletei (beszúrás) 4. eset [RR]: a jobboldali részfájába szúrúnk be. Az

Az AVL fa műveletei (beszúrás) 4. eset [RR]: a 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: 45: 35 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

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) (Szimmetrikus párja az RR-forgatás (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: 45: 35 45

k 1<k 2 A B C 12 12 8 4 2 23: 45: 36

k 1<k 2 A B C 12 12 8 4 2 23: 45: 36 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

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: 45: 37 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

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: 45: 37 B C A B D C C 48

 D A D B C A B D C C C 12 12

D A D B C A B D C C C 12 12 16 8 4 2 23: 45: 38 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:

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: 45: 39 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

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: 45: 39 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

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: 45: 40 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-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*log 2(n+1). A piros-fekete fát ezért megközelítőleg kiegyensúlyozottnak tekinthetjük. 23: 45: 41 53

Piros-Fekete Fa Egy kereső fát piros-fekete fának nevezünk, ha teljesülnek rá a következő piros-fekete

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: 45: 41 54

Piros-Fekete Fa 26 41 17 21 14 47 30 NIL 10 7 3 NIL

Piros-Fekete Fa 26 41 17 21 14 47 30 NIL 10 7 3 NIL 23: 45: 41 NIL 16 12 NIL 20 NIL 28 23 NIL 15 NIL 19 NIL 38 NIL NIL 33 NIL 39 NIL NIL NIL 55

Piros-Fekete Fa (a gyakorlatban leginkább) 26 41 17 21 14 10 7 16 12

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: 45: 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

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: 45: 42 57

Piros-Fekete Fa műveletei (bővítés) 1. Minden elem színe piros vagy fekete OK 2. A

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: 45: 43 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

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: 45: 43 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

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 n+1 x y n-1 z C n-1 A n-1 B n-1 x n-1 D n-1 y n z E C n-1 A n-1 n n-1 D n-1 E n-1 B n-1 23: 45: 43 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

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 n-1 n-1 C x n-1 D n-1 y A 23: 45: 43 y D n-1 61 B n-1 C n-1 A n-1 B n-1

3 z z n n x y D n-1 y A B A C

3 z z n n x y D n-1 y A B A C B n-1 n-1 3 x x n n y D n-1 n-1 n-1 y A z A B C n-1 n-1 23: 45: 44 n-1 x n-1 D n-1 z B n-1 C n-1 A, B, C, D: Fekete gyökerű, azonos fekete-magasságú részfák D n-1 62

4 a z y n y x A B A n-1 n-1 C n-1

4 a z y n y x A B A n-1 n-1 C n-1 z x D n-1 4 b ? n-1 D C n-1 4 b B n-1 y y B C n-1 A n-1 B n-1 D C n-1 z n-1 n-1 n-1 x z n-1 23: 45: 46 A ? n-1 z n-1 n A n x 4 a x y B n-1 C 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).

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: 45: 46 64

8 7 9 3 2 1 11 5 4 10 6 14 13 12

8 7 9 3 2 1 11 5 4 10 6 14 13 12 19 14 17 16 23: 45: 46 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

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: 45: 49 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

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: 45: 49 67

Törlés Piros-Fekete fából Ha egy csomópont fekete színű és rendelkezik ezzel a fekete tokennel,

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: 45: 49 68 piros. e)

Törlés Piros-Fekete fából 2 a, A tokennel rendelkező csúcspont piros színű, vagy a fa

Törlés Piros-Fekete fából 2 a, 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 n+1 23: 45: 51 A n B n A, B: Azonos fekete-magasságú részfák B n 69

Törlés Piros-Fekete fából 2 b, Ha a duplán fekete elem testvére piros, akkor egy

Törlés Piros-Fekete fából 2 b, 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: 45: 51 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

2 b y n z x■ n-1 n-2 A n-3 B n-3 D C

2 b y n z x■ n-1 n-2 A n-3 B n-3 D C n-1 z z n ? y n-1 D D n-1 x■ n-3 x■ C n-2 A n-1 B n-3 C n-2 A n-3 23: 45: 51 n-1 B n-3 2 ? c, d, e? 71 C, D: Fekete gyökerű részfák

Törlés Piros-Fekete fából 2 c, Tegyük fel, hogy a duplán fekete testvére és mindkét

Törlés Piros-Fekete fából 2 c, 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: 45: 52 72

2 c y y■ ? ? z x■ n-1 A n-2 B n-2 C

2 c y y■ ? ? z x■ n-1 A n-2 B n-2 C n-1 z x n n-1 D n-1 A n-2 23: 45: 52 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 2 d, A duplán fekete csúcspontnak fekete a testvére és a

Törlés Piros-Fekete fából 2 d, 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 ? w x■ n-2 B n-2 z n-1 A n-2 n C n-2 n-1 D C n-1 D A n-2 n-1 n n-1 w B z x■ ? n-1 E n-1 ? z x■ n n-1 A y ? n-1 23: 45: 52 n-1 C n-2 n-1 E n-1 w B D 2 e E n-1 74 C, D, E: Fekete gyökerű részfák

Törlés Piros-Fekete fából 2 e, A duplán fekete elem testvére fekete, de a távolabbi

Törlés Piros-Fekete fából 2 e, 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 A C n-2 n-1 D n-1 x n-1 C n-1 E A n-1 n-2 n n n-1 x■ n-1 w y w ? w B n-2 y n n-1 ? n z x■ z z ? D n-1 E C n-1 B n-2 23: 45: 55 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: 45: 56 13: 20 Minimális magasságú fa Bináris

Tökéletesen kiegyensúlyozott fa Kiegyensúlyozott fa 23: 45: 56 13: 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

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: 45: 56 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

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: 45: 57 78

A maximum kupac műveletei Rendezés: Keresés: Szekvenciális Bejárás: Nem szokásos Vajon csak teljes keresés

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: 45: 57 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

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: 45: 57 80

A kupac ábrázolása Folytonosan (Ez a tipikus. ) Egy vektort szokás alkalmazni. (pl. K)

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: 45: 57 81

A kupac tulajdonság fenntartása Feltételezés: Egy bizonyos i elem gyermekeinek részfáira már teljesül a

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: 45: 57 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

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 42 10 3 14 7 9 3 end procedure 4 5 6 7 23: 45: 57 2 8 83 8 9

A kupac alkalmazása elsőbbségi sorok ábrázolására Elsőbbségi sor: Alapvető algoritmusok: Minden elemhez tartozik egy

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: 45: 57 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

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: 45: 58 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

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)+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 8. end while 7 9 3 9. S[i] x 2 4 15 23: 45: 58 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

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)]-1 7. KUPACOL(S, 1) 8. return max end function 23: 45: 58 87

A kupac alkalmazása rendezéshez 1. változat procedure KUPACRENDEZÉS_1(K) 1. kupac_méret(K) 1 2. for i

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)-1 8. KUPACOL(K, 1) 9. end while end procedure 23: 45: 58 88

A kupac alkalmazása rendezéshez 2. változat procedure KUPACRENDEZÉS_2(K) 1. kupac_méret(K) 2. i méret(K)/2 3.

A kupac alkalmazása rendezéshez 2. változat procedure KUPACRENDEZÉS_2(K) 1. kupac_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)-1 10. KUPACOL(K, 1) 11. end while 23: 45: 59 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.

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: 45: 59 ~ (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) >

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)-1 5. KUPACOL(K, 1) 6. end while end procedure 23: 46: 00 procedure KUPACOT_ÉPíT(K) 1. kupac_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

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: p 0 23: 46: 00 a 1 p 1 a 2 p 2 a 3 p 3 . . . pm-1 am k 1 < k 2 < k 3 < . . . < km pm 92

B-fák További tulajdonsággai: A fának van rendje (n), pl. másodrendű Minden lap legfeljebb 2

B-fák További tulajdonsággai: A fának van rendje (n), pl. másodrendű Minden lap legfeljebb 2 n 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: 46: 01 93

Példa B-fára. (A fa rendje: 2) M E H B D 23: 46: 01

Példa B-fára. (A fa rendje: 2) M E H B D 23: 46: 01 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

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: 46: 02 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

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<2 n, akkor a rendezettség megmarad, a lapon elhelyezzük az új elemet. Ha a lap tele van (m=2 n) 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 2 n+1 lesz az elemek száma. Meghatározzuk a középső elemet, ezt kiemeljük a 2 n+1 elem közül, és megpróbáljuk a szülő lapján elhelyezni. 23: 46: 02 96

B-fa bővítése A lap e mentén ketté fog válni: a középső elem egy szinttel

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: 46: 02 97

Példa B-fa bővítésére C 1 N 2 G 3 A 4 H 5 E

Példa B-fa bővítésére C 1 N 2 G 3 A 4 H 5 E 6 K 7 Q 8 M 9 F 10 W 11 L 12 T 13 Z 14 D 15 P 16 R 17 X 18 Y 19 S 20 0. lépés: Üres B-fa 4. lépés: ACGN 5. lépés: G AC 8. lépés: ACE 23: 46: 02 G 9. lépés: HKNQ ACE HN GM HK NQ 98

Példa B-fa bővítésére C 1 N 2 G 3 A 4 H 5 E

Példa B-fa bővítésére C 1 N 2 G 3 A 4 H 5 E 6 K 7 Q 8 M 9 F 10 W 11 L 12 T 13 Z 14 D 15 P 16 R 17 X 18 Y 19 S 20 13. lépés: ACEF GM HKL 14. lépés: NQTW 15. lépés: AC EF 23: 46: 03 ACEF GMT HKL NQ WZ DGMT HKL NQ WZ 99

Példa B-fa bővítésére C 1 N 2 G 3 A 4 H 5 E

Példa B-fa bővítésére C 1 N 2 G 3 A 4 H 5 E 6 K 7 Q 8 M 9 F 10 W 11 L 12 T 13 Z 14 D 15 P 16 R 17 X 18 Y 19 S 20 19. lépés: AC EF DGMT HKL NPQR 20. lépés: M DG 23: 46: 03 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

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: 46: 04 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

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=2 n-1. Az elődlapon eggyel kevesebb mutató kell, így eggyel kevesebb elem is: ezt az elemet rárakjuk az összeolvasztott lapra, így 2 n 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: 46: 05 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

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: 46: 05 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: ?

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: 46: 06 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

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: 46: 06 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

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: p 0 23: 46: 06 a 1 p 1 a 2 p 2 a 3 p 3 . . . pm-1 am k 1 < k 2 < k 3 < . . . < 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

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 2 n mutatót (2 n-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: 46: 06 107

Példa B-fa bővítésére (n=2) C 1 N 2 G 3 A 4 H 5

Példa B-fa bővítésére (n=2) C 1 N 2 G 3 A 4 H 5 E 6 K 7 Q 8 M 9 F 10 W 11 L 12 T 13 Z 14 D 15 P 16 R 17 X 18 Y 19 S 20 0. lépés: Üres B-fa 3. lépés: CGN 4. lépés: (4/1) C G 4. lépés: (4/2) N 8. lépés: (8/1) 7. lépés: ACE 23: 46: 06 G HKN A C ACE N GK ACE 8. lépés: (8/2) G H N GK H NQ 108

Példa B-fa bővítésére (n=2) C 1 N 2 G 3 A 4 H 5

Példa B-fa bővítésére (n=2) C 1 N 2 G 3 A 4 H 5 E 6 K 7 Q 8 M 9 F 10 W 11 L 12 T 13 Z 14 D 15 P 16 R 17 X 18 Y 19 S 20 9. lépés: GK ACE 10. lépés: (10/1) A 23: 46: 06 H MNQ 10. lépés: (10/2) CGK E H MNQ A CGK EF H MNQ 109

Példa B-fa bővítésére (n=2) C 1 N 2 G 3 A 4 H 5

Példa B-fa bővítésére (n=2) C 1 N 2 G 3 A 4 H 5 E 6 K 7 Q 8 M 9 F 10 W 11 L 12 T 13 Z 14 D 15 P 16 R 17 X 18 Y 19 S 20 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: 46: 07 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) C 1 N 2 G 3 A 4 H 5

Példa B-fa bővítésére (n=2) C 1 N 2 G 3 A 4 H 5 E 6 K 7 Q 8 M 9 F 10 W 11 L 12 T 13 Z 14 D 15 P 16 R 17 X 18 Y 19 S 20 13. lépés: G C A KN EF H LM 14. lépés: (14/1) QTW G C A 23: 46: 07 EF KNT H LM Q W 111

Példa B-fa bővítésére (n=2) C 1 N 2 G 3 A 4 H 5

Példa B-fa bővítésére (n=2) C 1 N 2 G 3 A 4 H 5 E 6 K 7 Q 8 M 9 F 10 W 11 L 12 T 13 Z 14 D 15 P 16 R 17 X 18 Y 19 S 20 14. lépés: (14/2) G C A KNT EF H LM 15. lépés: Q G C 23: 46: 07 A WZ DEF KNT H LM Q WZ 112

Példa B-fa bővítésére (n=2) C 1 N 2 G 3 A 4 H 5

Példa B-fa bővítésére (n=2) C 1 N 2 G 3 A 4 H 5 E 6 K 7 Q 8 M 9 F 10 W 11 L 12 T 13 Z 14 D 15 P 16 R 17 X 18 Y 19 S 20 16. lépés: (16/1) GN C A K DEF H 16. lépés: (16/2) T LM Q GN C 23: 46: 07 A WZ DEF K H LM T PQ WZ 113