Algoritmusok és adatszerkezetek II.

Hasonló dokumentumok
Algoritmusok és adatszerkezetek II.

Algoritmusok és adatszerkezetek II.

Önszervező bináris keresőfák

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

Példa 30 14, 22 55,

Algoritmusok és adatszerkezetek gyakorlat 07

Rendezettminta-fa [2] [2]

Adatszerkezet - műveletek

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

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

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

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

Algoritmusok és Adatszerkezetek II.

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

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

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

ÖNSZERVEZŐ BINÁRIS KERESŐFÁK HATÉKONYSÁGA

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

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

Programozási nyelvek Java

OAF Gregorics Tibor: Minta dokumentáció a 3. házi feladathoz 1.

C# nyelv alapjai. Krizsán Zoltán 1. Objektumorientált programozás C# alapokon tananyag. Általános Informatikai Tanszék Miskolci Egyetem

Algoritmusok és Adatszerkezetek II. előadás

Programozási módszertan. Mohó algoritmusok

Algoritmusok és adatszerkezetek II.

3. Absztrakt adattípusok

Gelle Kitti Algoritmusok és adatszerkezetek gyakorlat - 07 Hasítótáblák

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

Bináris keresőfák. Adat : M Elemtip és Elemtip-on értelmezett egy lineáris rendezési reláció,

Elemi adatszerkezetek

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

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

OOP: Java 8.Gy: Abstract osztályok, interfészek

és az instanceof operátor

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

A MAXIMUM-KUPACOL eljárás helyreállítja az A[i] elemre a kupactulajdonságot. Az elemet süllyeszti cserékkel mindaddig, amíg a tulajdonság sérül.

Algoritmuselmélet. 2-3 fák. Katona Gyula Y. Számítástudományi és Információelméleti Tanszék Budapesti Műszaki és Gazdaságtudományi Egyetem. 8.

Hierarchikus adatszerkezetek

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

Egyesíthető prioritási sor

Kupac adatszerkezet. 1. ábra.

Generikus osztályok, gyűjtemények és algoritmusok

Egyesíthető prioritási sor

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

Adatszerkezetek 7a. Dr. IványiPéter

Algoritmusok és adatszerkezetek II.

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

Információs Technológia

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

Programozási nyelvek Java

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

OBJEKTUM ORIENTÁLT PROGRAMOZÁS JAVA NYELVEN. vizsgatételek

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

Java VI. Egy kis kitérő: az UML. Osztály diagram. Általános Informatikai Tanszék Utolsó módosítás:

A Verem absztrakt adattípus

6. előadás. Kiegyensúlyozottság, AVL-fa, piros-fekete fa. Adatszerkezetek és algoritmusok előadás március 6.

Széchenyi István Egyetem. Programozás III. Varjasi Norbert

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

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

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

Objektumorientált programozás C# nyelven III.

List<String> l1 = new ArrayList<String>(); List<Object> l2 = l1; // error

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

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

Objektum elvű alkalmazások fejlesztése Kifejezés lengyel formára hozása és kiértékelése

117. AA Megoldó Alfréd AA 117.

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

Programozás II. ATM példa Dr. Iványi Péter

Rekurzió. Horváth Gyula.

PHP II. WEB technológiák. Tóth Zsolt. Miskolci Egyetem. Tóth Zsolt (Miskolci Egyetem) PHP II / 19

Java Programozás 4. Gy: Java GUI. Tipper, MVC kalkulátor

A feladat lényege egy felhasználói típusnak a zsák típusnak a megvalósítása.

JAVA PROGRAMOZÁS 3.ELŐADÁS

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

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

Java Programozás 9. Gy: Java alapok. Adatkezelő 5.rész

OOP: Java 8.Gy: Gyakorlás

Helyes-e az alábbi kódrészlet? int i = 1; i = i * 3 + 1; int j; j = i + 1; Nem. Igen. Hányféleképpen lehet Javaban megjegyzést írni?

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

A C# programozási nyelv alapjai

Osztályok. 4. gyakorlat

Táblázatok fontosabb műveletei 1

Java Programozás 11. Ea: MVC modell

Programozási technológia

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

C# osztályok. Krizsán Zoltán

Rendezések. Összehasonlító rendezések

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

17. A 2-3 fák és B-fák. 2-3 fák

Abstract osztályok és interface-ek. 7-dik gyakorlat

Programozási nyelvek Java

Java bevezet o Kab odi L aszl o Kab odi L aszl o Java bevezet o

abkezel.java import java.awt.*; import java.awt.event.*; import javax.swing.*; import java.sql.*; public class abkezel extends JFrame {

Programozás I. 3. gyakorlat. Szegedi Tudományegyetem Természettudományi és Informatikai Kar

Objektum Orientált Programozás. 11. Kivételkezelés 44/1B IT MAN

Java II. I A Java programozási nyelv alapelemei

BME MOGI Gépészeti informatika 4.

Programozási technikák Pál László. Sapientia EMTE, Csíkszereda, 2009/2010

Felhasználó által definiált adattípus

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

Átírás:

Algoritmusok és adatszerkezetek II. Horváth Gyula Szegedi Tudományegyetem Természettudományi és Informatikai Kar horvath@inf.u-szeged.hu

5. Vágható-egyesíthető Halmaz adattípus megvalósítása önszervező bináris keresőfával Értékhalmaz: V EHalmaz = {{a 1,...,a n : a i E Műveletek: RHalmaz műveletek + H,H 1,H 2 : V EHalmaz, k : E {H = H Vag(H,k,H 1,H 2 ) {H = /0,H 1 = {x re(h) : x < k H 2 = {x re(h) : x k {max(h 1 ) min(h 2 ) Egyesit(H 1,H 2,H) {H 1 = /0,H 2 = /0,H = re(h 1 ) re(h 1 ) public interface VEHalmaz<E extends Comparable<E>> extends RHalmaz<E>{ public VEHalmaz<E> Vag(E k); public void Egyesit(VEHalmaz<E> H2);

A vágás művelet megvalósítható egy menetben felülről lefelé haladva a következő transzformációs lépésekkel. Minden lépésben a bemeneti fa egy részfáját átkapcsoljuk vagy az F 1 fa jobb sarkához, vagy az F 2 fa bal sarkához. A lépéseket addig kell ismételni, amíg a bemeneti fa elfogy.

a 1 a 2 1 b 1 2 a 3 1 b 2 3 b 3 2 3 1. ábra. A K kulcshoz tartozó bővítőút.

a 1 a 2 1 b 1 2 a 3 1 b 2 3 b 3 2 3 2. ábra. Az F fa K-nál kisebb gyökerű és K-nál nem kisebb gyökerű részfákra bontása.

a 1 F 1 a 2 1 b 1 F 2 2 a 3 1 b 2 3 b 3 2 3 3. ábra. A részfák összekapcsolása F 1 és F 2 fává.

Transzformációs invariáns. A VAG művelet megvalósítása transzformációs lépések sorozatából áll. Minden lépésben három fa vesz részt (amelyek közül egy lépésben csak kettő változik), F 1,F,F 2, ahol F a még vágandó fa, F 1 a kiindulási fából eddig kivágott és a K kulcsnál < pontokat tartalmazó keresőfa, F 2 pedig a kiindulási fából eddig kivágott és a K kulcsnál pontokat tartalmazó keresőfa. A kezdő hármas:,f,. Az algoritmus helyességének bizonyítását transzformációs invariáns alkalmazásával végezzük. A transzformációs invariáns olyan tulajdonság (logikai kifejezés), amely ha teljesül egy F 1,F,F 2 F 1,F,F 2 transzformációs lépés előtt az F 1,F,F 2 hármasra, akkor a keletkező F 1,F,F 2 fa-hármasra ismét teljesülni fog. Transzformációs invariáns a T 1 és T 2 vágási transzformációkra: 1. Az F, F 1 és F 2 fa bináris keresőfa 2. max(f 1 ) < K min(f 2 ) ha F 1 és F 2 3. max(f 1 ) min(f) ha F 1 4. max(f) min(f 2 ) ha F 2 Megvalósítás

Elõtte F X F 1 F 2 JS BS Utána F F 1 F 2 X BS JS 4. ábra. A T 1 vágási transzformáció; feltétel: X < K

Előtte F X F 1 F 2 JS BS Utána F 1 F 2 F JS X BS 5. ábra. A T 2 vágási transzformáció; feltétel: K X

public BinKerFa<E> BKFaVag(E k){ BinKerFaont<E> Fej; BinFaont<E> BJSarok, JBSarok, p; Fej=new BinKerFaont<E>(); p=gyoker; BJSarok=JBSarok=Fej; while (p!=null){ if (k.compareto(p.elem)<=0 ){ JBSarok.bal=p; //(B, X<-, J) --> (B, a, J) p.apa=jbsarok; // / \ / JBSarok=p; // a b X p=p.bal; // \ else{ // b BJSarok.jobb=p; //(B, X<-, J) --> (B, b, J) p.apa=bjsarok; // / \ \ BJSarok=p; // a b X p=p.jobb; // / // a //while BJSarok.jobb=null; JBSarok.bal=null; gyoker=fej.jobb; if (gyoker!=null) gyoker.apa=null; if (Fej.bal!=null) Fej.bal.apa=null; return new BinKerFaA<E>(Fej.bal);

A BKFAVAG eljárás futási ideje legrosszabb esetben O(h(F)). Azonban a vágás során nem tartható fenn sem az AVL, sem a piros-fekete kiegyensúlyozottság a fa magasságával arányos időben. 5.1. Egyesítés A max(f 1 ) min(f 2 ) feltétel miatt a két fa egyszerűen összekapcsolható, akár F 2 -t F 1 jobbsarkához, akár F 1 -et F 2 bal-sarkához kapcsolva. Kevésbé elfajuló fát kapunk, ha először F F F 1 F 2 F 1 F 2 F 2 F 1 6. ábra. Két bináris keresőfa egyszerű egyesítése eltávolítjuk F 1 -ből a legnagyobb elemet tartalmazó pontot, majd az így kapott F 1 fát az eltávolított pont bal, és az F 2 fát jobb fiaként kapcsoljuk be (vagy fordítva).

F K F K F 1 F 2 F 1 F 2 F 1 F 2 7. ábra. Két bináris keresőfa egyesítése 5.2. Önszervező bináris keresőfák Tegyük fel, hogy van olyan Splay(F, K) műveletünk, amely átalakítja az F bináris keresőfát úgy, hogy a K kulcsú elem kerül a gyökérbe, ha van F-ben K kulcsú elem, egyébként olyan K kulcsú elem kerül a gyökérbe, amely vagy követője, vagy előzője K-nak. (Tehát SLAY(F,K) hatására a K-keresőút végén lévő pont kerül a gyökérbe.) Tehát Splay(F, K) végrehajtása után teljesül a Splay tulajdonság: 1. F bináris keresőfa 2. Adat(F) = K, ha K re(f) vagy Adat(F) = Max{Adat(x) : x re(f) Adat(x) < K, vagy Adat(F) = Min{Adat(x) : x re(f) Adat(x) > K ha K / re(f) Ilyen SLAY művelettel megvalósítható a KERES, BOVIT, TOROL, VAG és EGYESIT műveletek mindegyike. A keresés nyilvánvaló, SLAY(F, K) után ellenőrizni kell, hogy K kulcsú elem került-e a gyökérbe.

F Splay(F, K) F K K K K K (a) (b) 8. ábra. A BOVIT(F, K) művelet megvalósítása SLAY művelettel. (a) eset: K K, (b)eset: K > K.

F Splay(F, K) F K Splay(, K) K K 9. ábra. A TOROL(F, K) művelet megvalósítása SLAY művelettel.

F Splay(F, K) F K F 1 K F 2 10. ábra. A VAG(F,K,F 1,F 2 ) művelet megvalósítása SLAY művelettel.

F 1 F 2 F 1 Splay(F 1,min(F 2 )) F 11. ábra. A EGYESIT(F 1,F 2,F) művelet megvalósítása SLAY művelettel.

Z R X Y Q δ Y Q X γ Z R γ δ 12. ábra. Alulról felfelé haladó transzformáció.

Z R Y X Q δ X Q Z R Y γ δ γ X R Y Z Q X R Z Q Y δ γ δ γ 13. ábra. Alulról felfelé haladó transzformáció.

A SLAY transzformáció megvalósítása felülről lefelé haladva. A BKFAVAG művelethez hasonlóan, a SLAY műveletet is transzformációs lépések sorozatával valósítjuk meg, amely az S5 összeépítő lépés végrehajtásával ér véget. Minden lépésben három fa vesz részt, a kezdő hármas:,f,. A transzformációs lépések mindegyikére a következő tulajdonság invariáns lesz. 1. Az F, F 1 és F 2 fa bináris keresőfa 2. max(f 1 ) K min(f 2 ) ha F 1 és F 2 3. max(f 1 ) min(f) ha F 1 4. max(f) min(f 2 ) ha F 2

Y F 1 F 2 X Q BJ γ JB Feltétel: K Y K X F 1 F 2 BJ X Q JB Y Feltétel: K Y K = X K X = γ X Q F 1 F 2 BJ Y JB γ 14. ábra. S1: Cikk-cikk transzformáció

Y F 1 F 2 X Q BJ γ JB Feltétel: K < Y K > X F 1 F 2 X Q Y BJ JB γ Feltétel: K < Y K = X K > X = X Q F 1 F 2 BJ Y JB γ 15. ábra. S2: Cikk-cakk transzformáció

X F 1 F 2 Y Q BJ JB γ Feltétel: K > X K < Y F 1 F 2 X Y Q BJ JB γ Feltétel: K > X K = Y K < Y = Y Q F 1 F 2 X γ JB BJ 16. ábra. S3: Cakk-cikk transzformáció

X F 1 F 2 Y Q BJ JB γ Feltétel: K > X K > Y γ F 1 γ F 2 Y Q JB X BJ Feltétel: K > X K = Y K > Y γ = Y Q F 1 F 2 X γ JB BJ 17. ábra. S4: Cakk-cakk transzformáció

X F 1 F 2 BJ JB Feltétel: X = K K < X = K > X = X F 1 F 2 18. ábra. S5 : Összeépítő transzformáció

Mivel mindegyik transzformációs lépés teljesíti az invariánst, ezért a keletkező fára teljesül a Splay tulajdonság. 5.1. tétel. Ha a halmazok ábrázolására önszervező bináris keresőfát használunk, akkor minden 1,..., m műveletsor, ahol i {KERES, BOVIT, TOROL, VAG, EGYESIT összesített futási ideje O(m lg n), ahol n a BOVIT műveletek száma és a műveletsor előtt üres halmazzal indulunk.

private void Splay(E x){ BinKerFaont<E> BJSarok, JBSarok, p, q; BJSarok = Fej; JBSarok = Fej; Fej.bal = Fej.jobb = null; p = (BinKerFaont<E>)gyoker; for (;;) { if (x.compareto(p.elem) < 0) { q=(binkerfaont<e>)p.bal; if (q!=null && x.compareto(q.elem) < 0) {//a keresőút balra halad p.bal = q.jobb; if (q.jobb!=null) q.jobb.apa=p; q.jobb = p; p.apa=q; p = q; if (p.bal == null) break; JBSarok.bal = p; p.apa=jbsarok; JBSarok = p; p = (BinKerFaont<E>)p.bal; // jobbra forgat // jobbra kapcsol

else if (x.compareto(p.elem) > 0) {a keresőút jobbra halad q=(binkerfaont<e>)p.jobb; if (q!=null && x.compareto(q.elem) > 0) { p.jobb = q.bal; if (q.bal!=null) q.bal.apa=p; q.bal = p; p.apa=q; p = q; if (p.jobb == null) break; BJSarok.jobb = p; p.apa=bjsarok; BJSarok = p; p = (BinKerFaont<E>)p.jobb; else { break; // balra forgat // balra kapcsol

BinFaont<E> f1=p.bal; BinFaont<E> f2=p.jobb; BJSarok.jobb = f1; // összeépítés JBSarok.bal = f2; p.bal = Fej.jobb; p.jobb = Fej.bal; if (f1!=null && BJSarok!=Fej) f1.apa=bjsarok; if (f2!=null && JBSarok!=Fej) f2.apa=jbsarok; if (p.bal!=null) p.bal.apa=p; if (p.jobb!=null) p.jobb.apa=p; p.apa=null; gyoker = p;

public boolean Bovit(E x, boolean tobb){ int ken; if (gyoker == null) { gyoker = new BinKerFaont(x,null,null); return true; Splay(x); if (( ken = x.compareto(gyoker.elem)) == 0 &&!tobb) return false; BinKerFaont<E> ujpont = new BinKerFaont<E>(x,null,null); if (ken < 0) { ujpont.bal = gyoker.bal; if (gyoker.bal!=null) gyoker.bal.apa=ujpont; ujpont.jobb = gyoker; gyoker.bal = null; else { ujpont.jobb = gyoker.jobb; if (gyoker.jobb!=null) gyoker.jobb.apa=ujpont; ujpont.bal = gyoker; gyoker.jobb = null; gyoker.apa=ujpont; gyoker = ujpont; gyoker.apa=null; return true; //Bovit

public boolean Torol(E x){ if (gyoker==null) return false; BinKerFaont<E> f2; Splay(x); if (x.compareto(gyoker.elem)!= 0) return false; // a gyöker törlése f2 = (BinKerFaont<E>)gyoker.jobb; gyoker = gyoker.bal; if (gyoker!=null){ gyoker.apa=null; Splay(x); gyoker.jobb = f2; if (f2!=null) f2.apa=gyoker; else gyoker=f2; if (gyoker!=null) gyoker.apa=null; return true; //Torol

public BinKerFa<E> Vag(E x){ Splay(x); BinKerFaont<E> p2 = (BinKerFaont<E>)gyoker; if (x.compareto(gyoker.elem) <=0){ gyoker=p2.bal; if (p2.bal!=null) gyoker.apa=null; p2.bal=null; else{ p2=(binkerfaont<e>)gyoker.jobb; if (p2.bal!=null) gyoker.jobb=null; gyoker.apa=null; return new BinKerFaS<E>(p2);

public void Egyesit(BinKerFaS<E> f2){ if (gyoker==null){ gyoker=f2.gyoker; return; BinKerFaont<E> p2 = (BinKerFaont<E>)f2.gyoker; if (p2==null) return; BinKerFaont<E> p2m=(binkerfaont<e>)f2.min(); Splay(p2.elem); if (gyoker.elem.compareto(p2m.elem)>0 ) throw new RuntimeException("A két Halmaz nem erősen diszjunkt"); gyoker.jobb=p2; p2.apa=gyoker; f2.gyoker=null;

5.3. A VHHalmaz adattípus megvalósítása önszervező bináris keresőfával public class VEHalmazSFa<E extends Comparable<E>> extends RHalmazFa<E> implements VEHalmaz<E>{ // örökölt adattagok RHalmazFa<E>-ból: // protected BinKerFa<E><E> Fa; // protected int eszam; // private boolean multi=true; VEHalmazSFa(boolean multi){ super("splay", multi); Fa=new BinKerFaS<E>(); eszam=0; VEHalmazSFa(){ super("splay"); Fa=new BinKerFaS<E>(); eszam=0;

public VEHalmaz<E> Vag(E x){ BinKerFaS<E> F2=(BinKerFaS<E>)((BinKerFaS<E>)Fa).Vag(x); VEHalmazSFa<E> H2=new VEHalmazSFa<E>(); H2.Fa=F2; H2.eszam=Integer.MIN_VALUE; eszam=integer.min_value; return H2; public void Egyesit(VEHalmaz<E> H2){ if (H2 instanceof VEHalmazSFa){ ((BinKerFaS<E>)Fa).Egyesit( (BinKerFaS<E>)((VEHalmazSFa<E>)H2).Fa ) // eszam=elemszam()+h2.elemszam(); eszam=integer.min_value; else throw new RuntimeException("A két Halmaz nem azonos ábrázolású");

private int Bejar(BinFaont<E> p){ if (p==null) return 0; return 1+Bejar(p.bal)+Bejar(p.jobb); public int Elemszam(){ if (Fa.gyoker==null) eszam=0; else if (eszam<0){ eszam=bejar(fa.gyoker); return eszam;