私はしばらくこれに苦労していて、何も思い付くことができません。どんなポインタでも本当にありがたいです。
問題は、偶数の長さの単語のみを受け取るすべてのDFAの言語を前提として、それがPであるかどうかを証明することです。
開始状態から受け入れ状態までのすべてのパスを見つけるために、BFS /ダイクストラのアルゴリズムのようなもので特定のDFAを調べるチューリングマシンを作成することを検討しましたが、ループを処理する方法がわかりませんか?
ありがとう!
私はしばらくこれに苦労していて、何も思い付くことができません。どんなポインタでも本当にありがたいです。
問題は、偶数の長さの単語のみを受け取るすべてのDFAの言語を前提として、それがPであるかどうかを証明することです。
開始状態から受け入れ状態までのすべてのパスを見つけるために、BFS /ダイクストラのアルゴリズムのようなもので特定のDFAを調べるチューリングマシンを作成することを検討しましたが、ループを処理する方法がわかりませんか?
ありがとう!
これには2つの状態しか必要ないようです。
エントリ状態は空の文字列になり、受け入れ状態にもなります。文字列にanythignを追加すると、次の状態に移動します。これを「odd」状態と呼ぶことができますが、受け入れ状態にすることはできません。別の文字列を追加すると、元の状態に戻ります。
言語がPであるかどうかの用語についてはもうわからないと思うので、そこで定義を教えていただければ、これがそれに適合するかどうかを教えていただけますが、これは最も単純なDFAの1つです...
最悪の場合、2次式のPにあると思います。DFAの各状態は、4つのパリティ状態を持つことができます
すべての状態を未訪問としてマークし、開始状態をキュー(FIFO、優先度など)に入れ、そのパリティ状態を2に設定します。
child_parity(n)
switch(n)
case 0: error
case 1: return 2
case 2: return 1
case 3: return 3
while(queue not empty)
dfa_state <- queue
step_parity = child_parity(dfa_state.parity_state)
for next_state in dfa_state.children
old_parity = next_state.parity_state
next_state.parity_state |= step_parity
if old_parity != next_state.parity_state // we have learnt something new
add next_state to queue // remove duplicates if applicable
for as in accept_states
if as.parity_state & 1 == 1
return false
return true
私が何かを見落としている場合を除いて、各DFA状態は最大2回処理され、そのたびに最大でほとんどのsize
子に必要なアクションがないかチェックされます。