logo

アルゴリズムのコストに関する漸近記法 📂アルゴリズム

アルゴリズムのコストに関する漸近記法

定義

大きさがnnのデータに対するアルゴリズムのコストを次のように表示する。

  1. OO表記: O(g(n)):={f(n)  c>0,n0N:nn0    f(n)cg(n)} O(g(n)) := \left\{ f(n) \ | \ \exists c > 0, n_{0} \in \mathbb{N} : \forall n \ge n_{0} \implies f(n) \le c g(n) \right\}
  2. Ω\Omega表記: Ω(g(n)):={f(n)  c>0,n0N:nn0    f(n)cg(n)} \Omega (g(n)) := \left\{ f(n) \ | \ \exists c > 0, n_{0} \in \mathbb{N} : \forall n \ge n_{0} \implies f(n) \ge c g(n) \right\}
  3. Θ\Theta表記: Θ(g(n)):=O(g(n))Ω(g(n)) \Theta (g(n)) := O (g(n)) \cap \Omega (g(n))

説明

漸近記法は、アルゴリズムのコストを数学的に表すものだ。エプシロン-デルタ論法を理解していれば、特に難しくなく、自然な定義として受け入れられるだろう。さらに直感的な説明を加えると、以下のようになる:

  • O(g(n))O(g(n))は、アルゴリズムが消費することができる最大-最悪のコストである。
  • Ω(g(n))\Omega (g(n))は、アルゴリズムが消費することができる最小-最善のコストである。
  • Θ(g(n))\Theta (g(n))は、アルゴリズムが消費する平均コストである。

これらは集合であるため、7n3O(n3)7n^3 \in O (n^3)のように表されるのが正しいが、通常は便宜上7n3=O(n3)7n^3 = O (n^3)のような表現を使う。また、O(n3)O(n)O(n^3) \subset O(n)であるため、数式展開上、O(n3)+O(n)=O(n3)O(n^3) + O(n) = O(n^3)のような表現も見られる。これを直感的な言葉で説明すると、「とにかくO(n3)O(n^3)ほどの莫大なコストがかかるならO(n)O(n)ぐらいは問題ないからO(n3)O(n^3)に含まれても構わない」という感じになる。

数学者の立場からすると、最も興味があるのは、コストの限界を定めるO(g(n))O(g(n))だろう。一方で、適切にアルゴリズムを使用する必要があるエンジニアの立場からは、実際のコストを表すΘ(g(n))\Theta (g(n))を気にすべきだ。さらに進んで、ローレベルの言語レベルでの最適化を行っているなら、Ω(g(n))\Omega (g(n))も考慮しなければならない。