Compiler construction nfa与dfa的时间复杂度权衡

Compiler construction nfa与dfa的时间复杂度权衡,compiler-construction,time,time-complexity,dfa,nfa,Compiler Construction,Time,Time Complexity,Dfa,Nfa,我正在寻找一个关于哪个更好地使用,在什么情况下在编译器中使用nfa或dfa的讨论。模拟nfa与dfa的时间复杂度权衡是什么?在编译器中的什么情况下,哪一种更合适 来自NFA的DFA的构造时间是O(2^m),其中m是节点数 DFA的运行时间是O(n),其中n是输入字符串的长度。这是因为给定字符串只有一条通过DFA的路径 NFA的构建时间应为O(m),其中m是节点数 NFA的运行时间是O(m²n),因为它是不确定的,计算机必须检查字符串中当前字符的每个可能路径。(假设没有前瞻性,它不知道下一个角色将

我正在寻找一个关于哪个更好地使用,在什么情况下在编译器中使用nfa或dfa的讨论。模拟nfa与dfa的时间复杂度权衡是什么?在编译器中的什么情况下,哪一种更合适
  • 来自NFA的DFA的构造时间是O(2^m),其中m是节点数
  • DFA的运行时间是O(n),其中n是输入字符串的长度。这是因为给定字符串只有一条通过DFA的路径
  • NFA的构建时间应为O(m),其中m是节点数
  • NFA的运行时间是O(m²n),因为它是不确定的,计算机必须检查字符串中当前字符的每个可能路径。(假设没有前瞻性,它不知道下一个角色将是什么,因此会陷入死胡同)

  • 这些数字可能会给你一个简单的想法

    我为其他任何人找到了答案..时空权衡目标:给定reg。exp.r和输入stringx,确定x是否在L(r)方法中#1:使用汤普森构造从r构建NFA,然后运行前面的算法|可以构造NFA inO(| r |)时间。“N最多有两倍于| r |的状态,每个状态最多有两个转换,因此转换表是isO(| r |)空间。以前的算法接受或拒绝sx inO(| r |×| x |)timeMethod#2:使用汤普森构造从r构建NFAN,然后使用子集构造从n构建DFAD;然后使用上次的DFA算法接受/拒绝X-D最多可以有2k个状态,其中k=#状态在N.“最坏情况”字符串中(a | b)*a(a | b)(a | b)…(a | b):为什么?“DFA接受算法接受或拒绝x inO(| x |)摘要:自动机构建运行NFA O(| r |)O(| r |×| x |)DFA O(2 | r |)O(| x |)O(| x |)因此使用第一种方法(NFA)对短文本字符串进行快速搜索(例如,emacs r.e.搜索)使用第二种方法(DFA)对长文本字符串进行更长的搜索(例如,Unix grep对多个文件进行搜索)“Lazy”DFA方法动态构建DFA转换表,将转换缓存为状态/输入对。我知道,从具有$r$状态的NFA构建的DFA中的状态数可能高达$2^r$,但我不知道从具有$r$状态的NFA构建DFA的成本如何为$O(2^r)$。在DFA的每个输入符号上添加边的成本是多少?对于构造的DFA,$O(顶点)=O(边)$吗?正如您所建议的,通过回溯运行NFA在最坏的情况下需要O(2^n)。幸运的是,有一些更智能的算法需要O(mn)时间,尽管它们不支持反向引用。(谷歌的re2就是其中之一。)