Önszervező bináris keresőfák

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

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

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

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

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

Adatszerkezet - műveletek

Algoritmusok és adatszerkezetek II.

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

Algoritmusok és adatszerkezetek gyakorlat 07

Algoritmusok és adatszerkezetek II.

Példa 30 14, 22 55,

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

Táblázatok fontosabb műveletei 1

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

Rendezettminta-fa [2] [2]

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

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

Algoritmusok és adatszerkezetek II.

Algoritmusok és Adatszerkezetek II.

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

Algoritmusok és adatszerkezetek gyakorlat 06 Adatszerkezetek

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

Kupac adatszerkezet. 1. ábra.

Adatszerkezetek 2. Dr. Iványi Péter

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

Egyesíthető prioritási sor

Adatszerkezetek Hasító táblák. Dr. Iványi Péter

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

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

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

Adatszerkezetek 7a. Dr. IványiPéter

Algoritmusok és Adatszerkezetek II. előadás

Algoritmusok és adatszerkezetek 2.

Egyesíthető prioritási sor

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

Elemi adatszerkezetek

Algoritmusok és adatszerkezetek II.

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

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

Algoritmusok és adatszerkezetek II.

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

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

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

Hasító táblázatok. Hasító függvények, kulcsütközés kezelése. Programozás II. előadás. Szénási Sándor

Hierarchikus adatszerkezetek

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

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

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

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.

Struktúra nélküli adatszerkezetek

Adatszerkezetek 1. előadás

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

Programozás II. előadás

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

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.

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.

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

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

Adatszerkezetek és algoritmusok

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

Algoritmuselmélet 2. előadás

INFORMATIKA javítókulcs 2016

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

Online migrációs ütemezési modellek

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

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

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

Programozási technológia

Programozási módszertan. Mohó algoritmusok

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

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

C# feladatok gyűjteménye

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

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

2018, Diszkrét matematika

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

Rendezések. A rendezési probléma: Bemenet: Kimenet: n számot tartalmazó (a 1,a 2,,a n ) sorozat

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

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

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

Információs Technológia

Adatszerkezetek 1. Dr. Iványi Péter

Bevezetés a programozásba. 12. Előadás: 8 királynő

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

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

GRÁFOK ÉS ALGORITMUSOK ELMÉLETE VIZSGAKÉRDÉSEK Matematika BSc Elemző szakirány II. év 1. félév

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

Adatszerkezetek 2. Dr. Iványi Péter

Függvények növekedési korlátainak jellemzése

Kiegészítő részelőadás 1. Az algoritmusok hatékonyságának mérése

Algoritmusok vektorokkal keresések 1

Programozás alapjai C nyelv 8. gyakorlat. Mutatók és címek (ism.) Indirekció (ism)

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

Bonyolultságelmélet. Thursday 1 st December, 2016, 22:21

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

Partíció probléma rekurzíómemorizálással

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

Érdekes informatika feladatok

Mutatók és címek (ism.) Programozás alapjai C nyelv 8. gyakorlat. Indirekció (ism) Néhány dolog érthetőbb (ism.) Változók a memóriában

Java II. I A Java programozási nyelv alapelemei

Átírás:

Önszervező bináris keresőfák

Vágható-egyesíthető halmaz adattípus H={2,5,7,11,23,45,75} Vag(H,23) Egyesit(H1,H2) H1= {2,5,7,11} H2= {23,45,75}

Vágás A keresési útvonal mentén feldaraboljuk a fát, majd a megfelelő részfákat összekapcsoljuk. A vágás futási ideje legrosszabb esetben O(h(F))

H={2,5,7,11,23,45,75} Vag(H,23) 11 5 45 2 7 23 75 11 45 5 75 2 7

H={2,5,7,11,23,45,75} Vag(H,25) 11 5 45 2 7 23 75 11 45 5 2 7 23 75

ai<k<bi a1 a2 b1 a3 b2 b3

Egyesítés Ha a max(f1) min(f2) feltétel teljesül: F1 F2 Az egyesítés futási ideje legrosszabb esetben O(1)

Ha a max(f1) min(f2) feltétel teljesül: ' F1 F2 Az egyesítés futási ideje legrosszabb esetben O(h(F))

Ha a max(f1) min(f2) feltétel teljesül: ' F1 F2 Az egyesítés futási ideje legrosszabb esetben O(h(F))

felforgat F.ff(fapont p) ; 11 5 45 2 7 23 75 6 8

felforgat F.ff(fapont p) ; 11 5 45 2 8 23 75 7 6

felforgat F.ff(fapont p) ; 11 8 45 2 5 7 23 75 6

felforgat FF(p) F.ff(fapont p) ; 8 5 11 2 7 45 6 23 75 A felforgat futási ideje legrosszabb esetben O(h(F))

FF(k) F.ff(int k) ; 11 k=9 5 45 2 7 23 75 1 3 6 9 16 27 56 79

FF(k) F.ff(int k) ; 5 11 45 k=9 2 23 75 1 3 7 16 27 56 79 6 9

FF(k) F.ff(int k) ; 11 k=9 5 45 2 7 23 75 1 3 6 16 27 56 79 9

FF(k) F.ff(int k) ; k=9 9 5 11 2 7 45 1 3 6 23 75 16 27 56 79

FF(k) F.ff(int k) ; 11 k=8 5 45 2 7 23 75 1 3 6 9 16 27 56 79

FF(k) F.ff(int k) ; 5 11 45 k=8 2 23 75 1 3 7 16 27 56 79 6 9

FF(k) F.ff(int k) ; 11 k=8 5 45 2 7 23 75 1 3 6 16 27 56 79 9

FF(k) F.ff(int k) ; k=8 9 5 11 2 7 45 1 3 6 23 75 16 27 56 79

ai<k<bi a1 a2 b1 a3 b2 k

ai<k<bi a1 a2 a3 b1 b2 k

F.bovit(k) ; k F α β F.ff(int k) ; k' k k' α β α β

F.torol(k) ; k F α β F.ff(int k) ; k' α α β β

F.torol(k) ; k F α β F.ff(int k) ; α.ff(int k) ; k' k' α β α-k' β

F.vag(k) ; k F1 k F α β α F.ff(int k) ; F2 β k' α β F1 k' F2 α β

F 1.egyesit(F 2 ) ; F1 F2 k=min(f2) ; F1.ff(k) ; k' F1-k' F2

Önszervező bináris keresőfák hatékonysága Tétel: Ha a halmazok ábrázolására önszervező bináris keresőfát használunk, akkor minden α 1,...,α m műveletsor, ahol ı {1..m}: α i {keres;bovit;torol;vag;egyesit} összesítec futási ideje O(m lg n), ahol n a BOVIT műveletek száma és a műveletsor előc üres halmazzal indulunk.

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

Adott egy M1,...,Mn műveletsor. A műveletsor futási idejének meghatározásához fejezzük ki minden egyes művelet futási idejét, és azt összegezzük!

Verem adattípus betesz(x); kivesz(); O(1) O(1) bverem adattípus: Vezessük be torol(k); új műveletet! void torol (k) {!! while (--k>=0 && not ures()) kivesz();! } torol(k); O(k)

Legyen betesz(x); kivesz(); torol(k); műveletekből tetszőleges sorrendben n darab, és kezdetben üres verem! Mivel torol(k) futási ideje legrosszabb esetben n (k=n esetén) és a műveletekből n darab van, így a futási idő a legrosszabb esetben n 2 lenne Legrosszabb esetre ez a módszer nem mindig éles!

Összesítéses módszer A teljes műveletsor összesített költségét számítjuk, nem az egyes műveletekét! - T(n) Minden elem a verembe egyszer kerülhet be és egyszer ki. M művelet esetén maximum n elem kerül a verembe, így a teljes futási idő T(n)=O(n)!

Az egyes műveletekre az átlagolt T(n)/n költséget számítjuk. Ezt az egyes műveletek átlagolt költségének nevezzük. Az amortizált költség bármely műveletre T(n)/n=n/n=1!

Könyvelési módszer A könyvelési módszer esetén különböző amortizált költséget számítunk ez egyes műveletekre, megengedve azt is, hogy egyes műveletek esetén a tényleges költségnél többet, másoknál kevesebbet számlázzunk. Az az összeg, amit egy adott műveletre felszámítunk, a művelet amortizációs költsége. Ha felső korlátot akarunk adni (a legrosszabb esetre), akkor az amortizációs összköltség a tényleges összköltség felső korlátja kell legyen minden n-re.

Példa: betesz(x) művelet tényleges költsége 1. kivesz() művelet tényleges költsége 1. töröl(k) művelet tényleges költsége k. betesz(x) művelet amortizált költsége 2. kivesz() művelet amortizált költsége 0. töröl(k) művelet amortizált költsége 0.

Potenciál módszer Feltételezzük, hogy minden művelet ugyanazon D adatszerkezeten hajt végre műveletet. Az adatszerkezet kezdeti helyzete D0, az i-edik művelet végrehajtása után Di.

Az előre kifizetett munkát nem az adatszerkezet egyes elemeihez rendeljük, hanem mint potenciális energiát (potenciált), a jövőbeni műveletek kifizetésére használhatjuk. Ezt a potenciált az adatszerkezet egészéhez rendeljük hozzá. (pl. az adatszerkezetben tárolt elemek száma)

A φ potenciálfüggvény a adatszerkezethez egy valós számot rendel, ami a Di adatszerkezethez rendelt potenciál. Az i-edik művelet amortizációs költségét a φ potenciálfüggvényre vonatkozóan a következő egyenlettel definiáljuk:

A teljes amortizációs költség m műveletre:

Legyen azaz Az amortizált költség felső korlátja a tényleges költségnek!

pl.: bverem adattípus amortizációs költségelemzése Definiáljuk fi potenciálfüggvényt a veremben lévő elemek számaként! betesz(x); O(1) kivesz(); O(1)

betesz(x) művelet költsége O(1). kivesz() művelet költsége O(1). torol(k); művelet végrehajtásakor a potenciális változás: } O(1) Mindhárom művelet amortizált költsége O(1) ezért tetszőleges m hosszú bverem műveletsor költsége O(m)

Hasító táblázatok

Halmaz adattípus U (kulcsuniverzum) K (aktuális kulcsok)

Függvény adattípus U (univerzum) ÉT (értelmezési tartomány) ÉK (érték készlet) Milyen az univerzum?

Rendezések felelevenítés Kupacrendezés: n elemet mozgat a kupacba majd n elemet vesz ki a kupacból 1 elem kupacba tétele O(logn) 1 elem kupacból kivétele O(logn) n elem kupacba tétele O(nlogn) n elem kupacból kivétele O(nlogn) Külső rendezés 1 elem halmazba tétele O(logn) n elem halmazba tétele O(nlogn) például piros-fekete fa n elem kiírása O(n) O(n+nlogn)=O(nlogn)

Leszámláló rendezés felelevenítés Csak speciális esetre! U={1,2,..,10} T 1 2 3 4 5 6 7 8 9 10 8 2 8 1 7 3 2 9 8 5 1 1 1 2 2 3 5 7 8 8 8 9 O(n)

Leszámláló rendezés felelevenítés n elemet mozgat (striguláz) a tömbbe majd n elemet vesz ki a tömbből 1 elem tömbbe tétele O(1) 1 elem tömbből kivétele O(1) n elem tömbbe tétele O(n) n elem tömből kivétele O(n)

Közvetlen címzésű táblázatok Erősen korlátozott felhasználhatóság! U U={1,2,..,10} (univerzum) 3 K (aktuális kulcsok) 4 9 7 1 2 3 4 5 6 7 8 9 10 Elem betesz: O(1) Elem keres: O(1) Elem kivesz: O(1)

Megvalósítás U={0,1,2,..,99} int i,t[99] ;! for (i=0;i<100;i++) T[i]=0 ;! int betesz(int a) {!! if (T[a]==0) {!!! T[a]=1 ;!!! return 1 ;!! } else return 0 ;! }! boolean keres(int a) {!! if (T[a]==1) return true ;!! else return false ;! }! int torol(int a) {!! if (T[a]==1) {!!! T[a]=0 ;!!! return 1 ;!! } else return 0 ;! }

Korlátozott felhasználhatóság megszűnik? U={0,1,2,..} U={..,-1,0,1,..} nem használhatunk végtelen tömböt! U... -7-6 -5-4 -3-2 -1 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23......... T 0 1 2 3 4 5 6 7 8 9

Hasító táblázat f(x) hasító függvény U (univerzum) T[0..m-1] f(k) k (aktuális kulcsok) k4 k2 k1 k3 f(k f(k f(k k k k pl.: f(x)=x mod m f(k k

Hasító táblázat példa pl.: f(x)=x mod 10 U (univerzum) T[0..9] f(k) 1 2 k (aktuális kulcsok) 3 44 127 19 3 3 4 44 5 6 7 127 8 9 19 10

Hasító táblázat példa pl.: f(x)=x mod 10 U (univerzum) T[0..9] f(k) 44 k (aktuális kulcsok) 3 127 94 1 2 3 3 4 44 5 6 7 127 8 9 10 94

Ütközésfeloldás nyílt címzéssel U T[0..m-1] (univerzum) f(k) k k (aktuális kulcsok) k4 k2 k1 k3 f(k f(k f(k k k k pl.: f(x,i)=(x+i) mod m i=0,1,2,...,m-1 f(k k

Ütközésfeloldás nyílt címzéssel pl.: f(x,i)=(x+i) mod 10 T[0..9] i=0,1,2,...,m-1 f(k) k 0 1 2 3 4 5 6 7 8 9 37 87 93

Adott kulcsú elem törlése pl.: f(x,i)=(x+i) mod 10 T[0..9] i=0,1,2,...,m-1 f(k) k 0 1 2 3 4 5 93 23 53 18 87 37 17 6 7 8 87 37 9

Adott kulcsú elem megkeresése T[0..9] f(k) k 0-1 - 2-3 4 5 6 7 8 93 T 53 T 87 37 9-24 keres(k) {!! i=0 ;!! do {!!! j=h(k,i++) ;!!! if (T[j]==k) return j ;!! } while (T[j]!=nil && i!=m) ;!! return nil ;! } Törlést kiegészítő művelet?

Ütközésfeloldás láncolással pl.: f(x)=x mod 10 U (univerzum) T[0..9] f(k) k (aktuális kulcsok) 3 47 127 1 2 3 4 5 6 7 8 9 10 3 47 127

Adatszerkezet public class HashT {!! int elemszam=0 ;!! class hastomb {!!! elemtar elso ;!! }!! class elemtar {!!! int kulcs ;!!! elemtar kovetkezo ;!! }!! elemtar nil ;!! hastomb[] HT=new hastomb[m] ;!! HashT() {!!! nil=new elemtar() ;!!! int i ;!!! for (i=1;i<n;i++) HT[i].elso=nil ;!! }!!...! } HT[0..m] f(k) 1 2 3 4 5 m nil

Adott kulcsú elem megkeresése public class HashT {!!...!! int hasit(int k) {!!! return k % m ;!! }!!! elemtar keres(int k) {!!! elemtar q=ht[hasit(k)].elso ;!!! while (q!=nil && q.kulcs!=k) q=q.kovetkezo ;!!! return q ;!! }!!...! }

Mennyi ideig tart egy adott kulcsú elem megkeresése? Legyen T egy m rést tartalmazó hasító táblázat amelyikben n elem van T[0..m-1] f(k) 1 α kitöltési tényező az egy láncba fűzött elemek átlagos száma Legrosszabb eset elemzés: mind az n elem egy láncba képződik le keresés végrehajtási ideje: O(n) 2 3=f(k 4=f(k 5 6 7=f(k m-2=f(k m-1 k k k k

Adott kulcsú elem beszúrása! int beszur(int k) {!!! elemtar elozo ;!!! elemtar q=ht[hasit(k)].elso ;!!! while (q!=nil && q.kulcs!=k) {!!!! elozo=q ;!!!! q=q.kovetkezo ;!!! }!!! if (q!=nil) return -1;!!! else {!!!! elemtar p=new elemtar() ;!!!! elozo.kovetkezo=p ;!!!! p.kulcs=k ;!!!! p.kovetkezo=nil ;!!! }!! }

Adott kulcsú elem törlése! int torol(int k) {!!! elemtar elozo ;!!! elemtar q=ht[hasit(k)].elso ;!!! while (q!=nil && q.kulcs!=k) {!!!! elozo=q ;!!!! q=q.kovetkezo ;!!! }!!! if (q==nil) return -1;!!! else {!!!! elozo.kovetkezo=q.kovetkezo ;!!!! return 0 ;!!! }!! }

Feltételezhetjük, hogy minden elem egyforma valószínűséggel képződik le bármely résre, függetlenül attól, hogy a többiek hová kerültek Ezt egyszerű egyenletes hasítási feltételnek nevezzük T[j] lista hosszát jelöljük nj-vel. (j=0,1,..., m-1) ekkor n = n0 + n1 +... + nm-1 és nj várható értéke:

Hasítófüggvény megválasztása pl. rgb(240,0,127) rgb(r,g,b) (65536r + 256g + b) mod m rgb(r,g,b) (66563r + 257g + b) mod m pl. float pl. float interval

Tétel: Láncolásos ütközésfeloldásnál, ha a hasítás egyszerű egyenletes, akkor a sikertelen keresés átlagos ideje: O(1+α). Biz.: A sikertelen keresés átlagos ideje megegyezik annak átlagos idejével hogy a T[f(k)] listát végigkeressük. Ennek a listának az átlagos hossza α. f(k) kiszámítási ideje 1. Így a sikertelen keresés átlagos ideje: O(1+α)

Tétel: Láncolásos ütközésfeloldásnál, ha a hasítás egyszerű egyenletes, akkor a sikeres keresés átlagos ideje: O(1+α). Megjegyzés: A sikeres keresés abban különbözik a sikertelentől, hogy nem feltétlenül kell a T[f(k)] listát végigkeressük, így az átlagos idő nem lehet több mint a sikertelen keresés átlagos ideje.

Következtetések Ha α konstans, a keresés, beszúrás és törlés ideje O(1)! Hogy lehet biztosítani, hogy az α konstans legyen? Ha m arányos n-el azaz tudjuk előre az adatszerkezetbe kerülő adatok maximális számát (vagy legalább annak nagyságrendjét) Korlátozott felhasználhatóság nem szűnt meg!

Futási idő n O(logn) O(1) 1 1 1 1 000 11 1 1 000 000 21 1 1 000 000 000 31 1 1 000 000 000 000 41 1

Dinamikus táblák - tábla kiterjesztése 37 x mod 5 x mod 10 90 11 Újrahasítás 23 48

1 1 1 1 1 5 1 1 1 1 1 1 1 1 1 1 10...n 5 5 10 10 O(1)

n Beszur teljes költsége Minden kiterjesztés után közvetlenül T.eszam = T.meret/2+1, vagyis Φ(T) = 2, közvetlenül előtte pedig T.eszam = T.meret, így Φ(T) = T.eszam. Φ(T) mindig nemnegatív. Legyen az i-edik művelet után közvetlenül szami a tárolt elemek száma, mereti a tábla mérete és Φi a potenciálfüggvény értéke. Kezdetben szam0 = meret0 = Φ0 = 0.

Ha az i-edik Beszur művelet nem váltja ki a tábla kiterjesztését, akkor mereti = m, így az amortizációs költsége: Ha az i-edik Beszur művelet kiváltja a tábla kiterjesztését, akkor

[1] T. H. Cormen, C. E. Leiserson, R.L. Rivest: Algoritmusok Műszaki Könyvkiadó, 2003. [2] Imreh Csanád: Algoritmusok és Adatszerkezetek II. 2009 http://www.inf.u-szeged.hu/~cimreh/n10alg26el.pdf [3] Horváth Gyula: Algoritmusok és Adatszerkezetek II. 2008 http://www.inf.u-szeged.hu/~tnemeth/a2anyagok/v10.pdf http://www.inf.u-szeged.hu/~tnemeth/a2anyagok/v13.pdf