Professional Documents
Culture Documents
Amortizációs Költségelemzés: 10.1. Összesítéses Elemzés
Amortizációs Költségelemzés: 10.1. Összesítéses Elemzés
Amortizációs költségelemzés
Tekintsünk egy
u1 ; . . . ; um
műveletsort. A műveletsor futási idejének kifejezésére több mód használatos.
1. Külön-külön minden egyes művelet futási idejét kifejezzük és összegezzük.
2. A teljes műveletsor összesített költségét számítjuk, de az egyes műveletekét nem.
3. 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.
A legrosszabb esetre az 1. módszer gyakran nem adekvát, mert nem éles.
Az 1. módszer szerint a költség legrosszabb esetben O(n2 ), mivel a K IVESZ művelet legrosszabb esetben n elemet vesz ki, aminek költsége
O(n).
Az összesített költség azonban O(n), mert minden elem a verembe egyszer kerülhet be és egyszer ki. Tehát az átlagolt költség O(n)/n = O(1).
Bináris számláló növelése
Tekintsük az A[0..k − 1] bitvektort, ami egy szám 2-es számrendszerbeli leírása, nevezetesen
x = ∑k−1 i k
i=0 A[i]2 . Legyen kezdetben x = 0, azaz A[i] = 0, i = 0, . . . k − 1. Az x := x + 1 eggyel (mod 2 ) való növelésre a következő eljárást
használjuk.
N OVEL(A)
Begin
i:=0; while (i<hossz[A]) and A[i] = 1 do Begin
A[i]:=0;
i:=i+1
end;
if i<hossz[A] then
A[i] := 1
end;
Az 1. módszert alkalmazva a következőt kapjuk. A legrosszabb esetben, amikor minden bit 1-es, a művelet O(k) ideig tart, tehet a műveletsor
költsége legrosszabb esetben O(n k).
Élesíthetjük a korlátot, ha észrevesszük, hogy az n N OVEL műveletből nem mindegyik változtatja mind a k bitet. Látszik, hogy az A[0] bit mindig
1
megváltozik, Az A[1] bit minden második műveletben, tehát bn/2c-ször. Általánosan, i = 0, 1, . . . , k − 1 esetén az A[i] bit megváltozásainak
száma bn/2i c. Ha i > k esetben nem változik bit. Tehát a bit-változások száma:
blg nc j ∞
nk 1
∑ 2i
< n∑
2 i
= 2n
i=0 i=0
Tehát n N OVEL műveletből álló műveletsor összesített költség, ha 0-val indulunk O(n), így az amortizált költség O(n)/n = O(1).
összefüggés adja.
Ha olyan Φ potenciálfüggvényt tudunk adni, hogy Φ(Dn ) ≥ Φ(D0 ) teljesüljön, akkor a ∑ni=1 cbi amortizációs költség felső korlátja lesz a ∑ni=1 ci
tényleges költségnek.
Verem művelek
Definiáljuk a Φ potenciálfüggvényt a veremben lévő elemek számaként. Kezdetben Φ(D0 ) = 0. Mindig teljesül a
Φ(Di ) ≥ 0 = Φ(D0 )
2
Tehát a V EREMBE művelet amortizációs költsége:
Ha a számláló 0-rol indul, akkor Φ(D0 ) = 0. Mivel minden i-re Φ(Di ) ≥ 0, így n N OVEL művelet sorozatának teljes amortizált költsége felső
korlátja lesz a tényleges költségnek, ami legrosszabb esetben O(n).
A potenciál módszerrel elemezhető az az eset is, amikor a számláló nem 0-ról indul. Kezdetben b0 1-es van benne, az i-edik N OVEL végrehajtása
után pedig bn , ahol 0 ≤ b0 , bn ≤ k. A (2) egyenlet átrendezésével kapjuk, hogy
n n
∑ ci = ∑ cbi − Φ(Dn ) + Φ(D0 ) . (4)
i=1 i=1
Tehát cbi ≤ 2 minden 1 ≤ i ≤ n esetén. Mivel Φ(D0 ) = b0 és Φ(Dn ) = bn , a tényleges költsége n N OVEL műveletnek
n n
∑ ci ≤ ∑ 2 − bn + b0
i=1 i=1
= 2n − bn + b0 .
3
End;
If T.szam=T.meret Then Begin
UT.meret:=2*T.meret;
Getmem(UT.Tar, UT.meret*Sizeof(Elemtip));
UT.eszam:=T.eszam;
For i:=1 To T.eszam Do
UT.Tar^[i]:=T.Tar^[i];
MreeMem(T.Tar,T.meret*Sizeof(Elemtip))
T:=UT;
End;
Inc(T.eszam);
T.Tar^[T.eszam]:=x;
End;
i if i − 1 2-hatvány ,
ci =
1 különben .
n B ESZUR teljes költsége
n blg nc
∑ ci ≤ n+ ∑ 2j
i=1 j=0
< n + 2n
= 3n ,
Potenciál módszer
cbi = ci + Φi − Φi−1
= 1 + (2 · eszami − mereti ) − (2 · eszami−1 − mereti−1 )
= 1 + (2 · eszami − mereti ) − (2(eszami −1) − mereti )
= 3.
Ha az i-edik B ESZUR művelet kiváltja a tábla kiterjesztését, akkor mereti = 2 · mereti−1 és mereti−1 = eszami−1 = eszami −1, amiből következik,
hogy mereti = 2 · (eszami −1).
Tehát az amortizációs költség:
cbi = ci + Φi − Φi−1
= eszami +(2 · eszami − mereti ) − (2 · eszami−1 − mereti−1 )
= eszami +(2 · eszami −2 · (eszami −1)) − (2(eszami −1) − (eszami −1))
= eszami +2 − (eszami −1)
= 3
ha αi ≥ 1/2 ,
2 · eszami − mereti
Φi =
mereti /2 − eszami ha αi < 1/2 ,
Először nézzük azt az esetet, amikor az i-edik művelet B ESZUR. Ha αi−1 ≥ 1/2, akkor az elemzés azonos a korábbi esettel, amikor csak B ESZUR
műveletet végeztünk, tehát cbi legfeljebb 3. Ha αi−1 < 1/2, akkor nem lép fel kiterjesztés, mert azt csak αi−1 = 1 esetben kell végezni. Ha még
4
αi < 1/2 is teljesül, akkor
cbi = ci + Φi − Φi−1
= 1 + (mereti /2 − numi ) − (mereti−1 /2 − numi−1 )
= 1 + (mereti /2 − numi ) − (mereti /2 − (numi −1))
= 0.
cbi = ci + Φi − Φi−1
= 1 + (2 · numi − mereti ) − (mereti−1 /2 − numi−1 )
= 1 + (2(numi−1 +1) − mereti−1 ) − (mereti−1 /2 − numi−1 )
3
= 3 · numi−1 − mereti−1 +3
2
3
= 3αi−1 mereti−1 − mereti−1 +3
2
3 3
< mereti−1 − mereti−1 +3
2 2
= 3
Tehát akár van, akár nincs kiterjesztés, a cbi amortizált költség legfeljebb 3.
Tekintsük most azt az esetet, amikor az i-edik művelet TOROL.
Ekkor eszami = eszami−1 −1. Ha αi−1 < 1/2, akkor figyelembe kell venni, hogy sor kerül összehúzásra. Ha nem, akkor mereti = mereti−1 és
így az amortizált költség
cbi = ci + Φi − Φi−1
= 1 + (mereti /2 − eszami ) − (mereti−1 /2 − eszami−1 )
= 1 + (mereti /2 − eszami ) − (mereti /2 − (eszami +1))
= 2
Ha αi−1 < 1/2 és a TOROL művelet összehúzást vált ki, akkor ci = eszami +1, mivel egy elemet törlünk és eszami számú elemet átmozgatunk.
Kapjuk, hogy mereti /2 = mereti−1 /4 = eszami−1 = eszami +1, így az amortizált költség
cbi = ci + Φi − Φi−1
= (eszami +1) + (mereti /2 − eszami ) − (mereti−1 /2 − eszami−1 )
= (eszami +1) + ((eszami +1) − eszami ) − ((2 · eszami +2) − (eszami +1))
= 1.
Ha az i-edik művelet TOROL és αi−1 ≥ 1/2, akkor is konstans felső korlát van az amortizált költségre.