是否有可以有效匹配正则表达式的“小型”机器?


30

众所周知,正则表达式可以通过大小不确定的有限自动机来识别,该自动机的大小与正则表达式成正比,也可以通过确定性FA来识别,该FA可能成倍增大。此外,在给定字符串和正则表达式,NFA可以及时测试与成比例的隶属关系。,并且DFA可以及时测试与成正比的成员资格 。NFA减速的原因是,我们基本上需要跟踪自动机可能处于的可能状态集,而DFA的指数级爆炸则源于以下事实,即DFA的状态是状态机的幂集。 NFA。s[R|s||[R||s|

如果我们允许使用功能更强大的机器,是否有可能有效地(即,时间要比,而空间要比)比有限自动机?(例如,使用下推式自动机或计数器机器识别常规语言是否具有简洁性?)Ø|[R||s|Ø2|[R|


2
当您说“ NFA可以按与成比例的时间测试成员资格”时,是指以明显方式模拟NFA的(确定性)RAM机器要花费这么多时间吗?还是有其他方法可以定义“ NFA的运行时间”而不引用其他计算模型?(除了明智但不是非常有用的定义,该定义说字符串的任何NFA的运行时都是。)s | s ||s||[R|s|s|
Radu GRIGore 2010年

是的,这是对我的问题的正确解释。
Neel Krishnaswami 2010年

2
然后,在我看来更自然简单地想问:有没有确定的算法(一RAM的机器上),如果一个字符串是由正则表达式定义的语言,在作品时间和空间?(特别是如果您还根据RAM机器定义下推自动机的运行时。)r o | s || r |o 2 | r |s[Ro|s||[R|o2|[R|
Radu GRIGore 2010年

1
我不太了解这个问题。输入的内容是否为字符串s和正则表达式r,问题在于确定s是否为正则表达式r定义的语言?
罗宾·科塔里

@Robin:是的,就是这样。我想知道您是否可以通过使用更多的计算能力来比有限自动机更有效地匹配正则表达式,或者其他功能(例如堆栈,RAM)是否无济于事。
Neel Krishnaswami 2010年

Answers:


20

轻而易举地就时间来换取空间,如下所示。

将正则表达式转换为NFA -为了具体化比较算法,我们假设是NFA状态的数量,因此您直接模拟NFA的O r s 时限是有效的,而O 2 r在您可以处理那么多内存的RAM中工作时,用于运行转换后的DFA的空间也将有效。[RØ[RsØ2[R

现在,分区NFA(任意地)的状态到子集š 至多- [R / ķ 指出每个。内每个子集š ,我们可以索引子集小号用数字从02 - [R / ķ - 1ķ小号一世[R/ķ小号一世一种一世小号一世02[R/ķ-1个

建一个表,其中ij的范围是0到k - 1c是输入符号,A iS i的子集(的数字索引)。表中存储的值是S j的子集(的数字索引):当且仅当状态yT [ i j c A i ]中Ť[一世ĴC一种一世]一世Ĵķ-1个C一种一世小号一世小号ĴÿŤ[一世ĴC一种一世]属于 S j,并且在 A i中存在一个状态,该状态在输入符号 c上转换为 yÿ小号Ĵ一种一世ÿC

为了模拟NFA,请维护索引,每个S i对应一个索引,指定输入中某些前缀可以到达的S i中状态的子集A i。对于每个输入符号c,使用表查找每对i j,可以通过在c上进行转换从A i中的状态到达S j中的状态集,然后使用按位二进制或对这些状态集的数值索引进行运算,以将它们组合为S j的单个状态子集ķ小号一世一种一世小号一世C一世Ĵ小号Ĵ一种一世C小号Ĵ。因此,模拟的每个步骤都需要时间,而模拟的总时间为O s k 2Øķ2Øsķ2

所需空间是所有表的空间,即。时间和空间分析在可以寻址这么多内存的RAM上有效,并且可以对足够大以寻址该内存的字进行二进制运算。Øķ22[R/ķ

由于对的二次依赖,因此您从中获得的时空折衷与NFA模拟并不完全匹配。但是然后,我怀疑O r s 是NFA模拟的正确时限:您如何模拟NFA的单个步骤,而不是查看当前所允许的所有(可能是二次方的)所有转换活动状态到另一个状态?不是O r 2 s 吗?ķØ[RsØ[R2s

在任何情况下,通过使变化,您都可以在DFA和NFA边界之间获得连续的时间范围,而其空间小于DFA。ķ


我认为您的更正是正确的,并且您的回答确实回答了我的提问。但是,我想问的问题是额外的计算能力有多少帮助。(例如,用一个计数器,你可以匹配的字符串在O(1)空间。)如果你不介意的话,我会离开的问题打开了一小会儿再看看是否有人知道这个问题的答案。 ...一种ķ
Neel Krishnaswami

@Neel:如果 David的解决方案是RAM机器可以做的最好的选择,那么堆栈,计数器等将无济于事。(但是,当然,他只给出了上限,而不是下限。)
Radu GRIGore 2010年

1
据我所知,我的解决方案确实使用了“附加功能”:它基于表查找和整数索引,而DFA或NFA模型中没有此功能。因此,我真的不明白它没有回答问题的那一部分。
David Eppstein 2010年

这是参数化此方法的另一种方法。假设我们有一个内存的机器上用字的宽度,其中w ^ LG [R 。然后,NFA模拟占用O s r 2时间和O r / w 空间。该DFA模拟是不可能的,如果[R w ^(没有足够的可用空间)。在此答案集施工ķ 听,说:- [R /瓦特并采取ø 小号- [R 2 / 瓦特2wwlg[RØs[R2Ø[R/w[Rwķ[R/w时间并使用所有可用空间(即 2 w空间附近的空间)。它基本上是利用RAM机器中可用的位并行机制来更快地进行NFA仿真。Øs[R2/w22w
DW

4

这不是答案,但是评论太久。我试图解释为什么这个问题可能很难理解。

有两种方法可以定义设备X的计算复杂度。

第一种也是最自然的方法是内在的。我们需要说一下设备X如何使用输入,以便我们以后可以看一下输入的大小n如何影响设备的运行时间。还需要说什么才算是一项操作(或步骤)。然后,我们仅让设备在输入和计数操作上运行。

第二个是外在的。我们为另一个设备Y定义了计算复杂度,然后对Y进行编程以充当X的模拟器。由于Y可能有多种模拟X的方法,因此我们需要补充一点,我们应该使用最佳方法。让我说同样的与其他词:我们说X需要时间大小的输入ñ如果存在的模拟器X上机实现Ÿ这需要˚F ñ 时间。ØFñFñ

例如,NFA的一个内在定义说,处理一个长度为n的字符串需要n个步骤;使用RAM机器作为设备Y的外部定义表示,最著名的上限可能是David Eppstein回答的。(否则,奇怪的是(1)另一个答案中指出的最佳实践实现没有使用更好的替代方法,并且(2)这里没有人指出更好的替代方法。)还请注意,严格来讲,设备X是正则表达式,但由于NFA具有相同的尺寸,因此可以安全地将其当作您正在查看的设备X使用

现在,当您使用第二种定义时,问限制设备X的功能如何影响运行时间几乎没有道理。但是,问一下设备Y的功能限制如何影响运行时间确实有意义。显然,允许使用功能更强大的机器Y可以使我们更快地模拟X。所以,如果我们假设可以实现最强大的机器之一(这排除了不确定性的机器,例如),并拿出一个下界,那么我们就知道没有那么强大的机器能做到更好。ΩFñ

因此,从某种意义上说,您可能希望的最佳答案是像细胞探针模型这样的证据,它模拟NFA需要一定的时间。(请注意,如果您考虑将NFA转换为DFA,则需要时间来记下大DFA,因此内存不是唯一的问题。)


4

即使您认为正则表达式匹配没有新的或旧的知识,请查看我很长时间以来遇到的最精美的论文之一:S Fischer,F Huch和T 对正则表达式的研究威尔克,ICFP 2010。

(MMT Chakravarty值得推荐本文。)

编辑:本文之所以有意义,是因为它描述了一种新技术(基于60年代的Glushkov's),它避免了构建与RE相对应的完整NFA(更不用说DFA)了。相反,所执行的操作类似于运行类似于众所周知的标记算法的算法,用于确定NFA在RE的语法树上是否接受单词。性能评估表明,即使使用Google最近发布的re2库,这也具有竞争力。


好看的纸!!
张显之张显之2011年

1

看看Russ Cox的这篇文章。它描述了一种基于NFA的方法,该方法首先由Ken Thompson使用,通过该方法,输入字符串s可以在时间O(| s | 。c)和空间O(| r | 。d)上与正则表达式r匹配,其中cd是上限常数。本文还详细介绍了该技术的C实现。


2
我不认为这是对本文的准确描述。它似乎是根据需要从NFA构建DFA并缓存结果。但是缓存的大小在r中可能是指数的。
David Eppstein 2010年
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.