我在理解嵌套循环的时间复杂性方面遇到了很多麻烦。我已经搜索了数周的资源在线/书籍等。但我无法理解嵌套的依赖循环是如何工作的。以此为例
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值写出来但我不明白如何处理跟踪以达到这种复杂性。
答案 0 :(得分:0)
可以使用算术级数的和来计算第二循环的迭代次数。让我们观察迭代i
时的迭代次数:
总的来说,迭代次数是: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