非最小DFA的性能特征

时间:2015-01-13 19:51:28

标签: finite-automata automata dfa

关于最小化DFA的算法的性能已经写了很多。这令我的谷歌感到沮丧,因为那不是我想要的。

我们能否就非最小DFA的性能特征做一般说法?我的直觉是,相对于输入的长度,非最小DFA的运行时间仍然是O(n)。似乎最小化只会影响状态的数量,从而影响存储要求。这是对的吗?

如果我们了解DFA的衍生结构,我们能否对这些概括进行细化?例如,假设NFA完全是通过将连接,并集和Kleene星运算应用于与一个输入符号或epsilon匹配的原始自动机来构造的。由于无法移除过渡或创建任意过渡,我认为不可能有任何死亡状态。关于由这些NFA构建的DFA,我们可以做出哪些概括?我对理论和实证答案感兴趣。

2 个答案:

答案 0 :(得分:1)

关于第一个问题,关于非最佳DFA的运行时。从理论上讲,你应该仍然在O(n)中运行的直觉是正确的。但是,想象(作为示例)Kleene-Star运算符的以下伪代码:

// given that the kleene-star operator starts at i=something
while string[i] == 'r':
    accepting = true;
    i++;
while string[i] == 'r':
    accepting = true;
    i++;
// here the testing of the input string can continue for i+1

如您所见,前两个while循环是相同的,可以理解为冗余状态。但是,循环中的“拆分”会降低(除其他外)分支预测精度,从而降低整体运行时间(有关更多详细信息,请参阅Mysticial对分支预测的精彩解释here

许多其他类似的“实际”论证可以说明为什么非最佳DFA会变慢;其中,正如你所提到的,更高的内存使用率(在许多情况下,更多的内存意味着更慢,对于内存来说 - 相比之下 - 计算机的较慢部分);更多“ifs”,对于每个附加状态,需要对其后继者进行输入检查;可能更多的循环(如示例中所示),这将使算法不仅在分支预测的基础上变慢,而且仅仅因为某些编程语言在循环上非常慢。

关于你的第二个问题 - 在这里我不确定你的意思。毕竟,如果你正确地进行转换,你应该首先得到一个非常理想的DFA。

编辑: 在讨论中提出了这样的想法:可以存在若干非最小DFA,其由一个NFA构建,其具有不同的效率(在所选择的任何度量中),而不是在实现中,而是在DFA的结构中。 这是不可能的,因为只有一个最佳DFA。这是对此的证明大纲:

  1. 假设我们创建和最小化DFA的程序是最佳的。
  2. 在应用程序时,我们将首先构建DFA。在这一步中,我们可以无限制地创建许多等效状态。这些状态都以某种方式连接到NFA的图形。
  3. 在下一步中,我们消除所有不可达状态。这对于性能无动于衷,因为无法访问的状态将对应于“死代码” - 永远不会被执行。
  4. 在第四步中,我们通过对等效状态进行分组来最小化DFA。这就是它变得有趣的地方 - 因为我们可以通过不同的方式实现这一目标,从而产生具有不同性能的不同DFA。但是,我们唯一的“选择”是将状态分配给不同的组。 因此,为了论证,我们假设我们可以做到这一点。 但是,通过最小化算法背后的思想,我们只能对等效状态进行分组。因此,如果我们有不同的分组特定状态的选择,通过等价的传递性,不仅状态将等同于两个组,而且组也将是等同的。因此,如果我们可以进行不同的分组,那么算法将不是最优的,因为它会将组中的所有状态分组到一个组中。 因此,可能存在不同最小化的假设必定是错误的。

答案 1 :(得分:0)

输入接受的“运行时”的原因是相同的,因为通常会消耗输入的一个字符;在DFA的上下文中,我从未听过“运行时”(在渐近运行时复杂度的意义上)的概念。最小化旨在最小化DFA的状态数量(即,优化“实施规模”)。