热门标签 | HotTags
当前位置:  开发笔记 > 后端 > 正文

状态机在计算机中的应用

当你参加比赛前,教练会问你状态如何;当你参加考试前,父母会问你状态如何;当你参加演出前,伙伴会问你状态如何。如

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

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

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

正则表达式使用单个字符串(如图一)来描述、匹配一系列符合某个句法规则的字符串。在很多文本编辑器里,正则表达式通常被用来检索、替换那些符合某个模式的文本。比如[abc]d既可以匹配ad,也可以匹配 bd ,cd^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工程师 杨阳 供稿



推荐阅读
  • 本文详细介绍了Java编程语言中的核心概念和常见面试问题,包括集合类、数据结构、线程处理、Java虚拟机(JVM)、HTTP协议以及Git操作等方面的内容。通过深入分析每个主题,帮助读者更好地理解Java的关键特性和最佳实践。 ... [详细]
  • 在当前众多持久层框架中,MyBatis(前身为iBatis)凭借其轻量级、易用性和对SQL的直接支持,成为许多开发者的首选。本文将详细探讨MyBatis的核心概念、设计理念及其优势。 ... [详细]
  • 网络运维工程师负责确保企业IT基础设施的稳定运行,保障业务连续性和数据安全。他们需要具备多种技能,包括搭建和维护网络环境、监控系统性能、处理突发事件等。本文将探讨网络运维工程师的职业前景及其平均薪酬水平。 ... [详细]
  • PHP 5.5.0rc1 发布:深入解析 Zend OPcache
    2013年5月9日,PHP官方发布了PHP 5.5.0rc1和PHP 5.4.15正式版,这两个版本均支持64位环境。本文将详细介绍Zend OPcache的功能及其在Windows环境下的配置与测试。 ... [详细]
  • 本文详细介绍了Linux系统中init进程的作用及其启动过程,解释了运行级别的概念,并提供了调整服务启动顺序的具体步骤和实例。通过了解这些内容,用户可以更好地管理系统的启动流程和服务配置。 ... [详细]
  • PHP 过滤器详解
    本文深入探讨了 PHP 中的过滤器机制,包括常见的 $_SERVER 变量、filter_has_var() 函数、filter_id() 函数、filter_input() 函数及其数组形式、filter_list() 函数以及 filter_var() 和其数组形式。同时,详细介绍了各种过滤器的用途和用法。 ... [详细]
  • 使用C#开发SQL Server存储过程的指南
    本文介绍如何利用C#在SQL Server中创建存储过程,涵盖背景、步骤和应用场景,旨在帮助开发者更好地理解和应用这一技术。 ... [详细]
  • 根据最新发布的《互联网人才趋势报告》,尽管大量IT从业者已转向Python开发,但随着人工智能和大数据领域的迅猛发展,仍存在巨大的人才缺口。本文将详细介绍如何使用Python编写一个简单的爬虫程序,并提供完整的代码示例。 ... [详细]
  • 本文介绍如何使用Perl编写一个简单的爬虫,从丁香园网站获取意大利的新冠病毒感染情况。通过LWP::UserAgent模块模拟浏览器访问并解析网页内容,最终提取所需数据。 ... [详细]
  • GIMP 2.99.2 发布:UI 采用 GTK3 实现、原生支持高分屏和 Wayland
    开源项目评选最后一周,手里的5票再不用就没用了https:www.oschina.netprojecttop_cn_2020GIMP2.99.2已发布,同时这也标志着GIMP3.0的到来,其中最显著的变化是从GTK2过渡到GTK3工具包。基于 ... [详细]
  • 深入解析Nginx中的Location指令及其属性
    本文将详细探讨Nginx配置文件中关键的location指令,包括其三种匹配方式(精准匹配、普通匹配和正则匹配),以及如何在实际应用中灵活运用这些匹配规则。此外,还将介绍location下的重要子元素如root、alias和proxy_pass,并解释相关参数的使用方法。 ... [详细]
  • 本文介绍了一段使用jQuery实现的用户注册页面表单验证代码,适用于前端开发人员学习和参考。该示例结合了HTML、CSS和JavaScript,确保用户输入的数据格式正确。 ... [详细]
  • 使用 GitHub、JSDelivr、PicGo 和 Typora 构建高效的图床解决方案
    本文详细介绍了如何利用 GitHub 仓库、JSDelivr CDN、PicGo 图床工具和 Typora 编辑器,搭建一个高效且免费的图床系统。通过此方案,用户可以轻松管理和上传图片,并在 Markdown 文档中快速插入高质量的图片链接。 ... [详细]
  • 本文由杨勇和思远于2012年12月27日撰写,主要探讨了如何使用PHP进行网页内容抓取,特别是针对字符较多的网站。文章详细介绍了正则表达式失效的原因,并提供了优化方法,同时展示了如何抓取淘宝服饰栏、天气信息以及IP地址对应的地理位置。 ... [详细]
  • 本文介绍如何从字符串中移除大写、小写、特殊、数字和非数字字符,并提供了多种编程语言的实现示例。 ... [详细]
author-avatar
波波无敌1989_424
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有