§D2.8アルゴリズムの正当性と計算量

最終更新

アルゴリズムが正しいとは、任意の許容入力に対して有限時間で停止し、仕様どおりの出力を返すことであり、その証明は「不変条件による部分正当性」と「整礎な変量による停止性」の二つに分解される。 本記事ではこの二分法を定式化し、続いて計算資源を測る漸近記法・分割統治の計算量・計算の限界(比較に基づく整列の下界と多項式時間の意味)を扱う。

以下、アルゴリズムは有限個の基本操作からなる決定的手続きとする。基本操作の実行回数を測る時間計算量は定義 2.1で定める。証明の技法はループを持つ手続き一般に適用でき、探索や最短路のアルゴリズム(別項)の正当性も同じ枠組みで得られる。

1 不変条件による正当性

繰り返しを含む手続きの正当性は、繰り返しのたびに保たれる性質を一つ取り出すことで示す。ここでは while ループ

while B do S\textbf{while } B \textbf{ do } S

を対象とする。BBはループ継続条件(述語)、SSはループ本体である。プログラムの実行途中の状態(変数の値の組)をσ\sigmaで表し、ループ入口に到達した時点の状態を順にσ0,σ1,σ2,…\sigma_0, \sigma_1, \sigma_2, \dotsとする。すなわちσ0\sigma_0はループに初めて到達した状態、σk+1\sigma_{k+1}はσk\sigma_kでBBが真であって本体SSを一度実行した直後の状態である。

定義 1.1 (ループ不変条件). 状態に関する述語PPが上のループのループ不変条件であるとは、次の二条件をみたすことをいう。

  1. (初期化)ループ入口に初めて到達した時点でP(σ0)P(\sigma_0)が成り立つ。
  2. (維持)任意のkkについて、P(σk)P(\sigma_k)が成り立ちかつB(σk)B(\sigma_k)が真(ゆえに本体がもう一度実行される)ならば、実行後の状態でP(σk+1)P(\sigma_{k+1})が成り立つ。

さらにループが停止したとき、継続条件の否定¬B\lnot BとPPをあわせて所期の事後条件を導くことを確認する段階を(終了)とよぶ。不変条件による正当性証明は、この初期化・維持・終了の三段からなる。

事後条件QQとは、手続きが「正しい出力を返した」ことを表す状態の述語である。不変条件が満たすべきは「毎回成り立つほど弱く、しかし停止時にはQQを導くほど強い」という緊張関係であり、適切なPPを見つけることが証明の核心になる。

定理 1.2 (不変条件による部分正当性).PPを定義 1.1の意味でのループ不変条件とする。ループが(有限回の反復で)停止し、停止時の状態をσN\sigma_Nとすると、P(σN)∧¬B(σN)P(\sigma_N) \land \lnot B(\sigma_N)が成り立つ。したがって含意

P(σ)∧¬B(σ)  ⟹  Q(σ)P(\sigma) \land \lnot B(\sigma) \;\Longrightarrow\; Q(\sigma)

がすべての状態σ\sigmaについて成り立つならば、ループは停止したとき必ず事後条件QQを満たす(部分正当性)。

証明. まず、ループ入口に到達したすべてのkkについてP(σk)P(\sigma_k)が成り立つことをkkに関する数学的帰納法(§A3.10 定理 1.1)で示す。

  • 基底(k=0k=0)。初期化条件よりP(σ0)P(\sigma_0)。
  • 帰納段階。P(σk)P(\sigma_k)を仮定する。ループが入口σk+1\sigma_{k+1}に到達したということは、σk\sigma_kで継続条件B(σk)B(\sigma_k)が真であり本体SSが実行されたということである。維持条件より、その実行後の状態でP(σk+1)P(\sigma_{k+1})が成り立つ。

よってループ入口に現れる各状態でPPが成り立つ。いま仮定によりループは有限回NNで停止する。停止するとは、状態σN\sigma_Nに到達したとき継続条件が偽、すなわち¬B(σN)\lnot B(\sigma_N)になることである。σN\sigma_Nもループ入口の状態だから上で示したことよりP(σN)P(\sigma_N)が成り立ち、あわせてP(σN)∧¬B(σN)P(\sigma_N) \land \lnot B(\sigma_N)を得る。仮定した含意にこれを適用してQ(σN)Q(\sigma_N)が従う。▨

注意 1.3. 本定理は「停止すれば正しい」ことしか主張せず、停止すること自体は別に示す必要がある。これが部分正当性とよばれる理由である。

停止性は不変条件とは独立の議論を要する。鍵は、各反復で確実に「減る」量を、それ以上は減れない下限をもつ整礎な集合の中に見つけることである。

命題 1.4 (整礎な変量による停止性). ループの状態に対して非負整数値の関数V(σ)∈N={0,1,2,… }V(\sigma) \in \mathbb{N} = \{0, 1, 2, \dots\}(変量、または測度)が定まり、本体が一度実行されるたびに狭義に減少する、すなわちB(σk)B(\sigma_k)が真ならばV(σk+1)<V(σk)V(\sigma_{k+1}) < V(\sigma_k)が成り立つとする。このときループは有限回で停止する。

証明. 背理法による。ループが停止しないと仮定すると、ループ入口の状態の無限列σ0,σ1,σ2,…\sigma_0, \sigma_1, \sigma_2, \dotsが生じ、各段で継続条件が真だから、仮定により

V(σ0)>V(σ1)>V(σ2)>⋯V(\sigma_0) > V(\sigma_1) > V(\sigma_2) > \cdots

という非負整数の無限狭義減少列が得られる。ところが集合{ V(σk):k≥0 }⊆N\{\, V(\sigma_k) : k \ge 0 \,\} \subseteq \mathbb{N}は空でないから、N\mathbb{N}の整列性(§A3.10 定理 2.1)により最小元をもつ。その最小元をV(σm)V(\sigma_m)とすると、次の項V(σm+1)<V(σm)V(\sigma_{m+1}) < V(\sigma_m)が同じ集合に属するのに最小元より小さく、最小性に反する。よって仮定は誤りで、ループは停止する。▨

変量の値域はN\mathbb{N}でなくとも、無限狭義減少列をもたない整礎順序(たとえば辞書式に並べた非負整数の組)であればよい。以下ではユークリッドの互除法を例に、不変条件と変量の両方を具体的に構成する。

例 1.5 (ユークリッドの互除法の正当性と停止性). 整数a0≥b0≥0a_0 \ge b_0 \ge 0(a0>0a_0 > 0)に対し、次の手続きはgcd⁡(a0,b0)\gcd(a_0, b_0)を返す。

(a,b)←(a0,b0);while b≠0 do (a,b)←(b, a mod b);return a.(a, b) \leftarrow (a_0, b_0); \quad \textbf{while } b \ne 0 \textbf{ do } (a, b) \leftarrow (b,\ a \bmod b); \quad \textbf{return } a.

ここでa mod ba \bmod bはaaをbbで割った余り(0≤a mod b<b0 \le a \bmod b < b)である。

証明. 不変条件としてP: gcd⁡(a,b)=gcd⁡(a0,b0)P:\ \gcd(a, b) = \gcd(a_0, b_0)をとる。まず補題として、b>0b > 0のときgcd⁡(a,b)=gcd⁡(b, a mod b)\gcd(a, b) = \gcd(b,\ a \bmod b)を示す。r=a mod br = a \bmod bとおくと、ある整数qqでa=qb+ra = qb + rと書ける。整数ddがaaとbbの公約数ならばd∣(a−qb)=rd \mid (a - qb) = rだからddはbbとrrの公約数であり、逆にddがbbとrrの公約数ならばd∣(qb+r)=ad \mid (qb + r) = aだからddはaaとbbの公約数である。ゆえに{a,b}\{a, b\}の公約数の集合と{b,r}\{b, r\}の公約数の集合は一致し、その最大値も等しい。

この補題により不変条件を検証する。初期化ではgcd⁡(a,b)=gcd⁡(a0,b0)\gcd(a, b) = \gcd(a_0, b_0)が定義そのものから成り立つ。維持では、本体が実行されるのはb≠0b \ne 0(すなわちb>0b > 0)のときで、更新後の対は(b, a mod b)(b,\ a \bmod b)だから補題よりgcd⁡(b, a mod b)=gcd⁡(a,b)\gcd(b,\ a \bmod b) = \gcd(a, b)となり、不変条件が保たれる。

停止性は変量V=bV = b(第二成分、非負整数)で示す。b>0b > 0で本体を実行すると新しい第二成分はa mod b<ba \bmod b < bだからVVは狭義に減少する。命題 1.4よりループは停止する。

終了では、停止時に継続条件の否定b=0b = 0が成り立つ。不変条件とあわせてgcd⁡(a,0)=gcd⁡(a0,b0)\gcd(a, 0) = \gcd(a_0, b_0)を得るが、a>0a > 0の任意の約数が00を割るのでgcd⁡(a,0)=a\gcd(a, 0) = a、ゆえに返り値aaはgcd⁡(a0,b0)\gcd(a_0, b_0)に等しい。定理 1.2により手続きは正しい。▨

検算(gcd⁡(1071,462)\gcd(1071, 462)). 手続きを実行すると、(a,b)(a, b)は

(1071,462)→(462,147)→(147,21)→(21,0)(1071, 462) \to (462, 147) \to (147, 21) \to (21, 0)

と遷移する。各段は1071=2⋅462+1471071 = 2 \cdot 462 + 147、462=3⋅147+21462 = 3 \cdot 147 + 21、147=7⋅21+0147 = 7 \cdot 21 + 0に対応し、変量bbは462>147>21>0462 > 147 > 21 > 0と単調に減少して停止する。返り値は2121であり、実際1071=21⋅511071 = 21 \cdot 51、462=21⋅22462 = 21 \cdot 22でgcd⁡(51,22)=1\gcd(51, 22) = 1だからgcd⁡(1071,462)=21\gcd(1071, 462) = 21、返り値と一致する。

2 計算量の漸近記法

比較の対象になるのは、個々の入力に対する実行回数ではなく、入力の大きさに対する最悪の実行回数である。まずこの量を定める。

定義 2.1 (入力サイズと時間計算量). アルゴリズムA\mathcal{A}が受け取ることのできる入力の全体をI\mathcal{I}とする。入力I∈II \in \mathcal{I}を定められた符号化で表すのに要する記号の個数をIIの入力サイズといい∣I∣|I|で表す。A\mathcal{A}が入力IIに対して停止するまでに実行する基本操作の回数をtA(I)t_{\mathcal{A}}(I)と書く。非負整数nnに対してIn:={I∈I:∣I∣=n}\mathcal{I}_n := \{I \in \mathcal{I} : |I| = n\}とおき、In\mathcal{I}_nが空でなく有限であるとき

TA(n):=max⁡I∈IntA(I)T_{\mathcal{A}}(n) := \max_{I \in \mathcal{I}_n} t_{\mathcal{A}}(I)

をA\mathcal{A}の最悪時間計算量という。本記事で単に時間計算量というときは、最悪時間計算量を指す。

何を基本操作として11回と数えるかは計算モデルによって定まる。本記事では、定数個の値に対する比較、代入、および四則演算をそれぞれ11回の基本操作として数える。

TAT_{\mathcal{A}}の値そのものは計算モデルの決め方に左右されるので、定数倍や低次の項を無視して増加の位数だけを見ると比較に都合がよい。以下、f,g:N→R≥0f, g : \mathbb{N} \to \mathbb{R}_{\ge 0}を(十分大きいnnで正の値をとる)関数とする。

定義 2.2 (漸近記法O, Ω, ΘO,\ \Omega,\ \Theta). 定数c>0c > 0と非負整数n0n_0に関する条件で、次の三つの関数の集合を定める。

  • f∈O(g)f \in O(g)とは、あるc>0, n0c > 0,\ n_0が存在してすべてのn≥n0n \ge n_0で0≤f(n)≤c g(n)0 \le f(n) \le c\,g(n)が成り立つこと(ffはggで上から抑えられる)。
  • f∈Ω(g)f \in \Omega(g)とは、あるc>0, n0c > 0,\ n_0が存在してすべてのn≥n0n \ge n_0でf(n)≥c g(n)≥0f(n) \ge c\,g(n) \ge 0が成り立つこと(下から抑えられる)。
  • f∈Θ(g)f \in \Theta(g)とはf∈O(g)f \in O(g)かつf∈Ω(g)f \in \Omega(g)であること。すなわちあるc1,c2>0, n0c_1, c_2 > 0,\ n_0でn≥n0n \ge n_0のときc1 g(n)≤f(n)≤c2 g(n)c_1\,g(n) \le f(n) \le c_2\,g(n)。

慣習に従いf∈O(g)f \in O(g)をf(n)=O(g(n))f(n) = O(g(n))とも書く。この等号は集合への所属を表す非対称な記法であって、通常の等式ではない。

命題 2.3 (漸近記法の演算則). 次が成り立つ。

  1. (推移律)f=O(g)f = O(g)かつg=O(h)g = O(h)ならばf=O(h)f = O(h)。
  2. (和の上界)f1=O(g)f_1 = O(g)かつf2=O(h)f_2 = O(h)ならばf1+f2=O(max⁡{g,h})f_1 + f_2 = O(\max\{g, h\})。したがって有限個の項の和は、それらの上界の最大値で抑えられる。
  3. (多項式は指数より真に小さい)任意の定数k>0k > 0と底b>1b > 1に対してnk=O(bn)n^k = O(b^n)であるが、bn≠O(nk)b^n \ne O(n^k)である。

証明. 1. 仮定よりc1>0, n1c_1 > 0,\ n_1でn≥n1n \ge n_1のときf(n)≤c1g(n)f(n) \le c_1 g(n)、またc2>0, n2c_2 > 0,\ n_2でn≥n2n \ge n_2のときg(n)≤c2h(n)g(n) \le c_2 h(n)。n0=max⁡{n1,n2}n_0 = \max\{n_1, n_2\}、c=c1c2c = c_1 c_2とおけば、n≥n0n \ge n_0でf(n)≤c1g(n)≤c1c2h(n)=c h(n)f(n) \le c_1 g(n) \le c_1 c_2 h(n) = c\,h(n)。ゆえにf=O(h)f = O(h)。

2. 仮定よりn≥n1n \ge n_1でf1(n)≤c1g(n)f_1(n) \le c_1 g(n)、n≥n2n \ge n_2でf2(n)≤c2h(n)f_2(n) \le c_2 h(n)。n0=max⁡{n1,n2}n_0 = \max\{n_1, n_2\}とすると、n≥n0n \ge n_0で

f1(n)+f2(n)≤c1g(n)+c2h(n)≤(c1+c2)max⁡{g(n),h(n)}.f_1(n) + f_2(n) \le c_1 g(n) + c_2 h(n) \le (c_1 + c_2)\max\{g(n), h(n)\}.

定数c1+c2c_1 + c_2をとればf1+f2=O(max⁡{g,h})f_1 + f_2 = O(\max\{g, h\})。

3. 比an=nk/bn≥0a_n = n^k / b^n \ge 0の挙動を調べる。n≥1n \ge 1で

an+1an=(n+1)kb n+1⋅bnnk=1b(1+1n)k.\frac{a_{n+1}}{a_n} = \frac{(n+1)^k}{b^{\,n+1}} \cdot \frac{b^n}{n^k} = \frac{1}{b}\left(1 + \frac{1}{n}\right)^{k}.

n→∞n \to \inftyで(1+1/n)k→1(1 + 1/n)^k \to 1だから、右辺は1/b1/bに収束する。1/b<11/b < 1なので、1/b<r<11/b < r < 1をみたす定数rrを一つ選ぶと、収束の定義よりあるNNが存在して、すべてのn≥Nn \ge Nでan+1/an≤ra_{n+1}/a_n \le rとなる。したがってm≥0m \ge 0についてaN+m≤rmaNa_{N+m} \le r^m a_Nが帰納的に従い、0≤r<10 \le r < 1よりaN+m→0a_{N+m} \to 0。ゆえに数列(an)(a_n)は収束(→0\to 0)ゆえ有界で、あるMMでan≤Ma_n \le Mがn≥Nn \ge Nで成り立つ。これはnk≤Mbnn^k \le M b^n(n≥Nn \ge N)を意味しnk=O(bn)n^k = O(b^n)。

逆にbn=O(nk)b^n = O(n^k)と仮定すると、あるc,n0c, n_0でn≥n0n \ge n_0のときbn≤c nkb^n \le c\,n^k、すなわちan=nk/bn≥1/c>0a_n = n^k/b^n \ge 1/c > 0となり、an→0a_n \to 0に矛盾する。ゆえにbn≠O(nk)b^n \ne O(n^k)。▨

推移律と和の規則により、たとえば実行回数が3n2+5nlog⁡2n+1003n^2 + 5n\log_2 n + 100の手続きはO(n2)O(n^2)、さらにΘ(n2)\Theta(n^2)である。低次の項と定数係数は位数に寄与しない。

3 分割統治とマスター定理

分割統治法は問題をサイズn/bn/bのaa個の部分問題に分け、それらの解をf(n)f(n)の手間で統合する。計算量はしばしば漸化式

T(n)=a T(n/b)+f(n)(a≥1, b>1)T(n) = a\,T(n/b) + f(n) \qquad (a \ge 1,\ b > 1)

の形をとる。次の定理はその解を三つの場合に分けて与える。以下、記述を簡明にするためnnはbbの冪n=bkn = b^k(k∈Nk \in \mathbb{N})を動くものとし、基底をT(1)=Θ(1)T(1) = \Theta(1)、ffを非負とする。臨界指数をp=log⁡bap = \log_b aで定める。

定理 3.1 (マスター定理). 上の漸化式について、p=log⁡bap = \log_b aとおくと次が成り立つ。

  1. あるε>0\varepsilon > 0でf(n)=O(n p−ε)f(n) = O(n^{\,p - \varepsilon})ならばT(n)=Θ(np)T(n) = \Theta(n^p)。
  2. f(n)=Θ(np)f(n) = \Theta(n^p)ならばT(n)=Θ(nplog⁡n)T(n) = \Theta(n^p \log n)。
  3. あるε>0\varepsilon > 0でf(n)=Ω(n p+ε)f(n) = \Omega(n^{\,p + \varepsilon})であり、かつ正則条件a f(n/b)≤c f(n)a\,f(n/b) \le c\,f(n)をみたす定数c<1c < 1が十分大きいすべてのnnで存在するならば、T(n)=Θ(f(n))T(n) = \Theta(f(n))。

証明.n=bkn = b^kとするとk=log⁡bnk = \log_b n。漸化式をkk回展開すると、T(1)T(1)の係数はaka^k、第jj段(j=0,1,…,k−1j = 0, 1, \dots, k-1)で統合コストf(n/bj)f(n/b^j)がaja^j個生じるので

T(n)=ak T(1)+∑j=0k−1aj f ⁣(nbj).T(n) = a^k\,T(1) + \sum_{j=0}^{k-1} a^j\, f\!\left(\frac{n}{b^j}\right).

ここでak=alog⁡bn=nlog⁡ba=npa^k = a^{\log_b n} = n^{\log_b a} = n^pに注意する。右辺第一項はΘ(np)\Theta(n^p)である。第二項をg(n)=∑j=0k−1ajf(n/bj)g(n) = \sum_{j=0}^{k-1} a^j f(n/b^j)とおき、場合ごとに評価する。f≥0f \ge 0なのでT(n)≥akT(1)=Ω(np)T(n) \ge a^k T(1) = \Omega(n^p)が常に成り立つことも用いる。

以下の各場合で、そこで用いる漸近評価がすべてのbq≥bq0b^q\ge b^{q_0}で成り立つようにq0≥1q_0\ge 1を固定する。k≥q0k\ge q_0とJ=k−q0J=k-q_0に対し、g(n)g(n)を0≤j≤J0\le j\le Jの段の和gup(n)g_{\mathrm{up}}(n)とJ<j<kJ<j<kの段の和glow(n)g_{\mathrm{low}}(n)に分ける。後者ではr=k−jr=k-jと変数変換すると

glow(n)=∑r=1q0−1ak−rf(br)=np∑r=1q0−1a−rf(br)=O(np)g_{\mathrm{low}}(n) =\sum_{r=1}^{q_0-1}a^{k-r}f(b^r) =n^p\sum_{r=1}^{q_0-1}a^{-r}f(b^r) =O(n^p)

となる。最後の和はnnに依らない有限和であり、q0=1q_0=1の場合は空和とする。これが、漸近評価を直接適用できない再帰木下端の有限段の寄与である。

場合 1.f(n)≤C n p−εf(n) \le C\,n^{\,p-\varepsilon}(n≥bq0n\ge b^{q_0})とすると、b p=ab^{\,p} = aよりa/b p−ε=bεa / b^{\,p-\varepsilon} = b^{\varepsilon}であって、0≤j≤J0\le j\le Jでは

ajf ⁣(nbj)≤C aj(nbj)p−ε=C n p−ε(ab p−ε) ⁣j=C n p−ε(bε)j.a^j f\!\left(\frac{n}{b^j}\right) \le C\, a^j \left(\frac{n}{b^j}\right)^{p-\varepsilon} = C\, n^{\,p-\varepsilon}\left(\frac{a}{b^{\,p-\varepsilon}}\right)^{\!j} = C\, n^{\,p-\varepsilon} (b^{\varepsilon})^{j}.

bε>1b^\varepsilon > 1の等比和で抑えると

gup(n)≤C n p−ε∑j=0k−1(bε)j≤Cbε−1 n p−ε bεk.g_{\mathrm{up}}(n) \le C\, n^{\,p-\varepsilon} \sum_{j=0}^{k-1} (b^{\varepsilon})^{j} \le \frac{C}{b^{\varepsilon} - 1}\, n^{\,p-\varepsilon}\, b^{\varepsilon k}.

bεk=(bk)ε=nεb^{\varepsilon k} = (b^k)^{\varepsilon} = n^{\varepsilon}だからgup(n)=O(np)g_{\mathrm{up}}(n)=O(n^p)である。さらにglow(n)=O(np)g_{\mathrm{low}}(n)=O(n^p)なのでg(n)=O(np)g(n)=O(n^p)となり、第一項とあわせT(n)=Θ(np)T(n) = \Theta(n^p)を得る。

場合 2.f(n)=Θ(np)f(n) = \Theta(n^p)のとき、a/b p=1a / b^{\,p} = 1より0≤j≤J0\le j\le Jの各段は、一様な定数で

ajf ⁣(nbj)=Θ ⁣(aj(nbj)p)=Θ ⁣(np(ab p) ⁣j)=Θ(np)a^j f\!\left(\frac{n}{b^j}\right) = \Theta\!\left(a^j \left(\frac{n}{b^j}\right)^{p}\right) = \Theta\!\left(n^p \left(\frac{a}{b^{\,p}}\right)^{\!j}\right) = \Theta(n^p)

となる。この範囲の段数はJ+1=k−q0+1=Θ(k)J+1=k-q_0+1=\Theta(k)だからgup(n)=Θ(knp)g_{\mathrm{up}}(n)=\Theta(kn^p)である。glow(n)=O(np)g_{\mathrm{low}}(n)=O(n^p)かつk=Θ(log⁡n)k=\Theta(\log n)なので、g(n)=Θ(nplog⁡n)g(n)=\Theta(n^p\log n)となる。第一項Θ(np)\Theta(n^p)はこれに吸収されT(n)=Θ(nplog⁡n)T(n)=\Theta(n^p\log n)を得る。

場合 3.f(n)=Ω(np+ε)f(n)=\Omega(n^{p+\varepsilon})の評価と正則条件がともにn≥bq0n\ge b^{q_0}で成り立つようにq0q_0を選ぶ。0≤j≤J0\le j\le Jでは、正則条件をjj回反復適用してajf(n/bj)≤cjf(n)a^j f(n/b^j) \le c^j f(n)を得る。したがって

gup(n)≤f(n)∑j=0∞cj=f(n)1−c=O(f(n)).g_{\mathrm{up}}(n) \le f(n) \sum_{j=0}^{\infty} c^j = \frac{f(n)}{1 - c} = O(f(n)).

またglow(n)=O(np)=O(f(n))g_{\mathrm{low}}(n)=O(n^p)=O(f(n))であるからg(n)=O(f(n))g(n)=O(f(n))であり、j=0j=0の項からg(n)≥f(n)g(n)\ge f(n)なのでg(n)=Θ(f(n))g(n)=\Theta(f(n))となる。さらにnp=O(f(n))n^p=O(f(n))だから第一項も吸収され、T(n)=Θ(f(n))T(n)=\Theta(f(n))を得る。▨

一般のnn(bbの冪でない場合)に対する床・天井を含む漸化式でも、ffが緩やかな正則性をもてば同じ結論が成り立つが、その還元は標準的なので本記事では省く。

適用例. 併合による整列はT(n)=2T(n/2)+Θ(n)T(n) = 2T(n/2) + \Theta(n)、a=b=2a = b = 2、p=log⁡22=1p = \log_2 2 = 1、f(n)=Θ(n)=Θ(np)f(n) = \Theta(n) = \Theta(n^p)ゆえ場合 2 でT(n)=Θ(nlog⁡n)T(n) = \Theta(n \log n)。二分探索はT(n)=T(n/2)+Θ(1)T(n) = T(n/2) + \Theta(1)、p=log⁡21=0p = \log_2 1 = 0、f(n)=Θ(1)=Θ(n0)f(n) = \Theta(1) = \Theta(n^0)ゆえ場合 2 でT(n)=Θ(log⁡n)T(n) = \Theta(\log n)。カラツバ法の乗算はT(n)=3T(n/2)+Θ(n)T(n) = 3T(n/2) + \Theta(n)、p=log⁡23≈1.585p = \log_2 3 \approx 1.585、f(n)=n=O(n p−ε)f(n) = n = O(n^{\,p-\varepsilon})ゆえ場合 1 でT(n)=Θ(nlog⁡23)T(n) = \Theta(n^{\log_2 3})となり、素朴なΘ(n2)\Theta(n^2)より速い。

4 多項式時間と計算の限界

計算量は個々のアルゴリズムだけでなく、問題そのものの難しさを測る尺度にもなる。まず「効率的に解ける」の標準的な線引きを与える。

定義 4.1 (多項式時間と扱いやすさ). アルゴリズムが多項式時間で動くとは、入力サイズnn(入力を表すのに要するビット数)に対する最悪時間計算量が、ある定数kkについてO(nk)O(n^k)であることをいう。多項式時間アルゴリズムをもつ問題を扱いやすい(tractable)とよび、多項式時間で解ける判定問題全体の(非形式的な)クラスをP\mathrm{P}と書く。

対比として、最悪時間が2Ω(n)2^{\Omega(n)}となるアルゴリズムは指数時間であり、命題 2.3の第 3 項が示すとおり任意の多項式より真に速く増大するため、nnが中程度でも実行不能になりやすい。

計算モデル(Turing 機械)に基づくP\mathrm{P}の形式的定義は「計算理論」に委ねる。ここでは「多項式か指数か」という粗い二分が、扱いやすさの実務的な境界として機能することを押さえておけばよい。

次に、ある問題については、いかなるアルゴリズムを設計しても超えられない計算量の下限が示せる。代表例が比較に基づく整列である。

命題 4.2 (比較に基づく整列の漸近的な下界). 要素間の比較のみで並べ替えを行うアルゴリズム(比較に基づく整列)は、相異なるnn個の要素を整列するのに最悪の場合Ω(nlog⁡n)\Omega(n \log n)回の比較を要する。

証明.§D2.9 定義 4.1は、比較だけで入力の順序を識別する計算モデルを定めています。そのモデルに対して§D2.9 系 4.6は、相異なるnn個の要素を正しく整列する決定木の高さがlog⁡2(n!)=Ω(nlog⁡n)\log_2(n!)=\Omega(n\log n)以上であることを証明しています。決定木の高さは最悪の場合の比較回数に等しいので、本命題が従います。▨

この下界により、Θ(nlog⁡n)\Theta(n\log n)で動く併合による整列は比較の回数の位数において最適である。下界は特定のアルゴリズムではなく比較モデル全体に対する主張である点が重要で、計算量理論の核心をなす。

注意 4.3 (帰着と NP). 問題AAから問題BBへの(多項式時間)帰着とは、AAの各インスタンスをBBのインスタンスへ写す多項式時間で計算可能な変換であって、答え(受理/非受理)を保つものをいう。AAがBBへ帰着できB∈PB \in \mathrm{P}ならばA∈PA \in \mathrm{P}である。

判定問題のクラスNP\mathrm{NP}は、「受理インスタンスに対して多項式サイズの証拠(証明書)が存在し、それを多項式時間で検証できる」問題の全体である。すべてのNP\mathrm{NP}問題が帰着する問題を NP\mathrm{NP}困難、NP\mathrm{NP}困難かつNP\mathrm{NP}に属する問題を NP\mathrm{NP}完全とよぶ。充足可能性問題 SAT がNP\mathrm{NP}完全であること(クック–レビンの定理)や、P=NP\mathrm{P} = \mathrm{NP}が未解決であることは、ここでは主張として述べるにとどめる。帰着・クラスNP\mathrm{NP}・完全性の形式的な定義と証明は「計算理論」に委ねる。

前提記事