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

Time 依赖嵌套循环的时间复杂度分析,time,complexity-theory,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)*

我很难理解嵌套循环的时间复杂性。我已经在网上搜索了数周的资源/书籍等,但我就是不明白嵌套的依赖循环是如何工作的。以这个为例

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值写出它,但我不知道如何处理跟踪以达到这种复杂性。

第二个循环的迭代次数可以使用算术级数的和来计算。让我们观察一下当我被迭代时它执行了多少次迭代:

当i为0时,它执行n/2迭代j=0,1。。。。n/2-1 当i为1时,它执行n/2-1迭代j=1。。。。n/2-1 当i为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的元素,第二个和用于立即未通过检查的剩余元素。如果您正在寻找“大O”符号,则双循环为*n,或处于更详细的级别。请注意,对于从n+3/2到n-1的i值,内部循环根本不执行,因为j已经大于n/2。更详细的级别,基本上是注释的是每行的时间复杂度,我正在尝试找出如何获得这些值。