糖尿病康复,内容丰富有趣,生活中的好帮手!
糖尿病康复 > nfa状态转换图正规式_0x02 从NFA到DFA

nfa状态转换图正规式_0x02 从NFA到DFA

时间:2023-05-01 14:32:01

相关推荐

nfa状态转换图正规式_0x02 从NFA到DFA

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

NFA匹配的"不足"

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

图1-1

效率

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

大量时间来执行。

转换冗余

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

冗余 ≠ 无用

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

状态压缩

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

DFA登场

DFA与NFA的区别

从图1-1与图1-2中可以明显的发现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》对你有帮助,请点赞、收藏,并留下你的观点哦!

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。