有人可以帮助我分析下面给出的伪代码的运行时间
for i = 1 to n
k[i] = 0
for i = 1 to n
for j = i to n
k[i] = k[i] +j
我猜它的时间复杂度是O(n ^ 2)。如果我错了,请纠正我。
答案 0 :(得分:0)
for循环由三个元素组成。赋值1.条件分支。和增量操作。如果可以量化每一行的执行时间,则可以计算执行的总时间。例如,调用k[i] = 0
操作 a 。 k[i] = k[i] +j
。操作 b 。 for循环分配操作 c 。 for循环增量和条件分支操作 d 。
这会产生: (对于i = 1到n),求和(n - i)*(b + d)+(2 + n) c + n a。
我认为这会简化为 对于非常大的n值,〜(b + d)*(n ^ 2)/ 2。所以我同意它的复杂性是O(n ^ 2)。
答案 1 :(得分:0)
分析这些嵌套循环的复杂性的方法来自最深的循环。
for i = 1 to n
k[i] = 0
for i = 1 to n
for j = i to n
k[i] = k[i] +j
对于第一个循环,很容易看到操作k [i] = 0将执行n次
所以它的顺序是O(N)
现在对于嵌套循环,j的循环从i开始,其中i从1循环到n并继续到n。
这是关键问题,询问循环执行的次数。
当i = 1时,它将执行N次 当i = 2时,它将执行N-1次 ... 当i = 1时,它将执行1次
所以如果你把它们全部相加就变成N + N-1 + ...... 1 = N(N-1)/ 2 = N ^ 2/2 - N / 2
所以嵌套循环的顺序是O(N ^ 2/2) - O(N / 2)= O(N ^ 2)
对于第一个循环,顺序是O(N)
所以总时间复杂度id O(N)+ O(N ^ 2)= O(N ^ 2)