最近我一直在考虑有限状态机(FSM),以及如何在软件中实现它们(编程语言并不重要)。
我的理解是确定性状态机被广泛使用(解析/词法分析器,编译器等),但非确定性状态机的问题是什么?
我知道可以将所有非确定性状态机转换为确定性状态机(甚至是以编程方式)。那不是我的观点。我还想象非确定性状态机的实现要复杂得多。
无论如何,它是否能够任何意义来实现非确定性状态机?有什么特别的应用我不知道吗? 这可能是什么原因?也许优化和专业的非确定性状态机更快?
答案 0 :(得分:8)
大多数正则表达式引擎使用非 -deminministic自动机,因为它们提供了更大的灵活性。 DFA受到更多限制。看看一些实现,你会看到这一点。微软甚至在他们的.NET Regex类文档中强调了这一事实:
.NET Framework正则表达式引擎是一种回溯正则表达式匹配器,它包含传统的非确定性有限自动机(NFA)引擎,例如Perl,Python,Emacs和Tcl使用的引擎。
Matching behavior(第一段) - 本文还提供了使用NFA的理由,而不是更有效的DFA。
答案 1 :(得分:6)
如您所知,NFA和DFA在计算上是等效的。这是自动机理论中的第一个定理之一。有一些算法可以将一个转换为另一个(与Pushdown或图灵机不同)。
因此。为什么一个超过另一个?因为使用NFA表示给定问题比等效DFA容易得多。
编辑在实际计算机器方面,DFA会更快,因为他们不必回溯。但他们将需要更多的记忆来代表。 (Mem与CPU权衡)
答案 2 :(得分:1)
我的建议=看一下Adrian Thurstons Ragel的手册。
有简单的方法直接生成DFA,但我相信它们只支持有限范围的运营商 - 基本上是EBNF通常的嫌疑人。 Ragel使用非确定性方法从较简单的自动机组成复杂自动机,然后使用epsilon消除和最小化来创建有效的确定性自动机。无论你需要多少个奇怪的运算符,转换到最小确定性自动机总是相同的,并且通过使用非确定性方法使每个运算符实现变得简单。
答案 3 :(得分:0)
viterbi algorithm对Hidden Markov Models进行操作,将其视为非常类似于NFA。不完全相同,但肯定是类似的。
它们在语音和文本识别等应用中非常有用。
答案 4 :(得分:0)
通常,创建NFA然后使用它会更容易(唯一的区别是你拥有一组状态而不是一个状态)。如果你想要快速,你可以制作DFA,但不要忘记,这样做的时间是指数级的(因为结果自动机可以指数级更大!)。
另一方面,如果你想补充语言,你别无选择,你需要一个det。变体。
这就是为什么否定在正则表达式引擎中的原因,只有在类([^ ...])中,你可以确定自动机是确定性的。
答案 5 :(得分:0)
如果我错了,请纠正我,但是从我的编译器课程中我记得有时你根本不能使用DFA,因为它会导致状态的“爆炸”。
答案 6 :(得分:0)
我认为选择非确定性有限自动机的主要原因是实际得到所选择的匹配。使用确定性版本执行此操作可能要困难得多。
如果您只想知道它们是否匹配,并且没有其他细节,我认为编译成有限自动机会更好。
答案 7 :(得分:-1)
Cayuga利用非确定性有限状态机进行复杂事件处理。好吧,看起来他们称之为“有状态发布/订阅事件监控”,但我相信这是CEP。
我相信他们的一些论文甚至讨论了他们使用自动机模型的原因。你可能想要浏览他们的网站。
......卡尤加自动机,从标准的非确定性有限自动机扩展而来。