计算上限算法的步骤

时间:2016-01-17 19:08:58

标签: runtime big-o time-complexity

我知道如果我有一个for循环和一个嵌套for循环,它们都迭代1 to n次,我可以将两个循环的运行时间相乘得到O(n^2)。这是一个简洁而简单的计算。但是,如果你有这样的迭代,

n = 2, k = 5

n = 3, k = 9

n = 4, k = 14

其中k是内部for循环迭代的次数。在某一时刻,它大于n^2,然后它正好是n^2,然后它变得小于n^2。假设您无法根据k确定n,甚至可能将这些点n分开很远,您如何计算Big-O?

我尝试过制图。有一点,我可以说它是O(n^3),因为有些点超过n^2,而进一步向下,它会是O(n^2)。我应该选择哪一个?

1 个答案:

答案 0 :(得分:1)

您在问题中说明k是:

  

" ...有一次,它大于n^2"

这是你问题中的不确定性(或非特异性),这使得很难严格回答。无论如何,对于本答复的其余部分,我们将假设您在上面引用的含义是:

  

对于n的所有值,k(n)的值都是从上方开始的   C·n^2,对于某些常数C>0

从此处开始,我们将此语句称为(+)

现在,既然你提到了Big-O符号,我们就会稍微松散地定义这实际意味着什么:

  

f(n) = O(g(n))表示c · g(n)f(n)上的上限。从而   存在一些常量cf(n)总是≤ c · g(n),   适用于足够大的n (即某些常量n ≥ n0n0)。

即,Big-O表示法是一种在此处描述算法的渐近(限制)行为的上限的方法。但是,你在问题中写道:

  

"有一次,我可以说它是O(n^3)因为某些点超过n^2,而进一步下降,它会是O(n^2)&#34 ;

现在,这是一个非常具体的分析,分析了算法的内部循环如何对n的特定值进行表达,而且实际上并不是与渐近分析(或Big-O表示法)相关的东西。我们对有关n的特定值的算法行为的具体细节不感兴趣,但是我们是否可以找到给定n的算法的一般上限是"足够大&#34 34; (对于某些常数n0,n≥n0。)

现在,通过上面的这些评论,我们可以继续分析算法的渐近行为。

我们可以使用Sigma表示法来处理此问题,使用上面的(+)语句,k(n) < C·n

enter image description here

最后一步(++)遵循Big-O-notation的定义,我们在上面已经松散地说明了这一点。

因此,鉴于我们将您的k信息解释为(+),您的算法会在O(n^3)>绑定,但不一定是紧的)。