Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Regex NFA与DFA的并行正则表达式匹配?哪一个更快?_Regex_Parallel Processing_Computer Science_Dfa_Nfa - Fatal编程技术网

Regex NFA与DFA的并行正则表达式匹配?哪一个更快?

Regex NFA与DFA的并行正则表达式匹配?哪一个更快?,regex,parallel-processing,computer-science,dfa,nfa,Regex,Parallel Processing,Computer Science,Dfa,Nfa,我读过关于NFA和DFA的书,似乎实现regex matcher最流行和最快的方法是从regex创建NFA,将其转换为DFA,最小化DFA,用任何语言实现并使用它 与NFA相比,DFA是一个更好的选择,因为一个输入只有一个转换,而NFA可以有许多转换。因此,DFA只有一条路可走,而NFA有很多路可走 但是,这就是我不理解的地方。为什么我们必须跟踪NFA状态并返回到它们,这会减慢我们的速度,当遇到多个状态的输入时,我们可以分成不同的线程并并行计算每个路径吗?这不是比DFA更快吗?或者我遗漏了什么?

我读过关于NFA和DFA的书,似乎实现regex matcher最流行和最快的方法是从regex创建NFA,将其转换为DFA,最小化DFA,用任何语言实现并使用它

与NFA相比,DFA是一个更好的选择,因为一个输入只有一个转换,而NFA可以有许多转换。因此,DFA只有一条路可走,而NFA有很多路可走


但是,这就是我不理解的地方。为什么我们必须跟踪NFA状态并返回到它们,这会减慢我们的速度,当遇到多个状态的输入时,我们可以分成不同的线程并并行计算每个路径吗?这不是比DFA更快吗?或者我遗漏了什么?

一般来说,DFA更快,但NFA更紧凑。NFA与正则表达式的大小成比例。(非正式证明:正则表达式语法中的每个运算符节点只是向NFA图添加一个新节点。)因为DFA是由NFA状态集的子集形成的,所以在某些情况下,它可能相当大。在最坏的情况下,DFA的大小是与正则表达式成指数关系的。这方面的一个例子是形式
(a | b)(a | b)(a | b)(a | b)(a | b)
的表达式,其中有N个
(a | b)
单元转换为大小为O(2**N)的DFA。它包含通过
a
b
的所有组合的唯一状态的转换。在模拟等效NFA所需的数据结构适合缓存的情况下,退化DFA可能会超过CPU缓存的大小

由于额外的步骤,DFA的前期成本稍高一些。因此,权衡适用:NFA模拟器将处理足够的数据来证明构建DFA的合理性

NFA模拟可以完全避免接触正则表达式中根本不适用于输入的部分。例如,假设一个正则表达式的形式为R1 | R2,其中R1非常简单和小,而R2是一个巨大而复杂的野兽。假设输入通常只匹配R1,而R2几乎不适用(例如,由于前缀不匹配,根本没有部分匹配)。这影响了折衷:编译到DFA意味着一切都被编译,简单的R1部分和可怕的R2部分


最后,一个实现不一定是严格的NFA或DFA。NFA模拟器设置其计算的目标。这些缓存状态等同于DFA状态,并提供与编译DFA类似的好处。你可以认为这是“NFA的JIT”。缓存可以被修剪到某个固定大小,并遵循替换策略,这样完整DFA较大的表达式可以在更少的内存中处理(如果数据在缓存中显示良好的引用位置,则速度几乎相同)。

问题太广泛了。“哪一个更快?”是一个无效的问题。它们都适合于特定的任务,在某些情况下你甚至需要两者。当模拟NFA时,从任何状态到任何其他状态只有一个转换。但是,状态表示为集合。它们不仅仅是从转换表中提取的简单整数。