有限自动机(DFA):任意单次状态转换的结果只有一种,转换的条件明确。
- 有限自动机
有限自动机(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,我们已经理解了有限自动机的概念了,接下来我们聊聊有限自动机下的两个不同类型:确定性有限自动机和非确定性有限自动机。
- 确定性有限自动机
具有以下这两个性质的有限自动机可以称为确定性有限自动机:
没有冲突:一个状态对于同样的输入,不能有多个规则,即每个输入只能有一个转移规则;
没有遗漏:每个状态都必须针对每个可能的输入字符有至少一个规则;
说的通俗点就是一个状态对应一个输入只会有一个转移规则;而每个状态都必须包含有所有输入的转移规则,不可以有遗漏;这就是确定性有限自动机。
理解了什么是确定性有限自动机了,接下来就让我们用代码来实现它:
"""
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):