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

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

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

Kupac adatszerkezet. 1. ábra.

Algoritmusok és adatszerkezetek II.

Az B sorozatban a pontok helyes preorder sorrendben vannak. A preorder bejárásban p k -t közvetlenül q m követi.

Korlátozás és szétválasztás elve. ADAGOLO adattípus

Algoritmusok és adatszerkezetek II.

1. Alapfogalmak Algoritmus Számítási probléma Specifikáció Algoritmusok futási ideje

Példa 30 14, 22 55,

Módosítható Prioritási sor Binomiális kupaccal. Wednesday, March 21, 12

Elemi adatszerkezetek

Adatszerkezetek 7a. Dr. IványiPéter

Adatszerkezet - műveletek

Algoritmusok és adatszerkezetek gyakorlat 07

Számláló rendezés. Példa

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

30. ERŐSEN ÜSSZEFÜGGŐ KOMPONENSEK

7 7, ,22 13,22 13, ,28

Egyesíthető prioritási sor

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

Adatszerkezetek és algoritmusok

Specifikáció. B logikai formula, a bemeneti feltétel, K logikai formula, a kimeneti feltétel, A az algoritmus, amelyre az állítás vonatkozik.

Melykeres(G) for(u in V) {szin(u):=feher Apa(u):=0} for(u in V) {if szin(u)=feher then MBejar(u)}

Programozási módszertan. Mohó algoritmusok

Bánsághi Anna 2014 Bánsághi Anna 1 of 68

23. SZÉLESSÉGI BEJÁRÁS

A félév során előkerülő témakörök

Megoldás meghatározása Ez a szakasz kitölti a c és S táblázatokat, a kiíratás S alapján egy rekurzív algoritmussal megtehető.

10. Gráf absztrakt adattípus, gráfok ábrázolása

Körkörös listák. fej. utolsó. utolsó. fej

Algoritmusok és adatszerkezetek II.

ALAPFOGALMAK 1. A reláció az program programfüggvénye, ha. Azt mondjuk, hogy az feladat szigorúbb, mint az feladat, ha

Specifikáció. B logikai formula, a bemeneti feltétel, K logikai formula, a kimeneti feltétel, A az algoritmus, amelyre az állítás vonatkozik.

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

Elıírt lépésszámú ciklusok

Példa Hajtsuk végre az 1 pontból a Dijkstra algoritmust az alábbi gráfra. (A mátrixban a c i j érték az (i, j) él hossza, ha nincs él.

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

Algoritmusok és adatszerkezetek II.

Feladat. Ternáris fa. Típusspecikáció. Reprezentáció. Absztrakt implementáció. Érdi Gerg EAF II. 4/3.

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

8. Mohó algoritmusok Egy esemény-kiválasztási probléma. Az esemény-kiválasztási probléma optimális részproblémák szerkezete

Gyakori elemhalmazok kinyerése

9. előadás. Programozás-elmélet. Programozási tételek Elemi prog. Sorozatszámítás Eldöntés Kiválasztás Lin. keresés Megszámolás Maximum.

2018, Diszkrét matematika

Neumann János Tehetséggondozó Program Gráfalgoritmusok II.

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

Aritmetikai kifejezések lengyelformára hozása

A C# programozási nyelv alapjai

2. Visszalépéses stratégia

Minimális feszítőfák Legyen G = (V,E,c), c : E R + egy súlyozott irányítatlan gráf. Terjesszük ki a súlyfüggvényt a T E élhalmazokra:

2. Visszalépéses keresés

Felvételi vizsga mintatételsor Informatika írásbeli vizsga

Rekurzió. Horváth Gyula.

Számjegyes vagy radix rendezés

Bánsághi Anna 2014 Bánsághi Anna 1 of 33

Melykeres(G) for(u in V) {szin(u):=feher Apa(u):=0} for(u in V) {if szin(u)=feher then MBejar(u)}

- 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.

Egyesíthető prioritási sor

A programozás alapjai 1 Rekurzió

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

5. SOR. Üres: S Sorba: S E S Sorból: S S E Első: S E

Java II. I A Java programozási nyelv alapelemei

Ö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.

Elmaradó óra. Az F = (V,T) gráf minimális feszitőfája G-nek, ha. F feszitőfája G-nek, és. C(T) minimális

Tuesday, March 6, 12. Hasító táblázatok

A Verem absztrakt adattípus

Információs Technológia

Rendezettminta-fa [2] [2]

Java programozási nyelv

Előfeltétel: legalább elégséges jegy Diszkrét matematika II. (GEMAK122B) tárgyból

Hátizsák feladat. Példa: A tárgyak (súly, fontosság) párokban (4,6) (3,5) (2,3) (2,3) a hátizsák kapacitása 8.

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

Minimális feszítőfák Legyen G = (V,E,c), c : E R + egy súlyozott irányítatlan gráf. Terjesszük ki a súlyfüggvényt a T E élhalmazokra:

INFORMATIKA javítókulcs 2016

5/1. tétel: Optimalis feszítőfák, Prim és Kruskal algorithmusa. Legrövidebb utak graphokban, negatív súlyú élek, Dijkstra és Bellman Ford algorithmus.

10. tétel. Adatszerkezetek és algoritmusok vizsga Frissült: január 28.

Gráfalgoritmusok: összefüggőség, párosítás páros gráfban

Bevezetés az informatikába

Algoritmizálás. Horváth Gyula Szegedi Tudományegyetem Természettudományi és Informatikai Kar

Hátizsák feladat. Példa: A tárgyak (súly, fontosság) párokban (4,6) (3,5) (2,3) (2,3) a hátizsák kapacitása 8.

Programozás I. Metódusok C#-ban Egyszerű programozási tételek. Sergyán Szabolcs

Ugrólisták. RSL Insert Example. insert(22) with 3 flips. Runtime?

Edényrendezés. Futási idő: Tegyük fel, hogy m = n, ekkor: legjobb eset Θ(n), legrosszabb eset Θ(n 2 ), átlagos eset Θ(n).

Algoritmusok helyességének bizonyítása. A Floyd-módszer

Példa Hajtsuk végre az 1 pontból a Dijkstra algoritmust az alábbi gráfra. (A mátrixban a c i j érték az (i, j) él hossza, ha nincs él.

angolul: greedy algorithms, románul: algoritmi greedy

és az instanceof operátor

2016, Diszkrét matematika

.Net adatstruktúrák. Készítette: Major Péter

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

Az absztrakt adattípus egy (E,M) párral adható meg, ahol E az értékhalmaz, M a műveletek halmaza. Fő tulajdonságok. Verem

Melykeres(G) for(u in V) {szin(u):=feher Apa(u):=0} for(u in V) {if szin(u)=feher then MBejar(u)}

Java VIII. Az interfacei. és az instanceof operátor. Az interfészről általában. Interfészek JAVA-ban. Krizsán Zoltán

Algoritmusok bonyolultsága

Hierarchikus adatszerkezetek

1. ábra. Számláló rendezés

BABEŞ-BOLYAI TUDOMÁNYEGYETEM MATEMATIKA-INFORMATIKA KAR Felvételi verseny - minta Informatika írásbeli

17. előadás: Vektorok a térben

Informatikus informatikus Térinformatikus Informatikus T 1/9

BBTE Matek-Infó verseny mintatételsor Informatika írásbeli vizsga

Átírás:

6. Fabejáró algoritmusok Fa bejárásán olyan algoritmust értünk, amelynek bemenete egy F fa és egy M művelet, és az algoritmus adott sorrendben pontosan egyszer végrehajtja az M műveletet a fa pontjaiban lévő adatokra. A preorder bejárási sorrend azt jelenti, hogy F minden p és q pontjára p megelőzi q-t a bejárási sorrendben, ha. q fia p-nek, 2. p bal-testvére q-nak. Tehát ha a p gyökerű fa fiai sorrendben az f,..., f k fák, akkor { p ha k = 0 preorder(p) = p, preorder( f ),..., preorder( f k ) ha k > 0 p f... fi... fk. ábra. Fa preorder bejárása. 2 7 3 6 8 0 2 3 5 4 5 9 4 2. ábra. Preorder bejárási sorrend. 6.. Rekurzív preorder bejárás (elsőfiú-testvér ábrázolásra) public static <E> void Preorder(FaPont<E> p, Muvelet<E> M){ if (p==null) return; FaPont<E> q=p.elsofiu; while (q!=null){ Preorder(q, M); q=q.testver; Rekurzív preorder bejárás változata

public static <E> void Preorder2(FaPont<E> p, Muvelet<E> M){ if (p==null) return; if (p.elsofiu!=null) Preorder2(p.elsofiu, M); if (p.testver!=null) Preorder2(p.testver, M); A Preorder2 algoritmus helyessége.. Alaplépés. Akkor és csak akkor nincs rekurzív hívás, ha a p pontnak se fia, se testvére nincs. Ekkor helyesen működik, mert végrehajtja az M műveletet a p pont adatára és terminál. 2. Rekurzív lépés. Bizonyítandó, hogy ha mindkét rekurzív hívás helyes, akkor helyes lesz a p gyökerű fára is. Az első rekurzív hívás az f fa (helyes) preorder bejárását végzi el, majd a második rekurzív hívás pedig a p.testver pontból az elso f iu és testver kapcsolatok szerint elérhető pontokra végez helyes preorder bejárást, tehát a p gyökerű fa preorder bejárását kapjuk. 6.2. Nem-rekurzív preorder bejárás Feltesszük, hogy minden pont tartalmaz apa kapcsolatot. apa 3.. elsofiu 2. testver 3. ábra. Továbblépési stratégia. A bejárás során a továbblépési sorrendben:. Első-fiúra, ha van 2. Testvérre, ha van 3. Apára (visszalépés), ha van. A műveletet a pont első érintésekor hajtjuk végre. public static <E> void PreorderN(FaPont<E> p, Muvelet<E> M){ while (p!=null){ while (p.elsofiu!=null){ p=p.elsofiu; while ((p!=null) && (p.testver==null)) p=p.apa; if (p!=null) p=p.testver; public static <E> void Postorder(FaPont<E> p, Muvelet<E> M){ if (p==null) return; 2

a a2 a7 a a3 a6 a8 a0 a2 a3 a5 a4 a5 a9 a4 4. ábra. Fa nem-rekurzív preorder bejárása. FaPont<E> aktpont=p; p=p.elsofiu; while (p!=null){ Postorder(p, M); p=p.testver; M.muvelet(aktpont.elem); 6.3. Nem-rekurzív bejárás veremmel public void PreorderV(FaPont<E> F, Muvelet<E> M){ // Preorder bejárás veremmel. Verem<FaPont<E>> V=new VeremL<FaPont<E>>(); V.VeremBe(F); FaPont<E> p; while (V.NemUres()){ p=v.verembol(); if (p.testver!=null) V.VeremBe(p.testver); if (p.elsofiu!=null) V.VeremBe(p.elsofiu) A PREORDERV algoritmus helyességének bizonyítása. Tekintsük a while ciklus végrehajtásának egy adott pillanatát. Legyen B = p,..., p k a fa azon pontjainak halmaza, amelyeket már bejártunk, abban a sorrendben, ahogy a veremből kikerültek. Legyen V = q,...,q m a V verem tartalma, ezek az aktív pontok. A következő négy állítás konjunkciója ciklusinvariáns lesz.. Az B sorozatban a pontok helyes preorder sorrendben vannak. 2. A preorder bejárásban p k -t közvetlenül q m követi. 3. A preorder sorrendben q i megelőzi q i -et (i = 2,...,m). 4. B V = /0 és a fa bármely p / B pontjára, pontosan egy olyan q V pont van, hogy p leszármazottja q-nak az elsőfiú-testvér fában. 3

Megmutatjuk, hogy ha a feltételek teljesülnek a ciklusmag végrehajtása előtt, és az ismétlési feltétel igaz, azaz a verem nem üres, akkor a ciklusmag végrehajtása után is teljesülni fognak. Először kivesszük a q m pontot a veremből az p változóba és végrehajtjuk rá az M műveletet, majd betesszük a verembe q m t testvérét, ha létezik, aztán betesszük a verembe q m e első fiát, ha létezik. Tehát B = p,..., p k,q m lesz és a verem tartalmára qm t... e f fu f0 5. ábra. q m a veremből éppen kivett pont. az alábbi négy eset lehetséges. a. V = q,...,q m b. V = q,...,q m,e c. V = q,...,q m,t d. V = q,...,q m,t,e Az. feltétel teljesül, mert a 2. feltétel teljesült a ciklusmag előtt. A 2. feltétel azért teljesül, mert q m preorder követője az a. esetben q m, a b. és d. esetben e, a c. esetben pedig t. Mivel q m megelőzi a preorder sorrendben q m -et, ezért q m minden leszármazottja, így e és t is megelőzi, továbbá e megelőzi t-t, tehát a 3. feltétel is teljesül. A 4. feltétel nyilvánvalóan teljesül, hiszen q m átkerült az B sorba, és q m bármely leszármazottja vagy e-nek, vagy t-nek leszármazottja az Elsőfiú-testvér fában. Az -4. feltételek mindegyike teljesül a ciklus végrehajtása előtt, mert S = és V csak a fa F gyökerét tartalmazza (V = F ). Tehát a while ciklus bizonyítási szabálya szerint a while ciklus után V = és teljesül az -4. feltételek mindegyike. Ez azt jelenti, hogy B a fa minden pontját tartalmazza helyes preorder sorrendben. 6.4. Szintszerinti bejárás A szintszerinti bejárási sorrend. Egy F fa bármely két, p és q pontjára p akkor és csak akkor előzi meg q-t a szintszerinti bejárásban, ha d(p) < d(q) d(p) = d(q) ( p, q)( pbal-testvére q nak pe p qe q) public static <E> void SzintBejar(FaPont<E> F, Muvelet<E> M){ if (F==null) return; Sor<FaPont<E>> S = new SorL<FaPont<E>>(); FaPont<E> p; S.SorBa(F); while (S.Elemszam()!=0){ p=s.sorbol(); p=p.elsofiu; while (p!=null){ S.SorBa(p); p=p.testver; 4

2 3 4 5 6 7 8 9 0 2 3 4 5 6. ábra. Fa szintszerinti bejárási sorrendje. A SZINTFABEJAR algoritmus működésének szemléltetése. q 7. ábra. Az ciklus első végrehajtása előtt. q q2 q3 8. ábra. Az ciklus első végrehajtása után. A SZINTFABEJAR algoritmus helyességének bizonyítása. Tekintsük a külső while ciklus végrehajtásának egy adott pillanatát. Legyen B = p,..., p k a fa azon pontjainak halmaza, amelyeket már bejártunk, abban a sorrendben, ahogy a sorból kikerültek. Legyen S = q,...,q m a S sor aktuális tartalma, ezek az aktív pontok. A következő öt állítás konjunkciója ciklusinvariáns lesz.. Az B sorozatban a pontok szintszerinti sorrendben vannak. 2. Az S sorban a pontok szintszerinti sorrendben vannak. 3. d(q m ) d(q ) + 5

2 q2 q3 q4 q5 9. ábra. Az ciklus második végrehajtása után. 2 3 q3 q4 q5 q6 q7 0. ábra. Az ciklus harmadik végrehajtása után. 2 3 4 q4 q5 q6 q7 q8 q9 q0. ábra. Az ciklus negyedik végrehajtása után. 6

4. A szintszerinti bejárásban p k megelőzi q -et. 5. B S = /0 és B S = F. Megmutatjuk, hogy ha a feltételek teljesülnek a ciklusmag végrehajtása előtt, és az ismétlési feltétel igaz, azaz az S sor nem üres, akkor a ciklusmag végrehajtása után is teljesülni fognak. Először kivesszük a sorból a q pontot az F változóba és végrehajtjuk rá az M műveletet, majd betesszük a sorba q fiait a f,..., f u fabeli sorrendjükben. Az. feltétel teljesül, mert a 2. és 4. feltétel teljesült a ciklusmag előtt. Mivel q megelőzi q 2 -t, ezért d(q ) d(q 2 ), tehát d( f u ) = d(q ) + d(q 2 ) +, tehát a 3. feltétel is teljesül. A 4. feltétel következik abból, hogy előtte teljesült a 2. feltétel. Az 5. feltétel nyilvánvalóan teljesül, hiszen q átkerült az B halmazba, és q bármely leszármazottja valamelyik f i leszármazottja. A 2. feltétel teljesülésének bizonyítása maradt hátra. Ha m =, akkor az S sor új tartalma éppen a q pont fiai lesznek. Ha m >, akkor elég azt bizonyítani, hogy q m megelőzi f -et a szintszerinti sorrendben. A 3. feltétel miatt teljesül a d( f ) = d(q ) + d(q m ). Ha d( f ) > d(q m ), akkor q m a definíció szerint megelőzi f -et. Ha d( f ) = d(q m ), akkor legyen q m := Apa(q m ), tehát d(q ) = d(q m ). Mivel q m csak úgy kerülhetett be az S sorba, hogy kivettük apját, tehát q m már B-ben van, tehát q m előbb van a sorrendben, mint q. Mivel d(q ) = d(q m ), ezért a definíció szerint van olyan r és r 2 pont, hogy r -nek jobb-testvére r 2 és q leszármazottja r -nek, q m pedig leszármazottja r 2 -nek. De így f leszármazottja r -nek és q m is leszármazottja r 2 -nek, továbbá d( f ) = d(q m ), tehát f megelőzi q m -et. Az -5. feltételek mindegyike teljesül a ciklus végrehajtása előtt, mert S = és V csak a fa F gyökerét tartalmazza (V = F ). Tehát a while ciklus bizonyítási szabálya szerint a while ciklus után V = és teljesül az -5. feltételek mindegyike. Ez azt jelenti, hogy B a fa minden pontját tartalmazza helyes preorder sorrendben. Vegyük észre, hogy nem fontos a szintszerinti bejárási sorrend, a fenti algoritmusban az aktív pontok tárolására minden olyan absztrakt adattípus használható lenne, amely biztosítaná az alábbi specifikációban adott műveleteket. Értékhalmaz: Adagolo = {A : A E Műveletek: A : Adagolo, x : E {Igaz Letesit(A) {A = /0 {A = A Megszuntet(A) {Igaz {A = A Uresit(A) {A = /0 {A = A Betesz(A,x) {A = Pre(A) {x {A /0 Kivesz(A,x) {x Pre(A) Pre(A) = A {x {A = A Elemszam(A) {Elemszam = A public static <E> void AdBejar(FaPont<E> F, Muvelet<E> M){ if (F==null) return; Adagolo<FaPont<E>> A = new Adagolo<FaPont<E>>(); FaPont<E> p; A.Betesz(F); while (A.Elemszam()!=0){ p=a.kivesz(); p=p.elsofiu; while (p!=null){ A.Betesz(p); p=p.testver; 7

!! " " # # $ $ % % & & ' ' ( ( ) ) * * + +,, - -.. / / 0 0 2 2 3 3 4 4 5 5 6 6 7 7 8 8 2. ábra. A fa pontjai adagolós bejárás során. 8