关于最小化DFA的算法的性能已经写了很多。这令我的谷歌感到沮丧,因为那不是我想要的。
我们能否就非最小DFA的性能特征做一般说法?我的直觉是,相对于输入的长度,非最小DFA的运行时间仍然是O(n)。似乎最小化只会影响状态的数量,从而影响存储要求。这是对的吗?
如果我们了解DFA的衍生结构,我们能否对这些概括进行细化?例如,假设NFA完全是通过将连接,并集和Kleene星运算应用于与一个输入符号或epsilon匹配的原始自动机来构造的。由于无法移除过渡或创建任意过渡,我认为不可能有任何死亡状态。关于由这些NFA构建的DFA,我们可以做出哪些概括?我对理论和实证答案感兴趣。
答案 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 :(得分:0)
输入接受的“运行时”的原因是相同的,因为通常会消耗输入的一个字符;在DFA的上下文中,我从未听过“运行时”(在渐近运行时复杂度的意义上)的概念。最小化旨在最小化DFA的状态数量(即,优化“实施规模”)。