Я думаю, что это в P, в худшем случае квадратичный.Каждое состояние DFA может иметь четыре состояния четности
- unvisited - состояние 0
- , о котором известно, что оно доступно за нечетное число шагов - состояние 1
- известно, что достижимо за четное число шагов - состояние 2
- известно, что достижимо как за нечетное, так и за четное число шагов - состояние 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 обрабатывается не более двух раз, каждоевремя проверки не более size
детей на необходимые действия.