我正在解决一个算法问题,我的分析是它将在O(2 ^ sqrt(n))上运行。那有多大 它等于O(2 ^ n)吗?现在仍然是非多项式时间吗?
我正在解决一个算法问题,我的分析是它将在O(2 ^ sqrt(n))上运行。那有多大 它等于O(2 ^ n)吗?现在仍然是非多项式时间吗?
Answers:
这是个有趣的问题。幸运的是,一旦您知道如何解决它,就不会特别困难。
对于函数˚F:Ñ → [R +和克:Ñ → [R +,我们有˚F ∈ Ô(克)当且仅当LIM SUP Ñ →∞ ˚F(Ñ)/ 克(Ñ)∈ [R 。
函数˚F:Ñ → [R +具有至多多项式生长当且仅当存在一个常数ķ ∈ Ñ使得˚F ∈ Ö(Ñ ↦ Ñ ķ)。让我们的工作了这一点,对任意但固定ķ ∈ ñ。
LIM SUP Ñ →∞ 2 (Ñ 1/2) / Ñ ķ =
LIM Ñ →∞ 2 (Ñ 1/2) / Ñ ķ =
LIM Ñ →∞ ë 日志(2)Ñ 1/2 / E 日志(Ñ)ķ =
LIM ñ →∞ ë 日志(2)ñ 1/2 -日志(ñ)ķ =∞∉ ř
第一个等式是正确的,因为分母和分母都是单调增长的稳定函数。第二个等式使用标识x y = e log(x)y。该限制不是有限的,因为最终表达式中的指数不受上述限制。在没有给出正式证明的情况下,可以假定已知n 1/2渐近地主导log(n)。因此,所讨论的函数超过多项式增长。
然而,它的生长比的指数,其中指数被定义严格以下(我,为了这个目的)作为ø(ñ ↦2 Ç Ñ)为C ^ > 0显示这是更简单的。
LIM SUP Ñ →∞ 2 ç Ñ / 2 (Ñ 1/2) = LIM ñ →∞ 2 Ç ñ - ñ 1/2 =∞∉ ř
对于任何固定的c >0。因此,函数的复杂度确实在多项式和指数之间。
那有多大 好吧,O(2 ^ sqrt(n))到底有多大:-(
为了弄清楚它的含义,想象一下您的算法将不只是O(2 ^ sqrt(n)),而是实际上在您的计算机上需要2 ^ sqrt(n)纳秒:
n = 100:2 ^ 10 = 1024纳秒。根本没有时间。n = 1000:2 ^ 31.xxx = 20亿纳秒。两秒钟,这很明显。n = 10,000:2 ^ 100≈10 ^ 30纳秒= 10 ^ 21秒= 30万亿年
这比2 ^ n纳秒要好得多,n = 100的纳秒要花费30万亿年,但是仍然可以解决的问题的规模非常有限。如果您认为一个问题可以解决,如果您的计算机可以在一星期内解决,则大约为6 x 10 ^ 14纳秒,大约为n = 2,400。另一方面,最多可以在毫秒内解决n = 400的问题。
(实际上,对于n = 10,000,O(2 ^ sqrt(n))和O(2 ^ n)花费的时间完全相同:等待时间太长。)
它确实超出了任何多项式。采取另一种算法,耗时n ^ 1000秒。这对于n = 2实际上是无法解决的。该算法花费的时间更长,直到n约为8.85亿。但是真的,谁在乎呢?到那时,两种算法所用的年数均为9,000位数字。