为什么n ^ O(1)表示多项式时间?

时间:2013-10-21 23:28:09

标签: math big-o

如果某个k的运行时间为O(n k ),则算法在多项式时间内运行。但是,我也看到多项式时间定义为时间n O(1)

我对此有一些疑问:

  1. 为什么n O(1)多项式时间? k怎么了?
  2. 如果n O(1)是多项式时间,则3n 2 应为n O(1)。但是3去了哪里?这有什么作用?
  3. 谢谢!

1 个答案:

答案 0 :(得分:10)

当你的表达式如“运行时为O(n)”或“运行时为O(n 2 )”时,O(n)和O(n 2 )术语不是实际功能。相反,它们是一些具有某些属性的其他函数的占位符。例如,请接受以下声明:

  

算法的运行时间为O(n)

这句话的确意味着

  

有一些函数f(n),算法的运行时间为f(n),f(n)= O(n)

例如,如果函数的实际运行时间是137n + 42,则语句“算法的运行时间为O(n)”为真,因为有一些函数(即f(n)= 137n + 42),其中算法的运行时间是f(n)和f(n)= O(n)。

鉴于此,让我们考虑一下“算法的运行时间是否为 O(1)”的含义。该陈述相当于

  

有一些函数f(n),其中算法的运行时间为n f(n)且f(n)= O(1)

既然我们已经明确了术语,那究竟是什么意思呢?直观地,如果函数最终从某个常数开始与上面有界,则函数是O(1)。因此,一旦n变得足够大,任何函数f(n)的O(1)必须满足f(n)≤k。因此,至少在直觉上,n O(1)意味着“n被提升到最多k的某个幂”,这听起来像多项式函数的定义。

当然,这是一个常见因素的棘手问题。函数137n 3 绝对是O(n 3 ),但它在前面有一个巨大的常数项。另一方面,如果我们具有n O(1)形式的函数,则在n 3 之前不存在常数项。我们该如何处理?

这是我们可以通过数学变得可爱的地方。在137n 3 的情况下,注意当n> 1时1,我们有

  

137n 3 = n log n 137 n 3 = n 3 + log n 137

请注意,这是n提升到log n 137的功能。虽然看起来函数log n 137随着n变大而增长,但它实际上有相反的行为:随着n的增长,减少。这样做的原因是我们可以使用基本公式的更改来重写log n 137

  

log n 137 = log 137 / log n

当log n减少时,长期明显减少。因此,表达式3 + log n 137最终被上面的某个常数限制,所以它是O(1)。

使用这种技术,可以通过选择n的指数为k加上log base n,将O(n k )转换为n O(1)在大O符号中出现的n k 项前面的常数因子。类似地,我们可以将n O(1)转换回O(n k ),方法是选择k为任何上限由O隐藏的函数的常量( 1)n的指数中的项。

希望这有帮助!