此嵌套三重for循环的复杂性是什么? [英] What is the complexity of this nested triple for loop?

查看:179
本文介绍了此嵌套三重for循环的复杂性是什么?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我在StackOverflow上进行了一些搜索,并了解了直到j循环为止的复杂度,即 O(n 2 。但是,由于嵌套了k循环,我感到困惑,因为为什么复杂度变为 O(n 3 。有人可以帮我理解吗?

I have searched a bit on StackOverflow and have understood the complexity up to the point of the j-loop, which is O(n2). However with the nested addition of the k-loop, I am confused as why the complexity becomes O(n3). Can someone help me understand this?

据我了解,i循环有n次迭代,j循环有1 + 2 + 3 + ... + n迭代 n *(n + 1)/ 2 ,即 O(n 2

From my understanding, the i-loop have n iterations and the j-loop have 1+2+3+...+n iterations n*(n+1)/2 which is O(n2).

for(i = 1; i < n; i++) {   
    for(j = i+1; j <= n; j++) {
        for(k = i; k <= j; k++) {
           // Do something here...
        }
    }
}

编辑:感谢您的所有帮助:) Balthazar,我已经写了一段代码,可以根据它们所在的循环来增加计数器的数量,这是一种循序渐进的粗略方法:

Thanks for all your help guys :) Balthazar, I have written a piece of code to which will increment counters depending on which loop they are in, kinda a crude way of step-by-step:

#include <iostream>

int main(int argc, const char * argv[])
{
    int n = 9;
    int index_I = 0;
    int index_J = 0;
    int index_K = 0;
    for (int i = 1; i < n; i++) {
        for (int j = i+1; j <= n; j++) {
            for (int k = i; k <= j; k++) {
                index_K++;
            }
            index_J++;
        }
        index_I++;
    }
    std::cout << index_I << std::endl;
    std::cout << index_J << std::endl;
    std::cout << index_K << std::endl;
    return 0;
}

我将此代码从n = 2运行到n = 9,增量为1并具有以下顺序:

I ran this code from n=2 to n=9 with increments of 1 and have got the following sequence:

因此从计数器中可以看出:
i = n-1给出O(n)的复杂度,并且j =((n-1)* n)/ 2给出复杂度 O(n 2 。很难发现K的模式,但是已知K取决于J,因此:

From the counters, it can therefore be seen that: i = n-1 giving the complexity of O(n) and j = ((n-1)*n)/2 giving the complexity O(n2). A pattern for K was hard to spot but it is known that K depends on J, therefore:

k =((n + 4)/ 3)* j =(n *( n-1)*(n + 4))/ 6 给出 O(n 3

k = ((n+4)/3)*j = (n*(n-1)*(n+4))/6 giving a complexity of O(n3)

我希望这对以后的人们有所帮助。

I hope this will help people in the future.

EDIT2:谢谢Dukeling 进行格式化:)在最后一行中也发现了一个错误,现在已纠正

thanks Dukeling for the formatting :) Also found a mistake in the last line, corrected now

推荐答案

如果您习惯于Sigma表示法,这是一种推断算法时间复杂度的正式方法(精确地是简单的嵌套循环):

If you're accustomed to Sigma Notation, here is a formal way to deduce the time complexity of your algorithm (the plain nested loops, precisely):

NB :公式简化可能包含错误。如果您检测到任何东西,请告诉我。

NB: the formula simplifications might contain errors. If you detect anything, please let me know.

这篇关于此嵌套三重for循环的复杂性是什么?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆