計算量の表現 (O|Θ|Ω)記法まとめ
アルゴリズムの計算量を表現する方法として、記法や記法、記法があります。
それらの定義と違いについてまとめていきます。
定義
何らかのアルゴリズムの計算量が自然数から自然数への関数で表されるとするとき それぞれの定義はこのようになっています $$ O(g(n))=\lbrace f:\mathbb{N} \rightarrow \mathbb{N}|\exists{c}>0\exists{n_0}\forall{n}>n_0[f(n)\leq cg(n)]\rbrace $$ $$ \Theta (g(n))=\lbrace f:\mathbb{N} \rightarrow \mathbb{N}|\exists{c_1}>0\exists{c_2}>0\exists{n_0}\forall{n}>n_0[c_1g(n)\leq f(n)\leq c_2g(n)]\rbrace $$ $$ \Omega (g(n))=\lbrace f:\mathbb{N} \rightarrow \mathbb{N}|\exists{c}>0\exists{n_0}\forall{n}>n_0[cg(n)\leq f(n)]\rbrace $$ ここで、であるときに、そのアルゴリズムの計算量はであるといいます。およびについても同様です。
解説
上の定義をみて「なるほど」ってなった人はここより先は読む必要はありません。
まず、について解説していきます。それ以外のものはこれを少し変化したものだからです。
$$
\Theta (g(n))=\lbrace f:\mathbb{N} \rightarrow \mathbb{N}|\exists{c_1}>0\exists{c_2}>0\exists{n_0}\forall{n}>n_0[c_1g(n)\leq f(n)\leq c_2g(n)]\rbrace
$$
定義を再掲しておきます。
まず、
$$
\Theta(g(n))=\lbrace f:\mathbb{N} \rightarrow \mathbb{N}|\cdots \rbrace
$$
この部分は、は (自然数から自然数への関数)からなる集合だといっています。この部分は正直無視してもいいと思います。
|よりも右側ではその関数の条件を指定しています。
$$
\exists{c_0}>0\exists{c_1}>0\exists{n_0}\forall{n}>n_0[c_1g(n)\leq f(n)\leq c_2g(n)]
$$
日本語で表記するなら「と、が存在してそれらはすべてのに対してが成立する」というところでしょうか
左側から順に表記しているので日本語と記号の対応関係は探してください
つまり、の増加をの定数倍で挟めるということです
直感的には、計算量がというのはが大きいとき計算量をの定数倍でだいたい近似できると思えばいいと思います
およびについては、の式からかのどちらかが無いものなので、
であるとき、はが十分大きいとき、の定数倍より大きくない
であるとき、はが十分大きいとき、の定数倍より小さくない
ということを表すのでは計算量の上限を、は計算量の下限を表してるといえます。
上限と下限しか表さないので、計算量がのとき、この計算量はですが、であるともいえます。なんならと書いても間違いではありません。についても同様で、とか、と書いても間違いではありません。
例
例えば、計算量がで表されるとき、この計算量はであるといえます。
の定義より、あるよりも大きいすべてのに対して
$$
c_1n^3\leq 5n^3+2n^2+3n+1 \leq c_2n^3
$$
が成立するとが存在します。
これを各辺で割ると
$$
c_1\leq5+\frac{2}{n}+\frac{3}{n^2}+\frac{1}{n^3} \leq c_2
$$
が十分大きいとき、は0に収束するので、これを満たすとは存在します
逆に、計算量がで表されるとき、この計算量はではありません。
であるならの定義より、あるよりも大きいすべてのに対して
$$
c_1n^3\leq 2n^2+3n+1 \leq c_2n^3
$$
が成立するとが存在するはずです。
これを各辺で割ると
$$
c_1\leq \frac{2}{n}+\frac{3}{n^2}+\frac{1}{n^3} \leq c_2
$$
が十分大きいとき、は0に収束するので、どんな大きなに対してもこの式が成立するは存在しません。
実用上簡単な方法として、計算量の式のうち、1番発散が早い項から係数を外してとしてにするとOKだったりします
アルゴリズムの計算量で扱うのは最悪計算量であることが多いのでのみわかれば十分な場合も多いです(競プロだとだいたいこれ)
(及びについては必ずしも成立しません(例:インサートソートはでなのでは発散が早い項を入れるだけではだめで、を定義できません))
ちなみに、発散が早い項というのは、早い順に
といった感じです(がどこに入るのかいまいち把握してないけどと同じかちょっと大きいぐらいと思っている)
まとめ
とでの表記は深く考えずにだいたい同じだと思ってもそんなに問題ない(自分で書くときには書き分ける)
はほとんど使わない