有限自动机可解析数据例题分析

有限自动机(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)

#初始化一

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值