我发现时间复杂的资源还不清楚何时可以忽略时间复杂度方程中的项,特别是非多项式的例子。
我很清楚,给出n 2 + n + 1形式的东西,最后两个术语是无关紧要的。
具体来说,给定两个分类,2 n 和n *(2 n ),第二个与第一个顺序相同吗?额外的n乘法是否重要?通常资源只是说x n 处于指数状态并且增长得更快......然后继续前进。
我能理解为什么它不会因为2 n 会大大超过n,但因为它们没有被加在一起,所以在比较这两个方程时它会很重要,实际上差别很大他们之间永远是n的一个因素,这至少可以说是重要的。
答案 0 :(得分:227)
为了回答这个问题,你必须转到大O(O
)的正式定义。
定义是f(x)
属于O(g(x))
当且仅当限制limsupx → ∞ (f(x)/g(x))
存在时,即不是无穷大。简而言之,这意味着存在常数M
,因此f(x)/g(x)
的值永远不会大于M
。
如果您的问题是f(n) = n ⋅ 2n
,请g(n) = 2n
。然后f(n)/g(n)
是n
,它仍将无限增长。因此f(n)
不属于O(g(n))
。
答案 1 :(得分:84)
快速查看n⋅2ⁿ
更大的方法是更改变量。让m = 2ⁿ
。然后n⋅2ⁿ = ( log₂m )⋅m
(在m = 2ⁿ
的两侧取基数2对数得到n = log₂m
),您可以轻松地显示m log₂m
增长速度超过m
。
答案 2 :(得分:10)
我同意n⋅2ⁿ
不在O(2ⁿ)
,但我认为它应该更明确,因为限制优越使用并不总是成立。
根据Big-O的正式定义:f(n)
如果存在常量O(g(n))
和c > 0
,则n₀ ≥ 0
位于n ≥ n₀
,以便我们拥有所有f(n) ≤ c⋅g(n)
f(n) = n⋅2ⁿ
。可以很容易地证明g(n) = 2ⁿ
和g(n)
不存在这样的常数。但是,可以显示O(f(n))
位于n⋅2ⁿ
。
换句话说,2ⁿ
受2ⁿ
的限制。这很直观。虽然它们都是指数级的,因此在大多数实际情况下同样不太可能使用,但我们不能说它们的顺序相同,因为n⋅2ⁿ
必然比{{1}}慢。
答案 3 :(得分:4)
我不同意其他答案,即n⋅2ⁿ
增长速度超过2ⁿ
。但n⋅2ⁿ
增长仍然只是指数级。
当我们谈论算法时,我们经常说时间复杂度增长是指数级的。
因此,我们认为2ⁿ
,3ⁿ
,eⁿ
,2.000001ⁿ
或我们的n⋅2ⁿ
是指数增长的同一组复杂性。
为了给它一点数学意义,我们认为函数f(x)
如果存在c > 1
那样f(x) = O(cx)
,则指数增长(不快于){/ 1}}。
对于n⋅2ⁿ
,常量c
可以是大于2
的任何数字,让我们取3
。然后:
n⋅2ⁿ / 3ⁿ = n ⋅ (2/3)ⁿ
,对于任何1
,这都小于n
。
所以2ⁿ
增长慢于n⋅2ⁿ
,最后反过来增长慢于2.000001ⁿ
。但是他们三个都呈指数级增长。
答案 4 :(得分:2)
你问"是第二个与第一个相同的顺序?额外的n乘法是否重要?"这是两个不同的问题,有两个不同的答案。
n 2 ^ n渐近地增长比2 ^ n快。这个问题回答了。
但你可以问"如果算法A需要2 ^ n纳秒,算法B需要n 2 ^ n纳秒,那么我能在第二/分钟/小时/天找到解决方案的最大值是多少? /月/年?答案是n = 29/35/41/46/51/54与25/30/36/40/45/49。在实践中没有太大区别。
在两种情况下,可以在时间T中解决的最大问题的大小是O(ln T)。
答案 5 :(得分:1)
非常简单的答案是“不”
见2^n
和n.2^n
对于任何 n.2^n > 2^n
所见的 n>0
或者你甚至可以通过在两边应用日志来做到这一点,然后你得到
n.log(2) < n.log(2) + log(n)
因此通过两种类型的分析
替换一个数字
使用日志
我们看到 n.2^n
明显大于 2^n
所以如果你得到一个等式
O ( 2^n + n.2^n )
可以替换为 O ( n.2^n)