给出数组A的以下伪代码
x = 0
for i = 0 to n - 1
for j = i to n - 1
if A[i] > A[j]:
x = x + 1
return x
如何确定运行时间? 我会说它(n - 1)*(n - 1)= n ^ 2 - 2n - 1 = O(n ^ 2)。
我不太确定如何使用if循环。
答案 0 :(得分:4)
是O(n ^ 2),只是对内循环中的迭代次数求和:
n + (n - 1) + (n - 2) + ... 1 = [ n x (n + 1) ] / 2
如果不是循环,则它是一个控制结构。通常,您只需计算检查条件的次数而不考虑条件。如果if体中有另一个循环,则条件可能很重要。
如何计算内循环的迭代次数:
i = 0
内循环运行n
次,然后结束i = 1
内循环运行n - 1
次,然后结束i = 2
内循环运行n - 2
次,然后结束i = n - 2
内循环运行1
次i = n - 1
内循环运行0
次所以我们需要做的就是添加内循环的迭代次数:
n + (n - 1) + (n - 2) + ... 1 = [ n x (n + 1) ] / 2
答案 1 :(得分:1)
@perreal对订单完全正确:
n*(n+1)/2 => O(n^2)
关于" if"部分,它并不重要。 (我写这篇文章来回答这一部分)
让我们说检查是否需要c1时间,而x = x + 1则需要c2时间。你会有
(c1 | c1+c2)* n*(n+1)/2
由于您可以忽略订单中的常量,因此它来自
为O(n ^ 2)
答案 2 :(得分:-1)
实际上,说"此算法的时间复杂度为O(n^2)
"隐含地暗示它是最坏情况的复杂性。
以一种天真的方式,您可以计算在最坏情况下每条指令的执行次数。 if A[i] > A[j]:
也可能被视为一种指示,所以首先你不必在条件成立时问自己。
2*(n-1)*(n-1)
是在最内层循环中执行的指令数量的主要内容,更准确地说是:
2(n + (n-1) + ... + 1) = n(n+1) = O(n^2)
即使它对O
- 符号不重要,也有几个数组的条件始终为真(因此这些算法是最坏的情况)。例如:
n n-1 n-2 ... 2 1