精华内容
下载资源
问答
  • DFA与NFA的区别与联系

    千次阅读 2014-04-28 16:19:53
    概念 记号  有字母表中符号组成有限长度序列。记号s长度记为|s|.长度为0记号成为空记号,记为

    概念

    记号

          有字母表中的符号组成的有限长度的序列。记号s的长度记为|s|.长度为0的记号成为空记号,记为∑。

    有限自动机(Finite State Automaton)

          为研究某种计算过程而抽象出的计算模型。拥有有限个状态,根据不同的输入每个状态可以迁移到其他的状态。

    非确定有限自动机(Nondeterministic Finite Automaton)

           简称NFA,由以下元素组成:

           1.有限状态集合S;

            2.有限输入符号的字母表∑;

            3.状态转移函数move;     

            4.开始状态sSUB{0};

            5.结束状态集合F, F∈S。

            自动机初始化状态为sSUB{0},逐一读入输入字符串中的每一个字母,根据当前状态,读入的字母,由状态转移函数move控制进入下一个状态。如果输入字符串读入结束时自动机的状态属于结束状态集合F,则说明该自动机接受该字符串,否则为不接受。

    确定有限自动机(Deterministic Finite Automaton)

           简称DFA,是NFA的一直特例,有以下两条限制:

           1. 对于空输入∑,状态不发送迁移;

           2.某个状态对于每一种输入最多只有一种状态转移。

     

     

     

    展开全文
  • DFA与NFA的终极比较

    千次阅读 2010-09-25 11:15:00
    DFA与NFA:在预编译阶段(pre-use compile)的区别 在使用正则表达式搜索之前,两种引擎都会编译表达式,得到一套内化形式,适应各自的匹配算法。NFA的编译过程通常要快一些,需要的内存也更少一些。传统...

    NFA与DFA各有利弊。

    DFA与NFA:在预编译阶段(pre-use compile)的区别

    在使用正则表达式搜索之前,两种引擎都会编译表达式,得到一套内化形式,适应各自的匹配算法。NFA的编译过程通常要快一些,需要的内存也更少一些。传统型NFA和POSIX NFA之间并没有实质的差别。

    DFA与NFA:匹配速度的差别

    对于“正常”情况下的简单文本匹配测试,两种引擎的速度差不多。一般来说,DFA的速度与正则表达式无关,而NFA中两者直接相关。

    传统的NFA在报告无法匹配以前,必须尝试正则表达式的所有变体。这就是为什么我要用整章(第6章)来论述提高NFA表达式匹配速度的技巧。我们将会看到,有时候一个NFA永远无法结束匹配。传统型NFA如果能找到一个匹配,肯定会停止匹配。

    相反,POSIX NFA必须尝试正则表达式的所有变体,确保获得最长的匹配文本,所以如果匹配失败,它所花的时间与传统型NFA一样(有可能很长)。因此,对POSIX NFA来说,表达式的效率问题更为重要。

    在某种意义上,我说得绝对了一点,因为优化措施通常能够减少获得匹配结果的时间。我们已经看到,优化引擎不会在字符串开头之外的任何地方尝试带「^」锚点的表达式,我们会在第6章看到更多的优化措施。

    DFA不需要做太多的优化,因为它的匹配速度很快,不过最重要的是,DFA在预编译阶段所作的工作提供的优化效果,要好于大多数NFA引擎复杂的优化措施。

    现代DFA引擎经常会尝试在匹配需要时再进行预编译,减少所需的时间和内存。因为应用的文本各异,通常情况下大部分的预编译都是白费工夫。因此,如果在匹配过程确实需要的情况下再进行编译,有时候能节省相当的时间和内存(技术术语就是“延迟求值(lazy evaluation)”)。这样,正则表达式、待匹配的文本和匹配速度之间就建立了某种联系。

    DFA与NFA:匹配结果的差别

    DFA(或者POSIX NFA)返回最左边的最长的匹配文本。传统型NFA可能返回同样的结果,当然也可能是别的文本。针对某一型具体的引擎,同样的正则表达式,同样的文本,总是得到同样的结果,在这个意义上来说,它不是“随机”的,但是其他NFA引擎可能返回不一样的结果。事实上,我见过的所有传统型NFA返回的结果都是一样的,但并没有任何标准来硬性规定。
     
    DFA与NFA:能力的差异

    NFA引擎能提供一些DFA不支持的功能,例如:
     捕获由括号内的子表达式匹配的文本。相关的功能是反向引用和后匹配信息(after- match information),它们描述匹配的文本中每个括号内的子表达式所匹配文本的位置。
     环视,以及其他复杂的零长度确认(注8)(133)。
     非匹配优先的量词,以及有序的多选结构。DFA很容易就能支持选择最短的匹配文本(尽管因为某些原因,这个选项似乎从未向用户提供过),但是它无法实现我们讨论过的局部的忽略优先性和有序的多选结构。
     占有优先量词(142)和固化分组(139)。

    兼具DFA的速度和NFA的功能:正则表达式的终极境界

    我已经多次说过,DFA不能支持捕获括号和反向引用。这无疑是对的,但这并不是说,我们不能组合不同的技术,以达到正则表达式的终极境界。180页的补充内容描述了NFA为了追求更强大的功能,如何脱离了纯理论的道路和限制,DFA的情况也是如此。受自身结构的限制,DFA进行这种突破更加困难,但并非不可能。

    GNU grep采取了一种简单但有效的策略。它尽可能多地使用DFA,在需要反向引用的时候,才切换到NFA。GNU awk的办法也差不多——在进行“是否匹配”的检查时,它采用GNU grep的DFA引擎,如果需要知道具体的匹配文本的内容,就采用不同的引擎。这里的“不同的引擎”就是NFA,利用自己的gensub函数,GNU awk能够很方便地提供捕获括号。

    Tcl的正则引擎由Henry Spencer(你或许记得,这个人在正则表达式的早期发展和流行中扮演了重要的角色)开发,它也是混合型的。Tcl引擎有时候像NFA——它支持环视、捕获括号、反向引用和忽略优先量词。但是,它也确实能提供POSIX的最左最长匹配(177),但没有我们将在第6章看到的NFA的问题。这点确实很棒。

    DFA与NFA:实现难度的差异

    尽管存在限制,但简单的DFA和NFA引擎都很容易理解和实现。对效率(包括时间和空间效率)和增强性能的追求,令实现越来越复杂。

    用代码长度来衡量的话,支持NFA正则表达式的ed Version 7(1979年1月发布)只有不到350行的C代码(所以,整个grep只有区区478行代码)。Henry Spencer1986年免费提供的Version 8正则程序差不多有1 900行C代码,1992年Tom Lord的POSIX NFA package rx(被GNU sed和其他工具采用)长达9 700行。

    为了糅合DFA和NFA的优点,GNU egrep Version 2.4.2使用了两个功能完整的引擎(差不多8 900行代码),Tcl的DFA/NFA混合引擎(请看上一页的补充内容)更是长达9 500行。

    某些实现很简单,但这并不是说它们支持的功能有限。我曾经想要用Pascal的正则表达式来处理某些文本。从毕业以后我就没用过Pascal了,但是写个简单的NFA引擎并不需要太多工夫。它并不追求花哨,也不追求速度,但是提供了相对全面的功能,非常实用。

    展开全文
  • NFA与DFA

    2008-03-23 19:37:42
    介绍NFA DFA以及他们的算法他们之间的区别
  • NFADFA的认识

    2020-12-31 15:11:21
    NFA与DFA的区别: 区别: 在某种状态下,当面临同一个输入符时存在不止一个状态转换,即允许进入多于一个的状态集合 格式: <S, Σ,T, s0, F>, 其中 S表示非空的有限状态集 Σ是非空的输入字母表 T是转移...

    构造下列正规式相应的DFA

    NFA与DFA的区别:

    区别: 在某种状态下,当面临同一个输入符时存在不止一个状态转换,即允许进入多于一个的状态集合

    格式: <S, Σ,T, s0, F>, 其中
    S表示非空的有限状态集
    Σ是非空的输入字母表
    T是转移函数(在NFA中结果是一个状态的集合,在DFA中是多个状态的集合)
    s0是唯一的起始状态
    F∈S,是非空的终结状态

    例题P64 1

    (1) 1(0|1) *101

    (2) 1(1010*|1(010)*1) *0

    (3) a((a|b)|aba)*b

    (4) b((ab)*|bb)*ab

    步骤

    a.构造正规式的NFA
    b.根据NFA写出状态转换表
    c.将状态转换表中的每个状态转换为DFA
    

    具体实现:

    (1) 1(0|1) *101
    

    如有不对请批评指正
    (2)1(1010*|1(010)*1) *0
    在这里插入图片描述
    状态转换表
    在这里插入图片描述

    按照状态转换表写出DFA
    (3) a((a|b)*|ab*a)*b
    (4) b((ab)*|bb)*ab
    也是同样的道理,这里就给出NFA图,接下来就靠你自己了
    

    在这里插入图片描述
    在这里插入图片描述

    展开全文
  • 我们知道NFA和DFA的区别最主要的就是一个状态和一个inputsymbol是否能够确定一个状态的问题,对于NFA,它将确定一个组状态,而DFA将确定一个状态,因此,我们有一个很好的办法就是把NFA的状态集对应每个DFA的状态,...

    1. 子集构造(Subset Construction)

    这是一个转换NFA到DFA的算法。我们知道NFA和DFA的区别最主要的就是一个状态和一个input

    symbol是否能够确定一个状态的问题,对于NFA,它将确定一个组状态,而DFA将确定一个状态,因此,我们有一个很好的办法就是把NFA的状态集对应每个DFA的状态,这就是subset

    construction的思想,不过这只是大概泛泛而论,我们需要更加明确的认识

    1) NFA在任何一个input

    symbol下,映射的状态集(通过move函数,这个集合通常用T字母表示)应该被知道

    2) 必须保证1)中状态集都对应了DFA中的一个状态

    具体算法:

    Input : 一个NFA N

    Output : 接受相同语言的DFA D

    Method : 为D构架一个transition table(转换表)

    Dtran,每个DFA的状态是一个NFA的状态集合(这里一定要注意前面说过的1)2)两点)。我们定义一些操作:

    s 表示NFA的状态,T 表示NFA的状态集合,a表示一个input symbol

    ε-transition(ε转换)就是说input symbol为ε时的transition(转换)

    操作(operation)

    描述(description)

    ε-closure(s)

    从NFA的状态s出发,只通过ε-transition到达的NFA的状态集合

    ε-closure(T)

    NFA的集合T中的状态p,只通过ε-transition到达的NFA的状态集合,再求这些集合的交集。用数学表达就是 {p|p

    属于 ε-closure(t) , t属于T}

    move(T,a)

    NFA的集合,这个集合在input symbol为a,状态为T中任意状态情况下,通过一个转换得到的集合

    注意一下,所有的操作都是针对NFA的状态或者状态集合,得到的时NFA的状态集合,或者说是DFA看为一个状态

    Subset Construction

    初始Dstates,它仅仅含有状态(D的状态)ε-closure(s0),并且状态未被标记,s0表示开始状态,注意,Dstates放的是D的状态

    双击代码全选

    1

    2

    3

    4

    5

    6

    7

    8

    9

    while( Dstates 有未标记的状态 T ) {// T是D中的一个状态,也是N中一个状态集

    标记 T;

    for( input symbol a ){// 遍历所有的input symbol

    U = ε-closure(move(T, a));// move为NFA的move函数

    if( U 不在 Dstates 中 )

    把U作为尚未标记的状态加入Dstates;

    Dtran[T, a] = U

    }

    }

    注意,状态s,ε-closure(s)一定包含s

    我们先来熟悉上面的操作operation,再来看上面的算法

    a4c26d1e5885305701be709a3d33442f.png

    双击代码全选

    1

    2

    3

    4

    5

    6

    7

    8

    ε-closure(0) = {0, 1, 2, 4, 7}// 从0状态出发的,input symbol为ε的所有状态的集合

    ε-closure(3) = {1, 2, 3, 4, 6, 7}

    ε-closure(8) = {8}

    ε-closure( {3, 8} ) = ε-closure(3) U ε-closure(8) = {1, 2, 3, 4, 6, 7, 8}

    move(0,a) = 空

    move(7,a) = {8}

    move(8,b) = {9}

    move( {0, 1, 2, 4, 7}, a) = move(0,a) U move(1,a) U move(2,a) U move(4,a) U move(7,a) = {3, 8}

    现在可以回去理解一下算法了。

    这里再说说求ε-closure(T)的算法:

    双击代码全选

    1

    2

    3

    4

    5

    6

    7

    8

    9

    10

    11

    把T的所有状态压入stack(栈);

    ε-closure(T)的初始值为 T 中的所有元素 ;// 也就是一定包含他们本身

    while( 栈非空 ) {

    弹出栈顶元素 t ;

    for( 每个属于 move(t, ε) 的状态 u ){

    if( u 不在 ε-closure(T) 中 ){

    u 加入 ε-closure(T);

    把 u 入栈;

    }

    }

    }

    下面对上图如何使用Set Construction算法来构建DFA做一个详细的描述:

    1. 初始化Dstates 把集合 ε-closure(s0) = {0, 1, 2, 4, 7}作为第一个状态,设此状态为

    A

    2. 现在转化,input symbol {a, b},因此,求:

    ε-closure(move(A, a));

    ε-closure(move(A, b));

    这里会得到2个状态

    ε-closure(move(A, a)) = {1, 2, 3, 4, 6, 7, 8},设其为 B

    ε-closure(move(A, b)) = {1, 2, 4, 5, 6, 7}, 设其为C

    B,C放入Dstates

    改写 Dtrans

    最终得到的 Dtrans 为:

    A = {0, 1, 2, 4, 7}

    B = {1, 2, 3, 4, 6, 7, 8}

    C = {1, 2, 4, 5, 6, 7}

    D = {1, 2, 4, 5, 6, 7, 9}

    a4c26d1e5885305701be709a3d33442f.png

    因此,NFA转化成为DFA:

    a4c26d1e5885305701be709a3d33442f.png

    展开全文
  • NFA构造及NFA转化为DFA

    万次阅读 2014-03-25 13:29:39
    1. NFA与DFA的区别 NFA与DFA的主要区别如下: 1) 对于一个特定的符号输入,DFA只会跳转到一个状态;而NFA则可能跳转到多个状态。 2) NFA中一个状态可以不经过任何符号就可以实现状态转换(即存在ε-转移) 上面两个区别...
  • 词法分析(4)---NFA与DFA的转化

    千次阅读 2011-09-07 22:37:15
    1. 子集构造(Subset Construction) ...我们知道NFADFA的区别最主要的就是一个状态和一个input symbol是否能够确定一个状态的问题,对于NFA,它将确定一个组状态,而DFA将确定一个状态,因此,我们有一个很好
  • 用C语言实现NFADFA的转换过程

    热门讨论 2008-12-09 16:53:35
    用C语言实现NFA到DFA转换过程 NFA (nondeterministic finite-state automata)是不确定性有限... 给定一个NFA,总有一个DFA与之对应,即一个NFA可以转换成一个等价DFA,我们将使用子集构造算法实现NFA到DFA转换。
  • 在上篇博客从0到1打造正则表达式执行引擎(一)中我们已经构建了一个可用的正则表达式引擎,相关源码见https://github.com/xindoo/regex,但上文中只是用到了NFA,NFA的引擎建图时间复杂度是O(n),但匹配一个长度为m的...
  • CFG正则文法句子的派生树文法二义性自动机有限自动机有限自动机示意图状态转换图语言定义不确定有限自动机 NFADFA与NFA的区别文法和自动机的关系由文法构造自动机的方式由自动机到正则文法从文法可以唯一确定语言,...
  • 有限状态机

    2017-08-13 21:00:33
    DFA与NFA的区别: 初态不同   有限自动机   不确定有限自动机   为什么要将NFA转换成DFA呢? NFA是一种状态不确定的自动机,所以这种自动机不便机器实现;DFA是有限确定状态的自动机,它的状态转换的...
  • 复习 有限自动机分为两种:不确定有限自动机(NFA)和确定有限自动机(DFA)。我们分别用一个五元组...确定有限状态自动机1、2、4、5与NFA一样。转换函数move:Sx(Σ)->p(s),两者区别在于:有限自动机任...
  • NFA与DFA之间的唯一区别在于返回值的类型:在NFA的情况下,返回值是一个状态集合;而在DFA的情况下,返回值是单个状态。 确定型有穷自动机的定义 一个确定型有穷自动机包括: 1.一个有穷的状态集合,
  • 一般情况下用正则写法为: [Ctrl+A 全选 注:如需引入外部Js需刷新才能执行]如果遇到大数据变长字符串话就... 而DFA与NFA机制上不同带来5个影响: 1. DFA对于文本串里每一个字符只需扫描一次,比较快,但特性较
  • 求语法树二义性问题文法分类:正规表达式、正规集:自动机DFANFA的构造语法输入输出自上而下的问题以及解决办法自下而上的核心问题规范归约最右推导短语、直接短语、句型、句柄前缀、活前缀、有效项目将语义分析...
  • 记录一些Automata学习的过程,以方便后续整理。 学习自动机,个人认为比较好的参考有《万门大学公开课 可计算理论... NFA与DFA的区别在于: 1、NFA从一个状态接收一个字符后,转移态有多个可以选择;而DFA只有一个...
  • 注:需要读者学习过基础的形式语言自动机的相关知识,至少是了解正则表达式,DFANFA的关系。 在算法导论32.3节中,介绍了一种利用有限自动机进行字符串匹配的算法,看上去非常复杂,在本文中我尝试从...
  • 思路:NFA与DFA的区别 NFA DFA 初始状态 不唯一 唯一 弧上标记 字(单字符字、ε) 字符 转换关系 非确定 确定 假定NFA M=<S, E, δ, So, F> ,我们对M的状态转换图进行以下改造: 1.解决初始状态...
  • 重点 一、编译过程 编译型语言解释型语言区别:...有限自动机分确定有限自动机(DFA)和非确定有限自动机(NFA) 例1 例2 不确定意思是输识别一个字符串有...
  • 今天想谈NFA与DFA的区别,对代码来说。 我喜欢购书,只要是经典的书,就买了。但当时也许看不懂。记得,《设计模式》一出来时,就购买了。可总是看不懂。直到看了程杰写的《大话设计模式》才基本看懂。 其实,学正则...
  • 编译原理复习提纲

    2019-01-03 20:24:48
    11.简述NFADFA的定义与区别 12.若M某些结点既是初态结点又是终态结点,或者存在一条从某初态结点到某个终态结点ε通路,那么空字ε可为M所识别 13.正规式优先自动机等价性 14.定理2.对于∑上每一个正规...
  • 这两种引擎的区别主要在于被匹配对象不同。 DFA是用文本去匹配表达式。而NFA是用表达式去匹配文本。这个了解一下就信了。目前我们用的是NFA自动机。 为什么有时候正则表达式的使用会导致CPU飙升呢?这个...
  • 正则表达式进阶

    2019-07-17 11:25:20
    正则表达式进阶 或 | 的小细节 替换匹配 | 任一侧最大的表达式 2.正则表达式和相应编码 https://blog.csdn.net/xyls12345/article/details/23942533 ...举例简单说明NFA与DFA工作的区别: 比...
  • 《编译原理》知识点考点超全总结

    千次阅读 多人点赞 2020-07-22 17:30:07
    T 型图描述自举及移植过程第二章 词法分析什么是词法分析记号分类正则表达式什么是有穷自动机DFA(确定性有穷自动机)NFA(非确定性有穷自动机)第三章 上下文无关文法上下文无关文法正则表达式主要区别:终结...

空空如也

空空如也

1 2
收藏数 26
精华内容 10
关键字:

dfa与nfa的区别