01-有限自动机&正则文法
基础概念
Alphabet: Σ,有限的字符集合
String: 由Σ中的字符组成的有限序列
空串: ϵ,长度为0的字符串
子串
前缀/后缀
字符串运算
Concatenation: w1w2,w1和w2的连接
Reverse: wR,字符串的逆序
Length: ∣w∣,字符串的长度
Power: wn,字符串的重复,w0=ϵ
Language: 字符串的集合
Kleene star: Σ∗,字母表Σ上的所有字符串的集合
Plus: Σ+,字母表Σ上的所有非空字符串的集合
Language 是 Σ∗ 的非空子集(可以为{ϵ})
语言运算
交并减补
Reverse:LR={wR∣w∈L}
Concatenation:L1L2={w1w2∣w1∈L1,w2∈L2}
Power:Ln={w1w2⋯wn∣wi∈L}
Star-closure:L∗=⋃i=0∞Li
Positive-closure:L+=⋃i=1∞Li=L∗−{ϵ}
例题
L={a,b},L3={aaa,aab,aba,abb,baa,bab,bba,bbb}L={anbn:n≥0},L2={anbnambm:n,m≥0}
Deterministic Finite Automata 有限自动机
有限自动机:输入字符串,输出接受/拒绝
两个圆圈的状态表示接受,一个圆圈的状态表示拒绝
箭头为状态转移
DFA:确定性有限自动机,对于每个状态和输入字符,只有一个状态转移
M=(Q,Σ,δ,q0,F)
Q:状态集合
Σ:输入字母表
δ:状态转移函数,δ:Q×Σ↦Q
q0∈Q:初始状态
F⊆Q:接受状态集合
δ∗:Q×Σ∗↦Q:状态转移函数的扩展,接受多个输入字符
使用 DFA 定义语言:L(M)={w∈Σ∗∣δ∗(q0,w)∈F}
【必考】 最小化 DFA
核心思想:将状态划分为集合,如果集合内两个状态在任何输入下都是等价的(输出状态所在集合相同),则保持不变,如果不等价,则分开
步骤
初始化:在去除不可达的状态后,将状态划分为接受和拒绝两个集合
找到不等价的状态,划分为新的集合
重复2,直到没有新的划分
时间复杂度:O(nloglogn)
DFA Bi-Simulation
Bi-Simulation:两个状态的输入输出行为相同,两个 DFA 是等价的
判断步骤
找到两个 DFA 的初始状态作为待检查的状态
对于每一个输入,找到待检查状态转移后的状态,将其加入待检查状态
重复 2 ,直到没有新的状态被加入
所有状态对中,如果两个状态同时为终止状态或同时为非终止状态,则两个 DFA 是等价的
Non-Deterministic Finite Automata 非确定性有限自动机
对于一个输入字符,可以有多个状态转移,只要有一个状态转移成功,就可以接受
允许 ϵ 转移
定义
M=(Q,Σ∪{ϵ},δ,q0,F)
δ:Q×(Σ∪{ϵ})↦2Q (2Q 表示 Q 的幂集,所有的子集)
ϵ-closure(q):从状态q开始,所有通过 ϵ 转移,不消耗其他字符可以到达的状态的集合
q∈ϵ-closure(q)
状态转移的拓展:匹配完成后,如果还能通过 ϵ 转移到达其他状态,则将这些状态也加入
δ∗:Q×Σ∗↦2Q
δ∗(q,w)=⋃q′∈δ∗(q,a)ϵ-closure(q′)
使用 NFA 定义语言:L(M)={w∈Σ∗∣δ∗(q0,w)∩F=∅}
【必考】 DFA 和 NFA 转换
DFA 显然是 NFA 的特例
NFA 可以转换为 DFA
转换步骤:子集构造法
初始化 DFA 的初始状态集合为 S0=ϵ-closure(q0)
对于每一个输入字符a,找到所有能到达的转移状态的集合S′=⋃q∈Sδ(q,a)
将S′′=ϵ-closure(S′)加入 DFA 的状态集合,如果转移状态中包含 NFA 的 Final 状态,则加入 DFA 的 Final 状态集合
重复,直到所有状态都被加入
最差时间复杂度:Θ(2n)
当 NFA 转换为 DFA 时,规模不一定会减小
最后更新于