dfa转正则表达式_从正则表达式到 NFA 到 DFA 到最简 DFA (二)

从正则表达式到 NFA 到 DFA 到最简 DFA (二)

NFA $ \rightarrow $ DFA (子集构造法)

这里我们用一个例子来解释。

647fe37ee973c812e8f8aab00be2bafb.png

如上图所示,这是上一篇文章中的正则表达式化成的 NFA,这里拿来接着用。

我们首先看开始状态 n0。n0 在接收了一个字符 a 之后可以转换到 n1,这个时候我们要看 n1 是否存在 $ \varepsilon $ 转移。若存在,则递归的将所有能 $ \varepsilon $ 转移的状态添加到一个集合里(包括 n1)。然后再看我们所创造的这个集合是否可以接收字符,接收字符后转移到的状态是否还有 $ \varepsilon $ 转移,依此类推。

拿这个图举例子就是:

$ n0 \xrightarrow{a} n1 ​$

n1 能 $ \varepsilon $ 转换到的状态是 q1,即 \(\{ n1, n2, n3, n4, n6, n9 \} : q1\) ,记 \(\{n0\}: q0\)

$ q1 \xrightarrow{b} n5 $

n5 能 $ \varepsilon $ 转移到的状态是 q2,即 \(\{ n5, n8, n9, n3, n4, n6 \} : q2\)

\(q2 \xrightarrow{...} \{...\} : q3​\)

我们构造的这个集合就叫做 $ \varepsilon - $闭包。

工作表算法

q0 ← Ɛ-闭包(n0)

Q ← {q0}

workList ← q0

while (workList != [])

remove q from workList

foreach char c

t ← Ɛ-闭包(delta(q, c))

D[q, c] ← t

if t 不属于 Q

add t to Q and workList

最终,Q 中的所有集合就是我们要求的 DFA 中的每个状态。再将状态转移连好,转换后的 DFA 就形成了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值