这个问题在这里已有答案:
nb = o(an)(o是小哦)是什么意思,直觉?我刚开始自学自我算法,每次看到这些表达式时,我都很难解释这些表达式。在这里,我理解的方式是,对于函数nb,增长率是a。但无论是对还是错,这对我都没有意义。
f(n)=o(g(n))
意味着当f(n)/g(n)->0
时n->infinite
。
对于你的问题,它应该持有a>1
。 (n^b)/(a^n)->0
当n->无限时,自(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
。当M/(sqrt(a)^n)->0
时,这就是n->infinite
。最后,当n->无限时,我们得到(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)
等。Little-o符号略有不同。直觉上,大O符号说,如果f
是O(g)
,那么f
渐渐渐渐渐渐增长,与g
一样快。 Little-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
渐进地渐渐变慢。
如果您打算处理算法复杂性,这是一件很重要的事情。更简单,可以说“多项式比指数函数生长得慢得多”。这是不正确的,这是真的,并且写得太多,所以这里有一个参考:
也许你必须对数学有一些安慰才能阅读这个事实的任何证据。
祝好运!
语句nb的超高级含义是o(a)只是指数函数比像多项式函数(如nb)快得多。
在查看大O和小符号时要理解的重要一点是它们都是上限。我猜这就是为什么你感到困惑。 nb是o(a)因为a的增长率要大得多。你可能会在nb上找到一个更紧密的小上界(一个边界和函数之间的间隙较小),但是仍然有效。它也可能值得看看Big O和小o之间的区别。
请记住,函数f是函数g的大O,如果对于某个常数k> 0,最终可以找到n的最小值,使得f(n)≤k* g(n)。
函数f是函数g的小o如果对于任何常数k> 0,你最终可以找到n的最小值,使得f(n)≤k* g(n)。
注意,很少需要满足要求,这意味着如果函数f是函数g的小o,它也是g的大O,这意味着函数g的增长速度比它只是g的大O更快。 。
在你的例子中,如果b是3且a是2并且我们将k设置为1,我们可以计算n的最小值,使得nb≤k* an。在这种情况下,它介于9和10之间,因为9³ = 729
和1 * 2⁹ = 512
,这意味着在9和a不大于nb但是10³ = 1000
和1 * 2¹⁰ = 1024
,这意味着n现在大于nb。对于n> 10的任何值,你可以看到n这些函数的n大于nb。此时我们只显示nb是n的大O,因为Big O只要求某个k> 0的值(我们选择了1)≥nb的某些最小n(在这种情况下,它在9到10之间)
为了证明nb是a的小数,我们必须证明,对于任何大于0的k,你仍然可以找到n的最小值,使得a> nb。例如,如果你选择k = .5,我们之前找到的最小值10不起作用,因为10³ = 1000
和.5 * 2¹⁰ = 512
。但是我们可以继续向n进一步滑动n的最小值,越小,k越大,n将b的最小值。说nb是一个小手段,无论你做多少k我们总能找到一个足够大的n值,这样nb≤k* an