有限自动机(DFA):任意单次状态转换的结果只有一种,转换的条件明确。

  1. 有限自动机
    有限自动机(finite automaton),也叫有限状态机(finite state machine),是一台极简的计算机模型。下面是一个非常简单的有限自动机:

    a 被称之为输入;
    圆圈 1 和 2 我们称之为状态,其中 1 为起始状态,2 为接受状态;
    在状态 1 的时候输入了 a,此时会转移到状态 2,这种转移我们可以称之为转移规则;
    如果一系列的输入能够使得一台有限自动机最终处于接受状态,那么这个输入是可以被这台有限自动机接受的,这个输入的内容可以称之为这台有限自动机的正则语言;否则,这种输入就是被该有限自动机拒绝的;
    下面是一台稍微复杂点的有限自动机,对照上面的概念,自己看看能不能理解这些概念:

    |当前状态| 输入 |目标状态|
    |–|--|
    | 1 | a | 2 |
    | 1 | b | 1 |
    | 2 | a | 2 |
    | 2 | b | 3 |
    | 3 | a | 3 |
    | | | |
    怎么样,很简单吧。OK,我们已经理解了有限自动机的概念了,接下来我们聊聊有限自动机下的两个不同类型:确定性有限自动机和非确定性有限自动机。

  2. 确定性有限自动机
    具有以下这两个性质的有限自动机可以称为确定性有限自动机:

没有冲突:一个状态对于同样的输入,不能有多个规则,即每个输入只能有一个转移规则;
没有遗漏:每个状态都必须针对每个可能的输入字符有至少一个规则;
说的通俗点就是一个状态对应一个输入只会有一个转移规则;而每个状态都必须包含有所有输入的转移规则,不可以有遗漏;这就是确定性有限自动机。

理解了什么是确定性有限自动机了,接下来就让我们用代码来实现它:`"""
DFA,确定性有限自动机
“”"

定义了一个转移规则

class FARule(object):
# 初始化
def init(self, state, character, next_state):
self.state = state
self.character = character
self.nextState = next_state

# 通过判断当前的状态和输入和此规则是否相等来决定是否应该使用该种规则
def applies(self, state, character):return self.state == state and self.character == character# 获取下一个规则
def next_state(self):return self.nextState

如果上面的类是一个转移规则,那么这里就是存储了一个有限自动机的转移规则的集合

class FARuleBook(object):
def init(self, rule_set):
self.ruleSet = rule_set

def rules(self):return self.ruleSet

初始化一个有限自动机的规则集合

rulebook = FARuleBook([
FARule(1, ‘a’, 2),
FARule(1, ‘b’, 1),
FARule(2, ‘a’, 2),
FARule(2, ‘b’, 1)
])

定义一个确定性有限自动机

class DFA(object):
# 初始化有限自动机时包含了初始状态、接受状态和转移规则的集合
def init(self, current_state, accept_state, rule_book):
self.currentState = current_state
self.acceptState = accept_state
self.ruleBook = rule_book.rules()

# 当输入一个字符时,根据当前状态和输入去转移规则中寻找对应的转移规则,
# 根据规则获取下一个状态,并把下一个状态置为当前状态
def input_character(self, character):for r in self.ruleBook:if r.applies(self.currentState, character):self.currentState = r.next_state()# 根据当前状态来判断是否是输入状态
def is_accept(self):return self.currentState == self.acceptState# 为了方便操作,同时也提供了一个可以输入字符串的方法
def input_string(self, string):for c in string:self.input_character(c)

#初始化一个DFA
dfa = DFA(1, 2, rulebook)
#读入字符串
dfa.input_string(‘aaaaaaaaaaaaaaaaaaab’)
#判断当前是否处于接受状态
print(dfa.is_accept())`

  1. 非确定性有限自动机
    所谓非确定性有限自动机(NFA),就是没有了 DFA 那两条限制的机器,即:

对于某一个状态,读入某一个输入的时候,可能会有多种转移规则;
对于某一个状态,它可能会缺少对应某种输入的转移规则;
说的再多不如示意图来的直观,下面就是一个 NFA:

通过观察上图可以发现,在状态 1 输入 b 的时候,可能跳转到状态 1,也可能跳转到状态 2;而状态 4 则对任何输入不会有转移。这样的机器就是 NFA。

OK,了解 NFA 的定义之后我们同样可以用 Python 来对其进行模拟。因为 NFA 的状态转移可能会对应多种的转移结果,所以与确定性有限自动机不一样,在非确定性有限自动机中我们用一个集合来保存所有可能转移到的状态。

"""
NFA,非确定性有限自动机
"""# 定义了一个转移规则
class FARule(object):# 初始化def __init__(self, state, character, next_state):self.state = stateself.character = characterself.nextState = next_state# 通过判断当前的状态和输入和此规则是否相等来决定是否应该使用该种规则def applies(self, state, character):return self.state == state and self.character == character# 获取下一个规则def next_state(self):return self.nextState# 同样,我们需要一个规则转移的集合
class FARuleBook(object):# 传入一个规则集合def __init__(self, rule_set):self.ruleSet = rule_set# 通过当前的状态集合和输入,根据转移规则集合,计算出所有可能的输出状态def get_next_states(self, current_states, character):next_states = []rule_set = self.ruleSetfor current_state in current_states:for rule in rule_set:if rule.applies(current_state, character):next_states.append(rule.next_state())# 使用 set 有助于去除重复的集合return set(next_states)# 初始化一个NFA的规则集合
rulebook = FARuleBook([FARule(1, 'a', 1),FARule(1, 'b', 1),FARule(1, 'b', 2),FARule(2, 'a', 3),FARule(2, 'b', 3),FARule(3, 'a', 4),FARule(3, 'b', 4)
])# 非确定性有限自动机
class NFA(object):# 初始化包括初始状态、接受状态、规则转移集合def __init__(self, current_state, accept_state, rule_book):self.current_state = current_stateself.accept_state = accept_stateself.rule_book = rule_book# 通过判断接受状态是否处于当前状态之中来测试当前是否可能处于接受状态def applies(self):return self.accept_state in self.current_state# 读入一个输入,根据当前状态获取到所有的可能的输出状态的集合def read_character(self, character):self.current_state = self.rule_book.get_next_states(self.current_state, character)# 同理,制作一个方便读入字符串的方法def read_string(self, string):for c in string:self.read_character(c)# 创建一个NFA,切记输入状态应该是一个集合
nfa = NFA([1], 4, rulebook)
# 读入 bbb
nfa.read_string('bbb')
# 判断输入是否可能被接受(即输入是否是该有限自动机的正则语言)
print(nfa.applies())

如果你看懂了上面程序,其实上面的代码所模拟的就是上面图例中的 NFA。

需要注意的是,NFA 有一点和 DFA 极其不一样的地方就在于 NFA 存在着一种名为自由移动的操作,所谓自由移动也就是说在 NFA 中某一种状态可以自由的转移到另一个状态而不需要任何的输入,下图就是一个例子:

从状态 1 到状态 2 或者状态 4 的转移操作就叫做自由移动,不需要任何的输入就可以完成状态转移的操作。如果想用代码来描述的话,方式如下:

FARule(1, None, 2)
FARule(1, None, 4)
  1. 从 NFA 转为 DFA
    我们已经了解 NFA 和 DFA,仔细的研究 NFA,思考它和 DFA 有什么区别吗?之后观察下图:

    如果我们把一个 NFA 用上面的这种形式表现出来,那么它是不是就变成了一个 DFA 了呢?答案是肯定的。通过上图的这种转化方式,我们可以将任意一个 NFA 转化为 DFA,具体的实现就不给出了,读者有兴趣可以自己实现。如果觉得有困难,可以参考计算的本质的 3.4 节。

  2. 总结
    有限自动机是一种非常简单但是又很重要的计算模型,我们后面提到的下推自动机和图灵机都是在有限自动机的基础上构造的,所以在查看后面的文章前请务必要先理解有限自动机这种计算模型。

有限自动机可解析数据例题分析相关推荐

  1. pcap文件解析工具_【免费毕设】PHP网络数据包分析工具的设计与开发(源代码+论文)...

    点击上方"蓝字"关注我们目录 系统设计 网络数据包分析系统的设计 整个网络数据报分析工具采用模块化的设计思想,原因是许多程序太长或太复杂,很难写在单一单元中.如果把代码分为较小的功 ...

  2. EMR StarRocks 极速数据湖分析原理解析

    简介:数据湖概念日益火热,本文由阿里云开源大数据 OLAP 团队和 StarRocks 数据湖分析团队共同为大家介绍" StarRocks 极速数据湖分析 "背后的原理. [首月9 ...

  3. 爬虫学习4-HTML和XML数据的分析与解析

    目前在 Java 中,解析 HTML 工具主要包含以下几种: 1,jsoup:强大的 HTML 解析工具,支持以 jQuery 中 CSS Selector 的方式提取 HTML 中的元素,学习成本较 ...

  4. 计算机网络ip数据包分析题,计算机网络课程设计-IP数据包解析实验报告

    计算机网络课程设计-IP数据包解析实验报告 解析 IP数据报实验报告目录目录 21.课程设计目的 .22.课程设计要求 .23.相关知识 .24.课程设计分析 .64.1 网卡设置64.2 使用套接字 ...

  5. Wireshark数据包分析(详细解析)

    wireshark数据包分析 Wireshark(前称Ethereal)是一个网络封包分析软件.网络封包分析软件的功能是截取网络封包,并尽可能显示出最为详细的网络封包资料.Wireshark使用Win ...

  6. (五)CDA 数据分析师Level1考试新版大纲解析(自己整理)PART 5 多维数据透视分析

    PART 5 多维数据透视分析(占 比 10%) 总体要求 理解多维数据模型价值.理解多维数据模型逻辑.理解透视分析原理.能够活用多维数据模型结合恰当透视方法观测业务问题实现商业洞察 1.多表透视分析 ...

  7. ❤️【Python】精彩解析拉钩网反反爬虫,❤️采集各行业招聘数据,分析行业行情❤️

    目录 前言 开始 分析(x0) 分析(x1) 分析(x2) 分析(x3) 分析(x4) 代码 效果 我有话说 前言 emmmmmm, 大家好我叫善念.基本是每天更新一篇Python爬虫实战的文章,不过 ...

  8. Colly源码解析——结合例子分析底层实现

    通过<Colly源码解析--框架>分析,我们可以知道Colly执行的主要流程.本文将结合http://go-colly.org上的例子分析一些高级设置的底层实现.(转载请指明出于break ...

  9. 单细胞转录组数据整合分析专题研讨会(2019.11)

    2019年10月9日,单细胞转录组再等Nature.题为Decoding human fetal liver haematopoiesis的研究,对受孕后4周至17周的人胚胎肝脏.卵黄囊.肾脏和皮肤组 ...

  10. python如何爬虫网页数据-python爬虫——爬取网页数据和解析数据

    1.网络爬虫的基本概念 网络爬虫(又称网络蜘蛛,机器人),就是模拟客户端发送网络请求,接收请求响应,一种按照一定的规则,自动地抓取互联网信息的程序. 只要浏览器能够做的事情,原则上,爬虫都能够做到. ...

最新文章

  1. 多线程下载问题(IDHTTP)
  2. C++中给二维指针分配内存
  3. Excel 设定密码保护特定的内容
  4. 关于如何在Nomad中保护工作部署的工作流的简要历史
  5. py---------面向对象进阶
  6. IP地址的正则表达式
  7. sonar 匿名内部类写法不推荐
  8. h5页面嵌入android app时遇到的问题
  9. javascript技术教程蔡敏_JavaScript基础与实践教程 (王萍萍,赵俊莉,孙强) pdf扫描版...
  10. delphi在linux运行,实现了delphi unigui跑在linux上
  11. c++17之结构化绑定
  12. CobaltStrike服务端自身隐匿技巧
  13. C++ std::condition_variable::notify_one()与notify_all()
  14. 论文翻译(5)-Contextual Inter-modal Attention for Multi-modal Sentiment Analysis
  15. 机器学习样本数据集,训练正负样本
  16. 离散数学——中国剩余定理(孙子定理)
  17. 学java用什么电脑_学java用什么电脑比较好?电脑需要什么样的配置?
  18. php 友盟推送角标,桌面角标设置以及消息推送服务
  19. iPhone 适配之路
  20. 计算机主板思维导图,根据思维导图,参考解读,你也能顺利完成CPU的选配

热门文章

  1. Swift3.0 中实现发短信功能
  2. Educoder 数据库设计 - 博客系统
  3. 第一范式、第二范式、第三范式、BCNF范式的区别
  4. 仿微信雷达寻好友动画
  5. php 读取读取本地xlsx,用PHP读取xlsx文件
  6. dir_recurse是 php函数,dir_recurse是一个函数么?
  7. 未来十年计算机语言,随便聊聊中国未来十年热门的十大编程语言使用趋势
  8. echarts绘制分时图(2)-- 配置echarts
  9. 透过现象看本质(一)
  10. 计算机控制器如何调用打印机,怎样设置打印机的虚拟usb端口