【发布时间】:2011-02-14 08:10:41
【问题描述】:
我正在开发一个将非确定性有限状态自动机 (NFA) 转换为确定性有限状态自动机 (DFA) 的程序。为此,我必须计算 NFA 中每个具有 epsilon 转换的状态的 epsilon 闭包。我已经想出了一种方法来做到这一点,但我总是认为我首先想到的通常是做某事效率最低的方法。
以下是我如何计算简单 epsilon 闭包的示例:
转换函数的输入字符串:格式为startState,symbol = endState
EPS 是一个 epsilon 转换
1,每股收益 = 2
导致新状态 { 12 }
现在显然这是一个非常简单的例子。我需要能够从任意数量的状态计算任意数量的 epsilon 转换。为此,我的解决方案是一个递归函数,它通过查看它有一个 epsilon 转换到的状态来计算给定状态的 epsilon 闭包。如果该状态具有(一个)epsilon 转换,则在 for 循环中递归调用该函数,以获取尽可能多的 epsilon 转换。这将完成工作,但可能不是最快的方法。所以我的问题是:在 Java 中计算 epsilon 闭包的最快方法是什么?
【问题讨论】:
-
澄清一下:Epsilon-NFA N 的 epsilon 闭包只是一个没有 epsilon 转换的 NFA?
-
@tkr 一个 epsilon 闭包不适用于 NFA。它应用于具有 1 个或多个 epsilon 转换到其他状态的状态,并返回单个状态。它用于在转换为 DFA 时摆脱 epsilon 转换,因为 DFA 不能有 epsilon 转换。
-
@Darkhydro,您不能只是将所有 epsilon 可达状态折叠在一起。考虑 s1--a-->s2, s1--b-->s3, s2--eps->s3, s2--c-->s4,开始状态 s1,接受状态 s4。如果您将 s2 和 s3 折叠成一个状态,则您接受字符串 bc,而原始 NDFA 不接受该字符串。
-
@Peter 我明白你的意思。我正在调查这个。
-
@Peter 实际上它不会接受 b。状态 1 仍将在输入 b 上转换为 3,而不是 23。创建状态 23 不会擦除状态 3。
标签: java optimization finite-automata