关于big o:此算法的复杂度(Big O)是多少?

What is the Complexity (BigO) of this Algorithm?

enter image description here

我对Big-O知识还很陌生,我想知道算法的复杂性是什么。

我了解,如果语句和变量初始化为O(1),则每次添加。

根据我的理解,第一个" i"循环将运行" n"次,第二个" j"循环将运行" n ^ 2"次。 现在,第三个" k"循环是我遇到问题的地方。

因为'j'的平均值是'n'的一半,它运行'(n ^ 3)/ 2'次吗?

这是否意味着Big-O为O((n ^ 3)/ 2)?


我们可以使用Sigma表示法来计算算法最内层基本操作的迭代次数,其中我们将sum = sum + A[k]视为基本操作。

Sigma not.

现在,您问如何在最后一步中推断T(n)O(n^3)中?

让我们宽松地定义Big-O表示法的含义:

f(n) = O(g(n)) means c · g(n) is an upper bound on f(n). Thus
there exists some constant c such that f(n) is always ≤ c · g(n),
for sufficiently large n (i.e. , n ≥ n0 for some constant n0).

即,我们想找到一些(非唯一的)正常数cn0集,使得以下内容成立

1
2
 |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,我们有:

1
2
3
4
5
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作为1n>n0=1),因此,我们证明了f(n) = T(n)O(n^3)中。

从上面的形式化推导中可以明显看出,函数g(n)中的任何常量都可以被提取并包含在(+)中的常量c中,因此您永远不会(至少不应该)看到时间复杂度描述为O((n^3)/2)。使用Big-O表示法时,我们描述的是算法的渐近行为的上限,因此只有感兴趣的项才有意义(但是如何用常量来缩放)。