轻而易举地就时间来换取空间,如下所示。
将正则表达式转换为NFA -为了具体化比较算法,我们假设是NFA状态的数量,因此您直接模拟NFA的O (r s )时限是有效的,而O (2 r)在您可以处理那么多内存的RAM中工作时,用于运行转换后的DFA的空间也将有效。[Rø (ř 小号)O (2[R)
现在,分区NFA(任意地)的状态到子集š 我至多⌈ - [R / ķ ⌉指出每个。内每个子集š 我,我们可以索引子集甲我的小号我用数字从0至2 ⌈ - [R / ķ ⌉ - 1。ķ小号一世⌈ - [R / ķ ⌉小号一世一种一世小号一世02⌈ - [R / ķ ⌉− 1
建一个表,其中i和j的范围是0到k - 1,c是输入符号,A i是S i的子集(的数字索引)。表中存储的值是S j的子集(的数字索引):当且仅当状态y在T [ i ,j ,c ,A i ]中Ť[ i ,j ,c ,A一世]一世Ĵk − 1C一种一世小号一世小号ĴÿŤ[ i ,j ,c ,A一世]属于 S j,并且在 A i中存在一个状态,该状态在输入符号 c上转换为 y。ÿ小号Ĵ一种一世ÿC
为了模拟NFA,请维护索引,每个S i对应一个索引,指定输入中某些前缀可以到达的S i中状态的子集A i。对于每个输入符号c,使用表查找每对i ,j,可以通过在c上进行转换从A i中的状态到达S j中的状态集,然后使用按位二进制或对这些状态集的数值索引进行运算,以将它们组合为S j的单个状态子集ķ小号一世一种一世小号一世C我,Ĵ小号Ĵ一种一世C小号Ĵ。因此,模拟的每个步骤都需要时间,而模拟的总时间为O (s k 2)。Ø (ķ2)ø (小号ķ2)
所需空间是所有表的空间,即。时间和空间分析在可以寻址这么多内存的RAM上有效,并且可以对足够大以寻址该内存的字进行二进制运算。Ø (ķ22[R / ķ)
由于对的二次依赖,因此您从中获得的时空折衷与NFA模拟并不完全匹配。但是然后,我怀疑O (r s )是NFA模拟的正确时限:您如何模拟NFA的单个步骤,而不是查看当前所允许的所有(可能是二次方的)所有转换活动状态到另一个状态?不是O (r 2 s )吗?ķø (ř 小号)Ø ([R2s )
在任何情况下,通过使变化,您都可以在DFA和NFA边界之间获得连续的时间范围,而其空间小于DFA。ķ