【问题标题】:DFA to regular expression time complexityDFA到正则表达式时间复杂度
【发布时间】:2013-04-19 00:20:13
【问题描述】:

我正在查看将 DFA 转换为正则表达式的时间复杂度分析 Ullman 等人的“自动机理论、语言和计算简介”,第 2 版,第 151 页。此方法有时称为transitive closure method。我不明白他们是如何在 O((n^3)*(4^n)) 时间复杂度中得出 4^n 表达式的。

我知道 4^n 表达式关于空间复杂度是成立的,但是,关于时间复杂度,我们似乎在每次迭代中只对每对状态执行四个恒定时间操作,使用之前迭代的结果。我到底错过了什么?

【问题讨论】:

  • 他们没有在书中给出理由吗?
  • 他们可能在(合理的)假设下运行,即您无法在 n 时间内创建大小为 n 的对象。如果输出可能需要 4^n 空间,那么他们可能会争辩说创建它至少需要 4^n 时间。
  • @templatetypedef 也许,但我目前不这么认为。在每对状态的每次迭代中,该算法仅采用在先前迭代中计算的四个正则表达式并将它们连接成一个更大的正则表达式;不涉及重新计算,然后可以用 4^n 严重过度近似。
  • @FrankieTheKneeMan 不是;很模糊。

标签: regex algorithm time-complexity automata


【解决方案1】:

这是对未使用正确数据结构的算法复杂性的粗略限制。除了作者显然不想在这里优化之外,我认为没有什么要解释的,可能是因为他们的主要观点是正则表达式至少与 DFA 一样具有表达力,并且因为他们认为优化这个指数毫无意义-时间算法。

有三个嵌套循环,每个循环 n 次;在外循环的迭代 k 期间构造的正则表达式归纳地具有 O(4^k) 的大小,因为它们是由最多四个在前一次迭代期间构造的正则表达式构造的。如果算法复制了这些子表达式,并且我们高估了所有迭代的正则表达式大小限制在 O(4^n),那么我们得到 O(n^3 4^n)。

显然我们可以做得更好。在不消除复制的情况下,我们可以通过适当地限制几何和得到 O(sum_{k=1}^n n^2 4^k) = O(n^2 (n + 4^n))。此外,正如您所指出的,我们根本不需要复制,除非最后我们同意 templatetypedef 输出必须完全写出,运行时间为 O(n^3) 来准备正则表达式和 O(4^n) 写出来。这个版本的空间复杂度等于时间复杂度。

【讨论】:

  • 当您说“优化无意义”时,您的意思是说优化没有意义,因为它很简单吗?
  • @bellpeace 更像是,在现实世界中,一个指数大小的正则表达式会做什么?关于表现力的定理同样不正确,因为运行时间很差。
  • 我理解关于表现力的定理,但我不同意你的观点,即他们在该特定部分的目标是强调等表现力。算法复杂性分析与算法本身(3.2.1)完全不同的部分(4.3.1)。这尤其令人困惑,因为在复杂性分析部分他们分析了其他算法并描述了它们的优化改进。
  • @bellpeace 好吧,我真的不能代表他们说话。优化 DFA 的转化是非常值得的。优化转换不是。
【解决方案2】:

我想你的疑问是关于 n3 时间复杂度。

让我们假设 Rijk 表示从状态 qi 转换自动机的所有字符串的集合qj 不经过任何高于 qk 的状态。

那么Rijk的迭代公式如下所示,

Rijk = Rikk-1 (Rkkk-1)* Rkjk-1 + Rijk-1.

这种技术类似于全对最短路径问题。唯一的区别是我们采用正则表达式的并集和连接,而不是对距离求和。所有对最短路径问题的时间复杂度为 n3。因此,我们可以预期 DFARegular Expression 的转换也具有相同的复杂性。同样的方法也可用于将NFAε-NFA 转换为对应的正则表达式。

transitive closure approach 的主要问题是它创建了非常大的正则表达式。如此大的长度是由于连接项的重复联合造成的。

【讨论】:

  • 如开篇所述,我不理解 4^n 表达式。正如您所解释的那样,我理解 n^3 表达式,但我不明白他们是如何在每次迭代中为每对得出 4^n 的,因为该公式编码了恒定数量的恒定时间操作。
猜你喜欢
  • 2014-03-18
  • 2015-12-21
  • 2017-02-09
  • 2021-07-08
  • 1970-01-01
  • 1970-01-01
  • 2018-04-16
  • 2019-04-30
  • 2019-07-08
相关资源
最近更新 更多