将超大型NFA转换为DFA的算法


12

我有非常大的非确定性有限自动机,我需要将其转换为DFA。

我的意思是说40 000多个州。到目前为止,我已经做了一些实验和编程的默认算法,通过表检索(如描述在这里),但即使是优化后速度很慢,非常消耗内存。我知道一个事实,州的数量可以成倍增长,但是在最小化之后,最终的DFA有大约9000个州,这是可以接受的。

所以我的问题是,是否有某种算法会更快或更友好的存储?


视频显然在标准确定算法上。参见例如NFA最小化而无需确定,stackoverflow
vzn

如果您进行了幼稚的NFA-> DFA转换(使用产品结构),那么生成的DFA有多大?(在最小化之前)
DW

2
您想对DFA做什么?如果您对包含检查感兴趣,可以使用一些算法直接进行。
Vijay D

感谢您的快速答复。对于大小,由于我的RAM用完了,所以我无法确切知道,但是我会给它仔细看看,而不是扩展问题。对于我想做的事情,我不确定是否可以公开讨论,因为这是我坚定的专业知识。但我可以肯定地说,我实际上需要生成的DFA。
詹达斯

1
您是否尝试过运行Angluin算法从成员资格和对等查询中学习DFA?成员资格部分很简单(只需在必需的字符串上运行DFA);为了等效,您可以绘制许多随机字符串,也可以尝试所有达到特定长度的字符串。这只是一种启发,因为您永远不会真正知道何时完成,但是我发现该技巧在实践中效果很好……
Aryeh 2013年

Answers:


6

您是否尝试过Brzozowski的算法?在最坏的情况下,运行时间是指数级的,但是我看到一些参考文献表明它通常表现非常好,尤其是从要转换为DFA并最小化的NFA开始时。

以下文件似乎相关:

它评估了DFA最小化的许多不同算法,包括将它们应用于您以NFA开头并希望将其转换为DFA并将其最小化的情况。

NFA的强连接组件(SCC)分解(将其视为有向图)是什么样的?它是否有许多组件,而所有组件都没有太大?如果是这样,我想知道是否有可能设计一种分而治之的算法,在该算法中,您可以使用单个组件,将其从NFA转换为DFA,然后将其最小化,然后将其替换为新的确定版本。对于单入口组件(在该组件中的所有边均通向单个顶点,即入口顶点),这应该是可能的。我没有立即看到是否可以对任意NFA进行这样的操作,但是如果您检查SCC的结构是什么样,那么您也许能够确定这种方向是否值得探索。


Brzozowski的算法似乎很有希望,但是分而治之的技术甚至更多!就我而言,这确实很容易做到,不需要大的代码更改。我会这样做,如果可行,我会接受你的回答。
詹达斯

2
我来了,问了一下,我分开了,我征服了
Jendas

2

从“确定为DFA /最小化DFA”的原始/长期策略之外,就已知/可用算法而言,这显然不是一个经过充分研究的问题。您似乎表明确定步骤是有问题的步骤,但这当然很典型,因为它具有指数空间/时间更糟的情况。请注意,有几种DFA最小化算法,它们的平均性能差异可能很大。

也被非正式地称为“没有确定性的最小化NFA”。从某种意义上讲,除非本文中显示P = Pspace,否则根本就没有近似算法,这是很难理解的:

但是,本文确实考虑了一些算法的通常很少探索的情况,这些情况并非基于找到确定的DFA 1 st

我们提出了减少不确定性自动机中状态和转换数量的不同技术。这些技术基于状态集的两个预排序,与包含左,右语言有关。由于它们的精确计算是NP难的,因此我们将重点放在多项式逼近上,这使得NFA都可以减小。

请注意,AT&T FSM库是一个公开可用的程序包/实现,可以一般地尽可能高效地处理大型NFA / DFA转换/最小化等。

它有一个fsmcompact有时可以满足的策略:

在无法确定换能器或加权受体或其体积变得很大的情况下,可以使用其他优化方法 fsmcompact。此操作将输入标签,输出标签和成本的每个三元编码为一个新标签,执行经典(未加权受体)确定和最小化,然后将编码后的标签解码回其原始值。这样做的好处是,始终对其进行定义,并且不会沿路径移动输出标签或成本。缺点是结果既不能是确定性的,也不能是最小的。


另请参见关于NFA减少 Ilie,Navarro,Yu
vzn
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.