我在时间复杂度方面找到的资源对于何时可以忽略时间复杂度方程中的项不是很清楚,尤其是对于非多项式的例子。
对于形如n2 + n + 1的表达式,最后两项可以忽略不计。
具体来说,对于两个分类:2n和n*(2n),第二个分类是否与第一个分类相同?那里的额外乘以n是否重要?通常的资源只是说xn是指数级别的,增长速度快得多……然后就过去了。
我能理解为什么不需要考虑乘以n,因为2n会大大超过n,但是因为它们没有被加在一起,所以在比较这两个方程时它们的差异将始终是n的一个因素,这似乎至关重要。
我在时间复杂度方面找到的资源对于何时可以忽略时间复杂度方程中的项不是很清楚,尤其是对于非多项式的例子。
对于形如n2 + n + 1的表达式,最后两项可以忽略不计。
具体来说,对于两个分类:2n和n*(2n),第二个分类是否与第一个分类相同?那里的额外乘以n是否重要?通常的资源只是说xn是指数级别的,增长速度快得多……然后就过去了。
我能理解为什么不需要考虑乘以n,因为2n会大大超过n,但是因为它们没有被加在一起,所以在比较这两个方程时它们的差异将始终是n的一个因素,这似乎至关重要。
O
)的正式定义才能回答这个问题。limsupx → ∞ (f(x)/g(x))
存在即不为无穷大,那么f(x)
属于O(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))
。O(f(x)/g(x))
取极限;大O符号是一组函数的缩写,而不是可以取值的单个函数。然而,我 认为 如果 lim(x->infinity) f(x)/g(x)
存在,你可以证明 f(x) = O(g(x))
。 - chepnerlim sup
而不是 lim
将是正确的。 - David Eisenstatx
是真实的,而不是所有的 x
值都是如此。 - K.Steff一个快速查看 n⋅2ⁿ
更大的方法是进行变量替换。令 m = 2ⁿ
。然后有 n⋅2ⁿ = ( log₂m )⋅m
(对 m = 2ⁿ
两边取以2为底的对数得到 n = log₂m
),并且您可以轻松证明 m log₂m
比 m
的增长更快。
lg
是什么?以2为底的对数? - Pierre Arlaudlg
是表示以10为底的对数的 ISO 表示法,而不是讨论渐近运行时间时最常用的与底数无关的表示法。详见 http://en.wikipedia.org/wiki/Logarithm#Particular_bases - chepner我同意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ⁿ
慢。
f(n) = 2*2^n
我认为你的意思是 n*2^n
? - tobias_kn⋅2ⁿ
的增长速度比 2ⁿ
更快。但是 n⋅2ⁿ
增长仍然只是指数级别的。2ⁿ
、3ⁿ
、eⁿ
、2.000001ⁿ
或者我们的 n⋅2ⁿ
属于同一组具有指数级增长的复杂度。c > 1
,使得 f(x) = O(cx)
,那么函数 f(x)
就呈指数级增长(不会更快)。n⋅2ⁿ
,常数 c
可以是大于 2
的任何数字,让我们取 3
。然后:
n⋅2ⁿ / 3ⁿ = n ⋅ (2/3)ⁿ
,对于任何 n
都小于 1
。2ⁿ
的增长速度比 n⋅2ⁿ
更慢,后者的增长速度又比 2.000001ⁿ
更慢。但它们三个都呈指数级增长。你问道“第二个问题和第一个问题的顺序一样吗?额外的n次方有影响吗?”这是两个不同的问题,有着不同的答案。
n 2^n 的增长速度大于 2^n 。这就回答了第一个问题。
但你也可以问“如果算法A需要2^n纳秒,算法B需要n 2^n 纳秒,那么我最多能用1秒/1分钟/1小时/1天/1月/1年找到解决方案的最大n值是多少?”答案分别为 n = 29/35/41/46/51/54 和 25/30/36/40/45/49。在实践中没有太大差异。
在两种情况下,可以解决的最大问题规模在时间T内的复杂度都是 O(ln T)。
2^n
和 n.2^n
如所见,对于任何 n>0
,n.2^n > 2^n
或者你甚至可以在两边应用对数,然后你会得到 n.log(2) < n.log(2) + log(n)
因此,通过两种类型的分析,即通过
替换数字
使用对数
我们可以看到 n.2^n
大于 2^n
,如可见所示
因此,如果您得到一个方程式如下:
O ( 2^n + n.2^n )
,它可以被替换为 O ( n.2^n)
n! = o((n+1)!)
,也就是说,从渐近意义上讲,它增长得严格较慢。 - chepner