Math 为什么n^O(1)表示多项式时间?
一个算法在多项式时间内运行,如果它的运行时间是O(nk)对于某些k。然而,我也见过多项式时间被定义为时间1 我对此有一些疑问:Math 为什么n^O(1)表示多项式时间?,math,big-o,Math,Big O,一个算法在多项式时间内运行,如果它的运行时间是O(nk)对于某些k。然而,我也见过多项式时间被定义为时间1 我对此有一些疑问: 为什么没有(1)多项式时间?k怎么了 如果nO(1)是多项式时间,那么3n2应该是nO(1)。但是那三个去了哪里?这是怎么回事 谢谢 当您有一个类似“运行时为O(n)”或“运行时为O(n2)”的表达式时,O(n)和O(n2)项不是实际的函数。相反,它们是具有某些属性的其他函数的占位符。例如,以以下语句为例: 该算法的运行时间为O(n) 这句话真的很有意思 有一个函数f(
谢谢 当您有一个类似“运行时为O(n)”或“运行时为O(n2)”的表达式时,O(n)和O(n2)项不是实际的函数。相反,它们是具有某些属性的其他函数的占位符。例如,以以下语句为例: 该算法的运行时间为O(n) 这句话真的很有意思 有一个函数f(n),其中算法的运行时间是f(n),f(n)=O(n) 例如,如果函数的实际运行时间为137n+42,则“算法的运行时间为O(n)”语句为真,因为存在某个函数(即f(n)=137n+42),其中算法的运行时间为f(n)且f(n)=O(n) 鉴于此,让我们考虑一下“算法的运行时是否(1)”这句话的意思。这句话相当于 有一个函数f(n),其中算法的运行时间是nf(n),f(n)=O(1) 现在我们已经把术语弄清楚了,这到底意味着什么?直观地说,一个函数是O(1),如果它最终由某个常数从上面限定。因此,O(1)的任何函数f(n)必须满足f(n)≤ 一旦n变得足够大,k。因此,至少在直觉上,nO(1)表示“n提升到某个至多k的幂次方”,这听起来像多项式函数的定义 当然,还有一个令人讨厌的问题,就是常数因素。函数137n3肯定是O(n3),但它前面有一个巨大的常数项。另一方面,如果我们有一个形式为nO(1)的函数,在n3前面就没有常数项。我们如何处理这件事 这是我们可以在数学上变得可爱的地方。对于137n3,请注意,当n>1时,我们有 137n3=nlogn137 n3=n3+logn 137 请注意,这是n提升到logn 137的幂。虽然它看起来像函数logn 137随着n的增大而增大,但实际上它具有相反的行为:它随着n的增大而减小。这是因为我们可以使用基本公式的更改将logn 137重写为 对数n 137=对数137/对数n 从长远来看,当对数n减小时,它明显减小。因此,表达式3+logn137最终由某个常数从上方限定,因此它是O(1) 使用这种技术,可以通过选择n的指数为k加上大O表示法中出现的nk项前面常数因子的对数基数n,将O(nk)转换为nO(1)。类似地,我们可以通过选择k为任何常数,使函数的上界为n的指数中O(1)项所隐藏的函数,从而将nO(1)转换回O(nk)
希望这有帮助 137n=n^(对数为137)n^3。也许,137n^3=…,而不是137n?哦,天哪,那是个打字错误。谢谢你抓住了+1感谢花时间把所有的
和
都写进去(尽管答案也很好!):+1。但是你在“当然,还有常数因子这个讨厌的问题。函数137n^3肯定是O(n)”@Teepeemm中有另一个输入错误-谢谢你发现了这一点。固定的!你有没有在指数中用O表示的例子?我知道你要用它,很直观,n^O(1)
将是一个多项式,但我不确定我是否喜欢这个符号f(x)=O(g(x))
对于f(x)已经是草率的了∈ O(g(x))
,将该术语用作指数会使其远离其原始含义,并使人们更难理解O(g(x))
是一个集合而不是单个函数的表示法。但是,如果您知道自己在做什么,这可能会非常有用。:)@卡斯滕——我在复杂性理论方面的书籍中看到过这一点(例如,Arora和Barak的计算复杂性)。此外,符号f(n)=O(g(n))令人困惑,但从技术上讲,这并不是滥用符号;许多作者以这种方式正式定义了big-O符号。