[关闭]
@zhongdao 2022-03-24T10:10:27.000000Z 字数 1812 阅读 804

状态机

未分类


状态机

https://zh.wikipedia.org/wiki/%E6%9C%89%E9%99%90%E7%8A%B6%E6%80%81%E6%9C%BA

https://blog.csdn.net/xinghuanmeiying/article/details/81586954

前言

状态机在实际工作开发中应用非常广泛,在刚进入公司的时候,根据公司产品做流程图的时候,发现自己经常会漏了这样或那样的状态,导致整体流程会有问题,后来知道了状态机这样的东西,发现用这幅图就可以很清晰的表达整个状态的流转。
很多协议的开发都必须用到状态机;一个健壮的状态机可以让你的程序,不论发生何种突发事件都不会突然进入一个不可预知的程序分支。

定义

状态机是有限状态自动机的简称,是现实事物运行规则抽象而成的一个数学模型。

先来解释什么是“状态”( State )。现实事物是有不同状态的,例如一个LED等,就有 亮 和 灭两种状态。我们通常所说的状态机是有限状态机,也就是被描述的事物的状态的数量是有限个,例如LED灯的状态就是两个 亮和 灭。

image_1fuqlu81618ti7b0329hbjj6bm.png-10.5kB

状态机,也就是 State Machine ,不是指一台实际机器,而是指一个数学模型。说白了,一般就是指一张状态转换图。

四大概念
下面来给出状态机的四大概念。

State ,状态。一个状态机至少要包含两个状态。例如上面灯泡的例子,有 灯泡亮和 灯泡灭两个状态。

Event ,事件。事件就是执行某个操作的触发条件或者口令。对于灯泡,“打开开关”就是一个事件。

Action ,动作。事件发生以后要执行动作。例如事件是“打开开关”,动作是“开灯”。编程的时候,一个 Action 一般就对应一个函数。

Transition ,变换。也就是从一个状态变化为另一个状态。例如“开灯过程”就是一个变换。

image_1fuqnhu5p2ivs29e1o15nj192e13.png-209.1kB

image_1fuqp8jt5t8k1mppbp110ju14or9.png-82.2kB

正则

机器还可以被描述为定义了一个语言,它包含了这个机器所接受而非拒绝的所有字词;我们称这个语言被这个机器接受。通过定义,FSM接受的语言是正则语言 - 就是说,如果一个语言被某个FSM接受,那么它是正则的(cf. Kleene的定理)。

实例:文件流转

https://zhixiaoxing.blog.csdn.net/article/details/81586954?spm=1001.2101.3001.6650.2&utm_medium=distribute.pc_relevant.none-task-blog-2%7Edefault%7ECTRLIST%7ERate-2.pc_relevant_antiscanv2&depth_1-utm_source=distribute.pc_relevant.none-task-blog-2%7Edefault%7ECTRLIST%7ERate-2.pc_relevant_antiscanv2&utm_relevant_index=5

image_1fuqnkuhgd8e1h6k16dgnu6tarc.png-259.4kB

图改成表:

image_1fuqnlsnl15hc2jcatpoistsep.png-282.9kB

实例汇总

实例:灯泡

image_1fuqps01e6g61tqjha011catm713.png-21.6kB

实例: 岗位

image_1fuqocced10me1eig4irfm9euo16.png-350kB

实例: 有多少个1011序列

https://baijiahao.baidu.com/s?id=1666672667730461870&wfr=spider&for=pc

现有一串二进制序列号和为:1000110100111010001111011010101111100010010001110001100111110110000000111111111111, 假如要求我们从这一堆数据检测出里面有多少个1011序列。想类似这种情况,用状态机就可以非常简单的实现了。要想检测1011序列号,那么我们就先要检测到1,接下来就要检测到0,然后又要检测到1,最后要检测到1。也就是说我们要检测到1011,那就必须经过如下5个状态:初始状态(状态0)->检测到1(状态1)-> 检测到10->(状态2)->检测到101(状态3)-> 检测到1011(状态4)->初始状态(状态0).

每个状态必须满足条件后才可进入下一个状态,否则就回到初始状态,在程序中我们只要我们按照这个逻辑来处理就好了。转换关系如下图:

image_1fuql54gg1f0e1q90pfa1lf1l9r9.png-81.8kB

实例:解析单词nice

image_1fuqok4v6po4pb31af1vem1nem1j.png-44kB

实例:游戏内状态

image_1fuqpki9q13imo412n0cs21l0gm.png-20.9kB

实例:用户状态

https://zhuanlan.zhihu.com/p/59723017

image_1fuqqovmp1u4c16a85tv161up9c1t.png-182.7kB

image_1fuqqs4ri1sf01ej7116ckat1jnc2a.png-293.5kB

实例: 退款流程

image_1fur7eogg1nmog915u7n81mbh2n.png-236.6kB

实例:美团外卖

image_1fuqq1j3esdt1nkv120arcbe971g.png-97.6kB

交易

image_1furjeqoc1cta1u2j1nc41kbm1i0i34.png-266.5kB

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注