问题描述
在最近的一次讲座中,我们被告知算法的时间复杂度为 exp(O(n))
,这与时间复杂度 O(exp(n))
不同。我对以下内容感兴趣:
- 我们如何解读
exp(O(n))
的时间复杂度?它意味着什么? -
exp(O(n))
和O(exp(n))
时间复杂度有什么区别?
我认为第一个问题也将回答第二个问题,但非常感谢明确的回答。
澄清一下,我们所看到的时间复杂性实际上是用 Big-Theta 表示法,而不是 Big-O 表示法,但我假设相同的相关属性适用于两者,这将是一种更有用的表达方式问题(因为我觉得人们搜索 Big-O 的次数比搜索 Big-Theta 的次数要多)。
对于那些好奇的人来说,所讨论的算法是在规则格子上的节点之间找到最小成本路径的蛮力方法。我们将其与效率更高的 (Θ(n^2)
) 动态编程方法进行比较。我正在学习的模块是计算生物学,主题是 DNA 和蛋白质的全局序列匹配。
解决方法
我认为理解 exp(O(n)) 的最简单方法是演示差异:
如果我们假设我们在基数 e 中工作,那么 exp(O(n)) 可以写成 e f(n),其中 f(n) ∈ O(n)。请注意,n 和 2n 都是 O(n),但是,当它们处于指数中时,情况有所不同:O(en) ≠O( e2n),因为 O(e2n) = O((e2)n)。指数表达式有不同的基数,因此属于不同的函数类。
因此,exp(O(n)) 是与 O(exp(n) 不同的一类函数em>)),因为后者要求渐近增长遵循en。 (当然,如果我们的基础不是 e,那么同样的论点仍然适用。)
一个重要的结果是 exp(O(n)) 包含的函数比 O(exp(n)),因此 O(exp(n)) ⊆ exp(O(n)).
混淆的根源可能是 exp(O(n)) 实际上与 O(exp (O(n)))。但是,由于 exp(O(n)) 已经是一个函数类,因此无需添加包装 O。因为 c·exp(f(n)) 比 exp(c·f(n)),因此 c·exp(f(n)) ∈ exp(O(n)) for f(n) ∈ O( n).