1.14k likes | 1.36k Views
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. Fa adatszerkezet.
E N D
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.
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é
Fa adatszerkezet • ú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.)
Részfa És ez is! Pl. ez is egy részfa! De ez nem részfa! Meg ez is!
Rendezetlen Fa • rendezetlen fa: az élek sorrendje tetszőleges • ha rendezetlen ez a 2 fa, akkor ekvivalensek egymással.
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 • Pl. baloldali részfa: részfa, melynek gyökere az adott elem baloldali rákövetkezője. Az elemtől balra van.
„Bináris” reprezentáció • Minden nem bináris fa (tetszőleges fa), reprezentálható bináris fával. (binarizáljuk) • 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.
„Bináris” reprezentáció • Az algoritmus pszeudo-kódja: gyakorlaton!
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)
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: • A gyökérelemet a két részfa előtt dolgozzuk fel. • Inorder: • A két részfa bejárása között dolgozzuk fel a gyökérelemet. • Postorder: • A gyökérelemet a két részfa után 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
Bináris fa preorder bejárása abcdeifgh
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.
Bináris fa inorder bejárása cbdaiegfh
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.
Bináris fa postorder bejárása cdbighfea
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.
Reprezentáció • 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.)
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.
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(maga a kifejezés, de zárójelek nélkül) • postfix: ab/cde-*+ (fordított lengyel ábrázolás) • A prefix és a postfix alak egyértelmű. • Az infix alak viszont nem egyértelmű. • Zárójelezéssel és speciális szabályokkal az infix forma is egyértelművé tehető.
Kifejezések kiértékelése Az alábbi három kifejezésfa infix alakjai megegyeznek. Pedig eltérő kifejezéseket ábrázolnak.
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.
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.) • 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.
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
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.) • 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ó).
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
Tökéletesen kiegyensúlyozott fa Minimális magasságú fa Kiegyensúlyozott fa
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.
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, • 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.
8, 9, 11, 15, 19, 20, 21, 7, 3, 2, 1, 5, 6, 4, 13, 14, 10, 12 17, 16, 18
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.
Keresőfa műveletei • A törlés három esete • Levélelem: kitörlöm, a szülő megfelelő mutatóját NIL-re állítom • Egy rákövetkezője van: az egy rákövetkezőjét felcsúsztatjuk (rácsúsztatjuk) a törlendő elem helyére. • 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.)
Tökéletesen kiegyensúlyozott fa Minimális magasságú fa Kiegyensúlyozott fa
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áé.
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:
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.) • 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.
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.
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.
Az AVL fa műveletei (beszúrás) • Természetesen ezen esetek szimmetrikus párjai is előfordulhatnak
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.
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.
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 (leftleft) • (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.
12 12 16 16 4 8 2 8 14 4 10 14 1 6 10 2 6 1
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.
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;
12 12 12 16 8 16 16 8 6 4 10 14 6 8 10 14 14 4 2 6 4 2 10 5 5 2 5
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ó.