我正在研究一些计算理论,正如暗示的那样,它是非常理论化的。
我可以很容易地从正则表达式转换为NFA到DFA,我可以理解。
但是,由于所有NFA都可以转换为DFA并且(我很确定)UNIX中的grep
命令使用正则表达式来确定匹配的字符串,最常用的有限自动机,DFA或NFA是什么?
根据我的经验(并不多),在表示常规语言时,DFA通常更容易使用,并且也是确定性的,因此应始终选择NFA。
NFA分支到多个结果,需要递归函数,对我来说似乎更尴尬。
我知道编译器是有限自动机的另一种实际用途。
我的问题......为什么学习/使用两者。对我来说,DFA看起来非常好。
感谢您的回答!
答案 0 :(得分:3)
DFA通常更快,更可扩展。确定和最小化NFA有时是昂贵的。因此,如果自动机仅使用一次,则可以跳过它。
NFA(Thompson-NFA,Glushkov-NFA,位并联NFA)的优点是:
此外,Regex-NFA在常用编程语言中使用(Backtracking-NFA,例如Python,Perl,Java,.NET,而不是grep):
编译器几乎总是使用最小化的DFA来进行lexing。 Regex Search使用DFA或混合DFA / NFA(后者用于子匹配识别)。编程语言中使用的NFA类型是最强大的(关于功能),但也是最慢的。
答案 1 :(得分:0)
我认为将回归转换为NFA比使用DFA更简单。很难直接将回归转换为DFA。