指数:小哦
这个问题在这里已经有了答案:
当n->infinite
时, f(n)=o(g(n))
意味着f(n)/g(n)->0
。
对于你的问题,它应该保持a>1
。 (n^b)/(a^n)->0
(n^b)/(sqrt(a)^n*sqrt(a)^n))=((n^b)/sqrt(a)^n) * (1/sqrt(a)^n)
。 让f(n)=((n^b)/sqrt(a)^n)
是一个函数先增大后减小,这样你就可以得到的最大值max(f(n))=M
,则(n^b)/(a^n) < M/(sqrt(a)^n)
由于a>1, sqrt(a)>1
,所以(sqrt(a)^n)->infinite
时n->infinite
。 当n->infinite
,即M/(sqrt(a)^n)->0
。最后,当n->infinite
,得到(n^b)/(a^n)->0
。 根据定义,这是n^b=o(a^n)
。
(为了简单起见,我假设所有函数总是返回正值,例如测量算法运行时的函数就是这种情况,因为没有算法在“负”时间运行)。
首先,回顾一下大O符号,澄清一个常见的误解:
说f
是O(g)
意味着f
最多渐进地增长到g
速度。 更正式地说,把f
和g
当作变量n
函数,假设f(n)
是O(g(n))
意味着存在一个常数K
,所以最终f(n) < K * g(n)
。 这里的“最终”一词意味着存在某个固定值N
(这是K
, f
和g
的函数),所以如果n > N
那么f(n) < K * g(n)
。
例如,函数f(n) = n + 2
是O(n^2)
。 要知道为什么,让K = 1
。 那么,如果n > 10
,我们有n + 2 < n^2
,所以我们的条件得到满足。 有几件事要注意:
n = 1
,我们有f(n) = 3
和g(n) = 1
,所以f(n) < K * g(n)
实际上失败了。 没关系! 请记住,不平等最终只需要保持不变,并且不等式对于n
小有限列表是否不成立。 K = 1
,但我们不需要。 例如, K = 2
也会起作用。 重要的是K
有一定的价值,这给我们最终的不平等。 n + 2
是O(n^2)
。 这可能看起来很混乱,你可能会说:“等等,实际上不是n + 2
O(n)
?” 答案是肯定的。 n + 2
是O(n)
, O(n^2)
, O(n^3)
, O(n/3)
等。 小O符号略有不同。 大O符号直观地表示,如果f
是O(g)
,那么f
渐进地增长至多g
。 小O符号表示,如果f
是o(g)
,那么f
渐近地严格地慢于g
。
形式上, f
是o(g)
如果对K
任何(假设为正)选择,最终不等式f(n) < K * o(g)
成立。 因此,例如:
f(n) = n
不是o(n)
。 这是因为,对于K = 1
,没有n
值,所以f(n) < K * g(n)
。 直觉上, f
和g
以相同的速度渐近地增长,所以f
不会比g
慢。 f(n) = n
是o(n^2)
。 为什么是这样? 选择你最喜欢的K
值。 (要查看实际点,请尽量减小K
,例如0.001。)想象一下函数f(n)
和K * g(n)
图形。 一条是通过正斜率的原点的直线,另一条是通过原点的凹面抛物线。 最终抛物线会比线更高,并且会保持这种状态。 (如果你记得你的计算前/微积分...) 现在我们来看你的实际问题:让f(n) = n^b
和g(n) = a^n
。 你问为什么f
是o(g)
。
据推测,原始声明的作者将a
和b
视为常数,正实数,而且a > 1
(如果a <= 1
那么声明是错误的)。
英吉利的声明是:
对于任何正实数b
和任何实数a > 1
,函数n^b
渐近地严格地比a^n
更慢地增长。
如果您将要处理算法复杂性,这是一件重要的事情。 简单点说,可以说“多项式增长比指数函数慢得多”。 这不是很明显,这是真的,并且写出太多,所以这里是一个参考:
https://math.stackexchange.com/questions/55468/how-to-prove-that-exponential-grows-faster-than-polynomial
可能你必须对数学有一些安慰,才能够阅读这个事实的任何证据。
祝你好运!
声明nb的超级高层含义是o(an)就是像指数函数那样的增长速度比多项式函数(如nb)快得多。
当看到大O和小O表示法时,要理解的重要一点是它们都是上限。 我猜这就是为什么你感到困惑。 n是o(an),因为an的增长率要大得多。 你可能会在nb上找到一个更小的o上界(其中界限和函数之间的间隔更小),但仍然有效。 这也可能值得看看大O和小O之间的区别。
请记住函数f是函数g的大O如果对于某个常数k> 0,最终可以找到n的最小值,使得f(n)≤k* g(n)。
函数f是函数g的一个小数,如果对于任何常数k> 0,您最终可以找到n的最小值,这样f(n)≤k* g(n)。
请注意,小o的要求很难实现,这意味着如果函数f只是函数g的一小部分,它也是g的大O,并且这意味着函数g的增长速度比它仅仅是g的大O 。
在你的例子中,如果b是3并且a是2并且我们将k设置为1,那么我们可以计算出n的最小值,使得nb≤k * an。 在这种情况下,由于9 9³ = 729
和1 * 2⁹ = 512
,这意味着在9和10之间,这意味着在9和nb还不大于nb,但10³ = 1000
和1 * 2¹⁰ = 1024
,这意味着现在n大于nb 。 你可以看到这些函数表示n对于n> 10的任何值都大于nb。在这一点上,我们只显示了nb是n的大O,因为大O只要求k> 0的某个值(我们选择1)对于某个最小值n≥nb(在这种情况下,它介于9和10之间)
为了证明nb是一个很小的值,我们必须证明,对于任何大于0的k,仍然可以找到n的最小值,使得> nb。 例如,如果选择k = .5,我们之前找到的最小值10不起作用,因为10³ = 1000
,而.5 * 2¹⁰ = 512
。 但是我们可以继续滑动n的最小值越小越好,k越小,n的最小值越大b。 说nb是一个手段,不管你做多小的k,我们总能找到一个足够大的n值,这样nb≤k* an