Algorithm 如果f(n)是O(g(n)),f(n)是否渐近增长不超过g(n)?

Algorithm 如果f(n)是O(g(n)),f(n)是否渐近增长不超过g(n)?,algorithm,big-o,complexity-theory,Algorithm,Big O,Complexity Theory,我的测验有一个问题: “如果f(n)是O(g(n)),那么f(n)渐近增长不超过g(n),对还是错?” 我的理解是: O(g(n))大于g(n),因为它是一个上界 f(n)是O(g(n)) f(n)大于g(n) f(n)比g(n)增长快 所以答案一定是假的 但是答案是正确的,我哪里出错了?推理是这样的O(g(n))是所有函数的集合,它们的渐近增长速度不超过g(n)。当f(n)在这个集合中时,它的增长速度不会比g(n)快,这主要是一个定义问题。big-O符号有一个精确的定义(虽然有时定义方式不

我的测验有一个问题:

“如果f(n)是O(g(n)),那么f(n)渐近增长不超过g(n),对还是错?”

我的理解是:

  • O(g(n))大于g(n),因为它是一个上界
  • f(n)是O(g(n))
  • f(n)大于g(n)
  • f(n)比g(n)增长快
  • 所以答案一定是假的

但是答案是正确的,我哪里出错了?

推理是这样的
O(g(n))
是所有函数的集合,它们的渐近增长速度不超过
g(n)
。当
f(n)
在这个集合中时,它的增长速度不会比
g(n)
快,这主要是一个定义问题。big-O符号有一个精确的定义(虽然有时定义方式不同,但我认为您的学习材料明确地从一些广泛使用的定义中选择了一个精确的定义),因此您可以随时查看它


但“X的渐进增长速度不快于Y”这个短语并不那么清楚。你在什么地方定义过它吗?如果是,它是否说
X=O(Y)
?如果是这样,这是你的答案。

你的错误是直接将O(g(n))与g(n)进行比较,因为大O描述了增长率,而g(n)是一个函数,所以不能直接比较两者


根据定义,这个问题基本上是正确的:它的增长率的上界等于g(n)的增长率,因此它不可能比g(n)增长得更快。

渐近上界,我们使用O表示法


O(g(n))=f(n):0首先让我们选择一个特定的定义,因为您并没有真正为我们提供定义

从Sipser对计算理论的介绍

设f和g是函数,使得f,g:N→ R+

假设f(n)=O(g(n)),如果正整数c和m存在 对于每一个整数n≥ m、 f(n)≤ cg(n)

根据这个定义,f(n)可以比普通的g(n)增长得更快,所以你的结论没有错

但是有一个陷阱,它涉及到单词的渐进性

为了使f(n)比g(n)渐进地增长快,它需要能够“超越”形式为1*g(n),2*g(n),3*g(n),…,1000000*g(n)。。。在n的某个或另一个值

举个例子可能会有所帮助


函数f(n)=3n+1的增长速度肯定比n快,但很明显f(n)≤ 10n表示所有n>0,因此根据上面的定义f(n)=O(n)

我投票结束这个问题,因为它不是一个编程问题。这是一个关于数学或计算理论的问题。问题说“不快”,你可以用前三步的论证来证明
g(n)
大于它本身:“O(g(n))大于g(n),因为它是一个上界”&“g(n)是O(g(n))”=>“g(n)大于g(n)”(这对所有n都是错误的)。这告诉我们,前提至少有一部分是错误的。“g(n)是O(g(n))”显然是真的,所以它一定是另一个假的(或者说是非感官的,因为
O(g(n))
不是一个函数)。