我从给定的正则表达式中创建了DFA以匹配测试字符串.在某些情况下会发生.*. (例如.* ab).现在假设机器处于状态1.在DFA中,.*指的是所有字符到自身的转换,以及从状态1到’a’的另一个转换.如果测试字符串包含’a’那么可能是转换,因为从状态1开始,机器可以转到DFA中不可能的两种状态.
我从你的例子的基础开始,以便人们可以发现它有用
任何 class of automata都可以有两种形式:

>确定性
>非确定性.

在确定性模型中:我们只有一个选择(或者说没有选择)从一个congratulation移动到下一个configuration.
在Finite Automate的确定性模型(DFA)中:对于状态(Q)和语言符号(Σ)的每种可能组合,我们总是具有唯一的下一状态.

Definition of transition function for DFA: δ:Q×Σ → Q

δ(q0,a) → q1
            ^ only single choice

因此,在DFA中,从一个状态到下一个状态,每个可能的移动都是明确的.

然而,
在非确定性模型中:我们可以为下一个配置提供多个选择.
并且在有限自动机(NFA)的非确定性模型中:输出是状态(Q)和语言符号(Σ)的某种组合的状态集.

NFA的转移函数的定义:δ:Q×Σ→2Q =⊆Q

δ(q0,a) → {q1,q2,q3}
               ^ is set,Not single state (more than one choice)

在NFA中,我们可以为下一个州提供多个选择.那就是你在过渡NFA中所谓的歧义.

(你的例子)
假设语言符号是Σ= {a,b},语言/正则表达式是(a b)* ab.这种语言的有限自动机可能如下:


Your question is: Which state to move when we have more than one choices for next state?
I make it more general question.

如何在NFA中处理字符串?

我正在考虑将自动机模型作为接受器,如果它属于自动机语言,则接受字符串.(注意:我们可以将自动机作为换能器),下面是我的回答以上示例

在上面的NFA中,我们找到了5个tapular对象:

1.  Σ :  {a,b}  
2.  Q :  {q1,q3}  
3.  q1:  initial state
4.  F :  {q3}       <---F is set of final state
5.  δ : Transition rules in above diagram: 
         δ(q1,a) → { q1,q2 }
         δ(q1,b) → { q1 }
         δ(q2,b) → { q3 }

示例有限自动机实际上是一个NFA,因为在生产规则δ(q1,a)→{q1,q2}中,如果我们得到一个符号,而当前状态是q1,那么下一个状态可以是q1或q2(多个选择) ).因此,当我们在NFA中处理字符串时,我们会获得额外的路径,只要它们是一个符号a进行处理,而当前状态为q1.

如果存在一些可能的移动序列,则会在字符串处理结束时将机器置于最终状态,NFA接受字符串.并且所有字符串的集合都有一些路径可以从初始状态到达集合F中的任何最终状态,称为NFA的语言:

我们也可以写一下,“NFA定义的语言是什么?”如:

L(nfa) = { w ⊆ Σ* | δ*(q1,w) ∩ F ≠ ∅}

当我是新人时,这对我来说太复杂了,但实际上并非如此

L(nfa)说:所有字符串都由语言符号组成=(w⊆Σ*)是用语言表达的; if(|)在处理w形式初始状态(=δ*(q1,w))后得到的状态集包含最终状态集中的一些状态(因此与最终状态的交集不为空=δ*(q1,w)∩F≠∅).因此,在处理Σ*中的字符串时,我们需要跟踪所有可能的路径.

示例1:在NFS上面处理字符串abab:

--►(q1)---a---►(q1)---b---►(q1)---a---►(q1)---b---►(q1)
     \                       \ 
      a                       a  
       \                       \
        ▼                       ▼
       (q2)                     (q2)---b---►((q3))
        |                      
        b                      
        |                      
        ▼                                 
       (q3)                   
        |
        a
        |
       halt

上图显示:如何在NFA中处理字符串abab?

停止:表示字符串无法完全处理,因此不能将此路径中的字符串视为已接受的字符串

字符串abab可以在两个方向上完全处理,因此δ*(q1,w)= {q1,q3}.

δ*(q1,w)与最终状态集的交集为{q3}:

{q1,q3} ∩ F 
             ==>  {q1,q3} ∩ {q3}     
             ==>  {q3}  ≠  ∅

这样,字符串ababa就是语言L(nfa).

示例2:来自Σ*的字符串是abba,以下是如何处理:

--►(q1)---a---►(q1)---b---►(q1)---b---►(q1)---a---►(q1)
     \                                   \ 
      a                                   a  
       \                                   \
        ▼                                   ▼
       (q2)                                (q2)
        |                      
        b                      
        |                      
        ▼                                 
       (q3)                   
        |
        b
        |
       halt

对于字符串abba,可达状态的集合是δ*(q1,q2}并且在该集合中没有状态是最终状态,这意味着=>它与F的交集是一个空集,因此字符串abba不是一个可接受的字符串(而不是语言).

这是我们在非确定性有限自动机中处理字符串的方式.

一些额外的重要说明:

>在有限自动机的情况下,确定性和非确定性模型同样有能力.非确定性模型没有额外的定义语言的能力.
因此,NFA和DFA的范围与常规语言相同. (这不是所有类自动化的例子,例如PDA的范围!= NPDA)
>非确定性模型对于理论目的更有用,相对论文来说是有用的.鉴于实现目的,我们总是希望确定性模型(为效率最小化).幸运的是,在有限autoMeta类中,每个非确定性模型都可以转换为等效的确定性模型.我们有算法方法到convert an NFA into DFA.
>由DFA中的单个状态表示的信息可以由NFA状态的组合表示,因此NFA中的状态数小于其等效DFA. (证据可用numberOfStates(DFA)< = 2 power numberOfStates(NFA),因为所有设置组合都是powerset)
以上常规语言的DFA如下:

使用此DFA,您将总是找到从Σ*中的任何字符串的初始状态到最终状态的唯一路径,而不是设置,您将获得单个可达到的最终状态,如果该状态属于最终设置,则输入字符串被称为被接受的字符串(用语言)否则不被/

(你的表达.* ab和(a b)* ab通常在我们不使用的理论科学中相同.点运算符,然后连接)

正则表达式 – 转换中的歧义:如何在NFA中处理字符串?的更多相关文章

  1. HTML5数字输入仅接受整数的实现代码

    这篇文章主要介绍了HTML5数字输入仅接受整数的实现代码,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下

  2. ios – 使用大写符号在字符串swift中获取URL的正则表达式

    我尝试在文本中获取URL.所以,在此之前,我使用了这样一个表达式:但是当用户输入带有大写符号的URL时(例如Http://Google.com,它与它不匹配)我遇到了问题.我试过了:但什么都没发生.解决方法您可以使用正则表达式中的i内联标志关闭区分大小写,有关可用正则表达式功能的详细信息,请参阅FoundationFrameworkReference.(?ismwx-ismwx)Flagsetti

  3. ios – 如何在Swift 3中使用正则表达式?

    解决方法我相信.当没有其他选项适用时,将使用.allZeros.因此,使用Swift3,您可以传递一个空的选项列表或省略options参数,因为它默认为无选项:要么请注意,在Swift3中,您不再使用error参数.它现在抛出.

  4. ios – lldb断点在类目标c中的所有方法

    如何使用lldb在ObjectiveC类中的所有方法上自动设置断点?

  5. swift的正则表达式(NSRegularExpression)

    init(_pattern:String){varerror:NSError?

  6. swift 正则表达式运用实例选自《swifter 100个swift开发必备tip 》

  7. swift算法实践4)-trie自动机

    1、trie自动机是识别字符串的确定性有向无环自动机2、图示3、构造代码F包括了状态q所对应的P中的字符串

  8. swift手记-trie自动机

    1、trie自动机是识别字符串的确定性有向无环自动机2、图示3、构造代码F包括了状态q所对应的P中的字符串

  9. Swift截取HTML中的所有图片url

    在Swift中,要从HTML格式的String中截取出所有的img的所有图片url,要截取的url就要匹配url,需要用到正则表达式。

  10. 收藏swift正则表达式的各种验证

    1.验证邮箱classfuncvalidateEmail(email:String)->Bool{varemailString="[A-Z0-9a-z._%-]@[A-Za-z0-9.-]\\.[A-Za-z]{2,4}"varemailPredicate=nspredicate(format:"SELFMATCHES%@",emailString)returnemailPredicate.eva

随机推荐

  1. 法国电话号码的正则表达式

    我正在尝试实施一个正则表达式,允许我检查一个号码是否是一个有效的法国电话号码.一定是这样的:要么:这是我实施的但是错了……

  2. 正则表达式 – perl分裂奇怪的行为

    PSperl是5.18.0问题是量词*允许零空间,你必须使用,这意味着1或更多.请注意,F和O之间的空间正好为零.

  3. 正则表达式 – 正则表达式大于和小于

    我想匹配以下任何一个字符:或=或=.这个似乎不起作用:[/]试试这个:它匹配可选地后跟=,或者只是=自身.

  4. 如何使用正则表达式用空格替换字符之间的短划线

    我想用正则表达式替换出现在带空格的字母之间的短划线.例如,用abcd替换ab-cd以下匹配字符–字符序列,但也替换字符[即ab-cd导致d,而不是abcd,因为我希望]我如何适应以上只能取代–部分?

  5. 正则表达式 – /bb | [^ b] {2} /它是如何工作的?

    有人可以解释一下吗?我在t-shirt上看到了这个:它似乎在说:“成为或不成为”怎么样?我好像没找到’e’?

  6. 正则表达式 – 在Scala中验证电子邮件一行

    在我的代码中添加简单的电子邮件验证,我创建了以下函数:这将传递像bob@testmymail.com这样的电子邮件和bobtestmymail.com之类的失败邮件,但是带有空格字符的邮件会漏掉,就像bob@testmymail也会返回true.我可能在这里很傻……当我测试你的正则表达式并且它正在捕捉简单的电子邮件时,我检查了你的代码并看到你正在使用findFirstIn.我相信这是你的问题.findFirstIn将跳转所有空格,直到它匹配字符串中任何位置的某个序列.我相信在你的情况下,最好使用unapp

  7. 正则表达式对小字符串的暴力

    在测试小字符串时,使用正则表达式会带来性能上的好处,还是会强制它们更快?不会通过检查给定字符串的字符是否在指定范围内比使用正则表达式更快来强制它们吗?

  8. 正则表达式 – 为什么`stoutest`不是有效的正则表达式?

    isthedelimiter,thenthematch-only-onceruleof?PATTERN?

  9. 正则表达式 – 替换..与.在R

    我怎样才能替换..我尝试过类似的东西:但它并不像我希望的那样有效.尝试添加fixed=T.

  10. 正则表达式 – 如何在字符串中的特定位置添加字符?

    我正在使用记事本,并希望使用正则表达式替换在字符串中的特定位置插入一个字符.例如,在每行的第6位插入一个逗号是什么意思?如果要在第六个字符后添加字符,请使用搜索和更换从技术上讲,这将用MatchGroup1替换每行的前6个字符,后跟逗号.

返回
顶部