1 操作列と三つの計算量
定義 1.1. 集合D \mathcal D D とその要素を状態 (state ) という。空でない有限集合O \mathcal O O とその要素を操作 (operation ) という。写像δ : D × O → D \delta:\mathcal D\times\mathcal O\to\mathcal D δ : D × O → D を遷移 (transition ) 、写像c : D × O → Z ≥ 0 c:\mathcal D\times\mathcal O\to\mathbb Z_{\ge0} c : D × O → Z ≥ 0 を実費用 (actual cost ) という。さらに初期状態 (initial state )D 0 ∈ D D_0\in\mathcal D D 0 ∈ D を一つ固定する。組M = ( D , O , δ , c , D 0 ) \mathcal M=(\mathcal D,\mathcal O,\delta,c,D_0) M = ( D , O , δ , c , D 0 ) を操作系 (operation system ) という。
非負整数N N N とσ = ( o 1 , … , o N ) ∈ O N \sigma=(o_1,\dots,o_N)\in\mathcal O^{N} σ = ( o 1 , … , o N ) ∈ O N の組を、長さN N N の操作列 (operation sequence ) という。操作列σ \sigma σ に対し、状態の列を
D i = δ ( D i − 1 , o i ) ( 1 ≤ i ≤ N ) D_i=\delta(D_{i-1},o_i)\qquad(1\le i\le N) D i = δ ( D i − 1 , o i ) ( 1 ≤ i ≤ N ) によって定め、第i i i 操作の実費用 (actual cost ) をc i = c ( D i − 1 , o i ) c_i=c(D_{i-1},o_i) c i = c ( D i − 1 , o i ) と書く。∑ i = 1 N c i \sum_{i=1}^{N}c_i ∑ i = 1 N c i をσ \sigma σ の総費用 (total cost ) という。D 0 D_0 D 0 から始まる何らかの操作列の状態の列に現れる状態を到達可能 (reachable ) という。D 0 D_0 D 0 自身は長さ0 0 0 の操作列によって到達可能である。
操作列σ = ( o 1 , … , o N ) \sigma=(o_1,\dots,o_N) σ = ( o 1 , … , o N ) と0 ≤ k ≤ N 0\le k\le N 0 ≤ k ≤ N に対し、σ ∣ k = ( o 1 , … , o k ) \sigma|_k=(o_1,\dots,o_k) σ ∣ k = ( o 1 , … , o k ) をσ \sigma σ の接頭列 (prefix ) という。接頭列の状態の列と実費用は、σ \sigma σ のそれの最初のk k k 項に一致する。
定義 1.2. 操作系M \mathcal M M について、次の三つを区別する。
到達可能な状態D D D と操作o ∈ O o\in\mathcal O o ∈ O にわたるc ( D , o ) c(D,o) c ( D , o ) の上限を、一つの操作の最悪計算量 (worst-case cost ) という。これは単一の操作の実費用についての量であり、操作列の長さに依存しない。
O \mathcal O O 上の確率分布、すなわち∑ o ∈ O P ( o ) = 1 \sum_{o\in\mathcal O}\mathbb P(o)=1 ∑ o ∈ O P ( o ) = 1 を満たす非負実数の族( P ( o ) ) o ∈ O (\mathbb P(o))_{o\in\mathcal O} ( P ( o ) ) o ∈ O を一つ定めたとき、状態D D D における
E [ c ( D , ⋅ ) ] = ∑ o ∈ O P ( o ) c ( D , o ) \mathbb E\bigl[c(D,\cdot)\bigr]=\sum_{o\in\mathcal O}\mathbb P(o)\,c(D,o) E [ c ( D , ⋅ ) ] = o ∈ O ∑ P ( o ) c ( D , o )
を、その分布に関する一つの操作の平均計算量 (average cost ) という。これは確率分布を定めて初めて意味をもつ量である。
写像T ^ : O → [ 0 , ∞ ) \hat T:\mathcal O\to[0,\infty) T ^ : O → [ 0 , ∞ ) がM \mathcal M M の償却計算量の上界 (amortized cost upper bound ) であるとは、D 0 D_0 D 0 から始まる任意の有限操作列σ = ( o 1 , … , o N ) \sigma=(o_1,\dots,o_N) σ = ( o 1 , … , o N ) に対し
∑ i = 1 N c i ≤ ∑ i = 1 N T ^ ( o i ) \sum_{i=1}^{N}c_i\ \le\ \sum_{i=1}^{N}\hat T(o_i) i = 1 ∑ N c i ≤ i = 1 ∑ N T ^ ( o i )
が成り立つことをいう。とくにT ^ \hat T T ^ が定数T T T であるとき、この条件は、任意の長さN N N の操作列について∑ i = 1 N c i ≤ T N \sum_{i=1}^{N}c_i\le TN ∑ i = 1 N c i ≤ T N が成り立つことである。償却計算量は確率分布を用いず、すべての操作列にわたる最悪の場合についての主張である。
実費用は、「アルゴリズムの正当性と計算量」が定める意味での基本操作の実行回数と読む。三つの量は互いに別のものである。とくに、償却計算量の上界が定数であっても、単一の操作の最悪計算量が有界であるとは限らない。本記事の二つの例はいずれもそのような場合である。
定数の償却計算量の上界が得られると、操作の回数についての線形な上界が直ちに従う。
命題 1.3. 操作系M \mathcal M M に対し、D 0 D_0 D 0 から始まる長さN N N の操作列の総費用の最大値をC ( N ) C(N) C ( N ) と書く。O \mathcal O O は空でない有限集合であるから長さN N N の操作列は有限個であり、この最大値は存在する。定数T ≥ 0 T\ge0 T ≥ 0 が定義 1.2 の意味の償却計算量の上界であるならば、すべてのN ≥ 0 N\ge0 N ≥ 0 についてC ( N ) ≤ T N C(N)\le TN C ( N ) ≤ T N が成り立ち、§D2.8 定義 2.2 の意味でC ( N ) = O ( N ) C(N)=O(N) C ( N ) = O ( N ) である。
証明. 長さN N N の操作列σ = ( o 1 , … , o N ) \sigma=(o_1,\dots,o_N) σ = ( o 1 , … , o N ) をとる。T ^ \hat T T ^ が定数T T T である場合の償却計算量の上界の定義により∑ i = 1 N c i ≤ ∑ i = 1 N T = T N \sum_{i=1}^{N}c_i\le\sum_{i=1}^{N}T=TN ∑ i = 1 N c i ≤ ∑ i = 1 N T = T N である。σ \sigma σ は任意であったから、最大値についてもC ( N ) ≤ T N C(N)\le TN C ( N ) ≤ T N である。
§D2.8 定義 2.2 の意味でC ( N ) = O ( N ) C(N)=O(N) C ( N ) = O ( N ) であることを確かめる。c = T + 1 > 0 c=T+1>0 c = T + 1 > 0 とn 0 = 0 n_0=0 n 0 = 0 をとると、すべてのN ≥ n 0 N\ge n_0 N ≥ n 0 について0 ≤ C ( N ) ≤ T N ≤ c N 0\le C(N)\le TN\le cN 0 ≤ C ( N ) ≤ T N ≤ c N が成り立つ。▨
単一の操作の最悪計算量M M M が有限であれば、C ( N ) ≤ M N C(N)\le MN C ( N ) ≤ M N という上界を直ちに得ることができる。本記事の二つの例ではこのM M M が有限でないので、この自明な評価を用いることができない。三つの方法は、いずれもこの場合に線形な上界を与えるための道具である。
2 会計法
会計法では、各操作に実費用とは別の課金額を割り当て、課金額が実費用を上回った分を蓄えとして繰り越す。蓄えが尽きないかぎり、課金額の総和が総費用の上界になる。次の定理は、この議論が成り立つための条件が「蓄えがどの時点でも非負である」ことと同値であることを述べる。
定理 2.1 (会計法). 操作系M \mathcal M M と写像a ^ : O → [ 0 , ∞ ) \hat a:\mathcal O\to[0,\infty) a ^ : O → [ 0 , ∞ ) をとる。a ^ \hat a a ^ を課金額 という。D 0 D_0 D 0 から始まる操作列σ = ( o 1 , … , o N ) \sigma=(o_1,\dots,o_N) σ = ( o 1 , … , o N ) と0 ≤ k ≤ N 0\le k\le N 0 ≤ k ≤ N に対し、信用残高 を
R k ( σ ) = ∑ i = 1 k ( a ^ ( o i ) − c i ) R_k(\sigma)=\sum_{i=1}^{k}\bigl(\hat a(o_i)-c_i\bigr) R k ( σ ) = i = 1 ∑ k ( a ^ ( o i ) − c i ) と定める。このとき次の二条件は同値である。
a ^ \hat a a ^ は定義 1.2 の意味の償却計算量の上界である。
D 0 D_0 D 0 から始まる任意の有限操作列σ \sigma σ と、0 ≤ k ≤ N 0\le k\le N 0 ≤ k ≤ N を満たす任意のk k k に対しR k ( σ ) ≥ 0 R_k(\sigma)\ge0 R k ( σ ) ≥ 0 が成り立つ。
証明. (2) ⇒ \Rightarrow ⇒ (1) を示す。D 0 D_0 D 0 から始まる操作列σ = ( o 1 , … , o N ) \sigma=(o_1,\dots,o_N) σ = ( o 1 , … , o N ) をとる。(2) をk = N k=N k = N に適用するとR N ( σ ) ≥ 0 R_N(\sigma)\ge0 R N ( σ ) ≥ 0 、すなわち
∑ i = 1 N a ^ ( o i ) − ∑ i = 1 N c i ≥ 0 \sum_{i=1}^{N}\hat a(o_i)-\sum_{i=1}^{N}c_i\ \ge\ 0 i = 1 ∑ N a ^ ( o i ) − i = 1 ∑ N c i ≥ 0 である。これは償却計算量の上界の定義そのものである。
(1) ⇒ \Rightarrow ⇒ (2) を示す。D 0 D_0 D 0 から始まる操作列σ = ( o 1 , … , o N ) \sigma=(o_1,\dots,o_N) σ = ( o 1 , … , o N ) と0 ≤ k ≤ N 0\le k\le N 0 ≤ k ≤ N をとる。接頭列σ ∣ k = ( o 1 , … , o k ) \sigma|_k=(o_1,\dots,o_k) σ ∣ k = ( o 1 , … , o k ) もD 0 D_0 D 0 から始まる有限操作列であり、定義 1.1 のとおり、その第i i i 操作の実費用はσ \sigma σ の第i i i 操作の実費用c i c_i c i に等しい。(1) をσ ∣ k \sigma|_k σ ∣ k へ適用すると
∑ i = 1 k c i ≤ ∑ i = 1 k a ^ ( o i ) \sum_{i=1}^{k}c_i\ \le\ \sum_{i=1}^{k}\hat a(o_i) i = 1 ∑ k c i ≤ i = 1 ∑ k a ^ ( o i ) であり、これはR k ( σ ) ≥ 0 R_k(\sigma)\ge0 R k ( σ ) ≥ 0 にほかならない。▨
定理 2.1 の同値性は、信用残高の非負性を末尾でだけ確かめても足りないことを示している。償却計算量の上界は任意の長さの操作列についての主張であり、長さk k k の操作列は長さN N N の操作列の接頭列としても現れるからである。
3 ポテンシャル法
ポテンシャル法では、蓄えを操作列の履歴ではなく状態の関数として表す。
定理 3.1 (ポテンシャル法). 操作系M \mathcal M M と写像Φ : D → R \Phi:\mathcal D\to\mathbb R Φ : D → R をとる。Φ \Phi Φ をポテンシャル関数 という。D 0 D_0 D 0 から始まる操作列σ = ( o 1 , … , o N ) \sigma=(o_1,\dots,o_N) σ = ( o 1 , … , o N ) に対し、第i i i 操作の償却費用 を
c ^ i = c i + Φ ( D i ) − Φ ( D i − 1 ) \hat c_i=c_i+\Phi(D_i)-\Phi(D_{i-1}) c ^ i = c i + Φ ( D i ) − Φ ( D i − 1 ) と定める。このとき次が成り立つ。
任意のN ≥ 0 N\ge0 N ≥ 0 に対し
∑ i = 1 N c ^ i = ∑ i = 1 N c i + Φ ( D N ) − Φ ( D 0 ) \sum_{i=1}^{N}\hat c_i=\sum_{i=1}^{N}c_i+\Phi(D_N)-\Phi(D_0) i = 1 ∑ N c ^ i = i = 1 ∑ N c i + Φ ( D N ) − Φ ( D 0 )
が成り立つ。
Φ ( D 0 ) = 0 \Phi(D_0)=0 Φ ( D 0 ) = 0 であり、かつすべての到達可能な状態D D D でΦ ( D ) ≥ 0 \Phi(D)\ge0 Φ ( D ) ≥ 0 であるとする。さらに写像T ^ : O → [ 0 , ∞ ) \hat T:\mathcal O\to[0,\infty) T ^ : O → [ 0 , ∞ ) が、D 0 D_0 D 0 から始まる任意の操作列とその任意の添字i i i についてc ^ i ≤ T ^ ( o i ) \hat c_i\le\hat T(o_i) c ^ i ≤ T ^ ( o i ) を満たすとする。このときT ^ \hat T T ^ はM \mathcal M M の償却計算量の上界である。
(2) の仮定のうち「Φ ( D 0 ) = 0 \Phi(D_0)=0 Φ ( D 0 ) = 0 かつ到達可能な状態でΦ ≥ 0 \Phi\ge0 Φ ≥ 0 」は、「D 0 D_0 D 0 から始まる任意の操作列でΦ ( D N ) ≥ Φ ( D 0 ) \Phi(D_N)\ge\Phi(D_0) Φ ( D N ) ≥ Φ ( D 0 ) 」へ弱めることができる。
証明. (1) を示す。償却費用の定義により
∑ i = 1 N c ^ i = ∑ i = 1 N c i + ∑ i = 1 N ( Φ ( D i ) − Φ ( D i − 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) i = 1 ∑ N c ^ i = i = 1 ∑ N c i + i = 1 ∑ N ( Φ ( D i ) − Φ ( D i − 1 ) ) である。右辺の第二項は隣り合う項が打ち消し合う望遠鏡和であり、N N N についての帰納法によりΦ ( D N ) − Φ ( D 0 ) \Phi(D_N)-\Phi(D_0) Φ ( D N ) − Φ ( D 0 ) に等しい。実際、N = 0 N=0 N = 0 のとき両辺は0 0 0 である。N − 1 N-1 N − 1 まで成り立つとすると、第二項は( Φ ( D N − 1 ) − Φ ( D 0 ) ) + ( Φ ( D N ) − Φ ( D N − 1 ) ) = Φ ( D N ) − Φ ( D 0 ) \bigl(\Phi(D_{N-1})-\Phi(D_0)\bigr)+\bigl(\Phi(D_N)-\Phi(D_{N-1})\bigr)=\Phi(D_N)-\Phi(D_0) ( Φ ( D N − 1 ) − Φ ( D 0 ) ) + ( Φ ( D N ) − Φ ( D N − 1 ) ) = Φ ( D N ) − Φ ( D 0 ) である。
(3) を先に示す。D 0 D_0 D 0 から始まる操作列σ = ( o 1 , … , o N ) \sigma=(o_1,\dots,o_N) σ = ( o 1 , … , o N ) についてΦ ( D N ) ≥ Φ ( D 0 ) \Phi(D_N)\ge\Phi(D_0) Φ ( D N ) ≥ Φ ( D 0 ) が成り立つとする。(1) を移項すると
∑ i = 1 N c i = ∑ i = 1 N c ^ i + Φ ( D 0 ) − Φ ( D N ) ≤ ∑ i = 1 N c ^ 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 i = 1 ∑ N c i = i = 1 ∑ N c ^ i + Φ ( D 0 ) − Φ ( D N ) ≤ i = 1 ∑ N c ^ i である。仮定c ^ i ≤ T ^ ( o i ) \hat c_i\le\hat T(o_i) c ^ i ≤ T ^ ( o i ) を加えると∑ i = 1 N c i ≤ ∑ i = 1 N T ^ ( o i ) \sum_{i=1}^{N}c_i\le\sum_{i=1}^{N}\hat T(o_i) ∑ i = 1 N c i ≤ ∑ i = 1 N T ^ ( o i ) を得る。σ \sigma σ は任意であったからT ^ \hat T T ^ は償却計算量の上界である。
(2) を示す。D N D_N D N はD 0 D_0 D 0 から始まる操作列によって到達可能であるから、仮定によりΦ ( D N ) ≥ 0 = Φ ( D 0 ) \Phi(D_N)\ge0=\Phi(D_0) Φ ( D N ) ≥ 0 = Φ ( D 0 ) である。よって(3) の条件が満たされ、同項により主張が従う。▨
4 二進カウンタ
定義 4.1. 状態集合をD = Z ≥ 0 \mathcal D=\mathbb Z_{\ge0} D = Z ≥ 0 、初期状態をD 0 = 0 D_0=0 D 0 = 0 とする。非負整数x x x の二進表記をx = ∑ j ≥ 0 x j 2 j x=\sum_{j\ge0}x_j2^{j} x = ∑ j ≥ 0 x j 2 j (x j ∈ { 0 , 1 } x_j\in\{0,1\} x j ∈ { 0 , 1 } であり、有限個を除いてx j = 0 x_j=0 x j = 0 )と書き、x j x_j x j をx x x の第j j j 桁という。二進表記は一意である。
操作の集合をO = { i n c } \mathcal O=\{\mathrm{inc}\} O = { inc } とし、遷移をδ ( x , i n c ) = x + 1 \delta(x,\mathrm{inc})=x+1 δ ( x , inc ) = x + 1 、実費用を
c ( x , i n c ) = ∣ { j ≥ 0 : x j ≠ ( x + 1 ) j } ∣ c(x,\mathrm{inc})=\bigl\lvert\{j\ge0:\ x_j\ne(x+1)_j\}\bigr\rvert c ( x , inc ) = { j ≥ 0 : x j = ( x + 1 ) j } と定める。すなわち増加操作の実費用は、書き換わる桁の個数である。
x x x の二進表記に現れる1 1 1 の個数をβ ( x ) = ∑ j ≥ 0 x j \beta(x)=\sum_{j\ge0}x_j β ( x ) = ∑ j ≥ 0 x j と書く。また、x 0 = x 1 = ⋯ = x t − 1 = 1 x_0=x_1=\dots=x_{t-1}=1 x 0 = x 1 = ⋯ = x t − 1 = 1 かつx t = 0 x_t=0 x t = 0 を満たす唯一の非負整数t t t をt ( x ) t(x) t ( x ) と書き、x x x の末尾の1 1 1 の個数 (number of trailing ones ) という。有限個を除いてx j = 0 x_j=0 x j = 0 であるから、そのようなt t t はただ一つ存在する。
補題 4.2. 非負整数x x x に対しt = t ( x ) t=t(x) t = t ( x ) と置くと、次が成り立つ。
x x x とx + 1 x+1 x + 1 の二進表記が異なる桁は第0 0 0 桁から第t t t 桁までであり、c ( x , i n c ) = t + 1 c(x,\mathrm{inc})=t+1 c ( x , inc ) = t + 1 である。
β ( x + 1 ) = β ( x ) − t + 1 \beta(x+1)=\beta(x)-t+1 β ( x + 1 ) = β ( x ) − t + 1 である。
非負整数j j j に対し、x x x とx + 1 x+1 x + 1 の第j j j 桁が異なることと2 j ∣ x + 1 2^{j}\mid x+1 2 j ∣ x + 1 であることは同値である。
証明. t = t ( x ) t=t(x) t = t ( x ) の定義によりx 0 = ⋯ = x t − 1 = 1 x_0=\dots=x_{t-1}=1 x 0 = ⋯ = x t − 1 = 1 かつx t = 0 x_t=0 x t = 0 である。よって
x = ∑ j = 0 t − 1 2 j + ∑ j > t x j 2 j = ( 2 t − 1 ) + ∑ j > t x j 2 j , x + 1 = 2 t + ∑ j > t x j 2 j x=\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} x = j = 0 ∑ t − 1 2 j + j > t ∑ x j 2 j = ( 2 t − 1 ) + j > t ∑ x j 2 j , x + 1 = 2 t + j > t ∑ x j 2 j である。右端の式は、第0 0 0 桁から第t − 1 t-1 t − 1 桁までが0 0 0 、第t t t 桁が1 1 1 、第j j j 桁(j > t j>t j > t )がx j x_j x j である二進表記であり、二進表記の一意性により( x + 1 ) j (x+1)_j ( x + 1 ) j はこのとおりである。
(1) を示す。j < t j<t j < t ではx j = 1 x_j=1 x j = 1 かつ( x + 1 ) j = 0 (x+1)_j=0 ( x + 1 ) j = 0 、j = t j=t j = t ではx t = 0 x_t=0 x t = 0 かつ( x + 1 ) t = 1 (x+1)_t=1 ( x + 1 ) t = 1 、j > t j>t j > t ではx j = ( x + 1 ) j x_j=(x+1)_j x j = ( x + 1 ) j である。よって異なる桁はj = 0 , 1 , … , t j=0,1,\dots,t j = 0 , 1 , … , t のちょうどt + 1 t+1 t + 1 個であり、c ( x , i n c ) = t + 1 c(x,\mathrm{inc})=t+1 c ( x , inc ) = t + 1 である。
(2) を示す。β ( x ) = t + ∑ j > t x j \beta(x)=t+\sum_{j>t}x_j β ( x ) = t + ∑ j > t x j でありβ ( x + 1 ) = 1 + ∑ j > t x j \beta(x+1)=1+\sum_{j>t}x_j β ( x + 1 ) = 1 + ∑ j > t x j である。差をとるとβ ( x + 1 ) − β ( x ) = 1 − t \beta(x+1)-\beta(x)=1-t β ( x + 1 ) − β ( x ) = 1 − t を得る。
(3) を示す。(1) により、x x x とx + 1 x+1 x + 1 の第j j j 桁が異なることはj ≤ t j\le t j ≤ t と同値である。一方、上の表示からx + 1 = 2 t ( 1 + ∑ j > t x j 2 j − t ) x+1=2^{t}\bigl(1+\sum_{j>t}x_j2^{j-t}\bigr) x + 1 = 2 t ( 1 + ∑ j > t x j 2 j − t ) であり、括弧の中は奇数である。したがって2 j ∣ x + 1 2^{j}\mid x+1 2 j ∣ x + 1 であることとj ≤ t j\le t j ≤ t であることは同値である。二つの同値を合わせて主張を得る。▨
以下、D 0 = 0 D_0=0 D 0 = 0 から始まる長さN N N の操作列を考える。操作は一種類しかないので、操作列は長さだけで決まり、D i = i D_i=i D i = i である。
4.1 集計法
集計法は、総費用の和を直接評価する方法である。ここでは桁ごとに数え直すことによって和を求める。
命題 4.3. D 0 = 0 D_0=0 D 0 = 0 から始まる長さN N N の操作列の総費用は
∑ i = 1 N c i = ∑ j ≥ 0 ⌊ N 2 j ⌋ \sum_{i=1}^{N}c_i=\sum_{j\ge0}\Bigl\lfloor\frac{N}{2^{j}}\Bigr\rfloor i = 1 ∑ N c i = j ≥ 0 ∑ ⌊ 2 j N ⌋ であり、この値は2 N 2N 2 N 以下である。
証明. D i − 1 = i − 1 D_{i-1}=i-1 D i − 1 = i − 1 であるからc i = c ( i − 1 , i n c ) = ∣ { j ≥ 0 : ( i − 1 ) j ≠ i j } ∣ c_i=c(i-1,\mathrm{inc})=\lvert\{j\ge0:\ (i-1)_j\ne i_j\}\rvert c i = c ( i − 1 , inc ) = ∣{ j ≥ 0 : ( i − 1 ) j = i j }∣ である。j ≥ 0 j\ge0 j ≥ 0 と1 ≤ i ≤ N 1\le i\le N 1 ≤ i ≤ N について、( i − 1 ) j ≠ i j (i-1)_j\ne i_j ( i − 1 ) j = i j が成り立つとき1 1 1 、そうでないとき0 0 0 をとる量を考え、その総和を二通りに数える。
i i i を先に固定してj j j について加えると、和は∑ i = 1 N c i \sum_{i=1}^{N}c_i ∑ i = 1 N c i である。j j j を先に固定してi i i について加えると、補題 4.2 (3) により
∣ { i : 1 ≤ i ≤ N , ( i − 1 ) j ≠ i j } ∣ = ∣ { i : 1 ≤ i ≤ N , 2 j ∣ i } ∣ = ⌊ N 2 j ⌋ \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 { i : 1 ≤ i ≤ N , ( i − 1 ) j = i j } = { i : 1 ≤ i ≤ N , 2 j ∣ i } = ⌊ 2 j N ⌋ である。2 j > N 2^{j}>N 2 j > N のときこの値は0 0 0 であるから、j j j についての和は有限個の項だけからなり、和の順序を入れ替えることができる。よって主張の等式を得る。
評価については、⌊ N / 2 j ⌋ ≤ N / 2 j \lfloor N/2^{j}\rfloor\le N/2^{j} ⌊ N / 2 j ⌋ ≤ N / 2 j であり、2 j > N 2^{j}>N 2 j > N の項が0 0 0 であることから、2 J ≤ N < 2 J + 1 2^{J}\le N<2^{J+1} 2 J ≤ N < 2 J + 1 を満たす非負整数J J J (N ≥ 1 N\ge1 N ≥ 1 のとき)をとって
∑ j ≥ 0 ⌊ N 2 j ⌋ ≤ ∑ j = 0 J N 2 j = N ⋅ 1 − 2 − ( J + 1 ) 1 − 2 − 1 < 2 N \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 j ≥ 0 ∑ ⌊ 2 j N ⌋ ≤ j = 0 ∑ J 2 j N = N ⋅ 1 − 2 − 1 1 − 2 − ( J + 1 ) < 2 N である。N = 0 N=0 N = 0 のときは両辺とも0 0 0 である。▨
4.2 会計法
各増加操作に2 2 2 を課金する。0 0 0 から1 1 1 へ変わる桁の書き換えに1 1 1 を払い、残りの1 1 1 をその桁へ預ける。その桁が後に1 1 1 から0 0 0 へ戻るときの書き換えは、預けてある分で支払う。この見方によれば、信用残高は現在1 1 1 である桁の個数に等しいはずである。次の命題はそれを等式として確かめる。
命題 4.4. 課金額をa ^ ( i n c ) = 2 \hat a(\mathrm{inc})=2 a ^ ( inc ) = 2 と定める。D 0 = 0 D_0=0 D 0 = 0 から始まる長さN N N の操作列σ \sigma σ に対し、すべての0 ≤ k ≤ N 0\le k\le N 0 ≤ k ≤ N で
R k ( σ ) = β ( D k ) R_k(\sigma)=\beta(D_k) R k ( σ ) = β ( D k ) が成り立つ。とくにR k ( σ ) ≥ 0 R_k(\sigma)\ge0 R k ( σ ) ≥ 0 である。したがって定理 2.1 によりa ^ \hat a a ^ は償却計算量の上界であり、総費用は2 N 2N 2 N 以下である。
証明. k k k についての帰納法で示す。k = 0 k=0 k = 0 のときR 0 ( σ ) = 0 R_0(\sigma)=0 R 0 ( σ ) = 0 でありβ ( D 0 ) = β ( 0 ) = 0 \beta(D_0)=\beta(0)=0 β ( D 0 ) = β ( 0 ) = 0 であるから等式が成り立つ。
k ≥ 1 k\ge1 k ≥ 1 とし、R k − 1 ( σ ) = β ( D k − 1 ) R_{k-1}(\sigma)=\beta(D_{k-1}) R k − 1 ( σ ) = β ( D k − 1 ) を仮定する。信用残高の定義により
R k ( σ ) − R k − 1 ( σ ) = a ^ ( i n c ) − c k = 2 − c ( D k − 1 , i n c ) R_k(\sigma)-R_{k-1}(\sigma)=\hat a(\mathrm{inc})-c_k=2-c(D_{k-1},\mathrm{inc}) R k ( σ ) − R k − 1 ( σ ) = a ^ ( inc ) − c k = 2 − c ( D k − 1 , inc ) であり、補題 4.2 (1) によりc ( D k − 1 , i n c ) = t ( D k − 1 ) + 1 c(D_{k-1},\mathrm{inc})=t(D_{k-1})+1 c ( D k − 1 , inc ) = t ( D k − 1 ) + 1 であるから、この差は1 − t ( D k − 1 ) 1-t(D_{k-1}) 1 − t ( D k − 1 ) である。一方、D k = D k − 1 + 1 D_k=D_{k-1}+1 D k = D k − 1 + 1 と補題 4.2 (2) により
β ( D k ) − β ( D k − 1 ) = 1 − t ( D k − 1 ) \beta(D_k)-\beta(D_{k-1})=1-t(D_{k-1}) β ( D k ) − β ( D k − 1 ) = 1 − t ( D k − 1 ) である。二つの差が一致するので、帰納法の仮定と合わせてR k ( σ ) = β ( D k ) R_k(\sigma)=\beta(D_k) R k ( σ ) = β ( D k ) を得る。
β \beta β は桁の個数であるから非負であり、R k ( σ ) ≥ 0 R_k(\sigma)\ge0 R k ( σ ) ≥ 0 である。定理 2.1 (2) から 1 への含意によりa ^ \hat a a ^ は償却計算量の上界であり、長さN N N の操作列の総費用は∑ i = 1 N a ^ ( i n c ) = 2 N \sum_{i=1}^{N}\hat a(\mathrm{inc})=2N ∑ i = 1 N a ^ ( inc ) = 2 N 以下である。▨
4.3 ポテンシャル法
命題 4.5. Φ ( x ) = β ( x ) \Phi(x)=\beta(x) Φ ( x ) = β ( x ) と定める。このときΦ ( D 0 ) = 0 \Phi(D_0)=0 Φ ( D 0 ) = 0 であり、すべての状態でΦ ≥ 0 \Phi\ge0 Φ ≥ 0 である。さらにD 0 = 0 D_0=0 D 0 = 0 から始まる任意の操作列の任意の添字i i i についてc ^ i = 2 \hat c_i=2 c ^ i = 2 が成り立つ。したがって定理 3.1 (2) によりT ^ ( i n c ) = 2 \hat T(\mathrm{inc})=2 T ^ ( inc ) = 2 は償却計算量の上界であり、長さN N N の操作列の総費用は2 N 2N 2 N 以下である。
証明. Φ ( D 0 ) = β ( 0 ) = 0 \Phi(D_0)=\beta(0)=0 Φ ( D 0 ) = β ( 0 ) = 0 であり、β \beta β は非負整数であるからΦ ≥ 0 \Phi\ge0 Φ ≥ 0 である。償却費用は、補題 4.2 (1) と 2 により
c ^ i = c i + Φ ( D i ) − Φ ( D i − 1 ) = ( t ( D i − 1 ) + 1 ) + ( 1 − t ( D i − 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 = c i + Φ ( D i ) − Φ ( D i − 1 ) = ( t ( D i − 1 ) + 1 ) + ( 1 − t ( D i − 1 ) ) = 2 である。よってc ^ i ≤ T ^ ( i n c ) = 2 \hat c_i\le\hat T(\mathrm{inc})=2 c ^ i ≤ T ^ ( inc ) = 2 が成り立ち、定理 3.1 (2) の仮定がすべて満たされる。▨
命題 4.6. 任意の正の整数M M M に対し、到達可能な状態x x x が存在してc ( x , i n c ) ≥ M c(x,\mathrm{inc})\ge M c ( x , inc ) ≥ M が成り立つ。
証明. x = 2 M − 1 x=2^{M}-1 x = 2 M − 1 と置く。D 0 = 0 D_0=0 D 0 = 0 からx x x 回の増加操作を行うと状態はx x x になるので、x x x は到達可能である。x x x の二進表記は第0 0 0 桁から第M − 1 M-1 M − 1 桁までが1 1 1 、第M M M 桁以上が0 0 0 であるからt ( x ) = M t(x)=M t ( x ) = M であり、補題 4.2 (1) によりc ( x , i n c ) = M + 1 ≥ M c(x,\mathrm{inc})=M+1\ge M c ( x , inc ) = M + 1 ≥ M である。▨
例 4.7 (二進カウンタの八回の増加の手計算). D 0 = 0 D_0=0 D 0 = 0 からN = 8 N=8 N = 8 回の増加操作を行う。各操作の前後の二進表記と実費用を書き下す。
0 → 1 0\to1 0 → 1 は000 → 001 000\to001 000 → 001 で書き換わる桁は第0 0 0 桁だけでありc 1 = 1 c_1=1 c 1 = 1 である。1 → 2 1\to2 1 → 2 は001 → 010 001\to010 001 → 010 で第0 0 0 桁と第1 1 1 桁が書き換わりc 2 = 2 c_2=2 c 2 = 2 である。2 → 3 2\to3 2 → 3 は010 → 011 010\to011 010 → 011 でc 3 = 1 c_3=1 c 3 = 1 、3 → 4 3\to4 3 → 4 は011 → 100 011\to100 011 → 100 で第0 0 0 、1 1 1 、2 2 2 桁が書き換わりc 4 = 3 c_4=3 c 4 = 3 、4 → 5 4\to5 4 → 5 は100 → 101 100\to101 100 → 101 でc 5 = 1 c_5=1 c 5 = 1 、5 → 6 5\to6 5 → 6 は101 → 110 101\to110 101 → 110 でc 6 = 2 c_6=2 c 6 = 2 、6 → 7 6\to7 6 → 7 は110 → 111 110\to111 110 → 111 でc 7 = 1 c_7=1 c 7 = 1 、7 → 8 7\to8 7 → 8 は0111 → 1000 0111\to1000 0111 → 1000 で第0 0 0 から第3 3 3 桁までが書き換わりc 8 = 4 c_8=4 c 8 = 4 である。
総費用は1 + 2 + 1 + 3 + 1 + 2 + 1 + 4 = 15 1+2+1+3+1+2+1+4=15 1 + 2 + 1 + 3 + 1 + 2 + 1 + 4 = 15 である。
集計法との照合 。命題 4.3 の式は
⌊ 8 1 ⌋ + ⌊ 8 2 ⌋ + ⌊ 8 4 ⌋ + ⌊ 8 8 ⌋ + ⌊ 8 16 ⌋ + ⋯ = 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 ⌊ 1 8 ⌋ + ⌊ 2 8 ⌋ + ⌊ 4 8 ⌋ + ⌊ 8 8 ⌋ + ⌊ 16 8 ⌋ + ⋯ = 8 + 4 + 2 + 1 + 0 + ⋯ = 15 を与え、手計算の値と一致する。上界は2 ⋅ 8 = 16 2\cdot8=16 2 ⋅ 8 = 16 であり、15 ≤ 16 15\le16 15 ≤ 16 である。
会計法との照合 。課金額の総和は2 ⋅ 8 = 16 2\cdot8=16 2 ⋅ 8 = 16 であるから、信用残高はR 8 = 16 − 15 = 1 R_8=16-15=1 R 8 = 16 − 15 = 1 である。一方D 8 = 8 D_8=8 D 8 = 8 の二進表記は1000 1000 1000 でありβ ( 8 ) = 1 \beta(8)=1 β ( 8 ) = 1 である。命題 4.4 の等式R 8 = β ( D 8 ) R_8=\beta(D_8) R 8 = β ( D 8 ) が成り立つ。
ポテンシャル法との照合 。償却費用の総和は2 ⋅ 8 = 16 2\cdot8=16 2 ⋅ 8 = 16 である。定理 3.1 (1) により
∑ i = 1 8 c i = ∑ i = 1 8 c ^ i + Φ ( D 0 ) − Φ ( D 8 ) = 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 i = 1 ∑ 8 c i = i = 1 ∑ 8 c ^ i + Φ ( D 0 ) − Φ ( D 8 ) = 16 + 0 − 1 = 15 であり、手計算の値と一致する。
単一の操作の実費用 。この操作列に現れた実費用の最大値はc 8 = 4 c_8=4 c 8 = 4 である。命題 4.6 のとおり、操作列を延ばせばこの値はいくらでも大きくなる。実際、x = 15 x=15 x = 15 から16 16 16 への増加の実費用は5 5 5 である。
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\} D = {( n , m ) ∈ Z ≥ 0 × Z ≥ 0 : n ≤ m } とし、初期状態をD 0 = ( 0 , 0 ) D_0=(0,0) D 0 = ( 0 , 0 ) とする。n n n は格納されている要素の個数、m m m は確保されている領域の大きさを表し、m m m を容量 (capacity ) という。
操作の集合をO = { a p p } \mathcal O=\{\mathrm{app}\} O = { app } とする。ここでa p p \mathrm{app} app は末尾への追加である。遷移と実費用を
δ ( ( n , m ) , a p p ) = { ( n + 1 , m ) ( n < m ) , ( n + 1 , max { 1 , 2 m } ) ( n = m ) , c ( ( n , m ) , a p p ) = { 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 , m ) , app ) = { ( n + 1 , m ) ( n + 1 , max { 1 , 2 m }) ( n < m ) , ( n = m ) , c ( ( n , m ) , app ) = { 1 n + 1 ( n < m ) , ( n = m ) と定める。n = m n=m n = m の場合を再確保 (reallocation ) という。再確保では、容量max { 1 , 2 m } \max\{1,2m\} max { 1 , 2 m } の新しい領域を確保して既存のn n n 個の要素を複写し、その後に末尾へ一つ書き込む。複写の費用をn n n 、書き込みの費用を1 1 1 と数えるので、実費用はn + 1 n+1 n + 1 である。n < m n<m n < m の場合は書き込みだけであり、実費用は1 1 1 である。
δ \delta δ の値がD \mathcal D D に属することを確かめる。n < m n<m n < m のときはn + 1 ≤ m n+1\le m n + 1 ≤ m である。n = m = 0 n=m=0 n = m = 0 のときは( 1 , 1 ) (1,1) ( 1 , 1 ) であり1 ≤ 1 1\le1 1 ≤ 1 である。n = m ≥ 1 n=m\ge1 n = m ≥ 1 のときは( m + 1 , 2 m ) (m+1,2m) ( m + 1 , 2 m ) であり、m ≥ 1 m\ge1 m ≥ 1 よりm + 1 ≤ 2 m m+1\le2m m + 1 ≤ 2 m である。
補題 5.2. D 0 = ( 0 , 0 ) D_0=(0,0) D 0 = ( 0 , 0 ) から始まる長さN N N の操作列についてD k = ( n k , m k ) D_k=(n_k,m_k) D k = ( n k , m k ) と書く。このとき次が成り立つ。
すべての0 ≤ k ≤ N 0\le k\le N 0 ≤ k ≤ N でn k = k n_k=k n k = k である。
m 0 = 0 m_0=0 m 0 = 0 であり、1 ≤ k ≤ N 1\le k\le N 1 ≤ k ≤ N のときm k m_k m k はk k k 以上の2 2 2 の冪のうち最小のものである。
1 ≤ k ≤ N 1\le k\le N 1 ≤ k ≤ N について、第k k k 操作が再確保であることと、k = 1 k=1 k = 1 であるかk − 1 k-1 k − 1 が2 2 2 の冪であることは同値である。
すべての0 ≤ k ≤ N 0\le k\le N 0 ≤ k ≤ N で2 n k − m k ≥ 0 2n_k-m_k\ge0 2 n k − m k ≥ 0 である。
証明. (1) を示す。δ \delta δ はいずれの場合も第一成分を1 1 1 だけ増やし、n 0 = 0 n_0=0 n 0 = 0 である。k k k についての帰納法によりn k = k n_k=k n k = k である。
(2) を示す。k k k についての帰納法で示す。k = 1 k=1 k = 1 のとき、n 0 = 0 = m 0 n_0=0=m_0 n 0 = 0 = m 0 であるから第1 1 1 操作は再確保でありm 1 = max { 1 , 0 } = 1 m_1=\max\{1,0\}=1 m 1 = max { 1 , 0 } = 1 である。1 1 1 以上の2 2 2 の冪のうち最小のものは1 1 1 であるから主張が成り立つ。
1 ≤ k < N 1\le k<N 1 ≤ k < N とし、m k m_k m k がk k k 以上の2 2 2 の冪のうち最小のものであると仮定する。(1) によりn k = k n_k=k n k = k である。
k < m k k<m_k k < m k の場合、第k + 1 k+1 k + 1 操作は再確保ではなくm k + 1 = m k m_{k+1}=m_k m k + 1 = m k である。m k m_k m k は2 2 2 の冪でありm k > k m_k>k m k > k であるからm k ≥ k + 1 m_k\ge k+1 m k ≥ k + 1 である。k + 1 k+1 k + 1 以上の2 2 2 の冪はk k k 以上でもあるから、帰納法の仮定によりそれはm k m_k m k 以上である。よってm k m_k m k はk + 1 k+1 k + 1 以上の2 2 2 の冪のうち最小のものである。
k = m k k=m_k k = m k の場合、第k + 1 k+1 k + 1 操作は再確保でありm k + 1 = 2 m k = 2 k m_{k+1}=2m_k=2k m k + 1 = 2 m k = 2 k である。k = m k k=m_k k = m k は2 2 2 の冪であるから2 k 2k 2 k も2 2 2 の冪である。k < k + 1 k<k+1 k < k + 1 であるからk k k はk + 1 k+1 k + 1 以上ではなく、k k k より大きい2 2 2 の冪のうち最小のものは2 k 2k 2 k である(k k k が2 2 2 の冪であることによる)。よって2 k 2k 2 k はk + 1 k+1 k + 1 以上の2 2 2 の冪のうち最小のものである。
(3) を示す。第k k k 操作が再確保であることはn k − 1 = m k − 1 n_{k-1}=m_{k-1} n k − 1 = m k − 1 、すなわち(1) によりk − 1 = m k − 1 k-1=m_{k-1} k − 1 = m k − 1 と同値である。k = 1 k=1 k = 1 のときは0 = m 0 = 0 0=m_0=0 0 = m 0 = 0 であるから成り立つ。k ≥ 2 k\ge2 k ≥ 2 のときはk − 1 ≥ 1 k-1\ge1 k − 1 ≥ 1 であり、(2) によりm k − 1 m_{k-1} m k − 1 はk − 1 k-1 k − 1 以上の2 2 2 の冪のうち最小のものであるから、k − 1 = m k − 1 k-1=m_{k-1} k − 1 = m k − 1 であることとk − 1 k-1 k − 1 が2 2 2 の冪であることは同値である。
(4) を示す。k = 0 k=0 k = 0 のときは2 ⋅ 0 − 0 = 0 2\cdot0-0=0 2 ⋅ 0 − 0 = 0 である。k ≥ 1 k\ge1 k ≥ 1 とする。(2) によりm k m_k m k はk k k 以上の2 2 2 の冪のうち最小のものである。m k = k m_k=k m k = k ならば2 k − m k = k ≥ 0 2k-m_k=k\ge0 2 k − m k = k ≥ 0 である。m k > k m_k>k m k > k ならば、m k ≥ k + 1 ≥ 2 m_k\ge k+1\ge2 m k ≥ k + 1 ≥ 2 であるからm k / 2 m_k/2 m k /2 も2 2 2 の冪であり、最小性によりm k / 2 < k m_k/2<k m k /2 < k である。よってm k < 2 k m_k<2k m k < 2 k 、すなわち2 n k − m k = 2 k − m k > 0 2n_k-m_k=2k-m_k>0 2 n k − m k = 2 k − m k > 0 である。▨
5.1 集計法
命題 5.3. D 0 = ( 0 , 0 ) D_0=(0,0) D 0 = ( 0 , 0 ) から始まる長さN N N の操作列の総費用について次が成り立つ。N = 0 N=0 N = 0 のとき総費用は0 0 0 、N = 1 N=1 N = 1 のとき総費用は1 1 1 である。N ≥ 2 N\ge2 N ≥ 2 のとき、2 J ≤ N − 1 < 2 J + 1 2^{J}\le N-1<2^{J+1} 2 J ≤ N − 1 < 2 J + 1 を満たす非負整数J J J をとると
∑ i = 1 N c i = N + 2 J + 1 − 1 \sum_{i=1}^{N}c_i=N+2^{J+1}-1 i = 1 ∑ N c i = N + 2 J + 1 − 1 である。いずれの場合も∑ i = 1 N c i ≤ 3 N \sum_{i=1}^{N}c_i\le3N ∑ i = 1 N c i ≤ 3 N が成り立つ。
証明. 補題 5.2 (1) によりn i − 1 = i − 1 n_{i-1}=i-1 n i − 1 = i − 1 である。第i i i 操作が再確保でなければc i = 1 c_i=1 c i = 1 、再確保であればc i = n i − 1 + 1 = i c_i=n_{i-1}+1=i c i = n i − 1 + 1 = i である。よって
∑ i = 1 N c i = 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) i = 1 ∑ N c i = N + 1 ≤ i ≤ N 第 i 操作が再確保 ∑ ( i − 1 ) である。補題 5.2 (3) により、再確保が起こる添字はi = 1 i=1 i = 1 と、i − 1 i-1 i − 1 が2 2 2 の冪であるi i i である。i = 1 i=1 i = 1 の項はi − 1 = 0 i-1=0 i − 1 = 0 であるから和に寄与しない。i − 1 = 2 j i-1=2^{j} i − 1 = 2 j かつ1 ≤ i ≤ N 1\le i\le N 1 ≤ i ≤ N を満たすj j j は2 j ≤ N − 1 2^{j}\le N-1 2 j ≤ N − 1 を満たす非負整数であるから、N ≥ 2 N\ge2 N ≥ 2 のとき
∑ 1 ≤ i ≤ N 第 i 操作が再確保 ( i − 1 ) = ∑ j = 0 J 2 j = 2 J + 1 − 1 \sum_{\substack{1\le i\le N\\ \text{第 }i\text{ 操作が再確保}}}(i-1)=\sum_{j=0}^{J}2^{j}=2^{J+1}-1 1 ≤ i ≤ N 第 i 操作が再確保 ∑ ( i − 1 ) = j = 0 ∑ J 2 j = 2 J + 1 − 1 である。N = 1 N=1 N = 1 のときは再確保はi = 1 i=1 i = 1 だけであり、和は0 0 0 である。N = 0 N=0 N = 0 のときは操作が無い。
評価を行う。N ≥ 2 N\ge2 N ≥ 2 のとき2 J ≤ N − 1 2^{J}\le N-1 2 J ≤ N − 1 であるから2 J + 1 − 1 ≤ 2 ( N − 1 ) − 1 = 2 N − 3 2^{J+1}-1\le2(N-1)-1=2N-3 2 J + 1 − 1 ≤ 2 ( N − 1 ) − 1 = 2 N − 3 であり、総費用はN + 2 N − 3 = 3 N − 3 ≤ 3 N N+2N-3=3N-3\le3N N + 2 N − 3 = 3 N − 3 ≤ 3 N 以下である。N = 1 N=1 N = 1 のとき総費用は1 ≤ 3 1\le3 1 ≤ 3 、N = 0 N=0 N = 0 のとき0 ≤ 0 0\le0 0 ≤ 0 である。▨
5.2 会計法
各追加操作に3 3 3 を課金する。1 1 1 は書き込みに使い、2 2 2 を新しく書いた要素へ預ける。次の再確保では、直前の再確保の時点で既にあった要素と、それ以降に書かれた要素とを合わせて複写するが、それ以降に書かれた要素は容量の半分だけあり、それぞれが2 2 2 ずつ預けているので複写の費用をまかなうことができる。この見通しを、量2 n − m 2n-m 2 n − m を下界とする形の不変条件として定式化する。
命題 5.4. 課金額をa ^ ( a p p ) = 3 \hat a(\mathrm{app})=3 a ^ ( app ) = 3 と定める。D 0 = ( 0 , 0 ) D_0=(0,0) D 0 = ( 0 , 0 ) から始まる長さN N N の操作列σ \sigma σ に対し、すべての0 ≤ k ≤ N 0\le k\le N 0 ≤ k ≤ N で
R k ( σ ) ≥ 2 n k − m k ≥ 0 R_k(\sigma)\ \ge\ 2n_k-m_k\ \ge\ 0 R k ( σ ) ≥ 2 n k − m k ≥ 0 が成り立つ。したがって定理 2.1 によりa ^ \hat a a ^ は償却計算量の上界であり、総費用は3 N 3N 3 N 以下である。
証明. 右側の不等式は補題 5.2 (4) である。左側の不等式をk k k についての帰納法で示す。
k = 0 k=0 k = 0 のときR 0 ( σ ) = 0 R_0(\sigma)=0 R 0 ( σ ) = 0 であり2 n 0 − m 0 = 0 2n_0-m_0=0 2 n 0 − m 0 = 0 であるから等号が成り立つ。
k ≥ 1 k\ge1 k ≥ 1 とし、R k − 1 ( σ ) ≥ 2 n k − 1 − m k − 1 R_{k-1}(\sigma)\ge2n_{k-1}-m_{k-1} R k − 1 ( σ ) ≥ 2 n k − 1 − m k − 1 を仮定する。R k ( σ ) = R k − 1 ( σ ) + 3 − c k R_k(\sigma)=R_{k-1}(\sigma)+3-c_k R k ( σ ) = R k − 1 ( σ ) + 3 − c k である。三つの場合に分ける。
第k k k 操作が再確保でない場合 。c k = 1 c_k=1 c k = 1 、n k = n k − 1 + 1 n_k=n_{k-1}+1 n k = n k − 1 + 1 、m k = m k − 1 m_k=m_{k-1} m k = m k − 1 であるから
R k ( σ ) = R k − 1 ( σ ) + 2 ≥ ( 2 n k − 1 − m k − 1 ) + 2 = 2 n k − m k R_k(\sigma)=R_{k-1}(\sigma)+2\ \ge\ (2n_{k-1}-m_{k-1})+2=2n_k-m_k R k ( σ ) = R k − 1 ( σ ) + 2 ≥ ( 2 n k − 1 − m k − 1 ) + 2 = 2 n k − m k である。
第k k k 操作が再確保でありm k − 1 ≥ 1 m_{k-1}\ge1 m k − 1 ≥ 1 である場合 。n k − 1 = m k − 1 n_{k-1}=m_{k-1} n k − 1 = m k − 1 であるから、m = m k − 1 m=m_{k-1} m = m k − 1 と置くとc k = m + 1 c_k=m+1 c k = m + 1 、n k = m + 1 n_k=m+1 n k = m + 1 、m k = 2 m m_k=2m m k = 2 m であり2 n k − m k = 2 ( m + 1 ) − 2 m = 2 2n_k-m_k=2(m+1)-2m=2 2 n k − m k = 2 ( m + 1 ) − 2 m = 2 である。帰納法の仮定はR k − 1 ( σ ) ≥ 2 m − m = m R_{k-1}(\sigma)\ge2m-m=m R k − 1 ( σ ) ≥ 2 m − m = m を与えるので
R k ( σ ) = R k − 1 ( σ ) + 3 − ( m + 1 ) ≥ m + 2 − m = 2 = 2 n k − m k R_k(\sigma)=R_{k-1}(\sigma)+3-(m+1)\ \ge\ m+2-m=2=2n_k-m_k R k ( σ ) = R k − 1 ( σ ) + 3 − ( m + 1 ) ≥ m + 2 − m = 2 = 2 n k − m k である。
第k k k 操作が再確保でありm k − 1 = 0 m_{k-1}=0 m k − 1 = 0 である場合 。このときn k − 1 = 0 n_{k-1}=0 n k − 1 = 0 であるからk = 1 k=1 k = 1 であり、c 1 = 1 c_1=1 c 1 = 1 、D 1 = ( 1 , 1 ) D_1=(1,1) D 1 = ( 1 , 1 ) である。R 1 ( σ ) = 0 + 3 − 1 = 2 R_1(\sigma)=0+3-1=2 R 1 ( σ ) = 0 + 3 − 1 = 2 であり2 n 1 − m 1 = 2 − 1 = 1 2n_1-m_1=2-1=1 2 n 1 − m 1 = 2 − 1 = 1 であるからR 1 ( σ ) ≥ 2 n 1 − m 1 R_1(\sigma)\ge2n_1-m_1 R 1 ( σ ) ≥ 2 n 1 − m 1 である。
以上で帰納法が完成する。定理 2.1 (2) から 1 への含意によりa ^ \hat a a ^ は償却計算量の上界であり、長さN N N の操作列の総費用は3 N 3N 3 N 以下である。▨
5.3 ポテンシャル法
命題 5.5. Φ ( n , m ) = 2 n − m \Phi(n,m)=2n-m Φ ( n , m ) = 2 n − m と定める。このときΦ ( D 0 ) = 0 \Phi(D_0)=0 Φ ( D 0 ) = 0 であり、補題 5.2 (4) によりすべての到達可能な状態でΦ ≥ 0 \Phi\ge0 Φ ≥ 0 である。さらにD 0 = ( 0 , 0 ) D_0=(0,0) D 0 = ( 0 , 0 ) から始まる任意の操作列の任意の添字i i i についてc ^ i ≤ 3 \hat c_i\le3 c ^ i ≤ 3 が成り立つ。したがって定理 3.1 (2) によりT ^ ( a p p ) = 3 \hat T(\mathrm{app})=3 T ^ ( app ) = 3 は償却計算量の上界であり、長さN N N の操作列の総費用は3 N 3N 3 N 以下である。
証明. Φ ( D 0 ) = 2 ⋅ 0 − 0 = 0 \Phi(D_0)=2\cdot0-0=0 Φ ( D 0 ) = 2 ⋅ 0 − 0 = 0 である。到達可能な状態での非負性は補題 5.2 (4) による。償却費用を三つの場合に分けて計算する。
第i i i 操作が再確保でない場合 。c i = 1 c_i=1 c i = 1 であり、D i − 1 = ( n , m ) D_{i-1}=(n,m) D i − 1 = ( n , m ) 、D i = ( n + 1 , m ) D_i=(n+1,m) D i = ( n + 1 , m ) であるから
c ^ i = 1 + ( 2 ( n + 1 ) − m ) − ( 2 n − m ) = 1 + 2 = 3 \hat c_i=1+\bigl(2(n+1)-m\bigr)-(2n-m)=1+2=3 c ^ i = 1 + ( 2 ( n + 1 ) − m ) − ( 2 n − m ) = 1 + 2 = 3 である。
第i i i 操作が再確保でありm ≥ 1 m\ge1 m ≥ 1 である場合 。D i − 1 = ( m , m ) D_{i-1}=(m,m) D i − 1 = ( m , m ) 、D i = ( m + 1 , 2 m ) D_i=(m+1,2m) D i = ( m + 1 , 2 m ) でありc i = m + 1 c_i=m+1 c i = m + 1 であるから
c ^ i = ( m + 1 ) + ( 2 ( m + 1 ) − 2 m ) − ( 2 m − m ) = ( m + 1 ) + 2 − m = 3 \hat c_i=(m+1)+\bigl(2(m+1)-2m\bigr)-(2m-m)=(m+1)+2-m=3 c ^ i = ( m + 1 ) + ( 2 ( m + 1 ) − 2 m ) − ( 2 m − m ) = ( m + 1 ) + 2 − m = 3 である。
第i i i 操作が再確保でありm = 0 m=0 m = 0 である場合 。D i − 1 = ( 0 , 0 ) D_{i-1}=(0,0) D i − 1 = ( 0 , 0 ) 、D i = ( 1 , 1 ) D_i=(1,1) D i = ( 1 , 1 ) でありc i = 1 c_i=1 c i = 1 であるから
c ^ i = 1 + ( 2 − 1 ) − ( 0 − 0 ) = 2 \hat c_i=1+(2-1)-(0-0)=2 c ^ i = 1 + ( 2 − 1 ) − ( 0 − 0 ) = 2 である。
いずれの場合もc ^ i ≤ 3 \hat c_i\le3 c ^ i ≤ 3 である。▨
命題 5.6. 任意の正の整数M M M に対し、到達可能な状態D D D が存在してc ( D , a p p ) ≥ M c(D,\mathrm{app})\ge M c ( D , app ) ≥ M が成り立つ。
証明. 2 j ≥ M 2^{j}\ge M 2 j ≥ M を満たす非負整数j j j をとり、k = 2 j k=2^{j} k = 2 j と置く。D 0 = ( 0 , 0 ) D_0=(0,0) D 0 = ( 0 , 0 ) からk k k 回の追加操作を行うと、補題 5.2 (1) と 2 によりD k = ( k , m k ) D_k=(k,m_k) D k = ( k , m k ) であり、m k m_k m k はk k k 以上の2 2 2 の冪のうち最小のものであるからm k = k m_k=k m k = k である。よってD k = ( k , k ) D_k=(k,k) D k = ( k , k ) は到達可能であり、次の追加操作は再確保であってc ( D k , a p p ) = k + 1 ≥ M c(D_k,\mathrm{app})=k+1\ge M c ( D k , app ) = k + 1 ≥ M である。▨
例 5.7 (動的配列への八回の追加の手計算). D 0 = ( 0 , 0 ) D_0=(0,0) D 0 = ( 0 , 0 ) からN = 8 N=8 N = 8 回の追加操作を行う。各操作の前の状態、再確保の有無、実費用および操作後の状態を順に書き下す。
第1 1 1 操作は( 0 , 0 ) (0,0) ( 0 , 0 ) から始まりn = m n=m n = m であるから再確保であり、c 1 = 0 + 1 = 1 c_1=0+1=1 c 1 = 0 + 1 = 1 で状態は( 1 , 1 ) (1,1) ( 1 , 1 ) になる。第2 2 2 操作は( 1 , 1 ) (1,1) ( 1 , 1 ) から始まり再確保でありc 2 = 1 + 1 = 2 c_2=1+1=2 c 2 = 1 + 1 = 2 で( 2 , 2 ) (2,2) ( 2 , 2 ) になる。第3 3 3 操作は( 2 , 2 ) (2,2) ( 2 , 2 ) から始まり再確保でありc 3 = 2 + 1 = 3 c_3=2+1=3 c 3 = 2 + 1 = 3 で( 3 , 4 ) (3,4) ( 3 , 4 ) になる。第4 4 4 操作は( 3 , 4 ) (3,4) ( 3 , 4 ) から始まりn < m n<m n < m であるからc 4 = 1 c_4=1 c 4 = 1 で( 4 , 4 ) (4,4) ( 4 , 4 ) になる。第5 5 5 操作は( 4 , 4 ) (4,4) ( 4 , 4 ) から始まり再確保でありc 5 = 4 + 1 = 5 c_5=4+1=5 c 5 = 4 + 1 = 5 で( 5 , 8 ) (5,8) ( 5 , 8 ) になる。第6 6 6 、第7 7 7 、第8 8 8 操作はいずれもn < m n<m n < m であるからc 6 = c 7 = c 8 = 1 c_6=c_7=c_8=1 c 6 = c 7 = c 8 = 1 であり、状態は順に( 6 , 8 ) (6,8) ( 6 , 8 ) 、( 7 , 8 ) (7,8) ( 7 , 8 ) 、( 8 , 8 ) (8,8) ( 8 , 8 ) になる。
総費用は1 + 2 + 3 + 1 + 5 + 1 + 1 + 1 = 15 1+2+3+1+5+1+1+1=15 1 + 2 + 3 + 1 + 5 + 1 + 1 + 1 = 15 である。
集計法との照合 。N = 8 N=8 N = 8 に対し2 J ≤ 7 < 2 J + 1 2^{J}\le7<2^{J+1} 2 J ≤ 7 < 2 J + 1 を満たすJ J J はJ = 2 J=2 J = 2 である。命題 5.3 の式は8 + 2 3 − 1 = 8 + 7 = 15 8+2^{3}-1=8+7=15 8 + 2 3 − 1 = 8 + 7 = 15 を与え、手計算の値と一致する。上界は3 ⋅ 8 = 24 3\cdot8=24 3 ⋅ 8 = 24 であり、15 ≤ 24 15\le24 15 ≤ 24 である。再確保が起きた添字は1 , 2 , 3 , 5 1,2,3,5 1 , 2 , 3 , 5 であり、i − 1 i-1 i − 1 の値は0 , 1 , 2 , 4 0,1,2,4 0 , 1 , 2 , 4 であって、i = 1 i=1 i = 1 を除けば2 2 2 の冪である。補題 5.2 (3) と一致する。
会計法との照合 。課金額の総和は3 ⋅ 8 = 24 3\cdot8=24 3 ⋅ 8 = 24 であるからR 8 = 24 − 15 = 9 R_8=24-15=9 R 8 = 24 − 15 = 9 である。一方D 8 = ( 8 , 8 ) D_8=(8,8) D 8 = ( 8 , 8 ) であるから2 n 8 − m 8 = 16 − 8 = 8 2n_8-m_8=16-8=8 2 n 8 − m 8 = 16 − 8 = 8 であり、R 8 = 9 ≥ 8 R_8=9\ge8 R 8 = 9 ≥ 8 が成り立つ。命題 5.4 の不等式のとおりである。
ポテンシャル法との照合 。償却費用は命題 5.5 の計算によりc ^ 1 = 2 \hat c_1=2 c ^ 1 = 2 、c ^ 2 = ⋯ = c ^ 8 = 3 \hat c_2=\dots=\hat c_8=3 c ^ 2 = ⋯ = c ^ 8 = 3 であるから総和は2 + 3 ⋅ 7 = 23 2+3\cdot7=23 2 + 3 ⋅ 7 = 23 である。定理 3.1 (1) により
∑ i = 1 8 c i = ∑ i = 1 8 c ^ i + Φ ( D 0 ) − Φ ( D 8 ) = 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 i = 1 ∑ 8 c i = i = 1 ∑ 8 c ^ i + Φ ( D 0 ) − Φ ( D 8 ) = 23 + 0 − 8 = 15 であり、手計算の値と一致する。
単一の操作の実費用 。この操作列に現れた実費用の最大値はc 5 = 5 c_5=5 c 5 = 5 である。命題 5.6 のとおり、操作列を延ばせばこの値はいくらでも大きくなる。実際、状態( 8 , 8 ) (8,8) ( 8 , 8 ) からの追加の実費用は9 9 9 である。
6 演習
問題 6.1.
操作を二つもつ操作系と課金額a ^ \hat a a ^ を作り、ある操作列σ \sigma σ についてR ∣ σ ∣ ( σ ) ≥ 0 R_{\lvert\sigma\rvert}(\sigma)\ge0 R ∣ σ ∣ ( σ ) ≥ 0 が成り立ちながら、σ \sigma σ のある接頭列でR k ( σ ) < 0 R_k(\sigma)<0 R k ( σ ) < 0 となるようにせよ。その例でa ^ \hat a a ^ が償却計算量の上界でないことを確かめ、この事実が定理 2.1 の同値性と矛盾しない理由を、1 から 2 を導く段が接頭列をどう用いているかに即して説明せよ。
定理 3.1 (1) の証明は望遠鏡和の評価を帰納法で行っている。この帰納法を書き下し、N = 0 N=0 N = 0 の場合が空和として正しく扱われていることを確かめよ。さらに、Φ \Phi Φ が実数値であることをどこで用いているかを指摘せよ。
注意 3.2 の反例において、ポテンシャル関数をΦ ( x ) = − x \Phi(x)=-x Φ ( x ) = − x からΦ ( x ) = x \Phi(x)=x Φ ( x ) = x へ取り替えると償却費用がいくつになるかを計算し、その場合に定理 3.1 (2) が与える上界を書き下せ。得られた上界が実際の総費用2 N 2N 2 N と整合することを確かめよ。
命題 4.4 は信用残高がβ ( D k ) \beta(D_k) β ( D k ) にちょうど等しいことを示している。課金額を2 2 2 ではなく3 / 2 3/2 3/2 に変えたとき、信用残高が非負であり続けるかどうかを判定せよ。非負でないならば、非負でなくなる最小のk k k を求めよ。
命題 5.4 の証明を、補題 5.2 (2) を用いずに書き直せ。すなわち、容量がk k k 以上の最小の2 2 2 の冪であることを使わずに、R k ( σ ) ≥ 2 n k − m k R_k(\sigma)\ge2n_k-m_k R k ( σ ) ≥ 2 n k − m k の帰納法だけで議論が閉じることを確かめ、2 n k − m k ≥ 0 2n_k-m_k\ge0 2 n k − m k ≥ 0 を別に示す必要がある理由を述べよ。
動的配列の再確保で容量を2 2 2 倍ではなく3 3 3 倍にする規則を考える。この規則に対するポテンシャル関数を設計し、定理 3.1 (2) の仮定をすべて満たすことを証明して、償却計算量の上界となる定数を求めよ。さらに、容量を2 2 2 倍にする場合と比べたときの上界の違いを述べよ。
動的配列に末尾からの削除操作を加え、削除の実費用を1 1 1 、要素数が容量の半分になったときに容量を半分にする規則を採る操作系を考える。Φ ( n , m ) = ∣ 2 n − m ∣ \Phi(n,m)=\lvert2n-m\rvert Φ ( n , m ) = ∣ 2 n − m ∣ について、定数T ^ \hat T T ^ をとって定理 3.1 (2) の仮定をすべて満たすようにすることができるかどうかを判定せよ。することができない場合は、要素数が容量の半分になる状態のまわりで追加と削除を交互に繰り返す操作列を作り、その操作列に沿って償却費用が上に有界でないことを示せ。
7 つまずいたら
信用残高の非負性は末尾だけで確かめても足りない。定理 2.1 は、すべての接頭列での非負性が償却計算量の上界であることと同値であると述べている。長さk k k の操作列は、より長い操作列の接頭列としても現れる。
ポテンシャル関数の初期値と終端値の条件を省かない。注意 3.2 は、条件を落とすと実際の総費用より小さい値を上界と誤認する例を与える。
償却費用c ^ i \hat c_i c ^ i は実費用c i c_i c i の近似ではない。個々のi i i についてc ^ i \hat c_i c ^ i はc i c_i c i より大きいことも小さいこともある。保証されるのは定理 3.1 (1) が述べる総和どうしの関係だけである。
償却計算量と平均計算量を混同しない。注意 5.8 のとおり、前者は確率を用いない最悪の場合についての主張であり、後者は操作の集合の上に確率分布を定めて初めて意味をもつ。
動的配列の容量を2 2 2 倍にする規則は落とすことができない。容量を毎回1 1 1 だけ増やす規則に変えると、すべての追加操作が再確保になり、長さN N N の操作列の総費用は∑ i = 1 N i = N ( N + 1 ) / 2 \sum_{i=1}^{N}i=N(N+1)/2 ∑ i = 1 N i = N ( N + 1 ) /2 になる。この値はT N TN T N の形の上界をもたない。
8 扱った範囲と次の記事
本記事は、有限な操作列に対する償却計算量の上界を定義し、単一の操作の最悪計算量および確率分布に関する平均計算量と区別した。定数の償却計算量の上界が総費用の線形な上界を与えることを示した。会計法については、課金額が償却計算量の上界であることと信用残高がすべての接頭列で非負であることが同値であることを証明した。ポテンシャル法については、償却費用の総和が望遠鏡和として実費用の総和と両端のポテンシャルの差に分かれることを証明し、初期値と終端値の条件を落とすと結論が成り立たない例を与えた。二進カウンタと動的配列については、集計法、会計法およびポテンシャル法の三つで同じ操作列上の上界を独立に証明し、いずれの例でも単一の操作の実費用が上に有界でないことを示した。削除操作を含む操作系、複数の操作をもつデータ構造、および償却計算量の下界は扱っていない。
次の記事では、有理数体上の一変数形式的冪級数について合成と形式微分を定義し、合成逆元の一意存在と係数公式を証明する。