书接上文,上回说道NFA已经可以完全描述正则语言的全部内容。那么,我们在这一章探索一下一个比较复杂的正则表达式在用NFA做匹配的时候会有什么“不足“。

NFA匹配的"不足"

为了言之有物,不妨设要讨论的模式为d?(c(a|b)*)*(b|c+)

图1-1

效率

从上图可以明确的看到存在大量的转换。这些转换在程序实现的时候就对应了大量的回溯入口,即决策点。那么很显然,这个时候一定存在大量的递归回溯调用,自然也就必然会需要

大量时间来执行。

转换冗余

究其原因,无非就是冗余状态太多了

冗余 ≠ 无用

这些看似冗余的转换实际上对分组捕获非常有用,因为在分组捕获时,这些回溯可以记录当前匹配的状态还有剩余输入信息等。但是,如果我们不用分组捕获,只是要求模式全称匹配,则这些转换就是冗余的,我们需要通过状态压缩来实现确定化以避免任何回溯。

状态压缩

从上可知,若要完成状态压缩,则必须消除这些ℇ转换。但是,如何完成这一算法呢?完成后的确定化的结果仍然自动机么?当然是,并且它有个与NFA对应的名字叫做DFA

DFA登场

DFA与NFA的区别

图1-1图1-2中可以明显的发现NFA和DFA在转换边上的差异,归纳为下表。

NFA DFA
ℇ转换 存在 不存在
相同输入,不同转换 存在 不存在

ℇ转换

closure---克林闭包

消除ℇ转换

function cleenClosure(){//  BFSlet espilonSet = [state];let queue = [state];while(queue.length > 0){let q = queue.shift();for(const st of q.epsilonTransitions){if(espilonSet.findIndex(val => st.label === val.label) === -1){queue.push(st);espilonSet.push(st)if(st.isEnd) state.isEnd = st.isEnd}}}return espilonSet;
}

Subset-Construction(子集构造)

借助上文的消除ℇ转换函数,我们可以将能够通过ℇ转换到达的相连节点划分为新DFA的等价状态。

function toDFA(exp) {// 输入字符集let aplhabets = new Set();// 原始正则表达式for(const ch of exp){if(ch !== "(" && ch !== "." && ch !== "?" && ch !== ")" && ch !== "*" && ch !== "|") {aplhabets.add(ch)}}const transExp = insertExplicitConcatOperator(exp);// 经过后缀改写的正则表达式,后缀改写目的在于解决运算符的优先级确定const postfixExp = toPostfix(transExp);let nfa = toNFA(postfixExp);//1. 从初始状态开始,进行下一状态等价集合的构造let q0 = createDFAState(false);q0.nfaStateSet = epsilonCleen(nfa.start);q0.isEnd = nfa.start.isEnd;//2. 存储新发现等价状态的工作集let workLst = new Array();//3. 存储已经生成等价状态的集合let dfaStates = [q0];workLst.push(q0);//4. 不停增加和删除等价状态,知道workLst变为空集while(workLst.length > 0){let q = workLst.shift();for(const ch of aplhabets) {// 4.1 计算delta并合并进入新状态t = epsilonCleenDelta(q,ch);if(t != null) {if(!dfaStatesHas(dfaStates,t)){dfaStates.push(t);workLst.push(t);q.transitions[ch] = t} else {let node = dfaStatesFind(dfaStates,t);node.isEnd = t.isEnd;q.transitions[ch] = node;}}}}return q0;
}

图1-2

nfa状态转换图正规式_0x02 从NFA到DFA相关推荐

  1. nfa状态转换图正规式_应用全方案 | RECOM铁路级电源转换器

    随着人们生活水平的提升,出行机动性的增加,以及在旅游业和资产升级的推动下,全球的铁路网络正朝着可持续发展又兼具环保的方向不断扩大.特别是中国和印度,正在大力投资这一市场,预计到2020年,市场规模将达 ...

  2. nfa状态转换图正规式_穿过隔离栅供电:认识隔离式直流/ 直流偏置电源

    对于设计人员来说,在隔离栅内移动信号和电源是一项常见的挑战.为了提高安全性和抗噪性能,或产生较大的电势差, 可能需要在不同的系统域之间进行隔离.例如,手机充电器通 过内部隔离,可在连接器短路时防止用户 ...

  3. nfa状态转换图正规式_穿过隔离栅供电:隔离式直流/ 直流偏置电源探讨

    编者按: 您身边有许多隔离式电源可以选择,但需要了解输出数量.调节要求.输出功率.隔离等级.工作温度和输入电压范围等系统级规格.为此,您可以选择这种成本最低.可满足所有系统 要求的解决方案. 电子设计 ...

  4. 【编译原理】正规式转换成NFA

    非确定有限自动机(NFA) 状态转换图 状态转换矩阵 识别语言 Σ中的符 ∑ 正规式转换成NFA 例题 具体步骤

  5. 词法分析程序之正规式转换成NFA

    文章目录 前言 正规式变成NFA 前备知识 中缀表达式和后缀表达式(细节处理) 输入正规式和转换NFA 测试结果 完整代码 前言 编译原理课里面书本有一个作业--使用C++实现: 将正规式变成NFA ...

  6. 编译原理实验报告_任意给定一个正规式 r (包括连接、或、闭包运算),根据 Thompson算法设计一个程序,生成与该正规式等价的 NFA N 。

    任意给定一个正规式 r (包括连接.或.闭包运算),根据 Thompson算法设计一个程序,生成与该正规式等价的 NFA N . 百度网盘下载 传送门 提取码:bzjn

  7. 编译原理 | 由正规式构造确定的有穷自动机DFA

    词法分析: 由正规式构造确定的有穷自动机DFA 解题方法 1. 先由正规式构造转换系统 规则见下图: 2. 再由转换系统构造确定有穷自动机DFA (1) 求 Ia 假定 I 是转换图状态集 K 一个子 ...

  8. 编译原理——正规式、NFA转换构造DFA、DFA的化简

    一.DFA和NFA的区别 NFA:非确定有限自动机 DFA:确定有限自动机 NFA在同一状态,可以有多条出边,DFA在同一状态,只能有一条出边: NFA的初态可以具有多个,DFA的初态是唯一的: 比如 ...

  9. 将下图的nfa确定化为dfa_构造以下正规式相应的

    [简答题]铅在 20 ° C .钨在 1100 ° C 时变形,各属于哪种变形?为什么?(铅的熔点为 327 ° C ,钨的熔点为 3380 ° C [简答题]设计酒类.饮料.药品的包装设计 [计算题 ...

最新文章

  1. 负载均衡策略关键因素
  2. GDPR:我们将如何对待你的数据?
  3. bartender外部表不是预期格式_三张表轻松搞定项目计划
  4. 三次样条插值 实验_【科普】理解数字图像插值(二)
  5. App用户体验的一点思考
  6. android社会化分享
  7. android OKHttp的基本使用详解
  8. 随机化算法-----模拟退火
  9. python模仿声音_5秒钟让python克隆别人的声音
  10. Faster R-CNN原理
  11. 这届 Windows 不行,是因为微软不卖“软件”改卖“服务”?
  12. 20050405:什么都要会啊
  13. Html5学习进阶一 视频和音频
  14. ORK包的安装与linemod算法识别测试 (使用kinect v2 出现很奇怪的问题和解决)
  15. 计算机演示文稿PPT知识点,计算机PowerPoint考点
  16. python 马赛克拼图_用Python和OpenCV实现照片马赛克拼图(蒙太奇照片)
  17. python -使用pytesseract识别文字时遇到的问题
  18. 先尝甜头后食苦果 曾经的光伏巨头如今都身在何方?
  19. Java 编程要点之并发(Concurrency)详解
  20. 作为米粉,我不得不说一说小米11全系,小米还是最初的小米呀

热门文章

  1. 配置IPsec on GRE Tunnel with IOS Firewall and NAT
  2. 智能安全实验室-Defendio杀马2.4.0.420-实时防护-内存防护、新浏览器导航界面...
  3. Flutter、ReactNative、uniapp对比
  4. asc desc排序_21.数据库排序?左连接 ?右连接?
  5. internal java compiler error_Java异常处理总结
  6. php sql跳过前四条数据,mysql实现每组取前N条记录的sql,以及后续的组数据量限制...
  7. c语言int a什么意思,问一下吧里大神 int a = a; 这么定义是什么意思?
  8. linux 安装nfs 客户端,在CentOS 7上安装NFS服务器和客户端
  9. ruby hash方法_Ruby中带有示例的Hash.keys方法
  10. scala 字符串转换数组_如何在Scala中将十六进制字符串转换为字节数组?