复杂性 - 确定增长的顺序

时间:2015-05-01 08:05:10

标签: algorithm big-o complexity-theory division

我理解如何在大多数情况下计算函数的复杂性。确定数学函数的增长顺序也是如此。 [我可能不像我想的那样理解它,这就是为什么我可能会问这个。]例如:

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^2n^3/a + bn^2

对于前一个公式,设n = 100,a = 1000,b = 10,那么我们有

n^3/a = 100^3/1000 = 1000bn^2 = 10*100^2 = 100,000

对后者来说甚至更具戏剧性 - 在这种情况下,主导词不仅如上所述缓慢增长,而且还在缩小,不是吗?:

a/n^3 = 1000/100^3 = 0.001bn^2 = 100,000如上所述。

在这两种情况下,第二项的贡献要大得多,那么实际决定增长顺序的不是n^2吗?

当主要词语后跟减法(a/n^3 - bn^2)或第二个词也是分词(n^3/a + n^2/b)或两者都是分词时,它会变得更复杂(至少对我而言)分裂但按混合顺序(a/n^3 + n^2/b)等

列表似乎无穷无尽,所以我的一般问题是,如何理解和处理涉及除法(和减法)的公式,以确定给定函数的增长顺序?

2 个答案:

答案 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是正面的。)

相关问题