【发布时间】:2011-06-02 14:42:23
【问题描述】:
我正在寻找关于哪个更好用以及在什么情况下在编译器中使用 nfa 或 dfa 的讨论。模拟 nfa 与 dfa 的时间复杂度权衡是什么?在编译器的什么情况下哪个更适合?
【问题讨论】:
-
我找到了其他人的答案..
-
时空权衡目标:给定 reg。 exp.r 和输入stringx,判断x 是否在L(r) 方法#1:使用Thompson 构造从r 构建NFAN,然后运行之前的算法¡ 可以在O(|r|) 时间内构造NFA。 ¡ N 最多有 |r| 的两倍状态,每个状态最多有两个转换,所以转换表是 O(|r|) 空间。 ¡ 以前的算法在O(|r|×|x|) 时间内接受或拒绝x
-
方法 #2:使用 Thompson 的构造构建 NFAN fromr,然后使用子集构造构建 DFAD fromN;然后使用上次的 DFA 算法来接受/拒绝 x ¡ D 最多可以有 2k 个状态,其中 k = # 个状态 in N. ''Worst-case'' string (a |b)*a (a |b)(a |b)...(a |b):为什么? ¡ DFA接受算法接受或拒绝x inO(|x|)
-
总结:Automaton Build Run NFA O(|r|) O(|r|×|x|) DFA O(2|r|) O(|x|) 所以使用第一种方法(NFA ) 用于快速搜索短文本字符串(例如,emacs 重新搜索) 使用第二种方法 (DFA) 用于长文本字符串上的较长搜索(例如,Unix grep 对多个文件) ''Lazy'' DFA 方法在fly,遇到状态/输入对缓存转换
-
我知道从具有 $r$ 个状态的 NFA 构建的 DFA 中的状态数量可能高达 $2^r$,但我不明白从具有 $r$ 个状态的 NFA 成本 $O(2^r)$。在 DFA 的每个输入符号上添加边的成本如何?构造的 DFA 是 $O(vertices) = O(edges)$ 吗?
标签: compiler-construction time time-complexity dfa nfa