É fácil o suficiente para trocar o tempo pelo espaço, da seguinte maneira.
Converter a expressão regular a um NFA - para concretude em algoritmos de comparação, vamos supor que é o número de estados NFA, de modo que o seu O ( r s ) tempo ligado para simular diretamente o NFA é válido e seu O ( 2 r ) o espaço vinculado para executar o DFA convertido também é válido sempre que você estiver trabalhando em uma RAM que pode endereçar essa quantidade de memória.rO(rs)O(2r)
Agora, particione os estados do NFA (arbitrariamente) em subconjuntos S i de no máximo ⌈ r / k ⌉ estados cada. Dentro de cada subconjunto S i , podemos indexar os subconjuntos A i de S i por números de 0 a 2 ⌈ r / k ⌉ - 1 .kSi⌈r/k⌉SiAiSi02⌈r/k⌉−1
Construir uma tabela em que i e j são na gama de 0 a k - 1 , c é um símbolo de entrada, e um i é (o índice numérico de) um subconjunto de S i . O valor armazenado na tabela é (o índice numérico de) um subconjunto de S j : um estado y está em T [ i , j , c , A i ] se e somente seT[i,j,c,Ai]ijk−1cAiSiSjyT[i,j,c,Ai] pertence a S j e há um estado em A i que faz a transição para y no símbolo de entrada c .ySjAiyc
Para simular o NFA, manter índices, um para cada S i , especificando o subconjunto Um i dos estados em S i que podem ser alcançados por alguns prefixo da entrada. Para cada símbolo de entrada c , utilizar as tabelas de olhar para cima, para cada par i , j , o conjunto de estados em S j que pode ser alcançado a partir de um estado em A i por uma transição em c , e, em seguida, usar um binário bit a bit ou operação nos índices numéricos desses conjuntos de estados para combiná-los em um único subconjunto de estados de S jkSiAiSici,jSjAicSj. Portanto, cada etapa da simulação leva tempo , e o tempo total para a simulação é O ( s k 2 ) .O(k2)O(sk2)
O espaço necessário é o espaço para todas as tabelas, que é . A análise de tempo e espaço é válida em qualquer RAM que possa endereçar tanta memória e que possa executar operações binárias em palavras grandes o suficiente para endereçar essa quantidade de memória.O(k22r/k)
A troca de tempo e espaço que você obtém disso não corresponde perfeitamente à simulação da NFA, devido à dependência quadrática de . Mas então, eu sou cético de que O ( r s ) é o momento certo com destino a simulação NFA: como você simular um único passo da NFA mais rápido do que olhar para todos os (possivelmente de forma quadrática muitos) transições permitida de um momento estado ativo para outro estado? Não deveria ser O ( r 2 s ) ?kO(rs)O(r2s)
De qualquer forma, deixando variar, é possível obter limites de tempo em um continuum entre os limites do DFA e do NFA, com menos espaço que o DFA.k