Absztrakt adatstruktúrák A bináris fák



Hasonló dokumentumok
Aritmetikai kifejezések lengyelformára hozása

Adatszerkezetek Adatszerkezet fogalma. Az értékhalmaz struktúrája

Adatszerkezetek és algoritmusok

Adatszerkezetek I. 7. előadás. (Horváth Gyula anyagai felhasználásával)

A számítástudomány alapjai. Katona Gyula Y. Számítástudományi és Információelméleti Tanszék Budapesti Műszaki és Gazdaságtudományi Egyetem

Adatszerkezetek 7a. Dr. IványiPéter

A programozás alapjai előadás. [<struktúra változó azonosítók>] ; Dinamikus adatszerkezetek:

Készítette: Nagy Tibor István

Elemi adatszerkezetek

Hierarchikus adatszerkezetek

Amortizációs költségelemzés

B-fa. Felépítés, alapvető műveletek. Programozás II. előadás. Szénási Sándor.

Fák Témakörök. Fa definíciója. Rekurzív típusok, fa adatszerkezet Bináris keresőfa, bejárások Bináris keresőfa, módosítás B-fa

Kupac adatszerkezet. A[i] bal fia A[2i] A[i] jobb fia A[2i + 1]

Információs Technológia

10. előadás Speciális többágú fák

Algoritmusok és adatszerkezetek gyakorlat 03 Oszd meg és uralkodj. Nagy

Algoritmusok és adatszerkezetek gyakorlat 06 Adatszerkezetek

A szemantikus elemzés elmélete. Szemantikus elemzés (attribútum fordítási grammatikák) A szemantikus elemzés elmélete. A szemantikus elemzés elmélete

1. előadás. Lineáris algebra numerikus módszerei. Hibaszámítás Számábrázolás Kerekítés, levágás Klasszikus hibaanalízis Abszolút hiba Relatív hiba

Verem Verem mutató 01

7. BINÁRIS FÁK 7.1. A bináris fa absztrakt adattípus 7.2. A bináris fa absztrakt adatszerkezet

Kifejezések. Kozsik Tamás. December 11, 2016

Adatszerkezetek I. 8. előadás. (Horváth Gyula anyagai felhasználásával)

Excel Hivatkozások, függvények használata

Kifejezések. Kozsik Tamás. December 11, 2016

Programozási segédlet

Informatika érettségi vizsga

Egész számok. pozitív egész számok: 1; 2; 3; 4;... negatív egész számok: 1; 2; 3; 4;...

Programozási nyelvek (ADA)

Karakterkészlet. A kis- és nagybetűk nem különböznek, a sztringliterálok belsejét leszámítva!

Házi feladatok megoldása. Nyelvek használata adatszerkezetek, képek leírására

Ellenőrző kérdések. 36. Ha t szintű indexet használunk, mennyi a keresési költség blokkműveletek számában mérve? (1 pont) log 2 (B(I (t) )) + t

Algoritmuselmélet 2. előadás

Excel Hivatkozások, függvények használata

Adatszerkezetek I. 1. előadás

Programozás BMEKOKAA146. Dr. Bécsi Tamás 2. előadás

A C programozási nyelv I. Bevezetés

A C programozási nyelv I. Bevezetés

az Excel for Windows programban

sallang avagy Fordítótervezés dióhéjban Sallai Gyula

Algoritmusok és adatszerkezetek I. 1. előadás

2018, Diszkrét matematika

... fi. ... fk. 6. Fabejáró algoritmusok Rekurzív preorder bejárás (elsőfiú-testvér ábrázolásra)

Segédlet az Informatika alapjai I. című tárgy számrendszerek fejezetéhez

Bináris keresőfa. Felépítés, alapvető műveletek. Programozás II. előadás. Szénási Sándor

Algoritmizálás és adatmodellezés tanítása 1. előadás

Felvételi tematika INFORMATIKA

Fa (Tree): csomópontok (nodes) halmaza, amelyeket élek (edges) kötnek össze, és teljesülnek az alábbi feltételek:

30. ERŐSEN ÜSSZEFÜGGŐ KOMPONENSEK

Adatszerkezetek Tömb, sor, verem. Dr. Iványi Péter

1. ábra. Egy rekurzív preorder bejárás. Egy másik rekurzív preorder bejárás

Struktúra nélküli adatszerkezetek

Brósch Zoltán (Debreceni Egyetem Kossuth Lajos Gyakorló Gimnáziuma) Számelmélet I.

ködös határ (félreértés, hiba)

Algoritmusok és adatszerkezetek gyakorlat 07

A szürke háttérrel jelölt fejezet/alfejezet szövege a CD-mellékleten található. A CD-melléklet használata. 1. Elméleti áttekintés 1

Programozás alapjai. (GKxB_INTM023) Dr. Hatwágner F. Miklós augusztus 29. Széchenyi István Egyetem, Gy r

Információk. Ismétlés II. Ismétlés. Ismétlés III. A PROGRAMOZÁS ALAPJAI 2. Készítette: Vénné Meskó Katalin. Algoritmus. Algoritmus ábrázolása

Logika es sz am ıt aselm elet I. r esz Logika Harmadik el oad as 1/33

Algoritmusok és adatszerkezetek I. 2. előadás

Adatszerkezetek 2. Dr. Iványi Péter

Összetett programozási tételek Rendezések Keresések PT egymásra építése. 10. előadás. Programozás-elmélet. Programozás-elmélet 10.

SZÁMÍTÁSOK A TÁBLÁZATBAN

Adatszerkezetek és algoritmusok

Adatszerkezetek. Nevezetes algoritmusok (Keresések, rendezések)

Gyakori elemhalmazok kinyerése

Hierarchikus adatszerkezetek

Tartalomjegyzék. Köszönetnyilvánítás. 1. Az alapok 1

Lekérdezések az SQL SELECT utasítással

Logika es sz am ıt aselm elet I. r esz Logika 1/36

Járműfedélzeti rendszerek II. 1. előadás Dr. Bécsi Tamás

Algoritmusok és adatszerkezetek I. 2. előadás

A 2016/2017 tanévi Országos Középiskolai Tanulmányi Verseny második fordulójának feladatai. INFORMATIKA II. (programozás) kategória

Mit tudunk már? Programozás alapjai C nyelv 4. gyakorlat. Legnagyobb elem keresése. Feltételes operátor (?:) Legnagyobb elem keresése (3)

Például számokból álló, egyszeresen láncolt lista felépítéséhez az alábbi struktúra definíciót használhatjuk:

1. Alapok. #!/bin/bash

Programozás alapjai C nyelv 4. gyakorlat. Mit tudunk már? Feltételes operátor (?:) Típus fogalma char, int, float, double

EGYSZERŰ, NEM IRÁNYÍTOTT (IRÁNYÍTATLAN) GRÁF

Kupac adatszerkezet. 1. ábra.

Chomsky-féle hierarchia

2. Ítéletkalkulus szintaxisa

Programozás I gyakorlat

Adatszerkezetek Bevezetés Adatszerkezet Adatszerkezet típusok Műveletek Bonyolultság

Bevezetés az informatikába Tételsor és minta zárthelyi dolgozat 2014/2015 I. félév

- Levelek: operandusok - Csomópontok: operátorok. Fenti kifejezés: (x+ (y 10)) * (6 / z) Bináris Keresőfa (BST) Példa bináris keresőfára.

2. Rekurzió. = 2P2(n,n) 2 < 2P2(n,n) 1

A 2017/2018 tanévi Országos Középiskolai Tanulmányi Verseny első fordulójának feladatai. INFORMATIKA II. (programozás) kategória

5. KOMBINÁCIÓS HÁLÓZATOK LEÍRÁSÁNAK SZABÁLYAI

ismerd meg! A PC vagyis a személyi számítógép XI. rész

file:///d:/okt/ad/jegyzet/ad1/b+fa.html

Algoritmusok. Dr. Iványi Péter

A 2016/2017 tanévi Országos Középiskolai Tanulmányi Verseny második forduló javítási-értékelési útmutató. INFORMATIKA II. (programozás) kategória

INFORMATIKA javítókulcs 2016

4. VEREM. Üres: V Verembe: V E V Veremből: V V E Felső: V E

I. ALAPALGORITMUSOK. I. Pszeudokódban beolvas n prim igaz minden i 2,gyök(n) végezd el ha n % i = 0 akkor prim hamis

Gauss elimináció, LU felbontás

Mveletek a relációs modellben. A felhasználónak szinte állandó jelleggel szüksége van az adatbázisban eltárolt adatok egy részére.

Relációs algebra 1.rész alapok

Számítástechnika I. BMEKOKAA152 BMEKOKAA119 Infokommunikáció I. BMEKOKAA606. Dr. Bécsi Tamás 2. előadás

Átírás:

ciós lámpa a legnagyobb élettartamú és a legjobb hatásfokú fényforrásnak tekinthető, nyugodtan mondhatjuk, hogy a jövő fényforrása. Ezt bizonyítja az a tény, hogy ezen a területen a kutatások és a bejelentett részmegoldásokra vonatkozó szabadalmak száma nagymértékben megnövekedett. Ugyanakkor jelentkeznek a globalizációs korszakunknak ezen a területen mutatkozó visszahúzó tendenciái. Az indukciós lámpákat kifejlesztő nagy multinacionális cégeknek hosszútávon nem bizonyul jó befektetésnek ezeknek a lámpáknak a gyártása és további fejlesztése. Ugyanis egy indukciós lámpa napi 4-5 órai üzemelés esetén 30-35 évig működőképes és a jövőben minden bizonnyal ezt még tovább lehet fokozni. Egy ilyen típusú lámpán az igen magas ár ellenére sem keresne annyit a gyártó cég, mint ezen idő alatt a többi típusú lámpák eladásából. Az indukciós lámpák bevezetésével a lámpagyárakban sok munkahely válik feleslegessé. Tehát az indukciós lámpa kérdése a XXI. századunk sajátos problematikájára is rávilágít, amelyet úgy fogalmazhatunk meg, hogy minden forradalmian új felfedezés a társadalomban súlyos gazdasági és társadalmi problémákat vethet fel, és kérdés, hogy ezekre a kihívásokra kellő időben tud-e megoldást találni az emberiség? Puskás Ferenc Absztrakt adatstruktúrák A fák Bináris fának egy, véges számú csomóponttal rendelkező absztrakt adatstruktúrát nevezünk, ahol a csomópontok vagy üresek, vagy két fa ágazik ki belőlük. Ezt a két részfát bal-, illetve jobboldali részfának nevezzük. Grafikusan a fát a következőképpen ábrázoljuk: Megfigyelhetjük, hogy a fának két alapvetően elkülöníthető része van: a terminális elemek, vagy levelek, amelyekből már nem indulnak ki további részfák, illetve a nemterminális elemek, vagy belső csomópontok. A memóriában a fákat lista segítségével ábrázolhatjuk: type PRoot = ^TRoot; TRoot = record Data: DataType; Left,Right: PRoot; end; A fák létrehozását rekurzívan végezhetjük el legegyszerűbben. Így járunk el a bejárásuknál is. Háromféle bejárás ismeretes: a.) Preorder: Gyökér - bal - jobb típusú bejárás. b.) Inorder: Bal - jobb - gyökér típusú bejárás. Az előbbi példa a három bejárás szerint így nézne ki: a.) * + a b - c d / a b b.) a + b * c - d - a / b c.) a b + c d - * a b / - 2000-2001/6 235

Két szempont szerint tárgyaljuk a fákat. Az első szempont a fák, mint adattárolásra és keresésre szolgáló adatszerkezetek - szimbólumtáblák megítására, a második szempont a fák, mint a kifejezések kiértékelését elősegítő, postfix struktúrák. A beszúrás művelete A fa kezdetben üres, egyetlen elemet sem tartalmaz. Az első elem beolvasásakor tehát először a gyökérelemet építjük fel. Az első elem fogja képezni a fa gyökerét. A későbbi elem beszúrása kereséssel jár: megkeressük, hogy a beolvasott elem már benne van-e a fában, ha igen, akkor a régi adatokat egyszerűen lecseréljük az új adatokra. Ha a beolvasott elem nincs benne a fában, akkor a keresés visszaadja az ehhez legközelebb álló (közvetlenül kisebb vagy nagyobb) gyökérelemet a fából. Összehasonlítjuk a beolvasott elemet ezzel az elemmel, ha kisebb nála, akkor a gyökérelem baloldali levelét, ha pedig nagyobb nála, akkor a jobboldali levelét hozzuk létre, és ide szúrjuk be az adatokat. Példa: A 4-es illetve a 8-as elemek beszúrása egy már meglévő fába: A keresés művelete A fa kezelésének egyik alapművelete a keresés. Az algoritmus leírása: tmp := gyökér amig szimbólum <> tmp^.data végezd el ha szimbólum > tmp^.data akkor ha tmp^.right üres akkor stop (ha) vége tmp := tmp^.right (ha) vége ha szimbólum < tmp^.data akkor ha tmp^.left üres akkor stop (ha) vége tmp := tmp^.left (ha) vége (amig) vége ha szimbólum = tmp^.data akkor megtaláltam (ha) vége Így bejárva tehát a fát vagy megkapjuk a keresett szimbólumot, vagy a hozzá legközelebb álló szimbólumot kapjuk vissza. A kiegyensúlyozás művelete Az adatstruktúra létrehozásakor fennállhatnak olyan esetek, amikor a keresés részlegesen vagy teljesen szekvenciális lesz. Ez olyan esetekben állhat fenn, mikor az elemek növekvő sorrendben követik egymást. Ekkor a beszúrás miatt a fa eltolódhat egy irányba, lineáris struktúrává válhat. Ahhoz, hogy visszaállítsuk a fa struktúráját, ki kell ezt egyensúlyozzuk. Fa kiegyensúlyozására nagyon sok algoritmus ismeretes. Itt csak egyet szeretnénk említeni. Ez a következő: Például: 236 2000-2001/6

1.) Inorder bejárással bontsuk le a fát. Így egy listát kapunk, amelyben az elemek ábécé sorrendbe vannak rendezve: 1 2 3 4 5. 2.) A listából felezéssel építsük vissza a fát. Ez azt jelenti, hogy megkeressük a lista középső elemét, az lesz a fa gyökere, így két listát kapunk. Az első lista fogja képezni a baloldali részfát, a második pedig a jobboldali részfát. A felezési algoritmust addig ismételjük, ameddig a lista üres nem lesz. Példaul: Ez a módszer egyszerű, lényegesen javít a keresés sebességén (most már keresés lesz), és a fa visszaépítésénél fel tudjuk használni a beszúrás algoritmusát is. Kifejezések ellenőrzésére és kiértékelésére szolgáló fák A kifejezések olyan programelemek, amelyekkel számítási folyamat írható le. Szintaktikai szempontból egy kifejezés operátorokból és operandusokból áll, amelyek leírják ezt a számítási folyamatot. Egy kifejezés kiértékelésének célja egy adott változó értékének a kiszámítása. Ez a kiszámítás a kiértékelés folyamatának az igénybevételével ul meg. A kifejezések osztályozásában a következő kritériumok játszanak fontos szerepet: a műveletek száma a műveletek operandusokhoz viszonyított pozíciója a kiértékelés eredményének típusa a kifejezés szintaxisa Példák kifejezésekre: (x+y)*(y-z), not B, (x = y) or (x <> z). Műveletek Az operandusok száma mérvadóan jellemző egy operátorra nézve. Ilyen szempontból beszélhetünk unáris műveletekről, amelyeknek egyetlen operandusuk van (Pl. +, -, not), (két operandusú) műveletekről (Pl. +, -, *, /, and, or, xor) és általában n-áris műveletekről. Az operátorok és operandusok helyétől függően beszélhetünk infix, postfix és prefix kifejezésekről. Ha kifejezésekből fákat építünk fel, akkor a kifejezések ilyen típusú osztályozása a felépített fa bejárási módjaival egyenértékű (inorder, postorder és preorder). Kifejezések típusa A szimbolizált művelet természete szerint az operátorok lehetnek: aritmetikai bit relációs referencia logikai feltételes halmaz értékadási műveletek karaktersorozat Egy kifejezés típusa a benne szereplő műveletek és operandusok típusából határozható meg. Attól függően, hogy melyek a domináns operátorok, a kifejezés típusa a fent felsorolt operátortípusok egyike lehet. Aritmetikai kifejezések Aritmetikai műveleteket használunk az aritmetikai, numerikus kifejezések felépítésére. Lássuk például a Pascal aritmetikai műveleteit: 2000-2001/6 237

Operátor Művelet Típus Eredmény Osztály + összeadás - kivonás * szorzás / osztás div osztás mod maradékosztály + pozitív előjel unáris - negatív előjel unáris Az aritmetikai kifejezések tehát összeadás, kivonás, szorzás, osztás, maradékszámítás műveleteket és a két unáris előjelt (pozitív, negatív) használhatják. A műveletek mellett azonosítókat vagy konstansokat adhatunk meg operandusokként, valamint használhatjuk a zárójeleket is a műveletvégzési sorrend meghatározására. Példák aritmetikai kifejezésekre: (x+y) * (alpha--beta), 12+35*4, 15*-delta/(2+4.8). Aritmetikai kifejezések kiértékelése - a kifejezést fordított lengyel formára hozzuk egy fa segítségével. - a fordított lengyel formában ábrázolt kifejezést kiértékeljük egy verem segítségével. Fordított lengyel alaknak nevezzük a következő ábrázolásmódot: a.) Egy operandus fordított lengyel alakban lévő kifejezés. b.) Ha K1 és K2 két fordított lengyel alakban lévő kifejezés és o egy operátor, akkor K1 K2 o fordított lengyel alakú. c.) Bármely fordított lengyel alakú kifejezés az a.) és b.) szabályok segítségével származtatható. Példák: Kifejezés Fordított lengyel forma a+b a b + (c-d) c d - (a+b)*(c-d) a b + c d - * a+b*c-d a b c * + d - Ha ismerjük az operátorok prioritását, a kifejezések nagyon egyszerűen átalakíthatóak fává, a következő szabályok betartásával: a.) A műveletek nem terminális csomópontok. b.) Bármely terminális elem egy változó vagy egy konstans. c.) Bármely nem terminális csomópontnak a bal- illetve a jobb részfája a művelet két operandusát jelenti. d.) A fa gyökere az utolsó elvégzendő művelet. Először rögzítenünk kell egy prioritási sorrendet. A fává alakításhoz változó prioritást használunk. Ez azt jelenti, hogy adott egy általános prioritás és ezt változtatjuk a megfelelő szimbólumokra. Két tömböt kell tehát használnunk, az egyikben tároljuk az eredeti kifejezést, amelyből kiszűrjük a zárójeleket, a másikban tároljuk a prioritásokat. Legyen a prioritásszámoló szabály a következő: 238 2000-2001/6

- Legyen pr az általános prioritás, e a kifejezéstömb, p a prioritástömb és s a beolvasott szimbólum. - pr kezdetben 0. - Ha s konstans vagy változó, akkor a prioritása 1000 és ezt beírjuk p-be, s-et pedig beírjuk e-be. - Ha s nyitó zárójel ( ( ), akkor növeljük pr-et 100-al. - Ha s - (negatív előjel), akkor p-be beírunk pr + 100-at, e-be pedig beírunk valamilyen s-et szimbolizáló jelt (pl. _). - Ha s csukó zárójel ( ) ), akkor csökkentjük pr-et 100-al. - Ha s + vagy - (), akkor p-be kerül pr + 1, e-be pedig s. - Ha s * vagy /, akkor p-be kerül pr + 10, e-be pedig s. Így tehát a rendelkezésünkre áll két tömb, az egyik a zárójelek nélküli kifejezést, a másik a kifejezésben szereplő szimbólumok prioritását tartalmazza. E két tömb segítségével, rekurzívan, fát építünk fel. A rekurzív algoritmushoz a következő információkra van szükségünk: - a két tömbre, - két értékre, az alsó és a felső határra, amely megadja, hogy momentán a két tömb melyik részével dolgozunk, kezdetben az alsó 1, a felső pedig a tömbök hossza. Az algoritmus: Input: A két tömb, alsó, felső. Output: A felépített fa. Módszer: 1.) Az alsó - felső résztömbben megkeressük a legkisebb prioritású műveletet, legyen ez az i-edik (jobbról - balra). 2.) Létrehozzuk az új csomópontot. 3.) Az új csomópont adata az 1.)-nél megkapott művelet lesz. 4.) Ha alsó = felső, akkor a csomópont bal illetve jobboldali részfája üres lesz. 5.) Különben ha a művelet unáris, akkor rekurzívan felépítjük a jobboldali részfát i+1-re és felsőre. 6.) Ha a művelet, akkor rendre felépítjük a baloldali részfát alsóra és i-1-re valamint a jobboldali részfát i+1-re és felsőre. Példa: Legyen a kifejezés: (a+b)*(c-d) A zárójelek nélküli kifejezés és a prioritástömb a következő: e: a + b * c - d p: 1000 101 1000 100 1000 101 1000 A felépített fa: A fa postorder bejárása A fát postorder módon szintén rekurzívan fogjuk bejárni. A bejárt csomópontokból kiolvasott adatokat egy flf tömbben tároljuk. Kezdetben ez a tömb üres. Az algoritmushoz még szükségünk van az aktuális csomópontra, legyen ez R, és kezdetben a fa gyökere. Az algoritmus: Input: R, flf 2000-2001/6 239

Output: flf Módszer: 1.) ha R nem üres, akkor 2.) rekurzívan hívjuk az algoritmust R baloldali részfájára és flf-re. 3.) rekurzívan hívjuk az algoritmust R jobboldali részfájára és flf-re. 4.) flf-be beírjuk R adatát. A bejárás után flf-ben megkapjuk fordított lengyel formában a kifejezést. Ezt a kifejezést postfix kifejezésnek nevezzük. Példa: A fenti fa a következő fordított lengyel formában lévő kifejezést eredményezi a postorder bejárás után: flf: a b + c d - * Megfigyelhetjük, hogy a fában már nincs szükség a zárójelekre, a műveletek sorrendje egyértelműen eldönthető. Fordított lengyel alakban ábrázolt kifejezéseket nagyon könnyű kiértékelni. A kiértékeléshez egy veremre van szükségünk, és a következő algoritmus szerint járunk el: a.) Elindulunk a fordított lengyel ábrázolásmódban levő kifejezés bal oldaláról. b.) Ha változót vagy konstanst találunk, akkor betesszük a verembe. c.) Ha unáris műveletet találunk, akkor kivesszük a verem legfelső elemét, végrehajtjuk rajta a műveletet, majd az eredményt visszahelyezzük a verembe. d.) Ha művelet kerül sorra, akkor a felső két elemet vesszük ki a veremből, a művelet végrehajtása után visszaírjuk az eredményt. e.) Az eljárást addig folytatjuk, amíg a kifejezés végére érünk. A veremben maradt adat a kifejezés értéke. Példa: A fenti a b + c d - * postfix kifejezés kiértékelésekor a verem így néz ki: feltételezzük, hogy a változók a következő értékekkel rendelkeznek: a = 1 b = 10 a verem az algoritmus során így módosul: c = 100 d = 1000 A kifejezés értéke tehát -9900 lesz. Kovács Lehel 240 2000-2001/6