「計算複雑性理論」の版間の差分

削除された内容 追加された内容
編集の要約なし
Okipow (会話 | 投稿記録)
m編集の要約なし
17行目:
計算複雑性理論で扱う'''問題'''とは、ある一連の問いの集合があり、各問いは有限長の[[文字列]]で表され、与えられた問いに対して解を求めて出力する計算問題である。例えば、[[素因数分解|''FACTORIZE'']]問題とは「[[二進記数法|二進数]]で書かれた1つの整数について、その[[素数|素因数]]を全部求めて返す」という問題である。問題に属する個別の問いを'''インスタンス'''と呼ぶ。例えば、「15 の素因数を求めよ」は ''FACTORIZE'' 問題のインスタンスである。
 
[[アルゴリズム]]の'''計算量'''(けいさんりょう)とは、[[計算機]]がそのアルゴリズムの実行に要する計算資源の量をいい、アルゴリズムの[[スケーラビリティ]]を示す。形式的には計算機を[[チューリング機械]]や[[即時呼出機械]]({{lang|en|random access machine}})などの[[計算模型|計算モデル]]として定式化したうえで、アルゴリズムの使用する資源の量を入力データ長などに対する[[関数 (数学)|関数]]として表す。計算モデルの瑣末な詳細に影響を受けないよう、計算量はその漸近的な挙動のみに注目し、定数倍を無視する[[ランダウの記号|O記法]]で書き表すことが多い。計算モデルとしては、[[チューリング機械]]や[[論理回路]]などがある。計算資源の量としては、チューリング機械における'''時間計算量'''(ステップ数)や'''空間計算量'''(テープ長)、また論理回路における素子数や深さなどがある。
 
* '''時間計算量'''は、あるアルゴリズムを使ったときに問題のインスタンスを解くのに要するステップ数を意味し、入力データの長さ(ビット数などで表現できる)の関数として表される。シンプルな例として、ある問題に対する解法が ''n''ビットの入力に対して、ある計算モデルで ''n''<sup>2</sup> ステップでする場合、時間計算量は ''n''<sup>2</sup> であるが、他のほとんどの計算モデルでも、時間計算量は漸近的には定数倍の違いしかなく、[[ランダウの記号|O記法]]を使えば計算モデルによらず問題の時間計算量をO(''n''<sup>2</sup>) と表せる。計算を芝生を刈る作業にたとえれば、その時間計算量は線型であり、芝生の面積が2倍になれば時間も2倍かかる。この面積が2倍になれば時間も2倍になるという関係は、芝刈機の速度には関係しない。しかし、辞書を[[二分探索]]する場合の時間計算量は対数時間であり、辞書の厚さが2倍になっても、二分探索のステップが1増加するだけである。
* '''空間計算量'''は、同様の概念であり、アルゴリズムが必要とする記憶容量を意味する。例えば、紙とペンを使って計算を行う際に要する紙の枚数に相当する。空間計算量にも[[ランダウの記号|O記法]]が使われる。