什么是有限状态自动机以及为什么程序员应该知道它们?

时间:2008-12-12 21:24:56

标签: finite-automata

呃 - 问题是什么。这是我一直听到的东西,但我还没有完成调查。


(更新)我可以查看定义...但为什么不(正如@erikson指出的那样)深入了解你的真实经历和轶事。社区维基会帮助人们投票给最有见地的答案。到目前为止有趣的阅读,谢谢!

12 个答案:

答案 0 :(得分:13)

简短的回答,这是一种可用于表达具体状态系统的技术(与量子态/概率分布相对)。

引用Wikipedia article

  

有限状态机(FSM)或有限状态   州自动机(复数:自动机)或   只是一个状态机,是一个模型   由有限数组成的行为   国家之间的转换   国家和行动。有限状态   机器是一个抽象模型   具有原始内部的机器   存储器中。

那么,这对你意味着什么?简而言之,它是一种有效的方式来表示从您关注的系统的起始状态到最终状态的路径。使用正则表达式作为一个相当容易理解的例子,让我们看一下AB + C模式(假设这个加号是一个上标)。我希望这种模式能够接受诸如“ABC”,“ABBC”,“ABBBC”等字符串.A在开始时,C在结尾处,中间有一些B(大于或等于1)

如果您考虑一下,就图片来说,考虑这个问题几乎要容易一些。用文本伪造它(我的括号是一个环回弧),你可以看到A(在左边)是起始状态,C(在右边)是右边的结束状态。

      _
     ( ) 
A --> B --> C

从FSA,您可以前往Turing Machines的土地继续您的计算复杂性之旅。

但是,您也可以使用状态机来表示真实的行为和系统。在我的世界中,我们使用它们来模拟实际人员的某些工作流程,这些工作人员使用非常不能容忍国家秩序错误的组件。如同“,A最好在C之前发生,否则会出现非常严重的问题。现在就做不到这个。”

答案 1 :(得分:9)

可以查找它,但到底是什么。直觉上,有限状态自动机是具有有限数量状态的事物的抽象,以及可以从状态到状态的规则。 state 是可以为其创建真或假的语句,而规则是您从一种状态更改为另一种状态的方式。所以,你可以说,有两个州:“我在家里”和“我在工作”和两个规则,“去工作”和“回家。”

事实证明,你可以用数学的方式看待这样的机器,并发现有些东西可以做但不能做。正则表达式基本上是一种描述有限状态机的方法,其中状态是一组不同的字符串,规则根据下一个字符读取将您从一个状态移动到另一个状态。你可以证明这一点。但是你也可以证明没有有限状态机可以判断表达式中的括号是否匹配(通过FSA的pumping lemma。)

学习关于FSA的原因是它们可以用来解决许多问题:字符串匹配,系统控制,业务流程描述,数字电路设计。他们本身就很漂亮。

正式,FSA是一个代数结构 F =⟨Σ,S,s 0 ,F,δ⟩其中 Σ输入字母 S 是一组状态 s 0 ∈S是一个特定的开始状态F⊆S是一组接受状态δ:S ×Σ→S 状态转换函数

答案 2 :(得分:6)

以OOP术语:如果你有一个对象,你调用某些事件的方法,以及一些(其他)方法具有不同的行为,取决于以前的调用....惊喜!你有一台状态机!

现在,如果你了解这个理论,你就不必重新思考这一切。你只需说:“小菜一碟,它只是一台状态机”,然后继续实施它。

如果你不知道你会在一段时间内考虑它的理论,写一些聪明的黑客,并得到一些难以解释和记录的东西......因为你没有用它来描述它的话/ p>

答案 3 :(得分:2)

每个程序员都应该了解它们,因为它们是某些问题的优秀工具,通常的“迭代思维”方法会产生令人讨厌的复杂代码。

典型的例子是游戏AI,其中NPC具有根据玩家的位置而改变的不同状态,例如:

  • NPC_STATE_IDLE
  • NPC_STATE_ALERT(球员不到100米)
  • NPC_STATE_ENGAGE(玩家攻击NPC)
  • NPC_STATE_FLEE(健康状况不佳)

其中FSM可以轻松描述转换并帮助执行有关FSM描述的系统的复杂推理。

答案 4 :(得分:2)

在完成操作之前,无论何时必须释放线程,都需要状态机。

由于Web服务通常不具有状态,因此您通常不会在Web服务中看到这一点 - 您重新排列URL,以便每个URL对应于代码中的单个路径。

我想另一种思考方式可能是每个Web服务器都是FSM,状态信息保存在URL中。

您在处理输入时经常会看到它。您必须在输入完成之前释放您的线程,因此您设置一个标记“正在输入”或类似的东西。完成后,将标志设置为“等待输入”。那面旗子是你的州监察员。

通常,FSM被实现为切换变量的switch语句。每个案例都是不同的州。在案例结束时,您可以将状态设置为新值。你几乎肯定在某个地方见过这个。

FSM的优点在于,您可以将状态作为数据的一部分而不是代码。想象一下,您需要在数据库中填写1000个项目。传入的数据将解决1000个项目中的一个,但您通常没有足够的数据来完成操作。

如果没有FSM,您可能会有数百个线程等待其余数据,以便完成处理并将结果写入数据库。使用FSM,您将状态写入DB,然后退出线程。下次你可以检查传入的数据,从线程中读取状态,这应该给你足够的信息来确定要运行的代码。

几乎每个FSM操作都可以通过专用线程来完成,但可能不太好(复杂性基于状态数倍增,而对于状态机,复杂性的增加更加线性)。此外,还有一些概念设计问题 - 在某些情况下检查状态级别的代码比在代码级别检查代码要容易得多。

答案 5 :(得分:2)

上面的好答案。我只想补充一点,FSA主要是思维工具,而不是编程技术。使它们有用的是它们具有很好的属性,而任何像这样的东西都有这些属性。如果您可以将某些事物视为FSA,那么可以通过多种方式构建它:

  • 作为正则表达式

  • 作为状态转换表

  • 作为while-switch-on-state循环

  • 作为goto-net(恐怖!)

  • 简单的结构化程序代码

等。等

如果有人说某事是FSA,无论它是如何构建的,你都可以立即知道他们在谈论什么。

答案 6 :(得分:2)

重要提示:如果您是“视觉”风格的学习者,请停止您正在做的所有事情并转到此链接......现在。

如果您是“视觉”学习者,这里有一个很好的链接,可以提供非常容易理解的介绍。

Reanimator by Oliver Steele

看起来你已经批准了答案,但是如果你欣赏新概念的“视觉”介绍,那么你应该查看链接。它非常出色。

(注意:该链接指向正则表达式上下文中对DFA和NDFA的讨论 - 使用动画交互式图表)

答案 7 :(得分:1)

是的!你可以查一查!

http://en.wikipedia.org/wiki/Finite_state_machine

答案 8 :(得分:1)

在其他网站(例如维基百科)上更好地回答了什么,因为已经有相当广泛的答案。

为什么你应该知道它们:因为你可能已经实现了它们。

任何时候你的代码都有有限数量的可能状态(即“有限状态”部分),并且一旦输入/事件发生(即“机器”部分),你就会切换到另一个状态,你已经编写了一个有限状态机

这是一个非常常见的工具,并且知道理论基础知识,能够对其进行推理并且知道如何将两个FSM组合成一个执行相同工作的FSM可以提供很大的帮助。

答案 9 :(得分:1)

FSA是理解的理想数据结构,因为您必须实现它们,您在Chomsky层次结构上的计算复杂度最低。一个很好的例子是单词形态学(单词的各个部分如何组合在一起)。已经做了大量工作来证明即使是最严重的病例也可以在这个极其快速的分析框架中进行分析。看看Karttunnen和Beesley在PARC的工作。

FSA也是开始学习机器学习概念(如隐马尔可夫模型)的好地方,因为在很多方面,问题可以使用相同的想法和词汇来分解。

答案 10 :(得分:1)

到目前为止尚未提及的一个项目是有限状态自动机和正则表达式的semantic equivalence。正则表达式可以编译为有限状态自动机(这是正则表达式库的工作方式),反之亦然。

答案 11 :(得分:1)

FSA(包括DFA和NFA)对于计算机科学非常重要,它们可用于许多领域,包括许多领域。例如,用于语音识别的隐马尔可夫字段也可以在软件和NLP(自然语言处理),AI(游戏编程),机器人编程等解释之前将正则表达式转换为FSA。

FSA的一个缺点是它们通常很慢并且通常难以实现,并且在阅读代码时难以理解或可视化,但它们很好,因为它们通常提供问题的通用解决方案并且它们是众所周知的很多关于FSA的研究。