时间复杂度分析依赖嵌套循环

时间:2014-12-18 18:08:41

标签: time complexity-theory

我在理解嵌套循环的时间复杂性方面遇到了很多麻烦。我已经搜索了数周的资源在线/书籍等。但我无法理解嵌套的依赖循环是如何工作的。以此为例

for (int i=0; i<n; i++) //n is even //n + 1
    for (int j=i; j<n/2; j++) //(n/2 + 3)*n/4 + n/2 = n2/8+5n/4
        cout << i << “,” << j <<endl; //(n/2 + 1)*n/4 = n2/8 + n/4 

时间复杂性在评论中,但我不明白它是如何得出答案的。我理解第一个循环中的n + 1;它运行n次加上失败的情况。但从那以后我不明白。如果有人能够清楚地向我解释,我会很感激。

我也尝试用n值写出来但我不明白如何处理跟踪以达到这种复杂性。

1 个答案:

答案 0 :(得分:0)

可以使用算术级数的和来计算第二循环的迭代次数。让我们观察迭代i时的迭代次数:

  • 当i为0时,它执行n / 2次迭代(j = 0,1,...... n / 2 - 1)
  • 当我为1时,它执行n / 2 - 1次迭代(j = 1,...... n / 2 - 1)
  • 当我是n / 2 - 1时,它执行1次迭代(j = n / 2 - 1)
  • 当i> = n / 2时,它执行0次迭代

总的来说,迭代次数是:n / 2 +(n / 2 - 1)+ ... + 1 =((n / 2 + 1)*(n / 2))/ 2 =(n / 2 + 1)*(n / 4) - 这里我使用算术级数之和的公式。这正是你提到的价值(虽然以不同的方式表示)。

对于外部值 - (n / 2 + 3)* n / 4 + n / 2 = n2 / 8 + 5n / 4 - 对于i的每个值,循环将再执行一次操作 - 验证j是否超过限制n / 2。因此你必须求和((n / 2 + 1)+(n / 2)+ .... + 2)+ 1 *(n / 2) - 第一个总和是不大于n / 2的元素 - 1,第二个是其余的,立即未通过检查j