• 作成:

計算理論(時間計算量)

前回の復習

{w2w|w{0,1}*}\{w2w | w ∈ \{0, 1\}^*\}ってどういう意味かと思ってたけど, wwをスター演算の結果の一例として, 22の両隣に同じ記号列があるということだったんですね.

big-O記法

時間計算量って高級言語だと, どの式や文がステップを消費してどの行為がステップを消費しないのか今ひとつわかりませんでしたが, チューリングマシンだと1ステップがハッキリしていて良いですね.

アルゴリズムの計算量は通常複雑な式になる. 漸近的解析と呼ばれる方法を用いて簡略化する. 最高次の項だけを考え, その項の係数やより低い次数の項を無視する.

f(n)=7n4+2n2+10n+5f(n) = 7n^4 + 2n^2 + 10n + 5 なら f(n)=O(n4)f(n) = O(n^4) にする.

n=1n = 1の時, 前者は2424, 後者は11になるが, n=10n = 10の時, 前者は7030570305, 後者は1000010000で, nnを増やしていくと差がなくなっていく.

ffggを2つの関数f:NR+f: N → R^+とする. 全ての整数n>=n0n >= n_0に対して正の整数ccn0n_0が存在して f(n)<=cg(n)f(n) <= cg(n) であるとき, f(n)=O(g(n))f(n) = O(g(n))と書く.

直感的に言えば, f(n)=O(g(n))f(n) = O(g(n))と書いた時定数倍を無視してffggより小さいか等しいことを意味する.

f(n)=O(logn)f(n) = O(\log n)のように書かれるとき, 対数の底を気にする必要はない. 底が変わっても値は定数倍しか変わらないのでオーダー記法の場合は無視されるため.

small-O記法

big-Oとは違い, f(n)<cg(n)f(n) < cg(n)のように等しくなく小さいことを意味する.

アルゴリズムの解析

次のようなTuring機械M1M_1の時間計算量を調べる.

  1. テープを全て走査し, 1の右側に0があれば拒否する
  2. 0と1の両方がテープ状に残っているならば1つの0と1つの1をXで消すことを繰り返す
  3. 0と1のどちらも残っていなければ受理する, そうでなければ拒否する

この動作時間をそれぞれ調べる

  1. 左端から右端まで行って戻って来るため2n=O(n)2n = O(n)
  2. 一度0と1のペアを消すのにO(n)O(n), これを最大でn/2n / 2回繰り返す必要があるので(n/2)O(n)=O(n2)(n / 2)O(n) = O(n^2)
  3. 一度走査すれば良いためO(n)O(n)

以上をまとめるとO(n)+O(n2)+O(n)=O(n2)O(n) + O(n^2) + O(n) = O(n^2)となる.

言語のクラス分け

言語は, それを判定するために必要な時間計算量でクラス分けされる.

先程のM1M_1で判定した言語はTIME(n2)TIME(n^2)となる.

M1M_1が判定する言語A1A_1を同じく判定するTuring機械M2M_2が作れ, それはTIME(nlogn)TIME(n \log n)となる.

M2M_2はステップ2で0と1の総数の偶奇を調べ, 奇数なら拒否し, 偶数なら0と1を一つおきに消していく.

単一テープTuring機械ではこれ以上改良することは不可能である. 単一テープTuring機械でo(nlogn)o(n \log n)時間で判定する任意の言語は正規言語であることが知られているが, A1A_1は正規言語ではないからである.