【问题标题】:Complexity of an NFANFA 的复杂性
【发布时间】:2016-08-03 23:28:25
【问题描述】:

我在几个来源(例如12 - 第 160 页)中看到,通过 NFA 运行的复杂度为 O(m²n)。但是我不明白为什么会这样。

我的直觉是复杂度应该是O(m^n)(其中m是字符串的长度,n是状态数),因为对于输入字符串中的每个字母,都有n个可能的状态NFA 可以转移到他们那里。

谁能给我解释一下?

谢谢。

【问题讨论】:

  • 您必须遵循所有可能的路径才能获得最终状态读取Ambiguity in transition: How to process string in NFA?
  • @Grijesh Chauhan 感谢您的评论,但我仍然不明白为什么它必须是 O(m²n)... 我将编辑我的主要问题,并提供更多关于我的直觉的解释.

标签: time-complexity big-o nfa


【解决方案1】:

让我们考虑一下如何进行模拟 NFA 的一步。我们从一组活跃状态 Qinit 开始。对于我们所处的每个状态,我们查看所有用当前符号标记的传出转换,然后将它们收集到一个集合 Qmid 中。接下来,我们跟踪来自这些状态的所有可能的 ε-转移,并不断重复这个过程,直到没有更多的 ε-转移可以遵循(即,我们找到了 ε-闭包),从而为我们提供了一组新的状态 Q下一个。然后,我们对输入中的每个字符重复此过程一次。

那么这需要多少时间?好吧,输入字符串中有 m 个字符,所以运行时间是我们对单个字符所做的任何工作的 m 倍。每个状态最多可以有 n 次转换将其留在每个字符上,因此遍历 Qinit 中的所有字符以找到集合 Qmid 的时间为 O(n 2):Qinit 中有 O(n) 个状态,我们只需要扫描每个状态的 O(n) 个转换。从那里开始,我们必须继续遵循 ε 转换,直到我们用完要遵循的转换。我们可以通过从 Qmin 中的每个状态同时开始并且仅遵循 ε 转换来执行 BFS 或 DFS 来做到这一点。 NFA 最多可以有 O(n2) 个 ε 转换(每对状态之间一个),因此 BFS 或 DFS 将在 O(n2)。总的来说,我们为每个字符做 O(n2) 个工作,所以完成的总工作是 O(mn2)。

【讨论】:

  • 你提到迭代所有字符的时间是 O(n^2) 并且 NFA 最多可以有 O(n^2) 个 epsilon 转换。这是否意味着您将 O(m(n^2 + n^2)) 减少到 O(mn^2)?
猜你喜欢
  • 2011-06-02
  • 1970-01-01
  • 2012-10-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多