§E13.19償却解析

最終更新

一つの操作の実費用が大きくなりうるとしても、その操作が続けて起こることはない、という状況がある。二進カウンタの増加操作は、末尾に11が長く並んでいるときに多くの桁を書き換えるが、そのような状態は稀にしか現れない。動的配列への追加操作は、領域が満杯になったときに全要素を複写するが、複写のあとしばらくは書き込みだけで済む。このような場合、単一の操作の最悪の実費用を操作の回数だけ足し合わせた上界は、実際の総費用から大きく離れる。

償却解析は、単一の操作ではなく有限な操作列の全体を対象として、総費用の上界を与える。本記事は、まず操作列の枠組みを定め、最悪計算量、平均計算量および償却計算量を定義の段階で分ける。次に、総費用を直接評価する集計法、課金額と信用残高による会計法、状態の関数によるポテンシャル法という三つの方法を扱い、会計法とポテンシャル法についてはその正当性を定理として証明する。最後に、二進カウンタと動的配列について、三つの方法のそれぞれで同じ操作列上の上界を証明する。

会計法では信用残高の非負性を、ポテンシャル法では初期値と終端値の条件を、いずれも明示する。これらを落とすと上界の議論は成り立たない。本記事はその点を、同値性の主張と反例によって示す。

1 操作列と三つの計算量

定義 1.1. 集合D\mathcal Dとその要素を状態 (state) という。空でない有限集合O\mathcal Oとその要素を操作 (operation) という。写像δ:D×O→D\delta:\mathcal D\times\mathcal O\to\mathcal Dを遷移 (transition)、写像c:D×O→Z≥0c:\mathcal D\times\mathcal O\to\mathbb Z_{\ge0}を実費用 (actual cost) という。さらに初期状態 (initial state)D0∈DD_0\in\mathcal Dを一つ固定する。組M=(D,O,δ,c,D0)\mathcal M=(\mathcal D,\mathcal O,\delta,c,D_0)を操作系 (operation system) という。

非負整数NNとσ=(o1,…,oN)∈ON\sigma=(o_1,\dots,o_N)\in\mathcal O^{N}の組を、長さNNの操作列 (operation sequence) という。操作列σ\sigmaに対し、状態の列を

Di=δ(Di−1,oi)(1≤i≤N)D_i=\delta(D_{i-1},o_i)\qquad(1\le i\le N)

によって定め、第ii操作の実費用 (actual cost) をci=c(Di−1,oi)c_i=c(D_{i-1},o_i)と書く。∑i=1Nci\sum_{i=1}^{N}c_iをσ\sigmaの総費用 (total cost) という。D0D_0から始まる何らかの操作列の状態の列に現れる状態を到達可能 (reachable) という。D0D_0自身は長さ00の操作列によって到達可能である。

操作列σ=(o1,…,oN)\sigma=(o_1,\dots,o_N)と0≤k≤N0\le k\le Nに対し、σ∣k=(o1,…,ok)\sigma|_k=(o_1,\dots,o_k)をσ\sigmaの接頭列 (prefix) という。接頭列の状態の列と実費用は、σ\sigmaのそれの最初のkk項に一致する。

定義 1.2. 操作系M\mathcal Mについて、次の三つを区別する。

  1. 到達可能な状態DDと操作o∈Oo\in\mathcal Oにわたるc(D,o)c(D,o)の上限を、一つの操作の最悪計算量 (worst-case cost) という。これは単一の操作の実費用についての量であり、操作列の長さに依存しない。
  2. O\mathcal O上の確率分布、すなわち∑o∈OP(o)=1\sum_{o\in\mathcal O}\mathbb P(o)=1を満たす非負実数の族(P(o))o∈O(\mathbb P(o))_{o\in\mathcal O}を一つ定めたとき、状態DDにおける E[c(D,⋅)]=∑o∈OP(o) c(D,o)\mathbb E\bigl[c(D,\cdot)\bigr]=\sum_{o\in\mathcal O}\mathbb P(o)\,c(D,o) を、その分布に関する一つの操作の平均計算量 (average cost) という。これは確率分布を定めて初めて意味をもつ量である。
  3. 写像T^:O→[0,∞)\hat T:\mathcal O\to[0,\infty)がM\mathcal Mの償却計算量の上界 (amortized cost upper bound) であるとは、D0D_0から始まる任意の有限操作列σ=(o1,…,oN)\sigma=(o_1,\dots,o_N)に対し ∑i=1Nci ≤ ∑i=1NT^(oi)\sum_{i=1}^{N}c_i\ \le\ \sum_{i=1}^{N}\hat T(o_i) が成り立つことをいう。とくにT^\hat Tが定数TTであるとき、この条件は、任意の長さNNの操作列について∑i=1Nci≤TN\sum_{i=1}^{N}c_i\le TNが成り立つことである。償却計算量は確率分布を用いず、すべての操作列にわたる最悪の場合についての主張である。

実費用は、「アルゴリズムの正当性と計算量」が定める意味での基本操作の実行回数と読む。三つの量は互いに別のものである。とくに、償却計算量の上界が定数であっても、単一の操作の最悪計算量が有界であるとは限らない。本記事の二つの例はいずれもそのような場合である。

定数の償却計算量の上界が得られると、操作の回数についての線形な上界が直ちに従う。

命題 1.3. 操作系M\mathcal Mに対し、D0D_0から始まる長さNNの操作列の総費用の最大値をC(N)C(N)と書く。O\mathcal Oは空でない有限集合であるから長さNNの操作列は有限個であり、この最大値は存在する。定数T≥0T\ge0が定義 1.2の意味の償却計算量の上界であるならば、すべてのN≥0N\ge0についてC(N)≤TNC(N)\le TNが成り立ち、§D2.8 定義 2.2の意味でC(N)=O(N)C(N)=O(N)である。

証明. 長さNNの操作列σ=(o1,…,oN)\sigma=(o_1,\dots,o_N)をとる。T^\hat Tが定数TTである場合の償却計算量の上界の定義により∑i=1Nci≤∑i=1NT=TN\sum_{i=1}^{N}c_i\le\sum_{i=1}^{N}T=TNである。σ\sigmaは任意であったから、最大値についてもC(N)≤TNC(N)\le TNである。

§D2.8 定義 2.2の意味でC(N)=O(N)C(N)=O(N)であることを確かめる。c=T+1>0c=T+1>0とn0=0n_0=0をとると、すべてのN≥n0N\ge n_0について0≤C(N)≤TN≤cN0\le C(N)\le TN\le cNが成り立つ。▨

単一の操作の最悪計算量MMが有限であれば、C(N)≤MNC(N)\le MNという上界を直ちに得ることができる。本記事の二つの例ではこのMMが有限でないので、この自明な評価を用いることができない。三つの方法は、いずれもこの場合に線形な上界を与えるための道具である。

2 会計法

会計法では、各操作に実費用とは別の課金額を割り当て、課金額が実費用を上回った分を蓄えとして繰り越す。蓄えが尽きないかぎり、課金額の総和が総費用の上界になる。次の定理は、この議論が成り立つための条件が「蓄えがどの時点でも非負である」ことと同値であることを述べる。

定理 2.1 (会計法). 操作系M\mathcal Mと写像a^:O→[0,∞)\hat a:\mathcal O\to[0,\infty)をとる。a^\hat aを課金額という。D0D_0から始まる操作列σ=(o1,…,oN)\sigma=(o_1,\dots,o_N)と0≤k≤N0\le k\le Nに対し、信用残高を

Rk(σ)=∑i=1k(a^(oi)−ci)R_k(\sigma)=\sum_{i=1}^{k}\bigl(\hat a(o_i)-c_i\bigr)

と定める。このとき次の二条件は同値である。

  1. a^\hat aは定義 1.2の意味の償却計算量の上界である。
  2. D0D_0から始まる任意の有限操作列σ\sigmaと、0≤k≤N0\le k\le Nを満たす任意のkkに対しRk(σ)≥0R_k(\sigma)\ge0が成り立つ。

証明.(2)⇒\Rightarrow(1)を示す。D0D_0から始まる操作列σ=(o1,…,oN)\sigma=(o_1,\dots,o_N)をとる。(2)をk=Nk=Nに適用するとRN(σ)≥0R_N(\sigma)\ge0、すなわち

∑i=1Na^(oi)−∑i=1Nci ≥ 0\sum_{i=1}^{N}\hat a(o_i)-\sum_{i=1}^{N}c_i\ \ge\ 0

である。これは償却計算量の上界の定義そのものである。

(1)⇒\Rightarrow(2)を示す。D0D_0から始まる操作列σ=(o1,…,oN)\sigma=(o_1,\dots,o_N)と0≤k≤N0\le k\le Nをとる。接頭列σ∣k=(o1,…,ok)\sigma|_k=(o_1,\dots,o_k)もD0D_0から始まる有限操作列であり、定義 1.1のとおり、その第ii操作の実費用はσ\sigmaの第ii操作の実費用cic_iに等しい。(1)をσ∣k\sigma|_kへ適用すると

∑i=1kci ≤ ∑i=1ka^(oi)\sum_{i=1}^{k}c_i\ \le\ \sum_{i=1}^{k}\hat a(o_i)

であり、これはRk(σ)≥0R_k(\sigma)\ge0にほかならない。▨

定理 2.1の同値性は、信用残高の非負性を末尾でだけ確かめても足りないことを示している。償却計算量の上界は任意の長さの操作列についての主張であり、長さkkの操作列は長さNNの操作列の接頭列としても現れるからである。

3 ポテンシャル法

ポテンシャル法では、蓄えを操作列の履歴ではなく状態の関数として表す。

定理 3.1 (ポテンシャル法). 操作系M\mathcal Mと写像Φ:D→R\Phi:\mathcal D\to\mathbb Rをとる。Φ\Phiをポテンシャル関数という。D0D_0から始まる操作列σ=(o1,…,oN)\sigma=(o_1,\dots,o_N)に対し、第ii操作の償却費用を

c^i=ci+Φ(Di)−Φ(Di−1)\hat c_i=c_i+\Phi(D_i)-\Phi(D_{i-1})

と定める。このとき次が成り立つ。

  1. 任意のN≥0N\ge0に対し ∑i=1Nc^i=∑i=1Nci+Φ(DN)−Φ(D0)\sum_{i=1}^{N}\hat c_i=\sum_{i=1}^{N}c_i+\Phi(D_N)-\Phi(D_0) が成り立つ。
  2. Φ(D0)=0\Phi(D_0)=0であり、かつすべての到達可能な状態DDでΦ(D)≥0\Phi(D)\ge0であるとする。さらに写像T^:O→[0,∞)\hat T:\mathcal O\to[0,\infty)が、D0D_0から始まる任意の操作列とその任意の添字iiについてc^i≤T^(oi)\hat c_i\le\hat T(o_i)を満たすとする。このときT^\hat TはM\mathcal Mの償却計算量の上界である。
  3. (2)の仮定のうち「Φ(D0)=0\Phi(D_0)=0かつ到達可能な状態でΦ≥0\Phi\ge0」は、「D0D_0から始まる任意の操作列でΦ(DN)≥Φ(D0)\Phi(D_N)\ge\Phi(D_0)」へ弱めることができる。

証明.(1)を示す。償却費用の定義により

∑i=1Nc^i=∑i=1Nci+∑i=1N(Φ(Di)−Φ(Di−1))\sum_{i=1}^{N}\hat c_i=\sum_{i=1}^{N}c_i+\sum_{i=1}^{N}\bigl(\Phi(D_i)-\Phi(D_{i-1})\bigr)

である。右辺の第二項は隣り合う項が打ち消し合う望遠鏡和であり、NNについての帰納法によりΦ(DN)−Φ(D0)\Phi(D_N)-\Phi(D_0)に等しい。実際、N=0N=0のとき両辺は00である。N−1N-1まで成り立つとすると、第二項は(Φ(DN−1)−Φ(D0))+(Φ(DN)−Φ(DN−1))=Φ(DN)−Φ(D0)\bigl(\Phi(D_{N-1})-\Phi(D_0)\bigr)+\bigl(\Phi(D_N)-\Phi(D_{N-1})\bigr)=\Phi(D_N)-\Phi(D_0)である。

(3)を先に示す。D0D_0から始まる操作列σ=(o1,…,oN)\sigma=(o_1,\dots,o_N)についてΦ(DN)≥Φ(D0)\Phi(D_N)\ge\Phi(D_0)が成り立つとする。(1)を移項すると

∑i=1Nci=∑i=1Nc^i+Φ(D0)−Φ(DN) ≤ ∑i=1Nc^i\sum_{i=1}^{N}c_i=\sum_{i=1}^{N}\hat c_i+\Phi(D_0)-\Phi(D_N)\ \le\ \sum_{i=1}^{N}\hat c_i

である。仮定c^i≤T^(oi)\hat c_i\le\hat T(o_i)を加えると∑i=1Nci≤∑i=1NT^(oi)\sum_{i=1}^{N}c_i\le\sum_{i=1}^{N}\hat T(o_i)を得る。σ\sigmaは任意であったからT^\hat Tは償却計算量の上界である。

(2)を示す。DND_NはD0D_0から始まる操作列によって到達可能であるから、仮定によりΦ(DN)≥0=Φ(D0)\Phi(D_N)\ge0=\Phi(D_0)である。よって(3)の条件が満たされ、同項により主張が従う。▨

注意 3.2 (初期値と終端値の条件を落とすと結論は成り立たない).定理 3.1 (3)の条件は落とすことができない。D=Z\mathcal D=\mathbb Z、D0=0D_0=0、O={o}\mathcal O=\{o\}、δ(x,o)=x+1\delta(x,o)=x+1、c(x,o)=2c(x,o)=2とする。長さNNの操作列に対しDi=iD_i=iであり、総費用は2N2Nである。

ここでΦ(x)=−x\Phi(x)=-xと置くとΦ(D0)=0\Phi(D_0)=0であるが、Φ\Phiは到達可能な状態で負の値をとる。償却費用は

c^i=2+Φ(Di)−Φ(Di−1)=2+(−i)−(−(i−1))=1\hat c_i=2+\Phi(D_i)-\Phi(D_{i-1})=2+(-i)-\bigl(-(i-1)\bigr)=1

であるから、初期値と終端値の条件を確かめずにT^(o)=1\hat T(o)=1を償却計算量の上界であると結論すると、2N≤N2N\le Nという誤った主張になる。実際にはΦ(DN)=−N<0=Φ(D0)\Phi(D_N)=-N<0=\Phi(D_0)であり、3 の条件が破れている。

注意 3.3 (会計法とポテンシャル法の違い). 会計法とポテンシャル法は、いずれも「実費用より多めに課金し、余りを蓄えて費用の大きい操作の支払いに充てる」という同じ形の議論である。差は蓄えの表し方にある。会計法の信用残高Rk(σ)R_k(\sigma)は操作列σ\sigmaとその長さkkに依存する量であり、同じ状態へ別の履歴で到達したときに別の値をとってよい。ポテンシャル法のΦ(Dk)\Phi(D_k)は状態だけの関数であり、履歴に依存しない。

ポテンシャル関数Φ\Phiと写像T^\hat Tが定理 3.1 (2)の仮定を満たすとき、課金額をa^=T^\hat a=\hat Tと定めると、定理 3.1 (1)から

Rk(σ)=∑i=1k(T^(oi)−ci)=∑i=1k(T^(oi)−c^i)+Φ(Dk)−Φ(D0) ≥ 0R_k(\sigma)=\sum_{i=1}^{k}\bigl(\hat T(o_i)-c_i\bigr) =\sum_{i=1}^{k}\bigl(\hat T(o_i)-\hat c_i\bigr)+\Phi(D_k)-\Phi(D_0)\ \ge\ 0

が従う。右辺の各項が非負だからである。したがってポテンシャル法による議論は、つねに会計法による議論を与える。逆向きは一般には成り立たない。信用残高が状態だけで決まるとは限らないからである。

4 二進カウンタ

定義 4.1. 状態集合をD=Z≥0\mathcal D=\mathbb Z_{\ge0}、初期状態をD0=0D_0=0とする。非負整数xxの二進表記をx=∑j≥0xj2jx=\sum_{j\ge0}x_j2^{j}(xj∈{0,1}x_j\in\{0,1\}であり、有限個を除いてxj=0x_j=0)と書き、xjx_jをxxの第jj桁という。二進表記は一意である。

操作の集合をO={inc}\mathcal O=\{\mathrm{inc}\}とし、遷移をδ(x,inc)=x+1\delta(x,\mathrm{inc})=x+1、実費用を

c(x,inc)=∣{j≥0: xj≠(x+1)j}∣c(x,\mathrm{inc})=\bigl\lvert\{j\ge0:\ x_j\ne(x+1)_j\}\bigr\rvert

と定める。すなわち増加操作の実費用は、書き換わる桁の個数である。

xxの二進表記に現れる11の個数をβ(x)=∑j≥0xj\beta(x)=\sum_{j\ge0}x_jと書く。また、x0=x1=⋯=xt−1=1x_0=x_1=\dots=x_{t-1}=1かつxt=0x_t=0を満たす唯一の非負整数ttをt(x)t(x)と書き、xxの末尾の11の個数 (number of trailing ones) という。有限個を除いてxj=0x_j=0であるから、そのようなttはただ一つ存在する。

補題 4.2. 非負整数xxに対しt=t(x)t=t(x)と置くと、次が成り立つ。

  1. xxとx+1x+1の二進表記が異なる桁は第00桁から第tt桁までであり、c(x,inc)=t+1c(x,\mathrm{inc})=t+1である。
  2. β(x+1)=β(x)−t+1\beta(x+1)=\beta(x)-t+1である。
  3. 非負整数jjに対し、xxとx+1x+1の第jj桁が異なることと2j∣x+12^{j}\mid x+1であることは同値である。

証明.t=t(x)t=t(x)の定義によりx0=⋯=xt−1=1x_0=\dots=x_{t-1}=1かつxt=0x_t=0である。よって

x=∑j=0t−12j+∑j>txj2j=(2t−1)+∑j>txj2j,x+1=2t+∑j>txj2jx=\sum_{j=0}^{t-1}2^{j}+\sum_{j>t}x_j2^{j}=(2^{t}-1)+\sum_{j>t}x_j2^{j}, \qquad x+1=2^{t}+\sum_{j>t}x_j2^{j}

である。右端の式は、第00桁から第t−1t-1桁までが00、第tt桁が11、第jj桁(j>tj>t)がxjx_jである二進表記であり、二進表記の一意性により(x+1)j(x+1)_jはこのとおりである。

(1)を示す。j<tj<tではxj=1x_j=1かつ(x+1)j=0(x+1)_j=0、j=tj=tではxt=0x_t=0かつ(x+1)t=1(x+1)_t=1、j>tj>tではxj=(x+1)jx_j=(x+1)_jである。よって異なる桁はj=0,1,…,tj=0,1,\dots,tのちょうどt+1t+1個であり、c(x,inc)=t+1c(x,\mathrm{inc})=t+1である。

(2)を示す。β(x)=t+∑j>txj\beta(x)=t+\sum_{j>t}x_jでありβ(x+1)=1+∑j>txj\beta(x+1)=1+\sum_{j>t}x_jである。差をとるとβ(x+1)−β(x)=1−t\beta(x+1)-\beta(x)=1-tを得る。

(3)を示す。(1)により、xxとx+1x+1の第jj桁が異なることはj≤tj\le tと同値である。一方、上の表示からx+1=2t(1+∑j>txj2j−t)x+1=2^{t}\bigl(1+\sum_{j>t}x_j2^{j-t}\bigr)であり、括弧の中は奇数である。したがって2j∣x+12^{j}\mid x+1であることとj≤tj\le tであることは同値である。二つの同値を合わせて主張を得る。▨

以下、D0=0D_0=0から始まる長さNNの操作列を考える。操作は一種類しかないので、操作列は長さだけで決まり、Di=iD_i=iである。

4.1 集計法

集計法は、総費用の和を直接評価する方法である。ここでは桁ごとに数え直すことによって和を求める。

命題 4.3.D0=0D_0=0から始まる長さNNの操作列の総費用は

∑i=1Nci=∑j≥0⌊N2j⌋\sum_{i=1}^{N}c_i=\sum_{j\ge0}\Bigl\lfloor\frac{N}{2^{j}}\Bigr\rfloor

であり、この値は2N2N以下である。

証明.Di−1=i−1D_{i-1}=i-1であるからci=c(i−1,inc)=∣{j≥0: (i−1)j≠ij}∣c_i=c(i-1,\mathrm{inc})=\lvert\{j\ge0:\ (i-1)_j\ne i_j\}\rvertである。j≥0j\ge0と1≤i≤N1\le i\le Nについて、(i−1)j≠ij(i-1)_j\ne i_jが成り立つとき11、そうでないとき00をとる量を考え、その総和を二通りに数える。

iiを先に固定してjjについて加えると、和は∑i=1Nci\sum_{i=1}^{N}c_iである。jjを先に固定してiiについて加えると、補題 4.2 (3)により

∣{i: 1≤i≤N, (i−1)j≠ij}∣=∣{i: 1≤i≤N, 2j∣i}∣=⌊N2j⌋\bigl\lvert\{i:\ 1\le i\le N,\ (i-1)_j\ne i_j\}\bigr\rvert =\bigl\lvert\{i:\ 1\le i\le N,\ 2^{j}\mid i\}\bigr\rvert =\Bigl\lfloor\frac{N}{2^{j}}\Bigr\rfloor

である。2j>N2^{j}>Nのときこの値は00であるから、jjについての和は有限個の項だけからなり、和の順序を入れ替えることができる。よって主張の等式を得る。

評価については、⌊N/2j⌋≤N/2j\lfloor N/2^{j}\rfloor\le N/2^{j}であり、2j>N2^{j}>Nの項が00であることから、2J≤N<2J+12^{J}\le N<2^{J+1}を満たす非負整数JJ(N≥1N\ge1のとき)をとって

∑j≥0⌊N2j⌋≤∑j=0JN2j=N⋅1−2−(J+1)1−2−1<2N\sum_{j\ge0}\Bigl\lfloor\frac{N}{2^{j}}\Bigr\rfloor \le\sum_{j=0}^{J}\frac{N}{2^{j}} =N\cdot\frac{1-2^{-(J+1)}}{1-2^{-1}} <2N

である。N=0N=0のときは両辺とも00である。▨

4.2 会計法

各増加操作に22を課金する。00から11へ変わる桁の書き換えに11を払い、残りの11をその桁へ預ける。その桁が後に11から00へ戻るときの書き換えは、預けてある分で支払う。この見方によれば、信用残高は現在11である桁の個数に等しいはずである。次の命題はそれを等式として確かめる。

命題 4.4. 課金額をa^(inc)=2\hat a(\mathrm{inc})=2と定める。D0=0D_0=0から始まる長さNNの操作列σ\sigmaに対し、すべての0≤k≤N0\le k\le Nで

Rk(σ)=β(Dk)R_k(\sigma)=\beta(D_k)

が成り立つ。とくにRk(σ)≥0R_k(\sigma)\ge0である。したがって定理 2.1によりa^\hat aは償却計算量の上界であり、総費用は2N2N以下である。

証明.kkについての帰納法で示す。k=0k=0のときR0(σ)=0R_0(\sigma)=0でありβ(D0)=β(0)=0\beta(D_0)=\beta(0)=0であるから等式が成り立つ。

k≥1k\ge1とし、Rk−1(σ)=β(Dk−1)R_{k-1}(\sigma)=\beta(D_{k-1})を仮定する。信用残高の定義により

Rk(σ)−Rk−1(σ)=a^(inc)−ck=2−c(Dk−1,inc)R_k(\sigma)-R_{k-1}(\sigma)=\hat a(\mathrm{inc})-c_k=2-c(D_{k-1},\mathrm{inc})

であり、補題 4.2 (1)によりc(Dk−1,inc)=t(Dk−1)+1c(D_{k-1},\mathrm{inc})=t(D_{k-1})+1であるから、この差は1−t(Dk−1)1-t(D_{k-1})である。一方、Dk=Dk−1+1D_k=D_{k-1}+1と補題 4.2 (2)により

β(Dk)−β(Dk−1)=1−t(Dk−1)\beta(D_k)-\beta(D_{k-1})=1-t(D_{k-1})

である。二つの差が一致するので、帰納法の仮定と合わせてRk(σ)=β(Dk)R_k(\sigma)=\beta(D_k)を得る。

β\betaは桁の個数であるから非負であり、Rk(σ)≥0R_k(\sigma)\ge0である。定理 2.1 (2)から 1 への含意によりa^\hat aは償却計算量の上界であり、長さNNの操作列の総費用は∑i=1Na^(inc)=2N\sum_{i=1}^{N}\hat a(\mathrm{inc})=2N以下である。▨

4.3 ポテンシャル法

命題 4.5.Φ(x)=β(x)\Phi(x)=\beta(x)と定める。このときΦ(D0)=0\Phi(D_0)=0であり、すべての状態でΦ≥0\Phi\ge0である。さらにD0=0D_0=0から始まる任意の操作列の任意の添字iiについてc^i=2\hat c_i=2が成り立つ。したがって定理 3.1 (2)によりT^(inc)=2\hat T(\mathrm{inc})=2は償却計算量の上界であり、長さNNの操作列の総費用は2N2N以下である。

証明.Φ(D0)=β(0)=0\Phi(D_0)=\beta(0)=0であり、β\betaは非負整数であるからΦ≥0\Phi\ge0である。償却費用は、補題 4.2 (1)と 2 により

c^i=ci+Φ(Di)−Φ(Di−1)=(t(Di−1)+1)+(1−t(Di−1))=2\hat c_i=c_i+\Phi(D_i)-\Phi(D_{i-1}) =\bigl(t(D_{i-1})+1\bigr)+\bigl(1-t(D_{i-1})\bigr)=2

である。よってc^i≤T^(inc)=2\hat c_i\le\hat T(\mathrm{inc})=2が成り立ち、定理 3.1 (2)の仮定がすべて満たされる。▨

命題 4.6. 任意の正の整数MMに対し、到達可能な状態xxが存在してc(x,inc)≥Mc(x,\mathrm{inc})\ge Mが成り立つ。

証明.x=2M−1x=2^{M}-1と置く。D0=0D_0=0からxx回の増加操作を行うと状態はxxになるので、xxは到達可能である。xxの二進表記は第00桁から第M−1M-1桁までが11、第MM桁以上が00であるからt(x)=Mt(x)=Mであり、補題 4.2 (1)によりc(x,inc)=M+1≥Mc(x,\mathrm{inc})=M+1\ge Mである。▨

例 4.7 (二進カウンタの八回の増加の手計算).D0=0D_0=0からN=8N=8回の増加操作を行う。各操作の前後の二進表記と実費用を書き下す。

0→10\to1は000→001000\to001で書き換わる桁は第00桁だけでありc1=1c_1=1である。1→21\to2は001→010001\to010で第00桁と第11桁が書き換わりc2=2c_2=2である。2→32\to3は010→011010\to011でc3=1c_3=1、3→43\to4は011→100011\to100で第00、11、22桁が書き換わりc4=3c_4=3、4→54\to5は100→101100\to101でc5=1c_5=1、5→65\to6は101→110101\to110でc6=2c_6=2、6→76\to7は110→111110\to111でc7=1c_7=1、7→87\to8は0111→10000111\to1000で第00から第33桁までが書き換わりc8=4c_8=4である。

総費用は1+2+1+3+1+2+1+4=151+2+1+3+1+2+1+4=15である。

集計法との照合。命題 4.3の式は

⌊81⌋+⌊82⌋+⌊84⌋+⌊88⌋+⌊816⌋+⋯=8+4+2+1+0+⋯=15\Bigl\lfloor\frac{8}{1}\Bigr\rfloor+\Bigl\lfloor\frac{8}{2}\Bigr\rfloor+\Bigl\lfloor\frac{8}{4}\Bigr\rfloor+\Bigl\lfloor\frac{8}{8}\Bigr\rfloor+\Bigl\lfloor\frac{8}{16}\Bigr\rfloor+\cdots =8+4+2+1+0+\cdots=15

を与え、手計算の値と一致する。上界は2⋅8=162\cdot8=16であり、15≤1615\le16である。

会計法との照合。課金額の総和は2⋅8=162\cdot8=16であるから、信用残高はR8=16−15=1R_8=16-15=1である。一方D8=8D_8=8の二進表記は10001000でありβ(8)=1\beta(8)=1である。命題 4.4の等式R8=β(D8)R_8=\beta(D_8)が成り立つ。

ポテンシャル法との照合。償却費用の総和は2⋅8=162\cdot8=16である。定理 3.1 (1)により

∑i=18ci=∑i=18c^i+Φ(D0)−Φ(D8)=16+0−1=15\sum_{i=1}^{8}c_i=\sum_{i=1}^{8}\hat c_i+\Phi(D_0)-\Phi(D_8)=16+0-1=15

であり、手計算の値と一致する。

単一の操作の実費用。この操作列に現れた実費用の最大値はc8=4c_8=4である。命題 4.6のとおり、操作列を延ばせばこの値はいくらでも大きくなる。実際、x=15x=15から1616への増加の実費用は55である。

5 動的配列

定義 5.1. 状態集合を

D={(n,m)∈Z≥0×Z≥0: n≤m}\mathcal D=\{(n,m)\in\mathbb Z_{\ge0}\times\mathbb Z_{\ge0}:\ n\le m\}

とし、初期状態をD0=(0,0)D_0=(0,0)とする。nnは格納されている要素の個数、mmは確保されている領域の大きさを表し、mmを容量 (capacity) という。

操作の集合をO={app}\mathcal O=\{\mathrm{app}\}とする。ここでapp\mathrm{app}は末尾への追加である。遷移と実費用を

δ((n,m),app)={(n+1, m)(n<m),(n+1, max⁡{1,2m})(n=m),c((n,m),app)={1(n<m),n+1(n=m)\delta\bigl((n,m),\mathrm{app}\bigr)= \begin{cases} (n+1,\ m) & (n<m),\\ (n+1,\ \max\{1,2m\}) & (n=m), \end{cases} \qquad c\bigl((n,m),\mathrm{app}\bigr)= \begin{cases} 1 & (n<m),\\ n+1 & (n=m) \end{cases}

と定める。n=mn=mの場合を再確保 (reallocation) という。再確保では、容量max⁡{1,2m}\max\{1,2m\}の新しい領域を確保して既存のnn個の要素を複写し、その後に末尾へ一つ書き込む。複写の費用をnn、書き込みの費用を11と数えるので、実費用はn+1n+1である。n<mn<mの場合は書き込みだけであり、実費用は11である。

δ\deltaの値がD\mathcal Dに属することを確かめる。n<mn<mのときはn+1≤mn+1\le mである。n=m=0n=m=0のときは(1,1)(1,1)であり1≤11\le1である。n=m≥1n=m\ge1のときは(m+1,2m)(m+1,2m)であり、m≥1m\ge1よりm+1≤2mm+1\le2mである。

補題 5.2.D0=(0,0)D_0=(0,0)から始まる長さNNの操作列についてDk=(nk,mk)D_k=(n_k,m_k)と書く。このとき次が成り立つ。

  1. すべての0≤k≤N0\le k\le Nでnk=kn_k=kである。
  2. m0=0m_0=0であり、1≤k≤N1\le k\le Nのときmkm_kはkk以上の22の冪のうち最小のものである。
  3. 1≤k≤N1\le k\le Nについて、第kk操作が再確保であることと、k=1k=1であるかk−1k-1が22の冪であることは同値である。
  4. すべての0≤k≤N0\le k\le Nで2nk−mk≥02n_k-m_k\ge0である。

証明.(1)を示す。δ\deltaはいずれの場合も第一成分を11だけ増やし、n0=0n_0=0である。kkについての帰納法によりnk=kn_k=kである。

(2)を示す。kkについての帰納法で示す。k=1k=1のとき、n0=0=m0n_0=0=m_0であるから第11操作は再確保でありm1=max⁡{1,0}=1m_1=\max\{1,0\}=1である。11以上の22の冪のうち最小のものは11であるから主張が成り立つ。

1≤k<N1\le k<Nとし、mkm_kがkk以上の22の冪のうち最小のものであると仮定する。(1)によりnk=kn_k=kである。

k<mkk<m_kの場合、第k+1k+1操作は再確保ではなくmk+1=mkm_{k+1}=m_kである。mkm_kは22の冪でありmk>km_k>kであるからmk≥k+1m_k\ge k+1である。k+1k+1以上の22の冪はkk以上でもあるから、帰納法の仮定によりそれはmkm_k以上である。よってmkm_kはk+1k+1以上の22の冪のうち最小のものである。

k=mkk=m_kの場合、第k+1k+1操作は再確保でありmk+1=2mk=2km_{k+1}=2m_k=2kである。k=mkk=m_kは22の冪であるから2k2kも22の冪である。k<k+1k<k+1であるからkkはk+1k+1以上ではなく、kkより大きい22の冪のうち最小のものは2k2kである(kkが22の冪であることによる)。よって2k2kはk+1k+1以上の22の冪のうち最小のものである。

(3)を示す。第kk操作が再確保であることはnk−1=mk−1n_{k-1}=m_{k-1}、すなわち(1)によりk−1=mk−1k-1=m_{k-1}と同値である。k=1k=1のときは0=m0=00=m_0=0であるから成り立つ。k≥2k\ge2のときはk−1≥1k-1\ge1であり、(2)によりmk−1m_{k-1}はk−1k-1以上の22の冪のうち最小のものであるから、k−1=mk−1k-1=m_{k-1}であることとk−1k-1が22の冪であることは同値である。

(4)を示す。k=0k=0のときは2⋅0−0=02\cdot0-0=0である。k≥1k\ge1とする。(2)によりmkm_kはkk以上の22の冪のうち最小のものである。mk=km_k=kならば2k−mk=k≥02k-m_k=k\ge0である。mk>km_k>kならば、mk≥k+1≥2m_k\ge k+1\ge2であるからmk/2m_k/2も22の冪であり、最小性によりmk/2<km_k/2<kである。よってmk<2km_k<2k、すなわち2nk−mk=2k−mk>02n_k-m_k=2k-m_k>0である。▨

5.1 集計法

命題 5.3.D0=(0,0)D_0=(0,0)から始まる長さNNの操作列の総費用について次が成り立つ。N=0N=0のとき総費用は00、N=1N=1のとき総費用は11である。N≥2N\ge2のとき、2J≤N−1<2J+12^{J}\le N-1<2^{J+1}を満たす非負整数JJをとると

∑i=1Nci=N+2J+1−1\sum_{i=1}^{N}c_i=N+2^{J+1}-1

である。いずれの場合も∑i=1Nci≤3N\sum_{i=1}^{N}c_i\le3Nが成り立つ。

証明.補題 5.2 (1)によりni−1=i−1n_{i-1}=i-1である。第ii操作が再確保でなければci=1c_i=1、再確保であればci=ni−1+1=ic_i=n_{i-1}+1=iである。よって

∑i=1Nci=N+∑1≤i≤N第 i 操作が再確保(i−1)\sum_{i=1}^{N}c_i=N+\sum_{\substack{1\le i\le N\\ \text{第 }i\text{ 操作が再確保}}}(i-1)

である。補題 5.2 (3)により、再確保が起こる添字はi=1i=1と、i−1i-1が22の冪であるiiである。i=1i=1の項はi−1=0i-1=0であるから和に寄与しない。i−1=2ji-1=2^{j}かつ1≤i≤N1\le i\le Nを満たすjjは2j≤N−12^{j}\le N-1を満たす非負整数であるから、N≥2N\ge2のとき

∑1≤i≤N第 i 操作が再確保(i−1)=∑j=0J2j=2J+1−1\sum_{\substack{1\le i\le N\\ \text{第 }i\text{ 操作が再確保}}}(i-1)=\sum_{j=0}^{J}2^{j}=2^{J+1}-1

である。N=1N=1のときは再確保はi=1i=1だけであり、和は00である。N=0N=0のときは操作が無い。

評価を行う。N≥2N\ge2のとき2J≤N−12^{J}\le N-1であるから2J+1−1≤2(N−1)−1=2N−32^{J+1}-1\le2(N-1)-1=2N-3であり、総費用はN+2N−3=3N−3≤3NN+2N-3=3N-3\le3N以下である。N=1N=1のとき総費用は1≤31\le3、N=0N=0のとき0≤00\le0である。▨

5.2 会計法

各追加操作に33を課金する。11は書き込みに使い、22を新しく書いた要素へ預ける。次の再確保では、直前の再確保の時点で既にあった要素と、それ以降に書かれた要素とを合わせて複写するが、それ以降に書かれた要素は容量の半分だけあり、それぞれが22ずつ預けているので複写の費用をまかなうことができる。この見通しを、量2n−m2n-mを下界とする形の不変条件として定式化する。

命題 5.4. 課金額をa^(app)=3\hat a(\mathrm{app})=3と定める。D0=(0,0)D_0=(0,0)から始まる長さNNの操作列σ\sigmaに対し、すべての0≤k≤N0\le k\le Nで

Rk(σ) ≥ 2nk−mk ≥ 0R_k(\sigma)\ \ge\ 2n_k-m_k\ \ge\ 0

が成り立つ。したがって定理 2.1によりa^\hat aは償却計算量の上界であり、総費用は3N3N以下である。

証明. 右側の不等式は補題 5.2 (4)である。左側の不等式をkkについての帰納法で示す。

k=0k=0のときR0(σ)=0R_0(\sigma)=0であり2n0−m0=02n_0-m_0=0であるから等号が成り立つ。

k≥1k\ge1とし、Rk−1(σ)≥2nk−1−mk−1R_{k-1}(\sigma)\ge2n_{k-1}-m_{k-1}を仮定する。Rk(σ)=Rk−1(σ)+3−ckR_k(\sigma)=R_{k-1}(\sigma)+3-c_kである。三つの場合に分ける。

第kk操作が再確保でない場合。ck=1c_k=1、nk=nk−1+1n_k=n_{k-1}+1、mk=mk−1m_k=m_{k-1}であるから

Rk(σ)=Rk−1(σ)+2 ≥ (2nk−1−mk−1)+2=2nk−mkR_k(\sigma)=R_{k-1}(\sigma)+2\ \ge\ (2n_{k-1}-m_{k-1})+2=2n_k-m_k

である。

第kk操作が再確保でありmk−1≥1m_{k-1}\ge1である場合。nk−1=mk−1n_{k-1}=m_{k-1}であるから、m=mk−1m=m_{k-1}と置くとck=m+1c_k=m+1、nk=m+1n_k=m+1、mk=2mm_k=2mであり2nk−mk=2(m+1)−2m=22n_k-m_k=2(m+1)-2m=2である。帰納法の仮定はRk−1(σ)≥2m−m=mR_{k-1}(\sigma)\ge2m-m=mを与えるので

Rk(σ)=Rk−1(σ)+3−(m+1) ≥ m+2−m=2=2nk−mkR_k(\sigma)=R_{k-1}(\sigma)+3-(m+1)\ \ge\ m+2-m=2=2n_k-m_k

である。

第kk操作が再確保でありmk−1=0m_{k-1}=0である場合。このときnk−1=0n_{k-1}=0であるからk=1k=1であり、c1=1c_1=1、D1=(1,1)D_1=(1,1)である。R1(σ)=0+3−1=2R_1(\sigma)=0+3-1=2であり2n1−m1=2−1=12n_1-m_1=2-1=1であるからR1(σ)≥2n1−m1R_1(\sigma)\ge2n_1-m_1である。

以上で帰納法が完成する。定理 2.1 (2)から 1 への含意によりa^\hat aは償却計算量の上界であり、長さNNの操作列の総費用は3N3N以下である。▨

5.3 ポテンシャル法

命題 5.5.Φ(n,m)=2n−m\Phi(n,m)=2n-mと定める。このときΦ(D0)=0\Phi(D_0)=0であり、補題 5.2 (4)によりすべての到達可能な状態でΦ≥0\Phi\ge0である。さらにD0=(0,0)D_0=(0,0)から始まる任意の操作列の任意の添字iiについてc^i≤3\hat c_i\le3が成り立つ。したがって定理 3.1 (2)によりT^(app)=3\hat T(\mathrm{app})=3は償却計算量の上界であり、長さNNの操作列の総費用は3N3N以下である。

証明.Φ(D0)=2⋅0−0=0\Phi(D_0)=2\cdot0-0=0である。到達可能な状態での非負性は補題 5.2 (4)による。償却費用を三つの場合に分けて計算する。

第ii操作が再確保でない場合。ci=1c_i=1であり、Di−1=(n,m)D_{i-1}=(n,m)、Di=(n+1,m)D_i=(n+1,m)であるから

c^i=1+(2(n+1)−m)−(2n−m)=1+2=3\hat c_i=1+\bigl(2(n+1)-m\bigr)-(2n-m)=1+2=3

である。

第ii操作が再確保でありm≥1m\ge1である場合。Di−1=(m,m)D_{i-1}=(m,m)、Di=(m+1,2m)D_i=(m+1,2m)でありci=m+1c_i=m+1であるから

c^i=(m+1)+(2(m+1)−2m)−(2m−m)=(m+1)+2−m=3\hat c_i=(m+1)+\bigl(2(m+1)-2m\bigr)-(2m-m)=(m+1)+2-m=3

である。

第ii操作が再確保でありm=0m=0である場合。Di−1=(0,0)D_{i-1}=(0,0)、Di=(1,1)D_i=(1,1)でありci=1c_i=1であるから

c^i=1+(2−1)−(0−0)=2\hat c_i=1+(2-1)-(0-0)=2

である。

いずれの場合もc^i≤3\hat c_i\le3である。▨

命題 5.6. 任意の正の整数MMに対し、到達可能な状態DDが存在してc(D,app)≥Mc(D,\mathrm{app})\ge Mが成り立つ。

証明.2j≥M2^{j}\ge Mを満たす非負整数jjをとり、k=2jk=2^{j}と置く。D0=(0,0)D_0=(0,0)からkk回の追加操作を行うと、補題 5.2 (1)と 2 によりDk=(k,mk)D_k=(k,m_k)であり、mkm_kはkk以上の22の冪のうち最小のものであるからmk=km_k=kである。よってDk=(k,k)D_k=(k,k)は到達可能であり、次の追加操作は再確保であってc(Dk,app)=k+1≥Mc(D_k,\mathrm{app})=k+1\ge Mである。▨

例 5.7 (動的配列への八回の追加の手計算).D0=(0,0)D_0=(0,0)からN=8N=8回の追加操作を行う。各操作の前の状態、再確保の有無、実費用および操作後の状態を順に書き下す。

第11操作は(0,0)(0,0)から始まりn=mn=mであるから再確保であり、c1=0+1=1c_1=0+1=1で状態は(1,1)(1,1)になる。第22操作は(1,1)(1,1)から始まり再確保でありc2=1+1=2c_2=1+1=2で(2,2)(2,2)になる。第33操作は(2,2)(2,2)から始まり再確保でありc3=2+1=3c_3=2+1=3で(3,4)(3,4)になる。第44操作は(3,4)(3,4)から始まりn<mn<mであるからc4=1c_4=1で(4,4)(4,4)になる。第55操作は(4,4)(4,4)から始まり再確保でありc5=4+1=5c_5=4+1=5で(5,8)(5,8)になる。第66、第77、第88操作はいずれもn<mn<mであるからc6=c7=c8=1c_6=c_7=c_8=1であり、状態は順に(6,8)(6,8)、(7,8)(7,8)、(8,8)(8,8)になる。

総費用は1+2+3+1+5+1+1+1=151+2+3+1+5+1+1+1=15である。

集計法との照合。N=8N=8に対し2J≤7<2J+12^{J}\le7<2^{J+1}を満たすJJはJ=2J=2である。命題 5.3の式は8+23−1=8+7=158+2^{3}-1=8+7=15を与え、手計算の値と一致する。上界は3⋅8=243\cdot8=24であり、15≤2415\le24である。再確保が起きた添字は1,2,3,51,2,3,5であり、i−1i-1の値は0,1,2,40,1,2,4であって、i=1i=1を除けば22の冪である。補題 5.2 (3)と一致する。

会計法との照合。課金額の総和は3⋅8=243\cdot8=24であるからR8=24−15=9R_8=24-15=9である。一方D8=(8,8)D_8=(8,8)であるから2n8−m8=16−8=82n_8-m_8=16-8=8であり、R8=9≥8R_8=9\ge8が成り立つ。命題 5.4の不等式のとおりである。

ポテンシャル法との照合。償却費用は命題 5.5の計算によりc^1=2\hat c_1=2、c^2=⋯=c^8=3\hat c_2=\dots=\hat c_8=3であるから総和は2+3⋅7=232+3\cdot7=23である。定理 3.1 (1)により

∑i=18ci=∑i=18c^i+Φ(D0)−Φ(D8)=23+0−8=15\sum_{i=1}^{8}c_i=\sum_{i=1}^{8}\hat c_i+\Phi(D_0)-\Phi(D_8)=23+0-8=15

であり、手計算の値と一致する。

単一の操作の実費用。この操作列に現れた実費用の最大値はc5=5c_5=5である。命題 5.6のとおり、操作列を延ばせばこの値はいくらでも大きくなる。実際、状態(8,8)(8,8)からの追加の実費用は99である。

注意 5.8 (償却計算量は平均計算量ではない).定義 1.2の三つの量は互いに別のものである。二進カウンタでは、単一の増加操作の最悪計算量は命題 4.6により上に有界でないが、命題 4.5が与える償却計算量の上界は定数22である。

償却計算量の上界としての定数22は、確率を用いずに得られている。主張は「どの操作列に対しても総費用が2N2N以下である」ことであって、「多くの操作列で総費用が2N2N程度である」ことではない。二進カウンタでも動的配列でも操作は一種類しかないので、O\mathcal O上の確率分布は一つしかなく、定義 1.2の平均計算量は固定した状態における実費用そのものに等しい。これは状態に依存し、上に有界でない。したがって、償却計算量の上界が定数であることは、平均計算量が定数であることからは従わない。両者は別々に定め、別々に示すべき量である。

6 演習

問題 6.1.

  1. 操作を二つもつ操作系と課金額a^\hat aを作り、ある操作列σ\sigmaについてR∣σ∣(σ)≥0R_{\lvert\sigma\rvert}(\sigma)\ge0が成り立ちながら、σ\sigmaのある接頭列でRk(σ)<0R_k(\sigma)<0となるようにせよ。その例でa^\hat aが償却計算量の上界でないことを確かめ、この事実が定理 2.1の同値性と矛盾しない理由を、1 から 2 を導く段が接頭列をどう用いているかに即して説明せよ。
  2. 定理 3.1 (1)の証明は望遠鏡和の評価を帰納法で行っている。この帰納法を書き下し、N=0N=0の場合が空和として正しく扱われていることを確かめよ。さらに、Φ\Phiが実数値であることをどこで用いているかを指摘せよ。
  3. 注意 3.2の反例において、ポテンシャル関数をΦ(x)=−x\Phi(x)=-xからΦ(x)=x\Phi(x)=xへ取り替えると償却費用がいくつになるかを計算し、その場合に定理 3.1 (2)が与える上界を書き下せ。得られた上界が実際の総費用2N2Nと整合することを確かめよ。
  4. 命題 4.4は信用残高がβ(Dk)\beta(D_k)にちょうど等しいことを示している。課金額を22ではなく3/23/2に変えたとき、信用残高が非負であり続けるかどうかを判定せよ。非負でないならば、非負でなくなる最小のkkを求めよ。
  5. 命題 5.4の証明を、補題 5.2 (2)を用いずに書き直せ。すなわち、容量がkk以上の最小の22の冪であることを使わずに、Rk(σ)≥2nk−mkR_k(\sigma)\ge2n_k-m_kの帰納法だけで議論が閉じることを確かめ、2nk−mk≥02n_k-m_k\ge0を別に示す必要がある理由を述べよ。
  6. 動的配列の再確保で容量を22倍ではなく33倍にする規則を考える。この規則に対するポテンシャル関数を設計し、定理 3.1 (2)の仮定をすべて満たすことを証明して、償却計算量の上界となる定数を求めよ。さらに、容量を22倍にする場合と比べたときの上界の違いを述べよ。
  7. 動的配列に末尾からの削除操作を加え、削除の実費用を11、要素数が容量の半分になったときに容量を半分にする規則を採る操作系を考える。Φ(n,m)=∣2n−m∣\Phi(n,m)=\lvert2n-m\rvertについて、定数T^\hat Tをとって定理 3.1 (2)の仮定をすべて満たすようにすることができるかどうかを判定せよ。することができない場合は、要素数が容量の半分になる状態のまわりで追加と削除を交互に繰り返す操作列を作り、その操作列に沿って償却費用が上に有界でないことを示せ。

8 扱った範囲と次の記事

本記事は、有限な操作列に対する償却計算量の上界を定義し、単一の操作の最悪計算量および確率分布に関する平均計算量と区別した。定数の償却計算量の上界が総費用の線形な上界を与えることを示した。会計法については、課金額が償却計算量の上界であることと信用残高がすべての接頭列で非負であることが同値であることを証明した。ポテンシャル法については、償却費用の総和が望遠鏡和として実費用の総和と両端のポテンシャルの差に分かれることを証明し、初期値と終端値の条件を落とすと結論が成り立たない例を与えた。二進カウンタと動的配列については、集計法、会計法およびポテンシャル法の三つで同じ操作列上の上界を独立に証明し、いずれの例でも単一の操作の実費用が上に有界でないことを示した。削除操作を含む操作系、複数の操作をもつデータ構造、および償却計算量の下界は扱っていない。

次の記事では、有理数体上の一変数形式的冪級数について合成と形式微分を定義し、合成逆元の一意存在と係数公式を証明する。

参考文献

  1. Thomas H. Cormen, Charles E. Leiserson, Ronald L. Rivest, and Clifford Stein, Introduction to Algorithms, 4th ed., MIT Press, Cambridge, Massachusetts, 2022.集計法、会計法およびポテンシャル法の定式化と、二進カウンタおよび動的表への適用を参考にした。
  2. Robert E. Tarjan, Amortized computational complexity, SIAM Journal on Algebraic and Discrete Methods 6 (1985), no. 2, 306–318.ポテンシャル関数による償却費用の定義と、初期値および終端値の条件の役割を参考にした。
  3. Peter Sanders, Kurt Mehlhorn, Martin Dietzfelbinger, and Roman Dementiev, Sequential and Parallel Algorithms and Data Structures: The Basic Toolbox, Springer, Cham, 2019.容量を二倍にする動的配列の再確保の規則と、追加操作の列に対する総費用の評価を参考にした。

前提記事