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

Hasonló dokumentumok
Adatszerkezet - műveletek

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

Egyesíthető prioritási sor

Önszervező bináris keresőfák

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

Egyesíthető prioritási sor

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

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

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

Kupac adatszerkezet. 1. ábra.

Algoritmusok és adatszerkezetek II.

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

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

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

Algoritmusok és adatszerkezetek gyakorlat 06 Adatszerkezetek

Online migrációs ütemezési modellek

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

Algoritmusok és adatszerkezetek gyakorlat 07

Algoritmusok és adatszerkezetek II.

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

Rendezettminta-fa [2] [2]

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

Adatszerkezetek 7a. Dr. IványiPéter

Algoritmusok és Adatszerkezetek II.

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

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

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

Diszkrét matematika 2.

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

Diszkrét matematika 2.C szakirány

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

Algoritmusok és adatszerkezetek II.

Általános algoritmustervezési módszerek

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.

Számjegyes vagy radix rendezés

Adatszerkezetek és algoritmusok

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.

Az optimális megoldást adó algoritmusok

Gráfok, definíciók. Gráfok ábrázolása. Az adott probléma megoldásához ténylegesen mely műveletek szükségesek. Ábrázolások. Példa:

Fibonacci számok. Dinamikus programozással

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.

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

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

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.

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

Gyakorló feladatok ZH-ra

INFORMATIKA javítókulcs 2016

Struktúra nélküli adatszerkezetek

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

1. A k-szerver probléma

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

Információs Technológia

Algoritmusok bonyolultsága

Matlab alapok. Baran Ágnes. Baran Ágnes Matlab alapok Elágazások, függvények 1 / 15

Adatszerkezetek 2. Dr. Iványi Péter

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.

Adatszerkezetek 2. Dr. Iványi Péter

Algoritmuselmélet. Gráfok megadása, szélességi bejárás, összefüggőség, párosítás. Katona Gyula Y.

Alkalmazott modul: Programozás

Diszkrét matematika 2. estis képzés

Elsőbbségi (prioritásos) sor

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

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

Mohó algoritmusok. Példa:

Diszkrét matematika 2. estis képzés

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

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

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

Programozási módszertan. Mohó algoritmusok

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

1. Online kiszolgálóelhelyezés

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

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

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

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:

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.

Az online algoritmusok k-szerver probléma

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

Algoritmusok és Adatszerkezetek II. előadás

Hierarchikus adatszerkezetek

KUPAC TĺPUSÚ ADATSZERKEZETEK

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

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

Matematikai alapok. Dr. Iványi Péter

Programozás II. előadás

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

Algoritmuselmélet 11. előadás

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

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

Gráfok 2. Legrövidebb utak, feszítőfák. Szoftvertervezés és -fejleszté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:

Algoritmusok és adatszerkezetek II.

Diszkrét matematika 2.C szakirány

A programozás alapjai 1 Rekurzió

26. MINIMÁLIS KÖLTSÉGŰ UTAK MINDEN CSÚCSPÁRRA

Algoritmuselmélet 2. előadás

Átírás:

Módosítható Prioritási sor Binomiális kupaccal

modosit(x,k) {! if (k>x.kulcs) {!! x.kulcs=k ;!! y=x!! z=x.apa ;!! while(z!=nil and y.kulcs<z.kulcs)!!! csere(y kulcs,z.kulcs) ;!! y=z ;!! z=y.apa ;! } else... } torol(x) { O(log(n))!modosit(x,INF) ;!sorbol() ; } O(log(n))

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

Adott egy M1,...,Mm 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 m darab, és kezdetben üres verem! Mivel kivesz(k) futási ideje legrosszabb esetben m és a műveletekből m darab van, a futási idő legrosszabb esetben m 2? Legrosszabb esetre ez a módszer nem mindig éles!

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

A műveletekre átlagolt T(n)/m költséget számítjuk. Ezt az egyes műveletek átlagolt költségének nevezzük.

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.

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:

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)

Fibonacci kupac

private class FibFaPont<E>{ E kulcs; FibFaPont<E> bal, jobb, apa, efiu; byte fokszam; boolean megjelol=false; FibFaPont(E k){ kulcs=k; this.bal=this; this.jobb=this; } } bal apa kulcs efiu jobb H = <F1;...;Fk>

Jelölje t(h) a H sorozatbeli fák számát, m(h) pedig a megjelölt pontok számát!

Műveletek H=egyesit(H1,H2); A művelet egyszerűen megvalósítható két körlánc közönséges egyesítésével. Egyesítsük a H1 és H2 körláncot, majd H1:min és H2:min közül a kisebb kulcsot tartalmazó legyen az egyesített sorozat kijelölt minimum pontja.

O(1) O(1)

sorba(x); Képezzünk a beszúrandó x elemből egypontú fát, majd egyesítsük a H-t ábrázoló kupaccal. O(1)

x=sorbol(); Az amortizált elemzés során feltételezzük, hogy adott egy D(n) felső korlát az n pontot tartalmazó Fibonacci kupacban szereplő csúcsok maximális fokszámára. Később az is igazolni fogjuk, hogy D(n) = O(log(n)). Az algoritmus a minimum elem fiait átrakja a gyökérlistába, majd végrehajtja a kiegyenlit eljárást.

sorbol(x) {! z=max ;! if (z==nil) return z ;! for (z minden x fiára) {!! x-et tegyük a gyökérlistába!! x.apa=nil ;! }! vegyük ki z-t a gyökérlistából! if (z==z.jobb) max=nil ;! else max=z.jobb ;! kiegyenlit() ;! elemszam-- ; }

A kiegyenlit használja a kupszerk(y,x) eljárást, ami az y gyökerű fát berakja az x gyökerű fa alá. Továbbá felhasznál egy T tömböt, amelynek a mérete D(n) és amelyre T[i] az i fokszámú fát fogja tartalmazni. T 0 1 2 3

kiegyenlit() {! for (i=1;i<d(n);i++) A[i]=nil ;! for (S minden w fájára) {!! x=w;!! d=x.fokszam;!! while (A[d]!=nil) {!!! y=a[d] ;!!! if (x.kulcs > y.kulcs) csere(x,y)!!! kupszerk(y,x);!!! A[d]=nil;!!! d++;!! }!! A[d]=x;! }! max=nil ;! for (i=1;i<d(n);i++)!! if (A[i]!=nil) { kupszerk(y,x) {! "vegyük ki y-t S-ből"! "tegyük y-t x egy fiává"! "növeljük x fokszámát"! x.megjelolt=false; }!!! "tegyük A[i]-t a gyökérlistába"!!! if (max==nil or A[i].kulcs>max.kulcs) min=a[i] ;!! } }

A gyökérlista mérete legfeljebb D(n) +t(h)-1, így az aktuális költség O(D(n) +t(h)) A potenciál a min. pont kivágása előtt: t(h) +2m(H) A kivágás után D(n) +1+2m(H) O(D(n)+t(H)) + ((D(n)+1)+2m(H))-(t(H)+2m(H)) = O(D(n)) + O(t(H))-t(H) = O(D(n))

modosit(x,k) Az algoritmus kivágja az adott elemet ha sérül a kupactulajdonság, továbbá a KASZKÁD-VÁGÁS algoritmus segítségével gondoskodik arról, hogy ne legyen olyan pont, ami több fiát is elveszti.

modosit(x,k) {!if(k>x.kulcs){!!x.kulcs=k;!!y=x.apa;!!if(y!=nil and x.kulcs<y.kulcs) {!!!kivag(x);!!!kaszkadvag(y);!!}!!if(x.kulcs<max.kulcs) min=x ;!} else... }

kivag(x) {! vegyük ki x-et x.apa fiainak listájából! tegyük bele x-et a gyökérlistába! x.apa=nil ;! x.megjelolt=false ; } kaszkadvag(y) {! z=y.apa ;! if (z!=nil) {!! if (y.megjelolt==false) y.megjelolt=true ;!! else kivag(y) ;!! kaszkadvag(z) ;! } }

A modosit algoritmus futási idejének elemzése: 1. A tényleges költség kiszámítása. Tegyük fel, hogy modosit adott hívására c számú kaszkadvag hajtódik végre. Ekkor modosit tényleges futási ideje O(c). 2. A potenciál változás: A kaszkadvag minden hívása, az utolsó kivételével, kivesz egy fapontot a fából és beteszi azt H gyökérlistájába. Így a kaszkadvag-ok végrehajtása után t(h)+c fa lesz a gyökérlistában. (t(h) volt eredetileg, az x pont, és még másik c-1 pont került be a vágások eredményeként). Legfeljebb m(h)-c+2 pont lesz megjelölve, mert c-1 pont jelöletlenné vált a kaszkadvag-ok miatt, és esetleg egyet még jelöletlenné tesz. A potenciál változása: ((t(h) +c) +2(m(H)-c+2))-(t(H) +2m(H)) = 4-c Tehát a modosit eljárás amortizált futási ideje legfeljebb O(c) +4-c = O(1)

A gyökérlista mérete legfeljebb D(n). A maximális fokszám felső korlátja: Lemma. Legyen x a H Fibonacci-kupac tetszőleges pontja, amelynek fokszáma k. Jelölje az y1, y2,..., yk sorozat x fiait abban az időrendi sorrendben, ahogyan x fiai lettek! Ekkor y1.fokszam 0 és yi.fokszam i - 2, i = 2,..., k-ra.

Bizonyítás. Az y1.fokszam 0 állítás nyilvánvaló. i 2 esetén vegyük észre, hogy amikor yi-t x-hez kapcsoltuk annak fiaként, akkor már az y1,..., yi-1 pontok x fiai voltak, így az x.fokszam = i -1 fennállt. Az yi pontot csak akkor kapcsoltuk x-hez, ha yi.fokszam = x.fokszam, tehát yi.fokszam = i - 1 is teljesült. Azóta yi legfeljebb egy fiát veszthette el, mert egyébként x-ből kivágtuk volna. Tehát yi.fokszam i - 2.

Tekintsük a következő Fibonacci számsorozatot: 1 1 1 2 2 1 2 3 3 2 4 5 Lemma. Minden k 0 egész számra: 4 3 7 8 5 5 12 13 6 8 20 21 7 13 33 34 8 21 54 55

Bizonyítás k-szerinti indukcióval bizonyítunk. k = 0-ra: Az indukciós feltétel szerint tehát:

Lemma Bizonyítás

Lemma. Legyen x a H Fibonacci-kupac tetszőleges pontja, amelynek fokszáma k. Ekkor Bizonyítás Jelölje sk a legkevesebb pontot tartalmazó Fibonacci-kupac k fokszámú fájának pontjai számát! sk értéke k-szerint monoton nő Jelölje az y1, y2,..., yk sorozat x fiait abban az időrendi sorrendben, ahogyan x fiai lettek!

következmény: Egy n pontot tartalmazó Fibonacci-kupac tetszőleges pontjának maximális fokszáma: D(n) = O(lg n). Bizonyítás: Így bármely pont maximális fokszáma D(n) = O(lgn)

torol(x) {!modosit(x,inf);!sorbol(); } O(log(n))

BinQpac vs. FibQpac BinQpac FibQpac sorba O(logn) *O(1) sorbol O(logn) *O(logn) egyesit O(logn) *O(1) modosit O(logn) *O(1) torol O(logn) *O(logn)

Dinamikus táblák

Tábla kiterjesztése

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