我对Big-O的东西相当新,我想知道算法的复杂程度。
据我所知,每次添加,if语句和变量初始化都是O(1)。
根据我的理解,首先'i'循环将运行'n'次,第二'j'循环将运行'n ^ 2'次。现在,第三个'k'循环是我遇到问题的地方。
是否正在运行'(n ^ 3)/ 2'次,因为'j'的平均值将是'n'的一半?
这是否意味着Big-O是O((n ^ 3)/ 2)?
答案 0 :(得分:1)
我们可以使用Sigma表示法计算您算法的最内层基本操作的迭代次数,我们将sum = sum + A[k]
视为基本操作。
现在,我们如何推断T(n)
在O(n^3)
的最后一步中,你问?
让我们松散地定义Big-O表示法的含义:
f(n) = O(g(n))
表示c · g(n)
是f(n)
上的上限。从而 存在一些常量c
,f(n)
总是≤ c · g(n)
, 适用于足够大的n
(即某些常量n ≥ n0
为n0
)。
即,我们希望找到一些(非唯一)正常量c
和n0
的集合,以便以下成立
|f(n)| ≤ c · |g(n)|, for some constant c>0 (+)
for n sufficiently large (say, n>n0)
某个函数g(n)
的,它会显示f(n)
位于O(g(n))
。
现在,在我们的案例中,f(n) = T(n) = (n^3 - n^2) / 2
,我们有:
f(n) = 0.5·n^3 - 0.5·n^2
{ n > 0 } => f(n) = 0.5·n^3 - 0.5·n^2 ≤ 0.5·n^3 ≤ n^3
=> f(n) ≤ 1·n^3 (++)
现在(++)
与(+)
完全相同c=1
(并选择n0
,例如1
,n>n0=1
),因此,我们已经证明f(n) = T(n)
位于O(n^3)
。
从上面的某种形式推导中可以明显看出,函数g(n)
中的任何常量都可以被提取并包含在c
中的常量(+)
中,因此你&#39 ;永远(至少不应该)看到时间复杂性被描述为例如O((n^3)/2)
。当使用Big-O表示法时,我们将描述算法的渐近行为的上界,因此只有主导词是有意义的(但不是如何用常数缩放)。