Algoritmusok és Adatszerkezetek II. előadás

Hasonló dokumentumok
Algoritmusok és Adatszerkezetek II.

Algoritmusok és adatszerkezetek II.

Rendezettminta-fa [2] [2]

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

Példa 30 14, 22 55,

Algoritmusok és adatszerkezetek II.

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

Adatszerkezet - műveletek

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

Algoritmusok és adatszerkezetek gyakorlat 07

Elemi adatszerkezetek

Önszervező bináris keresőfák

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.

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

Adatszerkezetek 7a. Dr. IványiPéter

Algoritmusok és adatszerkezetek II.

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

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

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

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

Adatszerkezetek és algoritmusok

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

Algoritmusok és adatszerkezetek gyakorlat 06 Adatszerkezetek

Kupac adatszerkezet. 1. ábra.

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

Hierarchikus adatszerkezetek

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

Adatszerkezetek 1. előadás

4. Előfeltételek (ha vannak) 4.1 Tantervi Nincs 4.2 Kompetenciabeli Elemi algoritmusok ismerete

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

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

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

Egyesíthető prioritási sor

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

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

Algoritmusok és adatszerkezetek II.

Buborékrendezés: Hanoi Tornyai: Asszimptótikus fv.ek: Láncolt ábrázolás: For ciklussal:

Haladó rendezések. PPT 2007/2008 tavasz.

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

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

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

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

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

félstatikus adatszerkezetek: verem, várakozási sor, hasítótábla dinamikus adatszerkezetek: lineáris lista, fa, hálózat

Egyesíthető prioritási sor

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

Programozás alapjai II. (7. ea) C++ Speciális adatszerkezetek. Tömbök. Kiegészítő anyag: speciális adatszerkezetek

Speciális adatszerkezetek. Programozás alapjai II. (8. ea) C++ Tömbök. Tömbök/2. N dimenziós tömb. Nagyméretű ritka tömbök

Információs Technológia

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

Programozás alapjai II. (7. ea) C++

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

Algoritmuselmélet 2. előadás

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

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.

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

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

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.

Gráfalgoritmusok és hatékony adatszerkezetek szemléltetése

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

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

4. Előfeltételek (ha vannak) 4.1 Tantervi Nincs 4.2 Kompetenciabeli Feladatok kijelentéseinek megértése

Keresés és rendezés. A programozás alapjai I. Hálózati Rendszerek és Szolgáltatások Tanszék Farkas Balázs, Fiala Péter, Vitéz András, Zsóka Zoltán

Információs Technológia

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

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

end function Az A vektorban elõforduló legnagyobb és legkisebb értékek indexeinek különbségét.. (1.5 pont) Ha üres a vektor, akkor 0-t..

Adatszerkezetek 2. Dr. Iványi Péter

Adatszerkezetek 1. Dr. Iványi Péter

Rekurzió. Horváth Gyula.

A lista adatszerkezet A lista elemek egymásutániságát jelenti. Fajtái: statikus, dinamikus lista.

A kurzus teljesítésének feltételei. Az I404 kódú kurzus teljesítéséhez meg kell oldani egy otthoni feladatot, határidő április 30.

Tartalom Keresés és rendezés. Vektoralgoritmusok. 1. fejezet. Keresés adatvektorban. A programozás alapjai I.

Programozás I gyakorlat

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

Miről lesz ma szó? A PROGAMOZÁS ALAPJAI 1. Dinamikus adatszerkezetek. Dinamikus adatszerkezetek. Önhivatkozó struktúrák. Önhivatkozó struktúrák

Gráfok 2. Legrövidebb utak, feszítőfák. Szoftvertervezés és -fejlesztés II. előadás. Szénási Sándor

A lista eleme. mutató rész. adat rész. Listaelem létrehozása. Node Deklarálás. Létrehozás. Az elemet nekünk kell bef zni a listába

9. előadás. A táblázat. A táblázatról általában, soros, önátrendező, rendezett és kulcstranszformációs táblázat

Egyirányban láncolt lista

A programozás alapjai előadás. Amiről szólesz: A tárgy címe: A programozás alapjai

Java és web programozás

Adatszerkezetek és algoritmusok

C# feladatok gyűjteménye

Generikus Típusok, Kollekciók

Számítógép hálózatok, osztott rendszerek 2009

2. Milyen értéket határoz meg az alábbi algoritmus, ha A egy vektor?. (2 pont)

1: Bevezetés: Internet, rétegmodell Alapok: aszimptótika, gráfok. HálózatokII, 2007

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

Láncolt listák. Egyszerű, rendezett és speciális láncolt listák. Programozás II. előadás. Szénási Sándor

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

Más szavakkal formálisan:, ahol olyan egész szám, hogy. Más szavakkal formálisan:, ahol olyan egész szám, hogy.

Approximációs algoritmusok

III. Adatszerkezetek és algoritmusok

Gyakorló feladatok ZH-ra

Programozási nyelvek Java

1.előadás Tornai Kálmán

Láncolt lista Bináris keresőfa Gráf Hasító táblázat. Programozás II. labor 2. rész (Adatszerkezetek)

Térinformatikai adatszerkezetek

Átírás:

Algoritmusok és Adatszerkezetek II. előadás

Felelős tanszék: Számítógépes algoritmusok és mesterséges intelligencia tanszék Nappali tagozaton: Előadás: heti 2 óra / 3 kredit. Teljesítés módja: Kollokvium. Gyakorlat: heti 1 óra / 1kredit. Teljesítés módja: Aláírás. A kurzus felvételének előfeltételei : Algoritmusok és adatszerkezetek I. vagy Algoritmizálás objektumok struktúrája a memóriában, adatszerkezetek tervezésének alapjai a rendezett halmaz adattípus és megvalósítása ugrólistával diszjunkt halmazok kezelése, az UnioHolvan adattípus és alkalmazása keresőfák és kiegyensúlyozott keresőfák: AVL -, piros-fekete -, 2-3 - és B-fák önszervező keresőfák, amortizációs költségelemzés, hasítótáblák a prioritási sor és kupac, egyesíthető prioritási sor binomiális és Fibonacci kupaccal geometriai algoritmusok mintaillesztés, a Knuth-Morris-Pratt algoritmus probléma megoldási módszerek II, BT, B&B véletlenített algoritmusok, közelítő algoritmusok, on-line algoritmusok számelméleti algoritmusok, nyilvános kulcsú titkosítás hálózatelemzési modellek és módszerek

Ajánlott irodalom: [1] T. H. Cormen, C. E. Leiserson, R.L. Rivest: Algoritmusok, Műszaki Könyvkiadó, 2003. [2] T. H. Cormen, C. E. Leiserson, R.L. Rivest, C. Stein: Új algoritmusok, Scolar Kiadó, 2003. [3] T. Ottman, P. Widmayer: Algoritmen und Datenstrukturen, Wissenschaftsverlag, 1990 [4] E. Knuth: A számitógépprogramozás művészete, 3. Kötet, Műszaki Könyvkiadó, 1990. [5] A. V. Aho, J. E. Hopcroft, J. D. Ullman: Számítógép-algoritmusok tervezése és analízise,műszaki Könyvkiadó, 1982. [6] G. Gonnet, R. Baeza-Yates: Handbook of algorithms and data structures. In Pascal and C., Addison-Wesley. 1991. [7] R. Sedgewick: Algoritms in C++, Addison-Wesley. 1991. [8] E. Horowitz, S. Shani: Fundamentals of Computer Algorithms, Computer Science Press, 1998. [9] Adonyi Róbert: Adatstruktúrák és algoritmusok (letölthető jegyzet)

A gyakorlat (gyakorlati jegy) teljesítésének feltételei A félév során 4 db kis ZH és 2db nagy ZH lesz az alábbi menetrend szerint: - 3. hét: kis - 5. hét: kis - 7. hét: nagy - 9. hét: kis - 11. hét: kis -13. hét: nagy -14. hét: nagy javító) A nagy ZH-k egyenként 40-40, a kis ZH-k 5-5 pontosak. A nagy ZH-kból külön-külön el kell érni minimum 40%-ot, ennek teljesülése esetén a gyakorlati jegy a félév során elért összpontszám alapján a következő ponthatárok szerint alakul: 85-100 5 75-84 4 63-74 3 50-62 2 0-49 1 Lehet továbbá pluszpontot szerezni (a félév során hallgatónként maximum 10-et), ami nem számítható bele a 2-es eléréséhez szükséges minimumpontszámba. Pluszponthoz órai munkával, vagy a gyakorlatvezetővel egyeztetett szorgalmi feladatok megoldásával lehet jutni.

A kurzus teljesítésének feltételei: gyakorlati_jegy!= 1 Kollokvium Elérhető maximális összpontszám: 100 Teljesítendő minimális összpontszám: 50 A kollokvium 3 részből áll: A. 5 kérdés a kurzus anyagát lefedő témakörökből Elérhető maximális pontszám: 50 Teljesítendő minimális pontszám: 20 B. Teljesen kidolgozandó tétel Elérhető maximális pontszám: 20 Teljesítendő minimális pontszám: 8 C. Feladatok megoldása Elérhető maximális pontszám: 30 Teljesítendő minimális pontszám: 15

A kurzus teljesítésének értékelése: 85 - jeles (5) 70-84 jó (4) 60-69 közepes (3) 50-59 elégséges (2) 0-49 elégtelen (1)

Adatszerkezetek Absztrakt adattípus (ADT) Absztrakt adatszerkezet (ADS) Reprezentáció (ábrázolás) Implementáció (fejlesztés, programnyelvi megvalósítás) Fizikai (memória) szint

Adat tárolása kulcsok adattagok szerkezeti elemek Dinamikus 5 Kiss Béla 1994.10.25. 7 Nagy Réka 1996.03.08. Statikus 2 5 7 8 9 A B B A E

létrehozás adat keresése műveletek adat módosítása adat felvétele elemszám visszaadása minden adat törlése (üresít) adat törlése adatszerkezet felszámolása (megszüntet)

Verem, sor megvalósítása alapműveletek: push, pop verem push sor push eleje verem pop semmi (null) sor pop

Verem (Stack) példa eleje null 7 12 5 null push(5) push(12) push(7) pop() pop() pop()

public static void main (String args[]) { verem v=new verem() ; v.betesz(5) ; v.betesz(8) ; v.betesz(12) ; System.out.println(v.kivesz()); System.out.println(v.kivesz()); System.out.println(v.kivesz()); public class verem { int elemszam ; struct elem { int ertek; elem kovetkezo ; elem semmi, eleje ; verem() { elem q=new elem() ; semmi=q ; eleje=q ; elemszam=0 ; void betesz(int x) { elem q=new elem() ; q.kovetkezo=eleje ; q.ertek=x ; eleje=q ; elemszam++ ; int kivesz() { if (eleje!=semmi) { int visszateresi_ertek ; visszateresi_ertek=eleje.ertek ; eleje=eleje.kovetkezo ; elemszam-- ; return visszateresi_ertek; else return 0 ;

Sor (Queue) példa 5 null 12 7 push(5) push(12) push(7) pop() pop() pop()

public static void main (String args[]) { sor s=new sor() ; s.betesz(5) ; s.betesz(8) ; s.betesz(12) ; System.out.println(s.kivesz()); System.out.println(s.kivesz()); System.out.println(s.kivesz()); public class sor { int elemszam ; class elem { int ertek; elem kovetkezo ; elem semmi, eleje ; sor() { elem q=new elem() ; semmi=q ; eleje=q ; elemszam=0 ; void betesz(int x) { elem q=new elem() ; semmi.kovetkezo=q ; semmi.ertek=x ; semmi=q ; elemszam++ ; int kivesz() { if (eleje!=semmi) { int visszateresi_ertek ; visszateresi_ertek=eleje.ertek ; eleje=eleje.kovetkezo ; elemszam-- ; return visszateresi_ertek; else return 0 ;

Láncolt lista Halmaz műveletek Rendezett lista Keresés, beszúrás, törlés: O(n) eleje 4 92 134 semmi (null)

Ugrólisták

Ugrólisták

Ugrólisták

Halmazok egyesítése Kruskal algoritmus felelevenítés kezdetben a gráf minden pontja külön halmazban van ; vegyük a gráfból az éleket növekvő sorrendben { ha az él 2 végpontja külön halmazban van { az él legyen része a minimális feszítőfának ; a 2 végpontot tartalmazó halmazt egyesítsük ;

Halmazok egyesítése Kruskal algoritmus felelevenítés

Honnan lehet tudni, hogy a következő él beválasztásával a feszítőerdő erdő (azaz körmentes) marad?

Példa

Kruskal algoritmus felelevenítés

Kruskal algoritmus felelevenítés

Kruskal algoritmus felelevenítés

Kruskal algoritmus felelevenítés

Kruskal algoritmus felelevenítés

Kruskal algoritmus felelevenítés

Kruskal algoritmus felelevenítés

Kruskal algoritmus felelevenítés

Kruskal algoritmus felelevenítés

Kruskal algoritmus felelevenítés

Kruskal algoritmus felelevenítés

Kruskal algoritmus felelevenítés

Kruskal algoritmus felelevenítés

Kruskal algoritmus felelevenítés

Kruskal algoritmus felelevenítés

Kruskal algoritmus felelevenítés

Kruskal algoritmus felelevenítés

Kruskal algoritmus felelevenítés foreach (el from G) { rep1=rep(el.p) ; rep2=rep(el.q) ; if (rep1!=rep2) { hozzaad(el) ; unio(rep1,rep2) ;

Honnan lehet tudni, hogy az adott él 2 végén lévő pont egy halmazban van-e? Hogyan tudom a kezdetben n halmazt hatékonyan egyesítgetni? Halmazok listájában az összes halmazt végigkeresni O(n) lenne :( Halmaz (piros-fekete fa) adatszerkezettel 2 halmaz egyesítése O(n) lenne :(

Halmazerdő adattípus nil

Kruskal algoritmus halmazerdővel foreach (el from G) { rep1=rep(el.p) ; rep2=rep(el.q) ; if (rep1!=rep2) { hozzaad(el) ; unio(rep1,rep2) ; gpont rep(gpont p) { gpont q; while (p.kovetkezo!=nil) { q=p ; p=p.kovetkezo ; return q ;

Kruskal algoritmus halmazerdővel gpont rep(gpont p) { gpont q; while (p.kovetkezo!=nil) { q=p ; p=p.kovetkezo ; return q ; nil foreach (el from G) { rep1=rep(el.p) ; rep2=rep(el.q) ; if (rep1!=rep2) { hozzaad(el) ; unio(rep1,rep2) ; rep1 unio(rep1,rep2) { rep2.kovetkezo=rep1 ; rep2

Halmazerdő tömörítése gpont rep(gpont p) { gpont q; while (p.kovetkezo!=nil) { q=p ; p=p.kovetkezo ; q.kovetkezo=p.kovetkezo ; return p ; p q

Halmazerdő hatékonyabb tömörítése gpont rep(gpont p) { gpont q; while (p.kovetkezo!=nil) { if (p.kovetkezo.kovetkezo!=nil) sorba(p) ; p=p.kovetkezo ; while (!sor_ures()) { q=sorbol() ; q.kovetkezo=p ; return p ; 5 3 4 6 1 q 2 p 4 7 5 3

Halmazok egyesítése Kruskal algoritmus.

Halmazok egyesítése halmazerdő felépítése Kruskal algoritmus.

Halmazok egyesítése halmazerdő felépítése Kruskal algoritmus.

Halmazok egyesítése halmazerdő felépítése Kruskal algoritmus.

Halmazok egyesítése halmazerdő felépítése Kruskal algoritmus.

Halmazok egyesítése halmazerdő felépítése Kruskal algoritmus.

Halmazok egyesítése halmazerdő felépítése Kruskal algoritmus.

Halmazok egyesítése halmazerdő felépítése Kruskal algoritmus.

Halmazok egyesítése halmazerdő felépítése Kruskal algoritmus.

Halmazok egyesítése halmazerdő felépítése Kruskal algoritmus

Halmazok egyesítése halmazerdő felépítése Kruskal algoritmus.

Halmazok egyesítése halmazerdő felépítése Kruskal algoritmus.

Halmazok egyesítése halmazerdő felépítése Kruskal algoritmus.

Halmazok egyesítése halmazerdő felépítése Kruskal algoritmus.

Halmazok egyesítése halmazerdő felépítése Kruskal algoritmus.

Halmazok egyesítése halmazerdő felépítése Kruskal algoritmus

Halmazok egyesítése halmazerdő felépítése Kruskal algoritmus.

Halmazok egyesítése halmazerdő felépítése Kruskal algoritmus

Halmazok egyesítése halmazerdő felépítése Kruskal algoritmus.

Halmazok egyesítése halmazerdő felépítése Kruskal algoritmus

Halmazerdő átlagos magassága foreach (el from G) { rep1=rep(el.p) ; rep2=rep(el.q) ; if (rep1!=rep2) { hozzaad(el) ; unio(rep1,rep2) ; unio 1-el hosszabítja az utakat rep 1-hosszúra rövidíti az érintett pontokon az utakat rep legalább 2-szer többször fut le mint unio HF: halmazerdő átlagos magassága Futási idő elemzése: [2] 444-455

eleje p1 p2 eleje p1 p2 HF: algoritmus megadása

Bináris keresőfa x p q fázunk... [2] 232-241

Bináris keresőfa 21 9 29 4 17 24 37 1 6 13 20 22 27 31 43

Bináris keresőfa 21 9 29 4 17 24 37 1 6 13 20 22 27 31 43 (-,1) (1,4) (4,6) (6,9) (9,13) (13,17) (17,20) (20,21) (21,22) (22,24) (24,27) (27,29) (29,31) (31,37) (37,43) (43, )

Fapont tárolása első megközelítés, a gyakorlatban nem így tároljuk! struct fapont{ int key, value ; fapont bal, jobb, apa ; apa key balfiu value jobbfiu

Bináris fa tárolása első megközelítés, a gyakorlatban nem így van! public class fa { int elemszam ; struct fapont{ int key, value ; fapont bal, jobb, apa ; fapont nil, gyoker ; void fa() { fapont q = new fapont() ; nil=q ; gyoker=q ; elemszam=0 ; boolean beszur(int x, int v) {...... nil nil gyoker k v beszur(5, 8) 5 8 k v gyoker

Keresés keresőfában 20 21 9 29 4 17 24 37 1 6 13 20 22 27 31 43 (-,1) (1,4) (4,6) (6,9) (9,13) (13,17) (17,20) (20,21) (21,22) (22,24) (24,27) (27,29) (29,31) (31,37) (37,43) (43, )

fapont keres(int x) { fapont p=gyoker ; nil.key=x ; while (p.key!=x) p=x<p.key?p.bal:p.jobb ; return p; gyökér 21 [3] 254 q=keres(17) ; q=keres(26) ; 9 29 4 17 24 37 1 6 13 20 22 27 31 43 nil 26

Beszúrás keresőfába 21 9 29 4 17 24 37 1 6 13 20 22 27 31 43 (-,1) (1,4) (4,6) (6,9) (9,13) (13,17) (17,20) (20,21) (21,22) (22,24) (24,27) (27,29) (29,31) (31,37) (37,43) (43, )

nil 5 A

nil 5 A

5 A 3 A nil

boolean beszur(int x, int v) { fapont p,papa ; p=gyoker ; papa=nil ; while (p!=nil && p.key!=x) { papa=p ; if (x<p.key) p=p.bal; else p=p.jobb; if (p==nil) { fapont ujpont = new fapont(); if (gyoker==p) gyoker=ujpont ; nil ujpont.key=x ; ujpont.value=v ; ujpont.bal=nil; ujpont.jobb=nil; ujpont.apa=papa; if (papa!=nil) { if (x>papa.key) papa.jobb=ujpont; else papa.bal=ujpont; elemszam++ ; return true ; else { p.value=v ; beszur(3,9) ; return false ; nil 3 9 5 8????? 5 8????? gyoker

Bináris fák tárolása csúcsonkét 2 pointer és egy bit, mely azt jelöli, hogy bal, vagy jobb gyerek 1. pointer bal gyerek, ha létezik jobb gyerek, ha csak az létezik. nil: ha egyáltalán nincs gyereke. 2. pointer ha ő maga bal gyerek, akkor a testvérre mutat, ha az létezik, különben a szülőre. ha jobb gyerek: a szülőre mutat. gyökérben nil

Fapont tárolása struct fapont<k,v>{ <K> key ; <V> value ; fapont fiu, tespa ; boolean bal ;

Műveletek és futási idő igények: bool beszúr(<k> key, <V> value) fapont keres(<k> x) bool töröl(fapont p) fapont rákövetkező(fapont p) mindetkiir(fapont p) mindenttöröl(fapont p) int elemszám(fapont p) int elemszám() O(h) O(h) O(h) O(h) O(n) O(n) O(h) O(1)

Bináris keresőfák jellemzői p gyökerű részfa belső pontjainak száma int s(fapont p) { if (p==nil) return 0 ; return 1+s(p.bal)+s(p.jobb) ; p gyökerű részfa magassága int h(fapont p) { if (p==nil) return 0 ; return 1+Math.max(h(p.bal),h(p.jobb)) ; O(n) O(n)

Bináris fa inorder bejárása function bejar(p){ if (p.bal!=nil) bejar(p.bal) ; muvelet(p) ; if (p.jobb!=nil) bejar(p.jobb) ; O(n)

5 function bejar(p){ if (p.bal!=nil) bejar(p.bal) ; muvelet(p) ; if (p.jobb!=nil) bejar(p.jobb) ; 3 7 function bejar(p){ if (p.bal!=nil) bejar(p.bal) ; muvelet(p) ; if (p.jobb!=nil) bejar(p.jobb) ; 5 3 7 1 4 6 146 function bejar(p){ if (p.bal!=nil) bejar(p.bal) ; muvelet(p) ; if (p.jobb!=nil) bejar(p.jobb) ; 1 3 4 5 6 7

Preorder - Inorder - Postorder bejárás function bejar(p){ //preorder muvelet(p) ; if (p.bal!=nil) bejar(p.bal) ; if (p.jobb!=nil) bejar(p.jobb) ; function bejar(p){ //inorder if (p.bal!=nil) bejar(p.bal) ; muvelet(p) ; if (p.jobb!=nil) bejar(p.jobb) ; function bejar(p){ //postorder if (p.bal!=nil) bejar(p.bal) ; if (p.jobb!=nil) bejar(p.jobb) ; muvelet(p) ; O(n)

Bejárás - csökkenő sorrendben function bejar(p){ //inorder rev. if (p.jobb!=nil) bejar(p.jobb) ; muvelet(p) ; if (p.bal!=nil) bejar(p.bal) ;

Rendezettminta-fa Minden p ponthoz tároljuk a p gyökerű fa belső pontjainak számát (méretét) Adott elem rangja: az elem sorszáma (sorrendben hányadik az adatszekezetben) Adott rangú elem keresése - T[r] Adott elem rangjának meghatározása Egyéb bővítési lehetőségek (pl. intervallumfák) [2] 272-277 [2] 279-285

Példa 26 rang=13 20 14 7 17 12 21 4 méret 30 5 41 7 47 1 7 2 10 4 12 1 15 1 16 2 19 2 20 1 22 1 28 1 rang=14 35 1 38 3 39 1 3 1

Adott rangú elem keresése 6 rang 1 2 41 7 7 30 5 4 méret 47 1 28 1 3 38 3 5 rmkeres(p,x) { r=p.bal.meret+1 ; 35 1 39 1 if (x==r) return p ; if (x<r) return rmkeres(p.bal,x) ; else return rmkeres(p.jobb,x-r) ; O(h)

Elem rangjának meghatározása 30 5 41 7 47 1 rmrang(p) { r=p.bal.meret+1 ; q=p ; while (q!=gyoker) { if (q==q.apa.jobb) r+=q.apa.bal.meret+1; q=q.apa ; return r ; 28 1 35 1 38 3 39 1 O(h)

Méret információ fenntartása beszjav(p) { while (p!=gyoker) { p=p.apa; p.meret++ ; 30 56 28 38 1 34 41 78 47 1 torljav(p) { while (p!=gyoker) { p=p.apa; p.meret-- ; 35 39 1 12 40 1 O(h)

Fapont tárolása első megközelítés, a gyakorlatban nem így tároljuk! struct fapont{ int key, v, meret ; fapont bal, jobb, apa ; apa key balfiu v meret jobbfiu

Rendezettmintafa Műveletek: bool beszúr(<k> key, <V> value) fapont keres(<k> x) bool töröl(fapont p) fapont rákövetkező(fapont p) int elemszám(fapont p) int rang(fapont p) fapont rangkeres(int x) O(h) O(h) O(h) O(h) O(1) O(h) O(h)

Elem rákövetkezője 21 9 29 4 17 24 37 1 13 20 27 31 43

p rákövetkezője p p p O(h)

p rákövetkezője fapont kovetkezo(fapont p) { if (p.jobb!=nil) { //ha van jobb fiú p=p.jobb ; //akkor a jobb részfa while (p.bal!=nil) p=p.bal; //bal szélső eleme return p; else { // ha nincs jobb fiú while (p.apa!=nil) { // amíg van apa if (p.apa.bal==p) // ha p bal gyerek return p.apa; // p apja a rákövetkező p=p.apa ; // megyünk felfelé p-vel ; return nil ; // nincs rákövetkező O(h)

Törlés bináris keresőfából p q O(h)

p void torol(fapont p) { if (p.jobb!=nil) { fapont q=kovetkezo(p) ; p.key=q.key ; p.value=q.value ; q.apa.bal=q.jobb ; q.jobb.apa=q.apa ; delete q ; else {... 21 q 24 29 37 27 31 43 O(h)

void torol(fapont p) { if (p.jobb!=nil) { fapont q=kovetkezo(p) ; p.key=q.key ; p.value=q.value ; q.apa.bal=q.jobb ; q.jobb.apa=q.apa ; delete q ; else { if (p.apa.jobb==p) p.apa.jobb=p.bal ; else p.apa.bal=p.bal ; p.bal.apa=p.apa ; delete p ; p O(h)

Elem törlése példa 21 9 29 4 17 24 37 1 13 20 27 31 43

Futási idők elemzése Keresés Beszúrás Mennyi a futási idő? O(h) Törlés

Teljes bináris keresőfa h n(h) 2 h 1 1 2 2 3 4 3 7 8 4 15 16 5 31 32 k 2 k - 1 2 k

n pontot tartalmazó teljes bináris keresőfa magassága h n(h) 2 h 1 1 2 2 3 4 3 7 8 4 15 16 5 31 32 h 2 h -1 2 k h=o(logn)

Majdnem teljes bináris keresőfa h n(h) 2 h-1 1 1 1 2 2 2 3 4 4 4 8 8 5 16 16 k 2 k-1 2 k-1

n pontot tartalmazó majdnem teljes bináris keresőfa magassága h n(h) 2 h-1 1 1 1 2 2 2 3 4 4 4 8 8 5 16 16 k 2 k-1 2 k-1 h=o(logn)

Majdnem teljes bináris keresőfa építése 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 f(i,j) { if (i<=j) { f=int((i+j)/2) ; beszur(t[f]) ; f(i,f-1) ; f(f+1,j) ; 4 2 6 8 10 12 14 1 3 5 7 9 11 13 15 Építés: O ( n log n )

Optimális bináris keresőfa Adott kulcsoknak egy K=(k1,...,kn) sorozata Minden ki kulcshoz ismert annak pi előfordulási valószínűsége és Minden di=(ki,ki+1) intervallumhoz ismert annak qi előfordulási valószínűsége, hogy arra az intervallumra keresünk, d0= (-,ki), dn= (kn, ) Optimális bináris keresőfa építhető (pl. dinamikus programozás módszerével) Építés: O(n 2 ) [2] 314-321

Véletlen építésű bináris keresőfa Adott n egymástól különböző kulcs, melyekből bináris keresőfát építünk úgy, hogy a kulcsokat valamilyen sorrendben egymás után beszúrjuk a kezdetben üres fába. Ha itt minden sorrend, vagyis az n kulcsnak mind az n! permutációja egyformán valószínű, akkor a kapott fát véletlen építésű bináris keresőfának nevezzük. Tétel: Egy n különböző kulcsot tartalmazó véletlen építésű bináris keresőfa várható magassága: O(log2n). [2] 241-244

Szúrjuk be rendre az 1, 2, 3, 4, 5,, n elemeket! 1 2 3 4 5... n 1 elemeket 2 3 4 5 Legrosszabb eset n h=n

Hogy lehetne javítani? Mivel az elemek egyesével jönnek Minden beszúrás (és törlés) után rögtön javítani kellene 5 1 1 6 2 2 3 3

Példa 21 9 29 4 17 24 37 27 31 43 46