编译原理学习之:确定和非确定性有限状态自动机(Non-determinism / determinism-Finate-Automaton)NFA /DFA

NFA

  • 在 NFA 中,对于一个状态节点( q 0 q_0 q0) ,通过某个字符 1 1 1 可以到达另外的多种状态节点, q 0 q_0 q0 通过 1 1 1 可以到达 q 1 , q 2 q_1, q_2 q1,q2 所以说他是非确定性的 (non-determinism)
    在这里插入图片描述
  • 对同一个语言(language)NFA 往往表现的更加的智能
  • 上图中的 w w w 如果用 DFA 表示,则如下:
    在这里插入图片描述

NFA 的 ϵ \epsilon ϵ 转换状态(transition)

  • NFA 同样支持一个状态通过空串 ϵ \epsilon ϵ 转换到另外一个状态(DFA不支持这种做法);如下:
    在这里插入图片描述
  • 这表示了两个 languages 的 union(并集) 操作;

NFA 的多初始状态(Multiple Start State)

在这里插入图片描述

  • 这样只需要四个状态即可完成整幅图的描述

NFA 的一般性定义

  • 与一般的 DFA 不同,NFA 的字符集包括空字符 ϵ \epsilon ϵ,即 Σ ϵ = Σ ∪ { ϵ } \Sigma_\epsilon=\Sigma\cup\{\epsilon\} Σϵ=Σ{ϵ}
  • 除此之外,NFA 也是一个五元组
    在这里插入图片描述
  • Q Q Q 代表有限的状态集合,
  • Σ \Sigma Σ 表示有限的字母表,也就是上图中线上的那些触发条件;通常选用那些数字 1 ,   2 ,   3... 1,~2,~3... 1, 2, 3... 或者小写字母 a , b , c . . . a,b,c... a,b,c...
  • δ \delta δ 代表的是状态转移的矩阵(情况)即,一个状态 q ∈ Q q\in Q qQ 在一个 σ ∈ Σ \sigma\in \Sigma σΣ 的情况下转移到另外一个状态 q q q;上图中所有的状态转移的全部记录就是 δ \delta δ
  • I ⊆ Q I ⊆ Q IQ 是开始状态集合;开始状态可以有多个,因此构成了一个集合(这一点和 DFA 也不同)
  • F ⊆ Q F\subseteq Q FQ 是接受状态, 即上图中用双圆圈表示的状态;当然 F F F 是一个集合,他里面可以有多个接受状态,也可以只有一个接受状态;

NFA 的“acceptance” 和 “recognition” (对语言的识别和对字符串的接收)

  • N = ( Q , Σ , δ , I , F ) N = (Q, Σ, δ, I , F) N=(Q,Σ,δ,I,F) 是一个 NFA , 并且让 w = v 1 v 2 ⋅ ⋅ ⋅ v n w = v_1v_2 · · · v_n w=v1v2vn 其中每一个 v i v_i vi 都是 Σ ϵ Σ_\epsilon Σϵ 的一个成员
  • 如果 N N N 可以接受字符串 w w w 那么 w w w 必须满足当且仅当:有一串状态 r 0 , r 1 , . . . r n r_0,r_1,...r_n r0,r1,...rn r i ∈ Q r_i\in Q riQ 满足:
    • r 0 ∈ I r_0 ∈ I r0I
    • r i + 1 ∈ δ ( r i , v i + 1 )   f o r   i = 0 , . . . , n − 1 r_{i+1} ∈ δ(r_i, v_{i+1}) ~for ~i = 0, . . . , n − 1 ri+1δ(ri,vi+1) for i=0,...,n1
    • r n ∈ F r_n ∈ F rnF
  • N N N recognises language A A A iff A = { w ∣ N   a c c e p t s   w } A = \{w | N ~accepts ~w\} A={wN accepts w}.

NFA 与正则语言和 DFA 的关系

等价关系

  • NFA 和正则语言也是等价的,一个正则语言一定能表示成一个 NFA 或者一个 DFA
  • 每个 NFA 都对应一个等价的 DFA
  • 可以通过 子集构造(subset construction) 来通过 NFA 得到 DFA
  • 一个 DFA 的状态是一个 NFA 状态的子集;即一个 NFA 的状态中可以包含一到多个 DFA 的状态节点

NFA 转换成 DFA 实例

  • 现在有一个 NFA 的表示,要把它转换成 DFA 遵循以下步骤
    在这里插入图片描述
    在这里插入图片描述

  • 起始状态为 1 1 1,并且由于 ϵ \epsilon ϵ 的原因,起始状态是 A = { 1 , 3 } A=\{1,3\} A={1,3}

  • 接着在集合 A A A 中的每一个状态通过 a a a 可以到达的状态我们进行分析:

    • 1 → a 2 1 \rightarrow^{a}2 1a2
    • 1 → ϵ 3 → a 1 1 \rightarrow^{\epsilon}3\rightarrow^{a}1 1ϵ3a1
    • 3 → a 1 → ϵ 3 3 \rightarrow^{a}1\rightarrow^{\epsilon}3 3a1ϵ3
    • 所以集合 A A A 通过 a a a 可以到达的状态节点为 { 1 , 2 , 3 } \{1,2,3\} {1,2,3} 我们把它写在表格中第一行第二列( B ∗ B^* B)的位置
  • 同样的,当集合 A A A 通过字符 b b b ,哪里也去不了,所以我们用空集表示,即 − - 或者 ∅ \empty

  • 由于 { 1 , 2 , 3 } \{1,2,3\} {1,2,3} 相对于 { 1 , 3 } \{1,3\} {1,3} 是一个新状态,因此,我们在第二行的起始状态中使用 { 1 , 2 , 3 } \{1,2,3\} {1,2,3} 作为开始;重复上面的步骤;第二行的 b b b 列我们又得到了新状态 { 2 , 3 } \{2,3\} {2,3},因此我们在第三行重复这个步骤,直到整张表中不出现新的状态。

  • 因此,如果把上述的 NFA 看做一个 DFA 的话,那么 { 1 , 2 , 3 } , { 1 , 3 } , { 2 , 3 } \{1,2,3\},\{1,3\},\{2,3\} {1,2,3},{1,3},{2,3} 都相当于 DFA 中一个单独的状态节点;因此我们说 NFA 的每个状态相当于 DFA 中的几个状态的集合。
    在这里插入图片描述

  • 最终我们根据上面的 NFA 中的各个状态得到等价的 DFA 的图。

  • 其中 D D D 状态就是那个空集,我们最后在写状态的时候也要单独考虑这种情况(完备);而最后得到的状态转移矩阵也如图所示。

更加正式的定义

  • 对于 N = ( Q , Σ , δ , I , F ) N=(Q,Σ,δ,I,F) N=(Q,Σ,δ,I,F);让 → ϵ ∗ \rightarrow^*_\epsilon ϵ 作为 → ϵ \rightarrow_\epsilon ϵ 的自反传递闭包
    在这里插入图片描述
  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

暖仔会飞

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值