Amortizációs elemzés Alapelv: nem egy-egy művelet lefutási idejét vizsgáljuk, hanem több műveletét együtt, sokszor Eredmény: átlagolt időszükséglet időátlagban és/vagy műveletek szerinti átlagban Három alapmódszer: Összesítési módszer: egy n műveletből álló sorozat össz-idejére határozunk meg egy T(n) felső korlátot Könyveléses módszer: túlszámlázás, hitel, visszafizetés, mindez az alaphalmaz elemeihez kötve Potenciál módszer: túlszámlázás, hitel, visszafizetés a teljes halmazra vetítve
Összesítési módszer. Pl. veremműveletek n művelet költsége: Verembe(x), Veremből() ideje O(1), n db művelet ideje O(n) TöbbVeremből(k) (Veremből ciklikus hívásával), ideje O(k). Legrosszabb esetben a verem n<=mély, n műveletet hajtunk végre, tehát. n*TöbbVeremből(n) =O(n2) az eredmény nem eléggé pontos/éles a három művelet nem független egymástól egymás után, üres veremre alkalmazva őket az időszükséglet csupán O(n) l*Verembe,m*Veremből,n*Veremből(k) ha l=m+n*k
Összesítési módszer. Pl. számláló 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 1 0 3 0 0 0 0 0 0 1 1 4 0 0 0 0 0 1 0 0 7 0 0 0 0 0 1 0 1 8 0 0 0 0 0 1 1 0 10 0 0 0 0 0 1 1 1 11 0 0 0 0 1 0 0 0 15 0 0 0 0 1 0 0 1 16 0 0 0 0 1 0 1 0 18 0 0 0 0 1 0 1 1 19 0 0 0 0 1 1 0 0 22 0 0 0 0 1 1 0 1 23 0 0 0 0 1 1 1 0 25 0 0 0 0 1 1 1 1 26 0 0 0 1 0 0 0 0 31 növel() i=0 while i<hossz és A[i]=1 A[i]=0 i=i+1 if i<A.hossz then A[i]=1 A növelés költsége a bitmódosítás költségével arányos A[0] minden alkalommal változik A[1] csak minden második alkalommal A[2] minden negyedik … bitszélesség/=log(n) (ha n> akkor ismétlődik) 8 hosszú bitvektor: a számláló
Összesítési módszer. Pl. számláló T(n)= i=0Σlog(n) n/2n<i=0Σ¥n/2n=2n
Könyvelési módszer A műveleteknek „amortizációs költsége” van. amortizációsktsg=ténylegesktsg+hitelletét ténylegesktsg=amortizációsktsg+hitelfelhasználás Hitel>=0, a ténylegesktsg>=számolt ktsg Cél: a teljes műveletsorra hosszfüggetlen felső költségkorlátot adni
Könyvelési módszer. Verem műveletek Verembe: 1 Veremből: 1 TöbbVeremből: min(k,s) Könyveléssel: Verembe: 2 Veremből: 0 TöbbVeremből: 0 Azt kell megmutatni, hogy a fenti könyveléssel az hitelegyenlegünk mindig>=0. Vagyis, a betétkor a túlszámlázást (betétdíjat) a kivétkor használjuk fel. Vagyis bármely műveletsorozat ennél olcsóbb lesz. Világos, hogy a verem tartalma=hitelegyenleg
Könyvelési módszer. Számláló Növel: művelet Rendeljünk 2 költséget az egyes bitek 01 átmenetéhez vagyis az 1-eknek hitelük van, viszont a 0-zás ingyenes Minden futáskor legfeljebb 1 bitet állítunk 1-be, ennek költsége 2. Ezért a könyveléses amortizációs ktsg: T(n)=2n
Potenciál módszer Az előre kifizetett ktsget „potenciálként” kezeli. Potenciálfüggvény:F(D), ahol D egy adatállapot D: adathalmaz, D0: kezdeti állapot ci: az i-ik lépés tényleges ktsge, c’i: az amortizációs ktsge. Ekkor az i-k lépésre: c’i=ci+F(Di)-F(Di-1) A teljes amortizációs ktsg: i=0Σnc’i=i=0Σn(ci+F(Di)-F(Di-1))=i=0Σnci+F(Dn)-F(D0) Azt kell belátni/úgy kell F-t megválasztani, hogy: F(Dn)>=F(D0), ilyenkor a teljes amortizációs ktsg felső korlátja lesz a ténylegesnek mivel nem tudjuk, hogy n mennyi, F(Di)>=F(D0) Teleszkopikus összeg
Potenciál módszer. Verem műveletek Legyen a F potenciálfüggvény a verem elemeinek száma, azaz F(D0)=0. Mivel az elemszám>=0, ezért F(Di)>=0 bármely i-re Verembe: F(Di)-F(Di-1)=1, tényleges ktsg: ci=1, amortizációs ktsg: c’i=ci+F(Di)-F(Di-1)=2. TöbbVeremből: Tfh. k’=min(k,s) objektumot vesz ki a veremből. Potenciálkül:F(Di)-F(Di-1)=-k’, tényleges ktsg: ci=k’, amortizációs ktsg: c’i=ci+F(Di)-F(Di-1)=k’+ -k’=0 Veremből: ugyanez, k’=1 a műveletek amortizációs ktsge: O(1), n műveleté O(n). Mivel F(Di)>=F(D0), ezért a teljes amortizációs ktsg felső korlátja a tényleges ktsgnek, vagyis O(n).
Potenciál módszer. Bináris számláló Legyen a F potenciálfüggvény a számláló 1-es bitjeinek a száma. F(Di)>=0 bármely i-re. Tfh. A „növel” eljárás ti bitet állít 1-ből 0-ba, (1 bitet pedig 0-ból 1-be). Tényleges ktsg: ti(+1). Egyesek száma: bi<=bi-1-ti+1. Potenciálkül: F(Di)-F(Di-1)<=bi-1-ti+1-bi-1=1-ti Amortizációs ktsg: c’i=ci+F(Di)-F(Di-1)<=(ti+1)+(1-ti)=2 A „növel” műveletsorozat amort ktsge felső korlátja a ténylegesének, 1 lépés amort. Ktsge O(1), a teljes műveletsorozat tényleges költségr O(n) HF: Biz. be, hogy ugyanez igaz akkor, amikor a szló nem 0-ról indult.
Dinamikus táblák Beszúr/Töröl mellett: private Kiterjeszt/Összehúz Azt fogjuk belátni, hogy mindezek mellett Beszúr/Töröl hosszútávon O(1) költségű. Tfh. Az elemek egyforma szélesek Kitöltöttségi arány (a=n/m): üres tábla mérete 0, a=0 A meggondolások a tényleges megvalósítástól függetlenek…
Csak beszúró dinamikus táblák Elemi beszúrás (átmásolás, végén beszúrás). Tfh. az időigény az elemi beszúrásokkal arányos Beszúr(x) if max=0 then helyfoglalás max=1 if max=méret then 2*méret helyfoglalás tábla átmásolás tábla felszabadítás méret=méret*2 x beszúrása méret=méret+1
Csak beszúró dinamikus táblák Beszúrás ktsge: ci=1, ha nincs kiterjesztés, ilyenkor ci=(i-1)+1=i. Legrosszabb eset becslés ezek alapján O(n), ami n lépésre O(n2) időigényt ad. (nem eléggé éles becslés) Kiterjesztés csak akkor, ha i-1= kettőhatvány… Amortizációs költség: i=0Σnci<=n+i=0Σlogn2i<n+2n=3n 3 Miért? Egy új elem 3-szor fizet. 1. Első beszúráskor 2. Kiterjesztéskor a tábla felső felének átmásolásakor 3. Kiterjesztéskor a tábla korábban megtöltött alsó felének átmásolásakor.
Potenciálelemzés A F potenciálfüggvény legyen 0 a kiterjesztés után, és legyen a táblaméret a kiterjesztés előtt (legyen miből állni a kiterjesztést) F(T)=2*T.méret-T.max F(T0)=0 Ha nincs kiterjesztés c’i=ci+Fi-Fi-1=1+(2*méreti-maxi)-(2*méreti-1-maxi-1)=1+(2*méreti-maxi)-(2*(méreti-1)-maxi)=3 Ha van kiterjesztés (méret=max) c’i=ci+Fi-Fi-1 =méreti+(2*méreti-maxi)-(2*méreti-1-maxi-1)= méreti +(2*méreti-(2*méreti-2))-(2*(méreti-1)-(méreti-1))=3 Kiterjeszthető/összehúzható tábla elemzés: HF.