最終更新日時:

分割統治法の計算量

はじめに

 分割統治法などを用いることで最悪計算量T(n)T(n)のアルゴリズムが

{T(1)=O(1)(n=1)T(n)=2T(n2)+O(n)(other)\begin{dcases}T(1)=O(1) & (n=1) \\T(n)=2T\left(\frac{n}{2}\right)+O(n) & (other)\end{dcases}

のようになる場合がある。この漸化式を解くことによりT(n)=O(nlogn)T(n)=O(n\log{n})が得られ、例えば、クイックソートやFFTなどがこのようになる。
 今回はその計算量について述べる。

 全然興味がないから知らないけど、競技プログラミングにおける最重要項目の1つではないだろうか。むしろ基礎知識だからこの記事を読む必要すらないともとれる。

 今回の記事は以下の図書を参考に書いているので気になる人は読んでみるといいだろう。ただし、日本語訳が怪しい部分もあるため考えどころである。私には買うお金がないので図書館で読んだ。

漸近記法

 よく知っている人は飛ばすべきである。
 まずは計算量を記述するための漸近記法について定義を与える。

定義

 f(n)O(g(n))f(n)\in O(g(n))となるとは

n0>0,c>0 s.t. n>n0,0f(n)cg(n)\exist n_{0}>0,\exist c>0\ s.t.\ \forall n>n_{0},0\leq f(n)\leq cg(n)

を満たすことである。このとき、g(n)g(n)f(n)f(n)漸近的上界(asymptotic upper bounds)であるという。

 これはランダウのO-記法としても知られている。次に、下界についての定義を示す。

定義

 f(n)Ω(g(n))f(n)\in\Omega(g(n))となるとは

n0>0,c>0 s.t. n>n0,0cg(n)f(n)\exist n_{0}>0,\exist c>0\ s.t.\ \forall n>n_{0},0\leq cg(n)\leq f(n)

を満たすことである。このとき、g(n)g(n)f(n)f(n)漸近的下界(asymptotic lower bounds)であるという。

 また、下界かつ上界について以下の定義が与えられる。

定義

 f(n)Θ(g(n))f(n)\in\Theta(g(n))となるとは

Θ(g(n))=O(g(n))Ω(g(n))\Theta(g(n))=O(g(n))\cap\Omega(g(n))

を満たすことである。このとき、g(n)g(n)f(n)f(n)下界かつ上界であるもしくは漸近的にタイトな限界(asymptotically tight bounds)という。

 これらの定義の相違についてを記す。まずはf(n)Θ(g(n))f(n)\in\Theta(g(n))であるとき、十分に大きな全てのnnで正のc1>0,c2>0c_{1}>0,c_{2}>0が存在して

c1g(n)f(n)c2g(n)c_{1}g(n)\leq f(n)\leq c_{2}g(n)

を満たすため、

limnf(n)g(n)=c3\lim_{n\to\infty}\frac{f(n)}{g(n)}=c_{3}

を満たす有限の極限値c3(c30)c_{3}(c_{3}\neq 0)をもつ。これはΘ(g(n))\Theta(g(n))の定義と同値な表現である。特に、c3=1c_{3}=1であるときf(n)f(n)g(n)g(n)漸近的に等しいという。次に、f(n)O(g(n))Θ(g(n))f(n)\in O(g(n))\setminus\Theta(g(n))であるときを考えれば、十分に大きな全てのnn

f(n)c2g(n)f(n)\leq c_{2}g(n)

を満たすc2>0c_{2}>0のうち

c1g(n)f(n)c2g(n)c_{1}g(n)\leq f(n)\leq c_{2}g(n)

を満たすc1>0c_{1}>0が存在しないものとなる。すなわち、十分に大きなnnでは任意のcc

0f(n)<c2g(n)0\leq f(n)< c_{2}g(n)

であるということである。つまり、

limnf(n)g(n)=0\lim_{n\to\infty}\frac{f(n)}{g(n)}=0

を満たす。同様にして、f(n)Ω(g(n))Θ(g(n))f(n)\in\Omega(g(n))\setminus\Theta(g(n))を考えれば

limng(n)f(n)=0\lim_{n\to\infty}\frac{g(n)}{f(n)}=0

である。これより、以下の定義が与えられる。

定義

 f(n)o(g(n))f(n)\in o(g(n))となるとは

o(g(n))=O(g(n))Θ(g(n))o(g(n))=O(g(n))\setminus\Theta(g(n))

を満たすことである。また、これは

n0(n0>0),c(c>0) s.t. n(n>n0),0f(n)<cg(n)\exist n_{0}(n_{0}>0),\forall c(c>0)\ s.t.\ \forall n(n>n_{0}),0\leq f(n)< cg(n)

および

limnf(n)g(n)=0\lim_{n\to\infty}\frac{f(n)}{g(n)}=0

を満たすことと同値である。

定義

 f(n)ω(g(n))f(n)\in\omega(g(n))となるとは

ω(g(n))=Ω(g(n))Θ(g(n))\omega(g(n))=\Omega(g(n))\setminus\Theta(g(n))

を満たすことである。また、これは

n0(n0>0),c(c>0) s.t. n(n>n0),0cg(n)<f(n)\exist n_{0}(n_{0}>0),\forall c(c>0)\ s.t.\ \forall n(n>n_{0}),0\leq cg(n)<f(n)

および

limng(n)f(n)=0\lim_{n\to\infty}\frac{g(n)}{f(n)}=0

を満たすことと同値である。

 この定理より直ちに以下の補題が与えられる。

補題

 f1(n)Θ(g(n)),f2(n)O(g(n))f_{1}(n)\in\Theta(g(n)),f_{2}(n)\in O(g(n))について

f1(n)+f2(n)Θ(g(n))f_{1}(n)+f_{2}(n)\in\Theta(g(n))。

 同様にして、f3(n)Ω(g(n))f_{3}(n)\in\Omega(g(n))について

f1(n)+f3(n)Θ(g(n))f_{1}(n)+f_{3}(n)\in\Theta(g(n))。

証明

 f2(n)Θ(g(n))f_{2}(n)\in\Theta(g(n))のときは自明であるためf2(n)∉Θ(g(n))f_{2}(n)\not\in\Theta(g(n))、すなわちf2(n)o(g(n))f_{2}(n)\in o(g(n))の場合を示す。f1(n)+f2(n)g(n)\frac{f_{1}(n)+f_{2}(n)}{g(n)}nn\to\inftyについて考えると

limnf1(n)+f2(n)g(n)=limnf1(n)g(n)\lim_{n\to\infty}\frac{f_{1}(n)+f_{2}(n)}{g(n)}=\lim_{n\to\infty}\frac{f_{1}(n)}{g(n)}

となり、0でない有限の値をとる。つまり、f1(n)+f2(n)Θ(g(n))f_{1}(n)+f_{2}(n)\in\Theta(g(n))である。また、f3(n)f_{3}(n)についても同様である。
 よって、命題は証明された。


 与えたこれらの漸近記法は厳密には集合であるが、慣習としてf(n)=O(n)f(n)=O(n)のように等号で記述することがある。

分割統治法の計算量

 まずは、漸近記法を用いて分割統治法のアルゴリズムについての一般の漸化式を示す。最悪計算量T(n)T(n)のアルゴリズムが

{T(1)=Θ(1)(n=1)T(n)=aT(nb)+f(n)(other)\begin{dcases}T(1)=\Theta(1) & (n=1) \\T(n)=aT\left(\frac{n}{b}\right)+f(n) & (other)\end{dcases}

のような漸化式で記述されるとする。なお、a1,b>1a\geq 1,b>1nb\frac{n}{b}は切り上げもしくは切り捨てを示す。
 この漸化式を解く手法として以下の3つが存在する。

  • 置き換え法(substitution method)
     限界を推定して数学的帰納法により証明をする手法。

  • 再帰木法(recursion-tree method)
     漸化式を木として展開し、各節点を再帰レベルに対する必要な計算量としてその和により限界を与える手法。

  • マスター法(master method)
     上記の漸化式を解くことにより限界を与える手法。

 以下ではそれぞれを解説していく。

置き換え法

 置き換え法については前述したとおりであるため、簡単な例を示す。簡単のために

{T(1)=1(n=1)T(n)=2T(n2)+n(other)\begin{dcases}T(1)=1 & (n=1) \\T(n)=2T\left(\left\lfloor\frac{n}{2}\right\rfloor\right)+n & (other)\end{dcases}

を解くことを考える。
 T(n)=O(nlogn)T(n)=O(n\log{n})と推定すれば、あるn0>0n_{0}>0が存在して、n>n0n>n_{0}においてある定数c>0c>0が存在してT(n)cnlognT(n)\leq cn\log{n}を満たすこととなる。これを漸化式に代入すると

T(n)=2cn2logn2+ncnlogn2+n=cnlogncnlog2+ncnlogn\begin{aligned}T(n)=&2c\left\lfloor\frac{n}{2}\right\rfloor\log{\left\lfloor\frac{n}{2}\right\rfloor}+n \\\leq&cn\log{\frac{n}{2}}+n \\=&cn\log{n}-cn\log{2}+n \\\leq&cn\log{n}。\end{aligned}

 なお、この操作の最後の不等号は1clog201-c\log{2}\leq 0となるようにccを選択したこととする。つまり、1log2c\frac{1}{\log{2}}\leq cである。
 次に、n0n_{0}を求める。n=1n=1のときはT(1)=1T(1)=1およびclog1=0c\log{1}=0となるためT(n)cnlognT(n)\leq cn\log{n}は成り立たない。n=2n=2のときはT(2)=4T(2)=4および2clog2>02c\log{2}>0となるため適当なccを選択することによりT(n)cnlognT(n)\leq cn\log{n}が成り立つ。よって、n0=2n_{0}=2となる。
 以上より、数学的帰納法によりT(n)=O(nlogn)T(n)=O(n\log{n})となる。
 次に、T(n)T(n)の下界を偶数2n2nと奇数2n+12n+1に分けて考える。まず、偶数のときT(2n)=Ω(2nlog2n)T(2n)=\Omega(2n\log{2n})と推定すれば

T(2n)=2c2n2log2n2+2n=2cnlog2n2+2n=2cnlog2n2cnlog2+2nc2nlog2n\begin{aligned}T(2n)=&2c\left\lfloor\frac{2n}{2}\right\rfloor\log{\left\lfloor\frac{2n}{2}\right\rfloor}+2n \\=&2cn\log{\frac{2n}{2}}+2n \\=&2cn\log{2n}-2cn\log{2}+2n \\\geq&c\cdot 2n\log{2n}。\end{aligned}

 なお、この操作の最後の不等号は1clog201-c\log{2}\geq 0となるようにccを選択したこととする。つまり、1log2c\frac{1}{\log{2}}\geq cである。奇数のときは、T(2n+1)=Ω(2nlog2n)T(2n+1)=\Omega(2n\log{2n})と推定すれば

T(2n+1)=2c2n+112log2n+112+2n+1=2cnlog2n2+2n+1=2cnlog2n2cnlog2+2n+12cnlog2n2cnlog2+2nc2nlog2n\begin{aligned}T(2n+1)=&2c\left\lfloor\frac{2n+1-1}{2}\right\rfloor\log{\left\lfloor\frac{2n+1-1}{2}\right\rfloor}+2n+1 \\=&2cn\log{\frac{2n}{2}}+2n+1 \\=&2cn\log{2n}-2cn\log{2}+2n+1 \\\geq&2cn\log{2n}-2cn\log{2}+2n \\\geq&c\cdot 2n\log{2n}。\end{aligned}

なお、この操作の最後の不等号は1clog201-c\log{2}\geq 0となるようにccを選択したこととする。つまり、1log2c\frac{1}{\log{2}}\geq cである。n0n_{0}についてはT(n)=O(nlogn)T(n)=O(n\log{n})と推定した場合と同様に考えることでn0=1n_{0}=1と求まる。
 以上より、数学的帰納法によりT(n)=Ω(nlogn)T(n)=\Omega(n\log{n})となり、T(n)=Θ(nlogn)T(n)=\Theta(n\log{n})が得られる。

 このようにして、限界を推定して数学的帰納法を用いることで計算量を求めることができる。

再帰木法

 再帰木法についても前述したとおりである。しかしながら、再帰木法により得られた計算量がT(n)T(n)の上界もしくは下界となるとは限らないことに留意する必要がある。あくまでも置き換え法により確かめる場合のよりよい推定を与える手法である。また、推定を与えるだけであるため、ある程度の杜撰さも許される。
 そこで、例として前述した置き換え法により計算量を与えた

{T(1)=1(n=1)T(n)=2T(n2)+n(other)\begin{dcases}T(1)=1 & (n=1) \\T(n)=2T\left(\left\lfloor\frac{n}{2}\right\rfloor\right)+n & (other)\end{dcases}

を再帰木法により推定をする。この漸化式により生成される木の深さはT(n)T(n)に対してlog2n\log_{2}{n}であるため、これらを直接和をとる。このときの最悪計算量はnnが2の冪乗となる場合であるため、n=2Nn=2^{N}と置換して考える。これにより、

T(n)=2T(2N1)+2N=2(T(2N2)+2N1)+2N=N2N=nlog2(n)\begin{aligned}T(n)=&2T(2^{N-1})+2^{N} \\=&2(T(2^{N-2})+2^{N-1})+2^{N} \\=&N2^{N} \\=&n\log_{2}(n)\end{aligned}

が得られ、最悪計算量がT(n)=Θ(nlogn)T(n)=\Theta(n\log{n})と推定される。そして、これを前述で行ったように置き換え法により整合性を証明すればいい。しかしながら、これは等号により式変形をして与えられているため正確にT(n)=Θ(nlogn)T(n)=\Theta(n\log{n})となり、置き換え法を用いる必要はない。

マスター法

 マスター法についても前述のとおりであり、それは以下のマスター定理により与えられる。

証明

定理

 最悪計算量T(n)T(n)のアルゴリズムが

{T(1)=Θ(1)(n=1)T(n)=aT(nb)+f(n)(other)\begin{dcases}T(1)=\Theta(1) & (n=1) \\T(n)=aT\left(\frac{n}{b}\right)+f(n) & (other)\end{dcases}

のような漸化式で記述されるとする。なお、a1,b>1a\geq 1,b>1nb\frac{n}{b}は切り上げもしくは切り捨てを示す。このとき、非負の関数f(n)f(n)により以下の分類が与えられる。

  • ε>0,f(n)=O(nlogbaε)  T(n)=Θ(nlogba)\exist \varepsilon>0,f(n)=O(n^{\log_{b}{a}-\varepsilon})\ \Rightarrow\ T(n)=\Theta(n^{\log_{b}{a}})

  • f(n)=Θ(nlogba)  T(n)=Θ(nlogbalogn)f(n)=\Theta(n^{\log_{b}{a}})\ \Rightarrow\ T(n)=\Theta(n^{\log_{b}{a}}\log{n})

  • ε>0,f(n)=Ω(nlogba+ε),c<0,n0>0 s.t. n>n0,af(nb)cf(n)  T(n)=Θ(f(n))\exist \varepsilon>0,f(n)=\Omega(n^{\log_{b}{a}+\varepsilon}),\exist c<0,\exist n_{0}>0\ s.t.\ \forall n>n_{0},af\left(\frac{n}{b}\right)\leq cf(n)\ \Rightarrow\ T(n)=\Theta(f(n))

 これをマスター定理(master theorem)という。特に、n0>0 s.t. n>n0,af(nb)cf(n)\exist n_{0}>0\ s.t.\ \forall n>n_{0},af\left(\frac{n}{b}\right)\leq cf(n)であることをf(n)f(n)は正則性を満たすという。

証明

 まず、nnbbの冪乗、すなわちn=bNn=b^{N}と表現される場合を示す。これを再帰木として展開すると

T(n)=aT(nb1)+f(n)=a(aT(nb2)+f(nb1))+f(n)=Θ(aN)+k=0N1akf(nbk)\begin{aligned}T(n)=&aT(nb^{-1})+f(n) \\=&a(aT(nb^{-2})+f(nb^{-1}))+f(n) \\=&\Theta(a^{N})+\sum_{k=0}^{N-1}a^{k}f(nb^{-k})\end{aligned}

と与えられるため、これに対してf(n)f(n)を代入してT(n)T(n)の計算量を与える。また、

aN=(blogba)N=bNlogba=nlogbaa^{N}=(b^{\log_{b}{a}})^{N}=b^{N\log_{b}{a}}=n^{\log_{b}{a}}

となることを用いる。1)について、f(n)=O(nlogbaε)f(n)=O(n^{\log_{b}{a}-\varepsilon})とおけば

T(n)=Θ(aN)+k=0N1akO((nbk)logbaε)=Θ(aN)+O(nlogbaεk=0N1ak(blogbaε)k)=Θ(aN)+O(nlogbaεk=0N1akakbkε)=Θ(aN)+O(nlogbaεbNε1bε1)=Θ(aN)+O(nlogbaεnε)=Θ(nlogba)+O(nlogba)=Θ(nlogba)\begin{aligned}T(n)=&\Theta(a^{N})+\sum_{k=0}^{N-1}a^{k}O((nb^{-k})^{\log_{b}{a}-\varepsilon}) \\=&\Theta(a^{N})+O\left(n^{\log_{b}{a}-\varepsilon}\sum_{k=0}^{N-1}a^{k}(b^{\log_{b}{a}-\varepsilon})^{-k}\right) \\=&\Theta(a^{N})+O\left(n^{\log_{b}{a}-\varepsilon}\sum_{k=0}^{N-1}a^{k}a^{-k}b^{k\varepsilon}\right) \\=&\Theta(a^{N})+O\left(n^{\log_{b}{a}-\varepsilon}\frac{b^{N\varepsilon}-1}{b^{\varepsilon}-1}\right) \\=&\Theta(a^{N})+O(n^{\log_{b}{a}-\varepsilon}n^{\varepsilon}) \\=&\Theta(n^{\log_{b}{a}})+O(n^{\log_{b}{a}}) \\=&\Theta(n^{\log_{b}{a}})。\end{aligned}

 2)について、f(n)=Θ(nlogba)f(n)=\Theta(n^{\log_{b}{a}})とおけば

T(n)=Θ(aN)+k=0N1akΘ((nbk)logba)=Θ(aN)+Θ(nlogbak=0N1ak(blogba)k)=Θ(aN)+Θ(nlogbak=0N1akak)=Θ(aN)+Θ(nlogbaN)=Θ(nlogba)+Θ(nlogbalogbn)=Θ(nlogbalogbn)\begin{aligned}T(n)=&\Theta(a^{N})+\sum_{k=0}^{N-1}a^{k}\Theta((nb^{-k})^{\log_{b}{a}}) \\=&\Theta(a^{N})+\Theta\left(n^{\log_{b}{a}}\sum_{k=0}^{N-1}a^{k}(b^{\log_{b}{a}})^{-k}\right) \\=&\Theta(a^{N})+\Theta\left(n^{\log_{b}{a}}\sum_{k=0}^{N-1}a^{k}a^{-k}\right) \\=&\Theta(a^{N})+\Theta\left(n^{\log_{b}{a}}N\right) \\=&\Theta(n^{\log_{b}{a}})+\Theta(n^{\log_{b}{a}}\log_{b}{n}) \\=&\Theta(n^{\log_{b}{a}}\log_{b}{n})。\end{aligned}

 なお、最後の行に関してはnbn\geq bnlogbanlogbalogbnn^{\log_{b}{a}}\leq n^{\log_{b}{a}}\log_{b}{n}となることを用いた。3)について、

g(n)=k=0N1akf(nbk)g(n)=\sum_{k=0}^{N-1}a^{k}f(nb^{-k})

とすればakf(nbk)a^{k}f(nb^{-k})は非負であるためg(n)=Ω(f(n))g(n)=\Omega(f(n))である。正則性より十分に大きなnnf(nb1)caf(n)f(nb^{-1})\leq \frac{c}{a}f(n)が成り立ち、さらにf(nb2)caf(nb1)f(nb^{-2})\leq \frac{c}{a}f(nb^{-1})が成り立つことからf(nb2)(ca)2f(n)f(nb^{-2})\leq \left(\frac{c}{a}\right)^{2}f(n)であり、nnn0n_{0}よりも十分に大きいものと仮定してこれを繰り返すことにより

akf(nbk)ckf(n)a^{k}f(nb^{-k})\leq c^{k}f(n)

が成り立つ。これを満たさないのはnbkn0=O(1)nb^{-k}\leq n_{0}=O(1)を満たす高々定数個であり、akf(nbk)=O(1)a^{k}f(nb^{-k})=O(1)である。その個数をMMとしたとき

k=NMN1akf(nbk)=MO(1)=O(1)\sum_{k=N-M}^{N-1}a^{k}f(nb^{-k})=MO(1)=O(1)

であり、

g(n)k=0N1ckf(n)+k=NMN1akf(nbk)f(n)k=0ck+O(1)=f(n)1c+O(1)=O(f(n))\begin{aligned}g(n)\leq&\sum_{k=0}^{N-1}c^{k}f(n)+\sum_{k=N-M}^{N-1}a^{k}f(nb^{-k}) \\\leq&f(n)\sum_{k=0}^{\infty}c^{k}+O(1) \\=&\frac{f(n)}{1-c}+O(1) \\=&O(f(n))\end{aligned}

となり、g(n)=Θ(f(n))g(n)=\Theta(f(n))が成り立つ。これを用いることでf(n)=Ω(nlogba+ε)f(n)=\Omega(n^{\log_{b}{a}+\varepsilon})よりT(n)T(n)

T(n)=Θ(nlogba)+Θ(f(n))=Θ(f(n))T(n)=\Theta(n^{\log_{b}{a}})+\Theta(f(n))=\Theta(f(n))。

 なお、これは十分に大きなnnであるc1>0,c2>0c_{1}>0,c_{2}>0を用いてc1nlogbac1nlogba+εf(n)c2nlogba+εc_{1}n^{\log_{b}{a}}\leq c_{1}n^{\log_{b}{a}+\varepsilon}\leq f(n)\leq c_{2}n^{\log_{b}{a}+\varepsilon}となることを用いた。
 次に、n=bNn=b^{N}とあらわされるnnだけではなくすべてのnn、すなわち

T(n)=aT(nb)+f(n) or T(n)=aT(nb)+f(n)T(n)=aT\left(\left\lfloor\frac{n}{b}\right\rfloor\right)+f(n)\ or\ T(n)=aT\left(\left\lceil\frac{n}{b}\right\rceil\right)+f(n)

の場合について示す。まずはnb\frac{n}{b}が切り上げの場合について、再帰木を生成するにあたって

nk={n(k=0)nk1b(other)n_{k}=\begin{dcases}n & (k=0) \\\left\lceil\frac{n_{k-1}}{b}\right\rceil & (other)\end{dcases}

と記述する。また、xx+1\lceil x\rceil\leq x+1より上記漸化式を繰り返し適用することで

n0nn1nb+1n2nb2+1b+1\begin{aligned}n_{0}\leq&n \\n_{1}\leq&\frac{n}{b}+1 \\n_{2}\leq&\frac{n}{b^{2}}+\frac{1}{b}+1 \\&\vdots\end{aligned}

となることからnkn_{k}については

nknbk+i=0k11bi<nbk+i=01bi=nbk+bb1n_{k}\leq\frac{n}{b^{k}}+\sum_{i=0}^{k-1}\frac{1}{b^{i}}<\frac{n}{b^{k}}+\sum_{i=0}^{\infty}\frac{1}{b^{i}}=\frac{n}{b^{k}}+\frac{b}{b-1}

が成り立つ。再帰の深さをlogbn\lfloor\log_{b}{n}\rfloorと推定すると、x>x1\lfloor x\rfloor>x-1よりk=logbnk=\lfloor\log_{b}{n}\rfloorのときは

nlogbn<nblogbn+bb1<nblogbn1+bb1=b+bb1=O(1)\begin{aligned}n_{\lfloor\log_{b}{n}\rfloor}<&\frac{n}{b^{\lfloor\log_{b}{n}\rfloor}}+\frac{b}{b-1} \\<&\frac{n}{b^{\log_{b}{n}-1}}+\frac{b}{b-1} \\=&b+\frac{b}{b-1} \\=&O(1)\end{aligned}

となり、高々定数となるため再帰の深さはlogbn\lfloor\log_{b}{n}\rfloorである。これより、n=bNn=b^{N}のときは再帰の深さがNNであったことに対応して、再帰木としてT(n)T(n)を展開すると

T(n)=Θ(alogbn)+k=0logbn1akf(nk)=Θ(nlogba)+k=0logbn1akf(nk)T(n)=\Theta(a^{\log_{b}{n}})+\sum_{k=0}^{\lfloor\log_{b}{n}\rfloor-1}a^{k}f(n_{k})=\Theta(n^{\log_{b}{a}})+\sum_{k=0}^{\lfloor\log_{b}{n}\rfloor-1}a^{k}f(n_{k})

となるため、n=bNn=b^{N}の場合と同じ要領で証明をする。3)について、

g(n)=k=0logbn1akf(nk)g(n)=\sum_{k=0}^{\lfloor\log_{b}{n}\rfloor-1}a^{k}f(n_{k})

として、正則性より十分に大きなnnakf(nk)ckf(n)a^{k}f(n_{k})\leq c^{k}f(n)が成り立つためn=bNn=b^{N}のときと同様にして示される。2)について、f(n)=O(nlogba)f(n)=O(n^{\log_{b}{a}})よりある定数c>0c>0が存在して

f(nk)cnklogba<c(nbk+bb1)logba=c(nbk(1+bknbb1))logba=c(nlogbaak)(1+bknbb1)logba\begin{aligned}f(n_{k})\leq&cn_{k}^{\log_{b}{a}} \\<&c\left(\frac{n}{b^{k}}+\frac{b}{b-1}\right)^{\log_{b}{a}} \\=&c\left(\frac{n}{b^{k}}\left(1+\frac{b^{k}}{n}\cdot\frac{b}{b-1}\right)\right)^{\log_{b}{a}} \\=&c\left(\frac{n^{\log_{b}{a}}}{a^{k}}\right)\left(1+\frac{b^{k}}{n}\cdot\frac{b}{b-1}\right)^{\log_{b}{a}}\end{aligned}

と記述することができ、klogbnk\leq\lfloor\log_{b}{n}\rfloor

bknblogbnnblogbnn=1\frac{b^{k}}{n}\leq\frac{b^{\lfloor\log_{b}{n}\rfloor}}{n}\leq\frac{b^{\log_{b}{n}}}{n}=1

となるため

f(nk)<c(nlogbaak)(1+bb1)logbaf(n_{k})<c\left(\frac{n^{\log_{b}{a}}}{a^{k}}\right)\left(1+\frac{b}{b-1}\right)^{\log_{b}{a}}。

 このとき、(1+bb1)logba\left(1+\frac{b}{b-1}\right)^{\log_{b}{a}}は定数であるためf(nk)=O(aknlogba)f(n_{k})=O(a^{-k}n^{\log_{b}{a}})となる。また、xx\lceil x\rceil\geq xとなることから

nknbkn_{k}\geq\frac{n}{b^{k}}

となることを用いると、f(n)=Ω(nlogba)f(n)=\Omega(n^{\log_{b}{a}})よりある定数c>0c>0が存在して

f(nk)cnklogbacnlogbaakf(n_{k})\geq cn_{k}^{\log_{b}{a}}\geq c\frac{n^{\log_{b}{a}}}{a^{k}}

となるためf(nk)=Ω(aknlogba)f(n_{k})=\Omega(a^{-k}n^{\log_{b}{a}})となり、f(nk)=Θ(aknlogba)f(n_{k})=\Theta(a^{-k}n^{\log_{b}{a}})が得られる。これをg(n)g(n)に代入すると、n=bNn=b^{N}の場合と同様にして

g(n)=k=0logbn1akΘ(aknlogba)=Θ(nlogbak=0logbn11)=Θ(nlogbalogbn)\begin{aligned}g(n)=&\sum_{k=0}^{\lfloor\log_{b}{n}\rfloor-1}a^{k}\Theta(a^{-k}n^{\log_{b}{a}}) \\=&\Theta\left(n^{\log_{b}{a}}\sum_{k=0}^{\lfloor\log_{b}{n}\rfloor-1}1\right) \\=&\Theta(n^{\log_{b}{a}}\log_{b}{n})\end{aligned}

となり、g(n)=Θ(nlogbalogbn)g(n)=\Theta(n^{\log_{b}{a}}\log_{b}{n})が得られる。つまり、T(n)=Θ(nlogbalogbn)T(n)=\Theta(n^{\log_{b}{a}}\log_{b}{n})となる。1)について、2)と同様にしてf(n)=O(nlogbaε)f(n)=O(n^{\log_{b}{a}-\varepsilon})よりある定数c>0c>0が存在して

f(nk)cnklogbaε<c(nbk)logbaε(1+bb1)logbaεf(n_{k})\leq cn_{k}^{\log_{b}{a}-\varepsilon}<c\left(\frac{n}{b^{k}}\right)^{\log_{b}{a}-\varepsilon}\left(1+\frac{b}{b-1}\right)^{\log_{b}{a}-\varepsilon}

となり、f(nk)=O((nbk)logbaε)f(n_{k})=O((nb^{-k})^{\log_{b}{a}-\varepsilon})となる。これをg(n)g(n)に代入するとn=bNn=b^{N}の場合と同様にして

g(n)k=0logbn1akc((nbk)logbaε)=cnlogbaεblogbnε1bε1cnlogbaεblogbnε1bε1cnlogbaεnε1bε1cnlogbaεnεbε1<cnlogba1bε1\begin{aligned}g(n)\leq&\sum_{k=0}^{\lfloor\log_{b}{n}\rfloor-1}a^{k}c((nb^{-k})^{\log_{b}{a}-\varepsilon}) \\=&cn^{\log_{b}{a}-\varepsilon}\frac{b^{\lfloor\log_{b}{n}\rfloor\varepsilon}-1}{b^{\varepsilon}-1} \\\leq&cn^{\log_{b}{a}-\varepsilon}\frac{b^{\log_{b}{n}\varepsilon}-1}{b^{\varepsilon}-1} \\\leq&cn^{\log_{b}{a}-\varepsilon}\frac{n^{\varepsilon}-1}{b^{\varepsilon}-1} \\\leq&cn^{\log_{b}{a}-\varepsilon}\frac{n^{\varepsilon}}{b^{\varepsilon}-1} \\<&cn^{\log_{b}{a}}\frac{1}{b^{\varepsilon}-1}\end{aligned}

となり、1bε1\frac{1}{b^{\varepsilon}-1}は定数であることからg(n)=O(nlogba)g(n)=O(n^{\log_{b}{a}})となる。つまり、T(n)=Θ(nlogba)T(n)=\Theta(n^{\log_{b}{a}})である。
 切り捨ての場合については切り上げの場合と同様にして示される。
 よって、命題は証明された。


 この定理を適用できないf(n)f(n)というのは1)と2)の間、2)と3)の間に存在する関数および正則でない場合である。例えば、

T(n)=2T(n2)+nlognT(n)=2T\left(\frac{n}{2}\right)+n\log{n}

であるときは、

limnnlogbanlogn=limnnnlogn=0\lim_{n\to\infty}\frac{n^{\log_{b}{a}}}{n\log{n}}=\lim_{n\to\infty}\frac{n}{n\log{n}}=0

よりnlogn=ω(nlogba)n\log{n}=\omega(n^{\log_{b}{a}})となるため3)が適用可能であると考えられるが、

limnnlogba+εnlogn=limnnεlogn=\lim_{n\to\infty}\frac{n^{\log_{b}{a}+\varepsilon}}{n\log{n}}=\lim_{n\to\infty}\frac{n^{\varepsilon}}{\log{n}}=\infty

となるためnlognΩ(nlogba+ε)n\log{n}\neq\Omega(n^{\log_{b}{a}+\varepsilon})であり、この漸化式は2)と3)の間に属するため、マスター定理を適用することができない。

練習問題

 最初に挙げた図書の練習問題における事実も割と重要であると思ったため解く。ページとしては87Pの下部にある。
 まずは以下の補題を示す。

補題

 a,bZa,b\in{\mathbb Z}xRx\in{\mathbb R}について

x/ab=xab,   x/ab=xab\left\lceil\frac{\lceil x/a\rceil}{b}\right\rceil=\left\lceil\frac{x}{ab}\right\rceil,\ \ \ \left\lfloor\frac{\lfloor x/a\rfloor}{b}\right\rfloor=\left\lfloor\frac{x}{ab}\right\rfloor

が成り立つ。

そのうち天井関数と床関数を別の記事で扱うため、そのときにこれは削除する

証明

 まずは天井関数に対してを示す。天井関数の不等式について

xa1<xaxa  x/a1b<xabx/ab\left\lceil\frac{x}{a}\right\rceil-1<\frac{x}{a}\leq\left\lceil\frac{x}{a}\right\rceil \ \Rightarrow\ \frac{\lceil x/a\rceil-1}{b}<\frac{x}{ab}\leq\frac{\lceil x/a\rceil}{b}

が成り立つ。ここで、c=xac=\lceil\frac{x}{a}\rceilbbで割れば、剰余0r<b0\leq r<bと商qqを用いて一意にc=qbrc=qb-rとあらわされることを用いて

c1b<xabcb\frac{c-1}{b}<\frac{x}{ab}\leq\frac{c}{b}

とあらわすとする。このとき、

q1c1b<xabcbqq-1\leq\frac{c-1}{b}<\frac{x}{ab}\leq\frac{c}{b}\leq q

と記述することができるため、

xab=cb  xab=x/ab\frac{x}{ab}=\frac{c}{b} \ \Rightarrow\ \left\lceil\frac{x}{ab}\right\rceil=\left\lceil\frac{\lceil x/a\rceil}{b}\right\rceil。

 床関数についても同様である。
 よって、命題は証明された。


問題4.6-1

 bbが任意の実数ではなく正の整数であるとき、

nk={n(k=0)nk1b(other)n_{k}=\begin{dcases}n & (k=0) \\\left\lceil\frac{n_{k-1}}{b}\right\rceil & (other)\end{dcases}

nkn_{k}の簡単で正確な式を求めよ。

解答

 仮定よりbbは正の整数であるため

n2=n/bb=nb2n_{2}=\left\lceil\frac{\lceil n/b\rceil}{b}\right\rceil=\left\lceil\frac{n}{b^{2}}\right\rceil

が成り立つ。これを逐次適用することで

nk=nbkn_{k}=\left\lceil\frac{n}{b^{k}}\right\rceil

が得られる。


問題4.6-2

 k0k\geq 0とする。f(n)=Θ(nlogbalogln)f(n)=\Theta(n^{\log_{b}{a}}\log^{l}{n})ならばマスター法の漸化式の解はT(n)=Θ(nlogbalogl+1n)T(n)=\Theta(n^{\log_{b}{a}}\log^{l+1}{n})と与えられる。bbの冪乗のみに解析を限定してもよい。

解答

 マスター定理の証明と同様にして

T(n)=Θ(nlogba)+k=0logbn1akf(nk),   g(n)=k=0logbn1akf(nk)T(n)=\Theta(n^{\log_{b}{a}})+\sum_{k=0}^{\lfloor\log_{b}{n}\rfloor-1}a^{k}f(n_{k}),\ \ \ g(n)=\sum_{k=0}^{\lfloor\log_{b}{n}\rfloor-1}a^{k}f(n_{k})

と記述するとする。また、漸化式のnb\frac{n}{b}が切り上げと切り捨てでどちらも同様に証明されるため、切り上げの場合のみを示す。まず、f(nk)f(n_{k})について、f(n)=O(nlogbalogln)f(n)=O(n^{\log_{b}{a}}\log^{l}{n})よりある定数c>0c>0が存在して

f(nk)cnklogbaloglnk<c(nlogbaak)(1+bb1)logbaloglnk\begin{aligned}f(n_{k})\leq&cn_{k}^{\log_{b}{a}}\log^{l}{n_{k}} \\<&c\left(\frac{n^{\log_{b}{a}}}{a^{k}}\right)\left(1+\frac{b}{b-1}\right)^{\log_{b}{a}}\log^{l}{n_{k}}\end{aligned}

となり、f(nk)=O(nlogbaakloglnk)f(n_{k})=O(n^{\log_{b}{a}}a^{-k}\log^{l}{n_{k}})が得られる。ここで、nkn_{k}を除去するために対数部について展開すると

loglnklogl(nbk(1+bb1))=(lognbk+log(1+bb1))l=loglnbk+o(loglnbk)=O(loglnbk)\begin{aligned}\log^{l}{n_{k}}\leq&\log^{l}\left(\frac{n}{b^{k}}\left(1+\frac{b}{b-1}\right)\right) \\=&\left(\log{\frac{n}{b^{k}}}+\log{\left(1+\frac{b}{b-1}\right)}\right)^{l} \\=&\log^{l}{\frac{n}{b^{k}}}+o(\log^{l}{\frac{n}{b^{k}}}) \\=&O(\log^{l}{\frac{n}{b^{k}}})\end{aligned}

となるため、f(nk)=O(nlogbaakloglnbk)f(n_{k})=O(n^{\log_{b}{a}}a^{-k}\log^{l}{nb^{-k}})となる。同様にして、f(n)=Ω(nlogbalogkn)f(n)=\Omega(n^{\log_{b}{a}}\log^{k}{n})よりある定数c>0c>0が存在して

f(nk)cnklogbaloglnkcnlogbaakloglnbkf(n_{k})\geq cn_{k}^{\log_{b}{a}}\log^{l}{n_{k}}\geq c\frac{n^{\log_{b}{a}}}{a^{k}}\log^{l}{\frac{n}{b^{k}}}

となるためf(nk)=Ω(nlogbaakloglnbk)f(n_{k})=\Omega(n^{\log_{b}{a}}a^{-k}\log^{l}{nb^{-k}})が得られ、f(nk)=Θ(nlogbaakloglnbk)f(n_{k})=\Theta(n^{\log_{b}{a}}a^{-k}\log^{l}{nb^{-k}})となる。これをg(n)g(n)に代入すると

g(n)=k=0logbn1akΘ(nlogbaakloglnbk)=Θ(nlogbak=0logbn1(lognlogbk)l)=Θ(nlogbak=0logbn1(loglno(logln)))=Θ(nlogbalogbn(loglno(logln)))=Θ(nlogba(logl+1no(logl+1n)))=Θ(nlogbalogl+1n)\begin{aligned}g(n)=&\sum_{k=0}^{\lfloor\log_{b}{n}\rfloor-1}a^{k}\Theta(n^{\log_{b}{a}}a^{-k}\log^{l}{nb^{-k}}) \\=&\Theta\left(n^{\log_{b}{a}}\sum_{k=0}^{\lfloor\log_{b}{n}\rfloor-1}(\log{n}-\log{b^{k}})^{l}\right) \\=&\Theta\left(n^{\log_{b}{a}}\sum_{k=0}^{\lfloor\log_{b}{n}\rfloor-1}(\log^{l}{n}-o(\log^{l}{n}))\right) \\=&\Theta(n^{\log_{b}{a}}\lfloor\log_{b}{n}\rfloor(\log^{l}{n}-o(\log^{l}{n}))) \\=&\Theta(n^{\log_{b}{a}}(\log^{l+1}{n}-o(\log^{l+1}{n}))) \\=&\Theta(n^{\log_{b}{a}}\log^{l+1}{n})\end{aligned}

となり、nlogbanlogbalogl+1nn^{\log_{b}{a}}\leq n^{\log_{b}{a}}\log^{l+1}{n}であるためT(n)=Θ(nlogbalogl+1n)T(n)=\Theta(n^{\log_{b}{a}}\log^{l+1}{n})となる。


問題4.6-3

 マスター定理の3)は次の意味で冗長である。ある定数c<1c<1に対して正則性af(nb)cf(n)af\left(\frac{n}{b}\right)\leq cf(n)が成り立つならば、f(n)=Ω(nlogba+ε)f(n)=\Omega(n^{\log_{b}{a}+\varepsilon})を満たすある定数ε>0\varepsilon>0が存在する。

解答

 正則性よりある定数kkが存在して

akf(1)ckf(n)=ckf(blogbn)a^{k}f(1)\leq c^{k}f(n)=c^{k}f(b^{\log_{b}{n}})

が成り立ち、kkは高々logbn\lfloor\log_{b}{n}\rfloorであるため

f(n)(ac)logbnf(1)=f(1)nlogbac=f(1)nlogbalogbcf(n)\geq\left(\frac{a}{c}\right)^{\log_{b}{n}}f(1)=f(1)n^{\log_{b}{\frac{a}{c}}}=f(1)n^{\log_{b}{a}-\log_{b}{c}}。

 仮定よりc<1c<1であるためlogbc<0\log_{b}{c}<0であり、ε=logbc>0\varepsilon=-\log_{b}{c}>0としてf(n)=Ω(nlogba+ε)f(n)=\Omega(n^{\log_{b}{a}+\varepsilon})が得られる。


おわりに

 今まで何となくの雰囲気でのみ理解していたが、再勉強した。対数の底は2として扱うべきであると思ったが、底の変換公式より底の違いでは対数は定数倍だけ変わり、漸近記法に関して何も影響はないため無視した。
 証明に関しては割と雑に行ったため(というか途中で日々の疲れで力尽きかけながら書いたため)間違っている気もするが、おおよその筋書きは合っていると思うためこれで良しとした。