You are on page 1of 5

10.

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.

10.1. Összesítéses elemzés


Összesítéses elemzésnél minden n-re megmutatjuk, hogy n elemű műveletsor legrosszabb esetben összesen T (n) ideig tart.
Tehát a műveletenkénti átlagos vagy amortizált költség T (n)/n.
Verem művelek
Vezessünk be a Verem adattípus K IVESZ (V,K) új műveletét.
Értékhalmaz: Verem = {ha1 , . . . , an i : ai ∈ E, i = 1, . . . , n, n ≥ 0}
Műveletek:
V : Verem, x : E

{V = ha1 , . . . , an i} VeremBe(V, x) {V = ha1 , . . . , an , xi}


{V = ha1 , . . . , an i ∧ n > 0} VeremBol(V, x) {V = ha1 , . . . , an−1 i ∧ x = an }
{V = V } Urese(V ) {Urese = (Pre(V ) = hi)}
{V = ha1 , . . . , an i ∧ n > 0} Torol(V ) {V = ha1 , . . . , an−1 i}
{V = ha1 , . . . , an i ∧ n > k} Kivesz(V, k) {V = ha1 , . . . , an−k i}
{V = ha1 , . . . , an i ∧ n ≤ k} Kivesz(V, k) {V = hi}

A K IVESZ (V, K ) művelet megvalósítható TOROL (V) művelettel:

while (k>0) and not Urese(V) do Begin


Torol(V);
k:=k-1
end;

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

10.2. 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.
n n
∑ cbi ≥ ∑ ci (1)
i=1 i=1
Verem művelek
A tényleges műveleti költségek:
V EREMBE 1
V EREMBOL 1
K IVESZ min(k, |V |)
A következő amortizációs költségekre teljesül az (1) egyenlőtlenség:
V EREMBE 2
V EREMBOL 0
K IVESZ 0
Tehát a teljes költség O(n).
Bináris számláló
A tényleges költség annyi, ahány bitet megváltoztat a művelet.
Számítsunk 2 amortizációs költséget, ha egy bitet 1-re állítunk be. Ekkor szintén teljesül az (1) egyenlőtlenség, tehát az összköltség O(n).

10.3. Potenciál módszer


Feltételezzük, hogy minden művelet ugyanazon D adatszerkezeten hajt végre műveletet. A kezdeti helyzete D0 , az i-edik művelet végrehajtása
után Di .
Az amortizációs költségelemzés potenciál módszere az előre kifizetett munkát nem az adatszerkezet egyes elemeihez rendeli, hanem mint
"potenciális energiát", röviden potenciált, ami a jövőbeni műveletek kifizetésére használható. Ezt a potenciált az adatszerkezet egészéhez
rendeljük hozzá.
A Φ potenciál függvény a Di adatszerkezethez egy Φ(Di ) valós számot rendel, ami a Di adatszerkezethez rendelt potenciál. Az i-edik művelet
cbi amortizációs költségét a Φ potenciálfüggvényre vonatkozóan a

cbi = ci + Φ(Di ) − Φ(Di−1 ) . (2)

egyenlettel definiáljuk. a teljes amortizációs költséget a


n n
∑ cbi = ∑ (ci + Φ(Di ) − Φ(Di−1 ))
i=1 i=1
n
= ∑ ci + Φ(Dn ) − Φ(D0 ) . (3)
i=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 )

egyenlőtlenség. A V EREMBE művelet végrehajtásakor a potenciál változás:

Φ(Di ) − Φ(Di−1 ) = (|V | + 1) − |V | = 1 .

2
Tehát a V EREMBE művelet amortizációs költsége:

cbi = ci + Φ(Di ) − Φ(Di−1 )


= 1+1 = 2

A K IVESZ (V, K ) műveletre


Φ(Di ) − Φ(Di−1 ) = −k0 .
ahol k0 = min(|V |, k). Tehát az amortizációs költség:

cbi = ci + Φ(Di ) − Φ(Di−1 )


= k0 − k0 = 0 .

Ehhez hasonlóan, a V EREM B OL művelet amortizációs költsége is 0.


Tehát mindhárom művelet amortizációs költsége O(1), ezért a teljes műveletsor amortizációs költsége O(n). Mivel már láttuk, hogy Φ(Di ) ≥
Φ(D0 ), így n művelet teljes amortizációs költsége felső korlátja a tényleges költségnek, tehát a tényleges összköltség legrosszabb esetben O(n).
Bináris számláló
Definiáljuk a potenciálfüggvényt az i-edik N OVEL művelet után a bi értékként, ami a számláló 1-einek száma az i-edik művelet után.
Számítsuk ki a N OVEL művelet amortizációs költségét. Tegyük fel, hogy az i-edik művelet ti bitet változtat 1-ről 0-ra. Ezért a tényleges költség
legfeljebb ti + 1, ami ti bit 1-re állítását és legfeljebb egy bitnek 0-rol 1-re változtatásából áll. Ha bi = 0, akkor a művelet mind a k bitet 0-ra állítja,
ezért bi−1 = ti = k. Ha bi > 0, akkor bi = bi−1 − ti + 1. Mindkét esetben bi ≤ bi−1 − ti + 1, és a potenciálváltozás

Φ(Di ) − Φ(Di−1 ) ≤ (bi−1 − ti + 1) − bi−1


= 1 − ti .

Az amortizált költség tehát

cbi = ci + Φ(Di ) − Φ(Di−1 )


≤ (ti + 1) + (1 − ti ) = 2 .

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 .

10.4. Dinamikus táblák


Type
Elemtip=???;
Tabla=Record
meret:Longint;
eszam:Longint;
Tar:^Array[1..MaxLongint] of Elemtip;
End;

10.4.1. Tábla kiterjesztése


Procedure Beszur(Var T:Tabla; x:Elemtip);
Var UT:Tabla;
i:Longint;
Begin
If T.meret=0 Then Begin
GetMem(T.Tar,Sizeof(Elemtip));
T.meret:=1;
T.eszam:=0;

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

Φ(T ) = 2T. eszam −T. meret (5)


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 B ESZUR művelet nem váltja ki a tábla kiterjesztését, akkor mereti = mereti−1 , így az amortizációs költsége:

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

10.4.2. Tábla kiterjesztése és összehúzása


Jelölje α(T ) = T.eszam/T.meret értéket, tehát a tábla telítettségi tényezőjét, αi az i-edik művelt után a telítettség értéke.
Az összehúzás stratégiája: ha a tábla félig van tele TOTOL művelet előtt, akkor csökkentsük felére a méretét.
n B ESZUR, TOTOL műveletet tartalmazó műveletsor futási idejét vizsgáljuk. Definiáljuk a potenciálfüggvényt a következő formulával:

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.

Ha αi−1 < 1/2 de αi ≥ 1/2, akkor

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.

You might also like