Достаточно легко обменять время на пространство следующим образом.
Преобразуйте регулярное выражение в NFA - для конкретности при сравнении алгоритмов мы будем предполагать, что - это число состояний NFA, так что ваше время для прямого моделирования NFA является действительным, а ваше пространство, ограниченное для запуска преобразованного DFA, также действует, когда вы работаете в ОЗУ, которое может адресовать столько памяти.O ( r s ) O ( 2 r )rO(rs)O(2r)
Теперь разделим состояния NFA (произвольно) на подмножеств не более чем состояний каждое. Внутри каждого подмножества мы можем индексировать подмножества в числами от до .S i ⌈ r / k ⌉ S i A i S i 0 2 ⌈ r / k ⌉ - 1kSi⌈r/k⌉SiAiSi02⌈r/k⌉−1
Составьте таблицу где и находятся в диапазоне от 0 до , - входной символ, а - (числовой индекс) подмножество . Значение, хранящееся в таблице, является (числовой индекс) подмножеством : состояние находится в тогда и только тогда, когда принадлежит и в есть состояние, которое переходит к на входном символе .i j k - 1 c A i S i S j y T [ i , j , c , A i ] y S j A i y cT[i,j,c,Ai]ijk−1cAiSiSjyT[i,j,c,Ai]ySjAiyc
Чтобы смоделировать NFA, сохраните индексов, по одному для каждого , указав подмножество состояний в которые могут быть достигнуты при помощи некоторого префикса ввода. Для каждого входного символа используйте таблицы, чтобы найти для каждой пары набор состояний в который может быть достигнут из состояния в путем перехода наS i A i S i c i , j S j A i ckSiAiSici,jSjAic , а затем используйте побитовый двоичный код или операцию над числовые индексы этих наборов состояний объединяют их в единое подмножество состояний . Итак, каждый шаг моделирования занимает время O ( k 2 )SjO(k2)и общее время моделирования составляет .O(sk2)
Требуемое пространство - это пространство для всех таблиц, которое равно . Анализ времени и пространства действителен для любой оперативной памяти, которая может адресовать столько памяти, и которая может выполнять двоичные операции со словами, которые достаточно велики, чтобы адресовать столько памяти.O(k22r/k)
Из-за квадратичной зависимости от компромисс между временем и пространством, который вы получаете от этого, не полностью соответствует моделированию NFA . Но потом, я скептически отношусь к тому, что O ( r s ) - это правильная временная граница для симуляции NFA: как вы моделируете один шаг NFA быстрее, чем рассматриваете все (возможно, квадратично много) переходы, разрешенные из текущего активное состояние в другое состояние? Разве это не должно быть O ( r 2 s ) ?kO(rs)O(r2s)
В любом случае, изменяя вы можете получить временные границы на континууме между границами DFA и NFA с меньшим пространством, чем DFA.k