Algorithm 复杂性——决定增长顺序
我在很大程度上理解了如何计算函数的复杂度。这同样适用于确定数学函数的增长顺序。[我可能没有我想的那么理解它,这就是为什么我可能会问这个问题。]例如:Algorithm 复杂性——决定增长顺序,algorithm,big-o,complexity-theory,division,Algorithm,Big O,Complexity Theory,Division,我在很大程度上理解了如何计算函数的复杂度。这同样适用于确定数学函数的增长顺序。[我可能没有我想的那么理解它,这就是为什么我可能会问这个问题。]例如: 一个^3+bn^2+cn+d可以用大O表示法写成O(n^3),因为对于足够大的n而言,bn^2+cn+d一词的值与一个^3相比是微不足道的(常数系数a、b、c和d也被省略,因为它们对值的贡献也变得微不足道) 我不明白的是,当主导术语涉及某种划分时,这是如何工作的?例如: a/n^3+bn^2或n^3/a+bn^2 对于前一个公式,设n=100,a=
一个^3+bn^2+cn+d
可以用大O表示法写成O(n^3),因为对于足够大的n
而言,bn^2+cn+d
一词的值与一个^3
相比是微不足道的(常数系数a、b、c和d也被省略,因为它们对值的贡献也变得微不足道)
我不明白的是,当主导术语涉及某种划分时,这是如何工作的?例如:
a/n^3+bn^2
或n^3/a+bn^2
对于前一个公式,设n=100,a=1000,b=10,我们得到
n^3/a=100^3/1000=1000
和bn^2=10*100^2=100000
或者对后者来说更具戏剧性——在这种情况下,主导词不仅像上面那样缓慢增长,而且还在缩小,不是吗
a/n^3=1000/100^3=0.001
和bn^2=100000
如上所述
在这两种情况下,第二项的贡献都要大得多,所以它不是决定增长顺序的真正因素吗
当前导项后面跟着减法(a/n^3-bn^2
)或第二项也是除法(n^3/a+n^2/b)
或两者都是除法但顺序不一(a/n^3+n^2/b
)时,情况就变得更复杂了(至少对我来说)
这个列表似乎没完没了,所以我的一般问题是,如何理解和处理涉及除法(和减法)的公式,以确定给定函数的增长顺序?除法只是由的乘法,因此
n^3/a==n^3*a^-1
,您可以用与任何其他系数相同的方式处理它
关于减法a*n^3-b*n^2=a/2*n^3
,对于足够大的n
,它也是在Omega(n^3)
中。有关减法的更详细说明,请参见:
大O表示法通常用于增加(不必是单调的)函数,而诸如
a/n
之类的减少函数并不适合它,尽管O(1/n)
似乎仍然定义得很好,而且它是O(1)
的子集(除非只考虑离散函数)。然而,这对算法的分析没有什么价值,因为算法的复杂度不能真正缩小。除法只是由的乘法,因此n^3/a==n^3*a^-1
,您可以像处理任何其他系数一样处理它
关于减法a*n^3-b*n^2=a/2*n^3
,对于足够大的n
,它也是在Omega(n^3)
中。有关减法的更详细说明,请参见:
大O表示法通常用于增加(不必是单调的)函数,而诸如
a/n
之类的减少函数并不适合它,尽管O(1/n)
似乎仍然定义得很好,而且它是O(1)
的子集(除非只考虑离散函数)。然而,这对算法的分析没有什么价值,因为算法的复杂性无法真正缩小。对于您发布的问题类型,有一个非常简单的规则
假设你试图找到f(n)
的增长顺序,你找到了一个简单的函数g(n)
lim {n -> inf} f(n) / g(n) = k
其中,k
为正有限常数。然后
f(n) = Theta(g(n))
(从微积分定义中很容易看出这一点。)
现在,让我们看看这如何适用于您的示例:
lim {n -> inf} (a/n^3 + bn^2) / n^2 = b
所以它是θ(n^2)
所以它是θ(n^2)
(当然,假设a和b为正。)对于您发布的问题类型,有一个非常简单的规则 假设你试图找到
f(n)
的增长顺序,你找到了一个简单的函数g(n)
lim {n -> inf} f(n) / g(n) = k
其中,k
为正有限常数。然后
f(n) = Theta(g(n))
(从微积分定义中很容易看出这一点。)
现在,让我们看看这如何适用于您的示例:
lim {n -> inf} (a/n^3 + bn^2) / n^2 = b
所以它是θ(n^2)
所以它是θ(n^2)
(当然,假设a和b是正的。)取反是非常聪明的,但是当a/n^3是
a/n^3
时,这也会起作用吗?因为这样我们就可以得到a*(n^3)^-1@Beko-No,只得到系数。我在回答的最后一段提到了a/n
(显然是针对任何类似的函数)。只是想澄清一下,这是否意味着在算法分析中没有真正考虑像a/n
这样的函数?@AmiTavory好吧,但是如果我们有a/n^2+an
,那该怎么办呢。所以a/n^2=O(1)
但是an=O(n)
@Beko不,a/n^2+an在O(n)中取反是非常聪明的,但是当它是a/n^3
时,这也会起作用吗?因为这样我们就可以得到a*(n^3)^-1@Beko-No,只得到系数。我在回答的最后一段提到了a/n
(显然是针对任何类似的函数)。只是想澄清一下,这是否意味着在算法分析中没有真正考虑像a/n
这样的函数?@AmiTavory好吧,但是如果我们有a/n^2+an
,那该怎么办呢。所以a/n^2=O(1)
但是an=O(n)
@Beko不,a/n^2+an在O(n)中