我理解如何在大多数情况下计算函数的复杂性。确定数学函数的增长顺序也是如此。 [我可能不像我想的那样理解它,这就是为什么我可能会问这个。]例如:
an^3 + bn^2 + cn + d
可以用大写符号写成O(n ^ 3),因为对于足够大的n
,与{bn^2 + cn + d
相比,术语an^3
的值无关紧要1}}(常数系数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 = 100,000
a/n^3 = 1000/100^3 = 0.001
和bn^2 = 100,000
如上所述。
在这两种情况下,第二项的贡献要大得多,那么实际决定增长顺序的不是n^2
吗?
当主要词语后跟减法(a/n^3 - bn^2
)或第二个词也是分词(n^3/a + n^2/b)
或两者都是分词时,它会变得更复杂(至少对我而言)分裂但按混合顺序(a/n^3 + n^2/b
)等
列表似乎无穷无尽,所以我的一般问题是,如何理解和处理涉及除法(和减法)的公式,以确定给定函数的增长顺序?
答案 0 :(得分:3)
除法只是乘以multiplicative inverse,所以n^3/a == n^3 * a^-1
,你可以像处理任何其他系数一样处理它。
关于减法a*n^3 - b*n^2 <= a*n^3
,它也在O(n^3)
。此外,a*n^3 - b*n^2 >= a/2 * n^3
适用于n
足够大的值,并且也在Omega(n^3)
中。关于减法的更详细解释可以在:Algorithm complexity when faced with substraction in value
大O符号通常用于增加(不必单调)函数,而a/n
等递减函数不适合它,尽管O(1/n)
似乎仍然完美定义,AFAIK,它是O(1)
的一个子集(除非你只考虑离散函数)。然而,这对于算法的分析几乎没有价值,因为算法的复杂性无法真正缩小。
答案 1 :(得分: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
所以Theta(n^2)
。
lim {n -> inf} (a n^3 - bn^2) / n^3 = a
所以Theta(n^2)
。
(当然,假设a和b是正面的。)