文章目录

  • 一、推广型的非确定性有限自动机 ( GNFA ) 引入
  • 二、推广型的非确定性有限自动机 ( GNFA ) 删除状态
  • 三、确定性有限自动机 ( DFA ) 转为 正则表达式
  • 四、确定性有限自动机 ( DFA ) 转为 正则表达式 ( 1 ) 添加开始状态 SSS 和结束状态 TTT
  • 五、确定性有限自动机 ( DFA ) 转为 正则表达式 ( 2 ) 删除 状态 222 删除方法
  • 六、确定性有限自动机 ( DFA ) 转为 正则表达式 ( 2 ) 删除 状态 222 信息梳理
  • 七、确定性有限自动机 ( DFA ) 转为 正则表达式 ( 2 ) 删除 状态 222 : 111 -> 222 -> 333 生成信息 111 -> 333
  • 八、确定性有限自动机 ( DFA ) 转为 正则表达式 ( 2 ) 删除 状态 222 : 333 -> 222 -> 333 生成信息 333 -> 333
  • 九、确定性有限自动机 ( DFA ) 转为 正则表达式 ( 2 ) 删除 状态 222 阶段性结果
  • 十、确定性有限自动机 ( DFA ) 转为 正则表达式 ( 3 ) 删除 状态 111 信息梳理
  • 十一、确定性有限自动机 ( DFA ) 转为 正则表达式 ( 3 ) 删除 状态 111 : 333 -> 111 -> 333 生成信息 333 -> 333
  • 十二、确定性有限自动机 ( DFA ) 转为 正则表达式 ( 3 ) 删除 状态 111 : SSS -> 111 -> 333 生成信息 SSS -> 333
  • 十三、确定性有限自动机 ( DFA ) 转为 正则表达式 ( 2 ) 删除 状态 2,12 , 12,1 阶段性结果
  • 十四、确定性有限自动机 ( DFA ) 转为 正则表达式 ( 4 ) 删除 状态 333 信息梳理
  • 十五、确定性有限自动机 ( DFA ) 转为 正则表达式 ( 4 ) 删除 状态 333 : SSS -> 333 -> TTT 生成信息 SSS -> TTT
  • 十六、确定性有限自动机 ( DFA ) 转为 正则表达式 总结

一、推广型的非确定性有限自动机 ( GNFA ) 引入


1 . 给定一个自动机 , 必有一个正则表达式可以表示其所识别的语言 ;

2 . 引入 推广型的非确定性有限自动机 ( GNFA ) : 首先要构造一个推广的一般型的非确定性有限自动机 , 每次消除一个状态 , 最后只剩下两个状态 , 此时箭头上的正则表达式就是最终的正则表达式 ;

上述自动机是一个 推广型的非确定性有限自动机 ( GNFA ) , 箭头上 不是单个字符 或 空字符 , 而是 正则表达式 ;

3 . 推广型的非确定性有限自动机 ( GNFA ) 中的推广的体现 :

① 非确定性有限自动机 ( NFA ) : 箭头上 只能出现 字符 , 空字符串 , 222 种输入 , 不能出现其它输入内容 ;

② 推广型的非确定性有限自动机 ( GNFA ) : 箭头上 可以出现 字符 , 空字符串 , 空集 , 正则表达式 , 444 种输入 ;

4 . 推广型的非确定性有限自动机 ( GNFA ) 与 非确定性有限自动机 ( NFA ) 是等价的 ;

二、推广型的非确定性有限自动机 ( GNFA ) 删除状态


给定一个 推广型的非确定性有限自动机 ( GNFA ) , 找到一个正则表达式 , 代表给定自动机的语言 ;

1 . 需求描述 : 上述自动机中 , R1,R2,R3,R4R_1 , R_2, R_3, R_4R1​,R2​,R3​,R4​ 都是正则表达式 ;

删除 q0q_0q0​ 状态 : 目前希望能删除 自动机中的 q0q_0q0​ 状态 , 删除 q0q_0q0​ 之后 , 会省略一部分语言 , 这里 省略了 R1,R2,R3R_1 , R_2 , R_3R1​,R2​,R3​ ;

语言要求 : 将 q0q_0q0​ 状态删除后 , 不影响整个自动机所接受的语言 , 那么需要将省略的部分语言 , 补充到 R4R_4R4​ 中 ;

2 . R1,R2,R3R_1 , R_2 , R_3R1​,R2​,R3​ 关系分析 :

① R2R_2R2​ 星运算 : R2R_2R2​ 是一个循环 , q0q_0q0​ 接受 R2R_2R2​ 后 , 仍然保持 q0q_0q0​ 状态 , 这里的该循环的正则表达式表示为 (R2)∗(R_2)^*(R2​)∗ ;

② R1R_1R1​ 与 (R2)∗(R_2)^*(R2​)∗ 串联运算 : R1R_1R1​ 与 (R2)∗(R_2)^*(R2​)∗ 是串联关系 , 表示为 R1(R2)∗R_1 (R_2)^*R1​(R2​)∗

③ 与 R3R_3R3​ 的串联运算 : R1(R2)∗R_1 (R_2)^*R1​(R2​)∗ 与 R3R_3R3​ 是串联关系 , 表示为 R1(R2)∗R3R_1 (R_2)^* R_3R1​(R2​)∗R3​ ;

3 . 并运算 : R1(R2)∗R3R_1 (R_2)^* R_3R1​(R2​)∗R3​ 与 R4R_4R4​ 是并集关系 , 都是 qiq_iqi​ 到 qjq_jqj​ 的输入的正则表达式 ;

4 . 两个正则表达式并运算表示为 : (R1(R2)∗R3)∪R4( R_1 (R_2)^* R_3 ) \cup R_4(R1​(R2​)∗R3​)∪R4​

三、确定性有限自动机 ( DFA ) 转为 正则表达式


上图中的自动机是一个 333 个状态的 确定性有限自动机 ( DFA ) ;

将上述 确定性有限自动机 ( DFA ) 转为正则表达式 ;

四、确定性有限自动机 ( DFA ) 转为 正则表达式 ( 1 ) 添加开始状态 SSS 和结束状态 TTT


1 . 添加开始和结束状态 :

① 添加开始状态 : 添加新的开始状态 SSS , 使用 ε\varepsilonε 箭头指向当前 确定性有限自动机 ( DFA ) 的 开始状态 ;

② 添加结束状态 : 再次添加一个 接受状态 , 从 确定性有限自动机 ( DFA ) 的接受状态 指向该新的结束状态 , 该新添加的结束状态 是 接受状态 ;

2 . 确定性有限自动机 ( DFA ) 转为 正则表达式 思想 : 逐步删除 1,2,31,2,31,2,3 状态 , 每次删除一个状态 , 生成新的正则表达式 , 最后就剩下 开始状态 SSS , 和结束状态 TTT , 最后剩下的就是 SSS 到 TTT 状态的正则表达式 , 也是自动机的正则表达式 ;

五、确定性有限自动机 ( DFA ) 转为 正则表达式 ( 2 ) 删除 状态 222 删除方法


1 . 删除 222 状态 :

① 信息抽取转移 : 找到 与 222 状态 所有的相关的信息 , 添加到其它的箭头上 , 如果没有创建一个新的箭头 ;

② 222 状态的输入和输出 : 哪些状态 有箭头 输入到 222 状态 , 222 状态 有哪些箭头 输出到了其它状态 ;

③ 信息转移 : 将每个输入 和 每个输出的信息全部转移 , 一条信息也不能遗漏 ;

④ 222 状态的输入输出统计 : 有 333 条输入 , 222 条输出 ; 其中有 一条输入输出是从 222 状态输出指向 它自己 , 共有 444 个箭头信
息 ; 外部输入有 2 条 , 外部输出 有 111 条 , 需要生成的箭头信息个数是 外部输入条数×外部输出条数外部输入条数 \times 外部输出条数外部输入条数×外部输出条数 ;

2 . 222 状态的循环 ( 111 输入 111 输出 ) : 222 状态下读取 bbb , 仍然回到 222 状态 ; 这 111 个输入 , 111 个输出 , 是从 222 状态输出到 222 状态 , 这是一个 星计算 ; 使用 b∗b^*b∗ 表示 ;

六、确定性有限自动机 ( DFA ) 转为 正则表达式 ( 2 ) 删除 状态 222 信息梳理


状态 222 信息梳理如下 ;

1 . 222 状态信息输入 :

SSS 状态 读取 ε\varepsilonε 跳转到 111 状态 ;

333 状态 读取 aaa 跳转到 111 状态 ;

2 . 222 状态信息输出 :

111 状态读取 (ab∗a)∪b(ab^*a) \cup b(ab∗a)∪b 正则表达式 跳转到 333 状态 ;

3 . 箭头信息生成个数 : 外部输入有 2 条 , 外部输出 有 111 条 , 需要生成的箭头信息条数 :

外部输入条数×外部输出条数=2×1=2外部输入条数 \times 外部输出条数 = 2 \times 1 = 2外部输入条数×外部输出条数=2×1=2

七、确定性有限自动机 ( DFA ) 转为 正则表达式 ( 2 ) 删除 状态 222 : 111 -> 222 -> 333 生成信息 111 -> 333


1 . 111 -> 222 -> 333 状态跳转 :

111 状态读取 aaa 跳转到 222 状态 : 这里是状态 222 的一条输入 , 使用 aaa 表示 ;

222 状态读取 bbb 跳转到 222 状态 : 这是无限的星计算 , 使用 b∗b^*b∗ 表示 ;

222 状态读取 aaa 跳转到 333 状态 : 这里是状态 222 的一条输出 , 使用 aaa 表示 ;

2 . 333 个正则表达式是串联关系 ;

中间经历的过程是 111 状态输入 aaa 跳转到 222 状态 , 222 本身可以有无限个星计算 , 222 状态输入 aaa 跳转到 333 状态 ;

使用正则表达式表示为 ab∗aab^*aab∗a ;

4 . 生成箭头信息 :

111 状态下 , 读取 ab∗aab^*aab∗a 正则表达式 , 可以跳转到 333 状态 ;

将 ab∗aab^*aab∗a 正则表达式 与 111 到 333 跳转箭头上的 bbb 进行并计算 , 得到

(ab∗a)∪b(ab^*a) \cup b(ab∗a)∪b

这是 111 跳转到 333 的正则表达式 ;

八、确定性有限自动机 ( DFA ) 转为 正则表达式 ( 2 ) 删除 状态 222 : 333 -> 222 -> 333 生成信息 333 -> 333


1 . 333 -> 222 -> 333 状态跳转 :

333 状态读取 bbb 跳转到 222 状态 : 这里是状态 222 的一条输入 , 使用 bbb 表示 ;

222 状态读取 bbb 跳转到 222 状态 : 这是无限的星计算 , 使用 b∗b^*b∗ 表示 ;

222 状态读取 aaa 跳转到 333 状态 : 这里是状态 222 的一条输出 , 使用 aaa 表示 ;

2 . 333 个正则表达式是串联关系 ;

中间经历的过程是 333 状态输入 bbb 跳转到 222 状态 , 222 本身可以有无限个星计算 , 222 状态输入 aaa 跳转到 333 状态 ;

三者串联关系 , 使用正则表达式表示为 bb∗abb^*abb∗a ;

即 333 状态下 , 读取 bb∗abb^*abb∗a 正则表达式 , 可以跳转到 333 状态 ;

3 . 生成箭头信息 :

给 333 状态添加一个箭头指向它自身 , 箭头的接收的正则表达式是

bb∗abb^*abb∗a

这是 111 跳转到 333 的正则表达式 ; 表示 333 状态下接收 bb∗abb^*abb∗a 正则表达式 , 仍然跳转到 333 状态 ;

九、确定性有限自动机 ( DFA ) 转为 正则表达式 ( 2 ) 删除 状态 222 阶段性结果


删除 222 状态结果 :

十、确定性有限自动机 ( DFA ) 转为 正则表达式 ( 3 ) 删除 状态 111 信息梳理


状态 111 信息梳理如下 ;

1 . 111 状态信息输入 :

SSS 状态 读取 ε\varepsilonε 跳转到 111 状态 ;

333 状态 读取 aaa 跳转到 111 状态 ;

2 . 111 状态信息输出 :

111 状态读取 (ab∗a)∪b(ab^*a) \cup b(ab∗a)∪b 正则表达式 跳转到 333 状态 ;

3 . 箭头信息生成个数 : 外部输入有 2 条 , 外部输出 有 111 条 , 需要生成的箭头信息条数 :

外部输入条数×外部输出条数=2×1=2外部输入条数 \times 外部输出条数 = 2 \times 1 = 2外部输入条数×外部输出条数=2×1=2

十一、确定性有限自动机 ( DFA ) 转为 正则表达式 ( 3 ) 删除 状态 111 : 333 -> 111 -> 333 生成信息 333 -> 333


1 . 333 -> 111 -> 333 状态跳转 :

333 状态 读取 aaa 跳转到 111 状态 , 正则表达式 表示为 aaa ;

111 状态 读取 (ab∗a)∪b(ab^*a) \cup b(ab∗a)∪b 正则表达式 跳转到 333 , 正则表达式 表示为 (ab∗a)∪b(ab^*a) \cup b(ab∗a)∪b ;

2 . 正则表达式 : 上述两个正则表达式是串联关系 , 正则表达式表示为 a((ab∗a)∪b)a ( (ab^*a) \cup b )a((ab∗a)∪b)

3 . 生成新的箭头信息 :

新增加的 333 状态下读取 a((ab∗a)∪b)a ( (ab^*a) \cup b )a((ab∗a)∪b) 跳转到 333 ;

与原来的 333 读取 bb∗abb^*abb∗a 跳转到 333 是并联关系 ,

最终的 333 读取一个正则表达手 跳转到 333 状态 , 的正则表达式为

(a((ab∗a)∪b))∪(bb∗a)( \quad a \; ( \; (ab^*a) \cup b \; ) \quad ) \cup ( bb^*a )(a((ab∗a)∪b))∪(bb∗a)

十二、确定性有限自动机 ( DFA ) 转为 正则表达式 ( 3 ) 删除 状态 111 : SSS -> 111 -> 333 生成信息 SSS -> 333


1 . SSS -> 111 -> 333 状态跳转 :

SSS 状态 读取 ε\varepsilonε 跳转到 111 状态 , 正则表达式 表示为 ε\varepsilonε ;

111 状态 读取 (ab∗a)∪b(ab^*a) \cup b(ab∗a)∪b 正则表达式 跳转到 333 , 正则表达式 表示为 (ab∗a)∪b(ab^*a) \cup b(ab∗a)∪b ;

上述两个正则表达式是串联关系 , 正则表达式表示为 ε∪((ab∗a)∪b)\varepsilon \cup ( (ab^*a) \cup b )ε∪((ab∗a)∪b) , 其中 ε\varepsilonε 可以省略 , 最终表示为 (ab∗a)∪b(ab^*a) \cup b(ab∗a)∪b

2 . 新增加 SSS 状态 到 333 状态之间的跳转 : SSS 状态下读取 (ab∗a)∪b(ab^*a) \cup b(ab∗a)∪b 正则表达式 , 跳转到 333 状态 ;

十三、确定性有限自动机 ( DFA ) 转为 正则表达式 ( 2 ) 删除 状态 2,12 , 12,1 阶段性结果


十四、确定性有限自动机 ( DFA ) 转为 正则表达式 ( 4 ) 删除 状态 333 信息梳理


状态 333 信息梳理 :

1 . 333 状态信息输入 :

SSS 状态 读取 (ab∗a)∪b(ab^*a) \cup b(ab∗a)∪b 跳转到 333 状态 ;

333 状态 读取 (a((ab∗a)∪b))∪(bb∗a)( \quad a \; ( \; (ab^*a) \cup b \; ) \quad ) \cup ( bb^*a )(a((ab∗a)∪b))∪(bb∗a) 跳转到 333 状态 ;

2 . 333 状态信息输出 :

333 状态 读取 (a((ab∗a)∪b))∪(bb∗a)( \quad a \; ( \; (ab^*a) \cup b \; ) \quad ) \cup ( bb^*a )(a((ab∗a)∪b))∪(bb∗a) 跳转到 333 状态 ;

333 状态读取 ε\varepsilonε 正则表达式 跳转到 TTT 状态 ;

3 . 箭头信息生成个数 : 自身循环有一个 , 从 333 状态 自身输出到输入 , 外部输入有 1 条 , 外部输出 有 111 条 , 需要生成的箭头信息条数 :

外部输入条数×外部输出条数=1×1=1外部输入条数 \times 外部输出条数 = 1 \times 1 = 1外部输入条数×外部输出条数=1×1=1

十五、确定性有限自动机 ( DFA ) 转为 正则表达式 ( 4 ) 删除 状态 333 : SSS -> 333 -> TTT 生成信息 SSS -> TTT


1 . SSS -> 333 -> TTT 状态跳转 :

SSS 状态 读取 (ab∗a)∪b(ab^*a) \cup b(ab∗a)∪b 跳转到 333 状态 ;

333 状态 读取 (a((ab∗a)∪b))∪(bb∗a)( \quad a \; ( \; (ab^*a) \cup b \; ) \quad ) \cup ( bb^*a )(a((ab∗a)∪b))∪(bb∗a) 跳转到 333 状态 , 星计算 , 表示成 (a((ab∗a)∪b))∪(bb∗a)∗( \quad a \; ( \; (ab^*a) \cup b \; ) \quad ) \cup ( bb^*a )^*(a((ab∗a)∪b))∪(bb∗a)∗

333 状态读取 ε\varepsilonε 正则表达式 跳转到 TTT 状态 ;

上述 333 个正则表达式是串联关系 , 正则表达式表示为 :

((ab∗a)∪b)∘((a((ab∗a)∪b))∪(bb∗a))∗( (ab^*a) \cup b ) \circ ( \quad ( \quad a \; ( \; (ab^*a) \cup b \; ) \quad ) \cup ( bb^*a ) \quad )^*((ab∗a)∪b)∘((a((ab∗a)∪b))∪(bb∗a))∗

2 . 新增加 SSS 状态 到 TTT 状态之间的跳转 : SSS 状态下读取 ((ab∗a)∪b)∘((a((ab∗a)∪b))∪(bb∗a))∗( (ab^*a) \cup b ) \circ ( \quad ( \quad a \; ( \; (ab^*a) \cup b \; ) \quad ) \cup ( bb^*a ) \quad )^*((ab∗a)∪b)∘((a((ab∗a)∪b))∪(bb∗a))∗ 正则表达式 , 跳转到 TTT 状态 ;

十六、确定性有限自动机 ( DFA ) 转为 正则表达式 总结


由上述示例可知 , 任何 确定性有限自动机 都可以转为 正则表达式 , 非确定性有限自动机 与 确定性有限自动机 又是等价的 , 因此 有限自动机 都可以转为 正则表达式 ;

【计算理论】正则语言 ( 推广型的非确定性有限自动机 GNFA | 删除状态 | 确定性有限自动机 转为 正则表达式 )相关推荐

  1. 计算理论——正则语言,上下文无关文法,图灵机,可判定性,可规约性

    目录 第一章 正则语言 状态图 自动机的形式化定义 非确定性 正则表达式 泵引理 使用泵引理证明某个语言非正则的方法 第二章 上下文无关文法 上下文无关文法概述 1.上下文无关文法形式化定义 2.上下 ...

  2. 【计算理论】计算理论总结 ( 正则表达式转为非确定性有限自动机 NFA ) ★★

    文章目录 一.正则表达式 二.正则语言运算示例 ★ 三.根据正则表达式构造自动机 一.正则表达式 1 . 正则表达式原子定义 : 如果 RRR 是 字符集 Σ\SigmaΣ 中的 111 个字符 , ...

  3. 【计算理论】计算理论总结 ( 非确定性有限自动机 NFA 转为确定性有限自动机 DFA | 示例 ) ★★

    文章目录 一.NFA 转 DFA 示例 1 二.NFA 转 DFA 示例 2 三.NFA 转 DFA 示例 3 一.NFA 转 DFA 示例 1 将下图的 非确定性有限自动机 NFA 转为确定性有限自 ...

  4. 【计算理论】可判定性 ( 非确定性有限自动机的接受问题 | 证明 “非确定性有限自动机的接受问题“ 的可判定性 )

    文章目录 一.非确定性有限自动机的接受问题 二.证明 "非确定性有限自动机的接受问题" 可判定性 一.非确定性有限自动机的接受问题 非确定性有限自动机 的 接受问题 , 首先将 计 ...

  5. 【计算理论】图灵机 ( 非确定性图灵机 与 计算树 | 非确定性 | 非确定性图灵机 与 确定性图灵机 相互模仿 | 非确定性图灵机 -> 确定性图灵机 )

    文章目录 一.非确定性图灵机 与 计算树 二.非确定性 三.非确定性图灵机 与 确定性图灵机 相互模仿 四.非确定性图灵机 -> 确定性图灵机 一.非确定性图灵机 与 计算树 非确定性图灵机体现 ...

  6. 【计算理论】计算理论总结 ( 正则表达式转为非确定性有限自动机 NFA | 示例 ) ★★

    文章目录 一.正则表达式转为非确定性有限自动机 NFA 要点 二.正则表达式转为非确定性有限自动机 NFA 示例 1 三.正则表达式转为非确定性有限自动机 NFA 示例 2 四.正则表达式转为非确定性 ...

  7. 【计算理论】自动机设计 ( 设计自动机 | 确定性自动机设计示例 | 确定性与非确定性 | 自动机中的不确定性 )

    文章目录 一. 设计自动机 ( 语言要求 ) 二. 设计自动机 ( 1 ) 开始状态 三. 设计自动机 ( 2 ) 状态 SSS 状态类型确定 四. 设计自动机 ( 3 ) 状态 SSS 输入输出分析 ...

  8. 【计算理论】计算复杂性 ( 证明 非确定性图灵机 与 确定性图灵机 的时间复杂度 之间的指数关系 )

    文章目录 证明 非确定性图灵机 与 确定性图灵机 的时间复杂度 之间的指数关系 证明 非确定性图灵机 与 确定性图灵机 的时间复杂度 之间的指数关系 在上一篇博客 [计算理论]计算复杂性 ( 非确定性 ...

  9. 【计算理论】计算复杂性 ( 非确定性图灵机的时间复杂度 | 非确定性图灵机 与 确定性图灵机 的时间复杂度 之间的关系 )

    文章目录 一.非确定性图灵机的时间复杂度 二.非确定性图灵机 与 确定性图灵机 的时间复杂度 之间的指数关系 一.非确定性图灵机的时间复杂度 给定一个非确定性图灵机 , 该图灵机是 判定机 , 在所有 ...

最新文章

  1. 查缺补漏 | Python自定义函数
  2. Thinkphp5 开发 OA 办公系统 - 数据库设计
  3. 使用Nginx的proxy_cache缓存功能取代Squid[原创]
  4. docker数据卷备份恢复以及配置桥接网络
  5. 2020年特斯拉是在中国获得补贴最多的电动汽车制造商
  6. 图解 Java 中的数据结构及原理,傻瓜也能看懂!
  7. android ble 发送指令,Android – 如何通过蓝牙低能耗(BLE)链接发送数据?
  8. Java 检测字符是否存在手机号或返回该手机号
  9. 微信小程序实现语音播报
  10. anvyiew java版_细说Anyview阅读器背后的故事
  11. 八数码问题BFS算法
  12. 小打卡软件测试,考勤打卡软件大测评,这款打卡软件你有在用吗?
  13. Linux环境变量PSI指什么,psi是什么单位(pSI指标应用原则)
  14. 计算机图形学实战——Bresenham直线光栅化算法绘制旋转线
  15. 【APICloud系列|15】上架ios应用到苹果应用市场总结
  16. 图说三极管,太容易懂了!(史上最详细版本)
  17. 百度、阿里、腾讯、有道各平台翻译API申请教程
  18. 有滞后单容对象MATLAB仿真,自动化生产线实训实验报告
  19. 【Go语言学习之路 1】下载,安装,环境变量,IDE
  20. vue 微信公众号支付接口_vue页面在微信公众号调用支付接口

热门文章

  1. JVM----Java内存区域
  2. freemarker程序开发
  3. 《构建之法》8.9.10
  4. MyEclipse 15 集成SVN
  5. 关系数据库范式粗略理解
  6. Android4.4源码编译(Ubuntu1204/1404)
  7. 用.NET SqlBulkCopy类执行批量复制
  8. 手机端自适应字体大小和元素宽度自适应
  9. 获得WebApi用Post方法获得新增数据的信息
  10. 放在NSArray、NSDictionary等容器内的对象Item,Item中的property在程序运行过程中被无故释放...