【发布时间】:2017-07-05 18:12:33
【问题描述】:
在为正则表达式创建 DFA 时,我注意到整个单词会增加状态的数量,尽管从分析上看,它们看起来类似于具有较少状态的正则表达式。
例如,对我来说,(a|b)+ 看起来与 (hello|world)+ 相同
如果我有一个匹配的字符串,那么用“a”查找/替换“hello”和用“b”替换“world”将相当容易,反之亦然。所以我的问题是,为什么不将“hello”和“world”算作单一状态?
【问题讨论】:
在为正则表达式创建 DFA 时,我注意到整个单词会增加状态的数量,尽管从分析上看,它们看起来类似于具有较少状态的正则表达式。
例如,对我来说,(a|b)+ 看起来与 (hello|world)+ 相同
如果我有一个匹配的字符串,那么用“a”查找/替换“hello”和用“b”替换“world”将相当容易,反之亦然。所以我的问题是,为什么不将“hello”和“world”算作单一状态?
【问题讨论】:
因为通过更简单的状态定义来实现 DFA 非常简单,但代价是拥有更多状态。您的建议可以很好地描述您希望 DFA 如何工作,并且与传统 DFA 有直接的对应关系。但它不允许你多说什么。
这类似于 NFA 的使用:它们更容易设计和(也许)思考,但没有更多的权力,并且有一个定义明确的算法可以将它们转换为 DFA(同样,以成本为代价)引入状态)。
将使用单字符转换的 DFA 视为正则表达式的“机器语言”(这与正则表达式不同,会显得迂腐)。
【讨论】: