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)中