我知道如果我有一个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)
。我应该选择哪一个?
答案 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)
上的上限。从而 存在一些常量c
,f(n)
总是≤ c · g(n)
, 适用于足够大的n
(即某些常量n ≥ n0
为n0
)。
即,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
:
最后一步(++)
遵循Big-O-notation的定义,我们在上面已经松散地说明了这一点。
因此,鉴于我们将您的k
信息解释为(+)
,您的算法会在O(n^3)
(上>绑定,但不一定是紧的)。