計算能力:Pで偶数長の単語を受け取るDFAの言語ですか?

私はしばらくの間これと苦労してきたし、何かを考え出すことができない。どのポインタも本当に感謝しています。

問題は、偶数長の単語だけを受け取るすべてのDFAの言語が与えられている場合、それがPかどうかを証明することです。

私は、開始状態から受け入れるまでのすべてのパスを見つけるために、BFS/Dijkstraのアルゴリズムのようなもので、与えられたDFAの上を行くチューリングマシンを作ることを考えましたが、どのようにループを処理するのか分かりませんでしたか?

ありがとう!

2

2 答え

これは2つの州しか必要ないと思われる。

あなたの入力状態は空の文字列であり、また受け入れ状態になります。 anythignを文字列に追加すると、それを次の状態に移動します。これを「奇数」状態と呼び、それを受け入れ状態にしません。別の文字列を追加すると元の状態に戻ります。

私は、言語がPであるかどうかという用語についてはもう分かりませんので、そこに定義を付けておけば、これに合っているかどうかは分かりますが、これは最も簡単なDFAの1つです...

1
追加された
私は今あなたの問題をよく見ます。 Pにある言語の定義はどういうものなのでしょうか?何に関連してPにいるの?私はそれが時間と計算の複雑さで使われていることを今までに見たことがあります。正直言って、あなたがユニの外に出ると、このコースはあまり使われません:)
追加された 著者 corsiKa,
御時間ありがとうございます!残念ながら、問題は実際に/すべて/偶数長の単語を受け入れるDFAを構築することではなく、指定されたDFAが偶数長の単語だけを受け入れるかどうかを決定する問題
追加された 著者 user1105415,

私はそれが最悪の二次的なPにあると思う。 DFAの各状態は、4つのパリティ状態

  1. unvisited - 状態0
  2. 奇数のステップで到達可能であることがわかっています - 状態1
  3. 偶数のステップで到達可能であることがわかっている - 状態2
  4. 奇数と偶数の両方のステップで到達可能であることがわかっています - 状態3

すべての状態を未訪問としてマークし、開始状態をキュー(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 子で必要なアクションをチェックします。

1
追加された