如何不使用NFA从正则表达式创建DFA?


12

目标是从正则表达式创建DFA,并且不能使用“ Regular exp> NFA> DFA转换”。应该怎么做呢?

我向我们的教授问了这个问题,但他告诉我,我们可以使用直觉,并拒绝提供任何解释。所以我想问你。

不能选择“正则表达式> NFA> DFA转换”,因为这样的转换要花费大量时间来转换一个相当复杂的正则表达式。例如,对于某个正则表达式,“ regex> NFA> DFA”对于人类来说要花费1个小时。我需要在不到30分钟的时间内将正则表达式转换为DFA。


2
您需要提供更多上下文。您当前使用什么(非正式)算法来翻译正则表达式?用诸如此类的示例来说明您的过程可能会有所帮助a(a|ab|ac)*a+。您可以将其直接转换为要简化为DFA的NDFA,也可以将其标准化为立即映射到DFA的内容。
阿蒙(Amon)

您是否必须通过特定方法在特定示例上执行此操作,还是必须提供一般步骤以供计算机应用?
2015年

Answers:


18

由于您希望“在不到30分钟的时间内将正则表达式转换为DFA”,我想您正在手工研究相对较小的示例。

在这种情况下,您可以使用Brzozowski的算法 ,该算法直接计算语言的Nerode自动机(已知等于其最小确定性自动机)。它基于导数的直接计算,并且还适用于允许相交和补码的扩展正则表达式。该算法的缺点是需要检查沿途计算的表达式的等价性,这是一个昂贵的过程。但是在实践中,对于一些小例子,它非常有效。[1]

左商。令A 的语言,令u为一个词。然后 ü - 1大号= { v * | ü v 大号} 语言ù - 1大号称为左商(或左衍生物)的大号LAu

u1L={vAuvL}
u1LL

Nerode自动机。所述Nerode自动机是确定性自动大号= Q 大号˚F 其中Q = { Ü - 1大号| Ü * }˚F = { Ü - 1大号| Ü 大号}和过渡函数被定义,对于每个LA(L)=(Q,A,,L,F)Q={u1LuA}F={u1LuL},由式 û - 1大号一个= 一个- 1Ü - 1大号= Ú - 1大号 当心这个相当抽象的定义。A的每个状态都是 L乘以一个单词的左商,因此是 A 的语言。初始状态是语言大号,和一组最终状态的是集所有剩下商的大号由一个字大号aA

(u1L)a=a1(u1L)=(ua)1L
ALALLL

a,b

a11=0a1b={1if a=b0if aba1(L1L2)=a1L1u1L2,a1(L1L2)=a1L1u1L2,a1(L1L2)=a1L1u1L2,a1L=(a1L)L
a1(L1L2)={(a1L1)L2si 1L1,(a1L1)L2a1L2si 1L1

L=(a(ab))(ba)

11L=L=L1a1L1=(ab)(a(ab))=L2b1L1=a(ba)=L3a1L2=b(ab)(a(ab))(ab)(a(ab))=bL2L2=L4b1L2=a1L3=(ba)=L5b1L3=a1L4=a1(bL2L2)=a1L2=L4b1L4=b1(bL2L2)=L2b1L2=L2a1L5=b1L5=a(ba)=L3
最小自动机

[1]

编辑。(2015年4月5日),我刚刚发现了一个类似的问题:存在什么算法可用于构建可识别给定正则表达式描述的语言的DFA?被问到cstheory。答案部分解决了复杂性问题。


您能否进一步说明该算法的复杂性?
2015年

@babou将RE转换为DFA是PSPACE困难的,因此绝对是指数级的。
jmite

这可能应该进入答案。OP从“通过NFA进行标准构建的速度太慢”开始,部分答案似乎是“运气不好,没有真正的快速解决方案”。有待讨论的是,这是否比标准结构更好。(cc @jmite)
拉斐尔

@jmite是的,我期望如此。我提出这个问题的原因是,为什么应该以这种方式简化DFA的构建。(注意:系统花了整整一天的时间将@ jmite的答案通知我)。
2015年

2

J.-E. Pin在形式和完整性方面提供了更好的答案,但是我认为您的教授所暗示的“直觉”要说些什么。

在大多数情况下,最简单的方法是查看正则表达式,了解其接受的语言,然后利用自己的创造力/聪明才智来构建接受该语言的DFA。

除了其他人给出的算法外,没有简单的方法可以做到这一点,但是这里有一些准则可能被证明是有用的。

  1. 问问自己,我是否可以编写仅使用布尔值或很小的整数变量来接受此RE的程序?然后编写该程序,并将其转换为DFA,其中每个值组合都有一个状态。

  2. 查找正则表达式中您确定可以接受的部分,即“如果我看到此内容,那么我必须匹配RE的这一部分。” 不一定总会有很多,但是识别这些零件可以显示易于制作DFA的零件,因此您可以在真正需要不确定性的零件上花费更多时间。

  3. NFA-> DFA的子集构造实际上并不复杂。因此,如果这是一项作业,而不是考试题,则只需编写实施代码,然后让您的程序将NFA转换为DFA可能会更快。如果您使用自己的代码,那么应该不会出现抄袭问题。

P=NP=PSPACE

当您可以在算法需要很多步骤但结果显而易见的地方使用直觉时,请尝试“向前看”。


-2

虽然这不是正确的方法,但是它大多数时候都有效。

第一步:找到正则表达式可以接受的最小字符串。 第二步:使用最小字符串接受机的事务绘制必要的状态。 第三步:为所有州绘制剩余的字母交易记录。

例如:正则表达式(0 + 1)* 1“以1结尾的字符串”步骤1:最小字符串:1步骤2:两种状态Q0和Q1。从Q0到Q1的交易量为1。Q1为接受状态。步骤3:对于Q0状态,Q0 1事务处理到Q1。现在在Q0本身进行0笔交易。对于Q1状态Q1 1交易将保留在Q1中。并且0交易将在Q0中进行。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.