grep 使用 NFA 为什么效率高
龙书中提到,grep为了效率,使用了 NFA 算法。NFA 匹配正则的效率不是比 DFA 更慢吗?
这么说的原因是什么,我哪里没理解正确,请各位兄弟指教。
dfa只是正则的子集,能力太弱。 回复 2# codechurch
正则直接转成NFA比较容易。我理解,每一个NFA都可以转换成DFA。在转换成DFA后,再做匹配,效率就会提高很多。
我这个思路错在哪里了?请赐教,谢谢
回复 3# amarant
并非所有nfa都可以转为dfa,正则的全集就不能转为dfa
dfa只能包括*+| 的功能
像 “{,}” 与 后向引用等等功能,都不可能做到。
回复 4# codechurch
多谢 回复 4# codechurch
^_^,你这说的是 Unix 传统正则语言(或者说扩展正则)。按照编译书籍上严格的正则语言定义,正则语言(就是去掉 Unix 扩展正则的)和NFA DFA等价且可以相互转换的。
你说那个引用的问题,NFA 也是不能解决的,得用递归。
不过实际上的正则库实现来说,我认为没有必要死守编译理论,非把正则识别等同于构造 NFA DFA 来实现。
codechurch 发表于 2016-11-02 18:44
回复 3# amarant
并非所有nfa都可以转为dfa,正则的全集就不能转为dfa
{,}可以转化为DFA
而后向引用当然不可以,因为它已经不是正则语言范畴
页:
[1]