当你参加比赛前,教练会问你状态如何;当你参加考试前,父母会问你状态如何;当你参加演出前,伙伴会问你状态如何。如果状态不好,那么你在这些活动的表现就可能不尽如人意,相反则可能有出人意料的表现。

可见,一个人状态的好坏会直接影响他的真实表现。但是,今天的状态不佳,明天的状态却有可能很好,可见状态也是会变化的。人如此,计算机也一样——计算机的很多思想都来自于人的生活,因此生活中的状态在计算机中也是遍地开花。

我最早接触状态机的概念是在学习编译原理的课程中。当时觉得状态机虽然在词法分析中发挥了神奇的作用,但总觉得抽象不太容易理解。后来在计算机的学习和工作中慢慢了解到状态机在计算机中还有很多应用,例如正则表达式。

正则表达式使用单个字符串(如图一)来描述、匹配一系列符合某个句法规则的字符串。在很多文本编辑器里,正则表达式通常被用来检索、替换那些符合某个模式的文本。比如[abc]d既可以匹配ad,也可以匹配 bdcd^1[3|4|5|7|8][0-9]\d{8}$ 则可以匹配目前的手机号码。


图一:正则表达式

那么,正则表达式是如何起作用的呢?这就需要了解正则表达式的引擎了。目前主流的引擎分为 3 类:DFA(确定的有限状态机),传统型 NFA **(非确定的有限状态机),POSIX NFA**。

那什么是确定的有限状态机?数学上的严谨定义是确定的有限状态机从起始状态开始,一个字符接一个字符地读入一个字符串,并根据给定的转移函数一步一步地转移至下一个状态。通过状态图,我们可以清晰的看出这类状态机的大致模样(如图二)。


图二:有限状态机

简单来看,当 s1 状态在输入 0 的时候会进入 s2 的状态,而s2的状态在输入 0 的时候则会重新回到 s1 的状态,这种状态转移图正好符合正则表达的内涵。我们可以将某个正则表达式生成一张对应的状态图,然后根据输入的字符串来进行一个状态转移,如果过滤完该字符串后刚好到达有向图的结尾,那么该输入字符串则匹配了该正则表达式。

就拿之前提到的手机号码举例,^1[3|4|5|7|8][0-9]\d{8}$对应的有向图如(图三),只有在输入符合条件的手机号码时,状态有向图才会从最开始状态走到结束状态。对于复杂的正则表达,借助状态有向图则可以达到事半功倍的效果。


图三:状态有向图

除了在正则表达式上的应用外,状态机还在网络协议中发挥了重要的作用。我们都知道 CDN 中离不开缓存系统,而被我们熟知的 ATS ( Apache Traffic Server )则是一个由状态机模型实现的异步事件处理程序。状态机模型具有很强的描述系统行为的能力,尤其是针对具有事件驱动的并发的特征的问题,用状态机来建模非常合适。将状态机作为一种构建系统的基本模块来对系统进行分解,将会使很多原本复杂的问题简单化。由此可见,状态机模型的引入可以有效解决协议处理过程的复杂性从而将系统变得简单和稳定。

曾经有个理论说,你最多通过其中的 6 个人就可以和世界上任何一位陌生人建立联系,果真如此的话,每个人的认识状态图也未免有些简单吧,不过每次的状态转移可不是这么轻松的哦。

另:本文由UPYUN CDN工程师 杨阳 供稿

状态机在计算机中的应用相关推荐

  1. Knowledge Point 20180305 数据在计算机中的表示

    计算机发明的初衷就是用于帮助我们加工和处理数据,虽然时至今天计算机看起来无所不能,但它根本上还是在做数据的加工和处理,数据的机器层次表示将直接影响到计算机的结构和性能. 在计算机中,采用数字化方式来表 ...

  2. 计算机函数模式的用处是啥,请问怎么理解计算机中的函数?

    你的理解有点外行看热闹的意思,呵呵. 代码本身就是抽象的,所以"计算机中的函数是一种对代码进行抽象的方式"不能说不对,但是也和没说一样.至于"我们使用抽象出来的函数,而不 ...

  3. 中断原理在计算机中的应用,计算机组成原理期末考试简答题重点

    6.DMA方式和程序中断方式比较有什么不同? DMA:采用内在和外设直接数据交换的方式,只有当有一段数据传送时才会请求CPU中断,减少了CPU的负担. 程序中断:只适用于简单的少量外设的计算机系统,会 ...

  4. C语言中浮点型在计算机中的存储

    一 . 浮点型的存储 在十进制中我们都学习过科学计数法,比如31.4可以用科学计数法表示就是3.14*10^1.浮点型同样是采取科学计数法进行表示的.在计算机中,以二进制数存储,如1011.10用科学 ...

  5. C语言中整型在计算机中的存储

    一 . 整型的表示 1.字面值后面加上L(l)表示long长整型 2.字面值后面加上U(u)表示usigned整型值 3.十进制123  ... 4.八进制,以0开头,如0123,0754  ... ...

  6. C语言中字符型在计算机中的存储

    一. 字符型的分类和表示范围 char:是有符号还是无符号数视编译器而定,一般为有符号数,下文把它全部当成有符号数进行讨论 表示范围:32位和64位机器上均是一个字节,所以是八个bit位,最高位为符号 ...

  7. C语言中整型浮点型在计算机中的存储

    第一次写博客,遣词造句有点菜,算是一次简单梳理,慢慢学习人家的博客风格,随着学习的深入再做修改. 本次学习的是C语言在VS下的编译调试,对于初学者两说,首先说一下如何监控变量,以及监控变量在内存中的存 ...

  8. 计算机中音乐设备数字接口,一种计算机用声卡封存装置的制作方法

    本实用新型涉及计算机声卡领域,尤其涉及一种计算机用声卡封存装置. 背景技术: 声卡的基本功能是把来自话筒.磁带.光盘的原始声音信号加以转换,输出到耳机.扬声器.扩音机.录音机等声响设备,或通过音乐设备 ...

  9. 探索“小数”在计算机中的存储

    本文介绍了小数在计算机中的存储方式,第一种为定点方式,这种方式很少遇到,但在Matlab中有涉及,见图文<Matlab与线性代数–显示格式的设置>.第二种为浮点方式,一个浮点数由阶码和尾数 ...

最新文章

  1. Spark系列(八)Worker工作原理
  2. hdu3037 Saving Beans
  3. linux blender 中文乱码,Blender2.7.8中文显示框框乱码该怎么办?
  4. python 港股交易数据_GitHub - 116pythonZS/futuquant: 富途量化平台 API
  5. linux 系统函数调用:open close read write lseek
  6. 莫烦Pytorch神经网络第五章代码修改
  7. python列表如何修改_如何在python中更改列表的字典中的值
  8. 编写build.xml的12个原则
  9. 【2019上海网络赛:D】Counting Sequences I(dfs+多重集合排列)
  10. 决策树ID3算法的不足
  11. Redis 实战指南
  12. 雷士灯wifi控制方法_一种wifi无线控制的灯具系统的制作方法
  13. 日常消费软件记账项目
  14. eclipse 中各种小图标含义
  15. 手机界面设计—常识篇
  16. C++ 时间函数整理详解
  17. 【C++】String用法总结
  18. 地质勘查土质分类图片_地质土质分类
  19. linux 进程学习笔记-进程信号sigal
  20. 组队学习-free_excel-知识点和作业汇总

热门文章

  1. 面试官问我:平常如何对你的Java程序进行调优?
  2. 聊一聊如何优雅地向程序员提问题
  3. 过来人的肺腑之言,攻读ML和CV硕士给我带来了什么?
  4. LSTM之父:吐槽了两年,来划划重点:“这5篇最高引论文都源于我们。”
  5. NeurIPS 2020 | Focal Loss改进版来了!GFocal Loss:良心技术,无Cost涨点!
  6. Keras vs PyTorch,哪一个更适合做深度学习?
  7. 多所双一流高校通知将恢复正常上班!还有的为在校生开放实验室
  8. 哈佛大学学生保持20个快乐的习惯
  9. Python从入门到精通 - 入门篇 (下)
  10. 【每日一算法】删除排序数组中的重复项