《编程珠玑(续)(修订版)》—第2章2.2节有穷状态机模拟器

简介: 有穷状态机(FSM)是计算的一种优雅的数学模型和有用的实践工具,它在程序设计语言的词法分析、通信协议以及简单硬件设备等许多应用领域都有广泛的用途。

本节书摘来自异步社区《编程珠玑(续)(修订版)》一书中的第2章,第2.2节有穷状态机模拟器,作者【美】Jon Bentley,更多章节内容可以访问云栖社区“异步社区”公众号查看。

2.2 有穷状态机模拟器
有穷状态机(FSM)是计算的一种优雅的数学模型和有用的实践工具,它在程序设计语言的词法分析、通信协议以及简单硬件设备等许多应用领域都有广泛的用途。Wulf、Shaw、Hilfinger和Flon在他们合著的Fundamental Structures of Computer Science③一书(Addison-Wesley出版社1981年出版)的1.1节讨论了这一主题。

作为例子,他们考虑这样一个简单的任务——“抑制”比特流中所有新出现的1:

Input:    011010111
Output:    001000011

紧跟在0后面的1被改成0,输入流中的所有其他比特位不变。

下面的两状态自动机在其状态中对最后一个输入比特进行编码:“LIZ”表示“Last Input Zero”,而“LIO”表示“Last Input One”。


a07ec526d84c7d4f67c365a3b034adcfa9a71d69

指向LIZ的横向箭头表明这是初始状态。从LIZ到LIO的弧线的意思是,如果自动机当前处于状态LIZ且输入是一个1,则输出一个0并进入状态LIO。

执行FSM的程序使用两个主要数据结构。如果FSM包含弧线


4e9fc983c0750d2ec2d7c1d0c0c1f465bf6cd95f

那么下面的等式成立:
trans[State1, InSym]   == State2
out[State1, InSym]   == OutSym

名字trans表示状态转换,out表示输出符号。

上面描述的自动机和输入编码如下:

LIZ  0  LIZ  0
LIZ  1  LIO  0
LIO  0  LIZ  0
LIO  1  LIO  1
start    LIZ
0
1
1
0
...

前4行表示FSM中的4条边。第一行说,如果自动机当前状态为LIZ且输入为0,那么下一个状态是LIZ并输出0。第五行确定初始状态,之后的行是输入数据。

下面的程序按上面描述的形式执行FSM。

run == 1 { print out[s, $1]; s = trans[s, $1]  }
run == 0 { if ($1 == "start") { run = 1; s = $2 }
      else { trans[$1, $2] = $3; out[$1, $2] = $4 }
     }

该程序有两个主要的模式。起初,变量run值为零。在这个模式下,将自动机的转换添加到数组trans和out中。当输入的某一行的第一个字段是字符串"start"时,程序将相应的初始状态存放到s中,然后切换到运行模式。然后每步的执行都将产生输出并改变状态,每步转换后的状态可以看成是当前输入($1)和当前状态(s)的函数。

这个微型的程序有很多缺点。例如,对于未定义的转换,它做出的反应将是灾难性的。事实上,这个程序顶多适合个人使用。另一方面,它为创建更健壮的程序提供了便利的基础,见习题2。

相关文章
|
存储 弹性计算 算法
倚天产品介绍|倚天ECS加速国密算法性能
倚天ECS是阿里云基于平头哥自研数据中心芯片倚天710推出arm架构实例,采用armv9架构,支持SM3/SM4指令,可以加速国密算法性能。本文基于OpenSSL 3.2和Tongsuo 实测对比了倚天ECS g8y实例和Intel g7 实例国密性能。为用户选择ECS提供参考。
|
网络协议 Linux Android开发
告别无法访问的github(附解决方案)
最近一行在使用github的时候又登不上去了,挂着NPV都没用 据说是某些不可描述的有关组织机构对该网站的DNS污染或者随机丢包造成的
22407 5
告别无法访问的github(附解决方案)
|
开发工具 git Windows
Git | 向GitHub提交代码超时处理
向GitHub提交代码超时处理
731 0
|
11月前
|
机器学习/深度学习 存储 自然语言处理
如何提升大模型的“深度思维能力”
本文探讨了如何通过模拟人类的思维过程来提升大模型的推理和规划能力。文章从人类的思维模式入手,分析了人类在面对复杂问题时的“增-减”信息循环,提出了通过增加相关信息和减少噪声来降低信息熵的方法。文章还讨论了如何生成逻辑自洽的推理路径,并通过实例说明了多结论问题的处理方法。最后,文章指出,通过现有的大模型进行针对性微调,可以逐步强化数据,提升模型的推理和规划能力。
804 11
|
机器学习/深度学习 人工智能 自然语言处理
|
Web App开发 缓存 Linux
FFmpeg开发笔记(三十六)Linux环境安装SRS实现视频直播推流
《FFmpeg开发实战》书中第10章提及轻量级流媒体服务器MediaMTX,适合测试RTSP/RTMP协议,但不适合生产环境。推荐使用SRS或ZLMediaKit,其中SRS是国产开源实时视频服务器,支持多种流媒体协议。本文简述在华为欧拉系统上编译安装SRS和FFmpeg的步骤,包括安装依赖、下载源码、配置、编译以及启动SRS服务。此外,还展示了如何通过FFmpeg进行RTMP推流,并使用VLC播放器测试拉流。更多FFmpeg开发内容可参考相关书籍。
736 2
FFmpeg开发笔记(三十六)Linux环境安装SRS实现视频直播推流
|
机器学习/深度学习 人工智能 自然语言处理
500篇论文!最全代码大模型综述来袭
11月14日,蚂蚁集团联合上海交通大学发布55页代码大模型综述,覆盖超过50个模型、30个下游任务、500篇参考文献,全方位总结大语言模型在代码相关应用中的最新进展与挑战。
1781 0
|
SQL 人工智能 自然语言处理
2024年6月118篇代码大模型论文最全整理
基座模型与训练数据、代码微调、测试基准、代码Agent、低资源语言处理、AI代码安全与分析、人机交互、软件工程下游任务应用主题代码大模型论文分享,干货满满~
1367 2
|
设计模式
从零开始学设计模式(十八):状态模式(State Pattern)
状态模式(State Pattern)指的是将一个对象的状态从该对象中分离出来,封装到专门的状态类中,使得对象状态可以灵活变化,在其内部状态改变时改变它的行为。状态模式是一种对象行为型模式。它和策略模式有一点很像,就是将一些复杂的逻辑放在一个专门的上下文类中进行处理。
1666 0
从零开始学设计模式(十八):状态模式(State Pattern)
|
缓存 编译器 程序员
C/C++编译器链接优化技术:链接优化是在编译器和链接器之间进行的优化
C/C++编译器链接优化技术:链接优化是在编译器和链接器之间进行的优化
592 0