Algorithm 循环的增长顺序

Algorithm 循环的增长顺序,algorithm,time-complexity,Algorithm,Time Complexity,下面代码的增长顺序是什么。我的猜测是,每个循环的增长都是线性的,但是if语句让我感到困惑。我怎么把它和整件事联系起来呢。我非常希望得到一个解释性的答案,这样我就可以理解所涉及的过程 int count = 0; for (int i = 0; i < N; i++) for (int j = i+1; j < N; j++) for (int k = j+1; k < N; k++) if(a[i] + a[j] + a[k] == 0) count++; int count

下面代码的增长顺序是什么。我的猜测是,每个循环的增长都是线性的,但是if语句让我感到困惑。我怎么把它和整件事联系起来呢。我非常希望得到一个解释性的答案,这样我就可以理解所涉及的过程

int count = 0;
for (int i = 0; i < N; i++)
for (int j = i+1; j < N; j++)
for (int k = j+1; k < N; k++)
if(a[i] + a[j] + a[k] == 0)
count++;
int count=0;
对于(int i=0;i
代码的增长顺序为O(N^3)


一般来说,长度为N的k个嵌套循环有助于O(N^k)的增长。

当试图确定代码的复杂性时,有两件事情可能会让人困惑

  • 并非所有循环都从0开始。第二个循环从
    i+1
    开始,第三个循环从
    j+1
    开始。这会影响复杂性吗?事实并非如此。让我们只考虑前两个循环。对于
    i=0
    ,第二个运行
    N-1
    次,对于
    i=1
    它运行
    N-2
    次,…,对于
    i=N-1
    它运行
    0
    次。把这些加起来:

    0 + 1 + ... + N - 1 = N(N - 1) / 2 = O(N^2).
    
    因此,不从0开始不会影响复杂性(请记住,大oh忽略低阶项和常量)。因此,即使在这个设置下,整个过程也是
    O(N^3)

  • if
    语句。
    if
    语句在这里显然不相关,因为它只是最后一个循环的一部分,不包含
    break
    语句或其他会影响循环的代码。它只影响计数的递增,而不影响任何循环的执行,因此我们可以安全地忽略它。即使计数没有增加(一个
    O(1)
    操作),检查
    if
    条件(也是一个
    O(1)
    操作),因此使用和不使用
    if
    执行相同的大致操作数

    因此,即使使用
    if
    语句,算法仍然是
    O(N^3)


  • 这里有两个是在没有太多计算的情况下发现时间复杂度是θ(N^3)


    首先,您选择
    i嵌套循环收缩每个迭代是否会影响结果?我期待的是阶乘或其他修饰符不是真的。虽然它会影响N^k旁边的常数,但它并不会真正影响O的表示法。也许我当时出错了,对此我还是很陌生:O(N*(N-1)*(N-2))=O(N^3-3*N^2+2n)你完全正确!注意O(n^3-3*n^2+2n)=O(n^3),因为最大的“因子”总是超过。我能问一下为什么你把n(n-1)除以2吗。@JVTura-因为求和是通过将第一项与最后一项、第二项与倒数第二项进行分组来计算的。例如,对于
    0+1+2+3+4
    ,我们将
    (0+4)+(1+3)+(2+2)+(3+1)+(4+0)
    。有
    N=5
    组,每个组的和
    N-1=4
    。但是我们必须除以2,因为每个组发生两次,所以如果我们不除以,我们就会求和过多:
    5*4/2=10
    ,这是正确的。这个代码片段的增长顺序是什么?
    int sum=0;for(int N=N;N>0;N/=2;)for(int i=0;i
    (代码行的(缺少)注释和缩进让人怀疑这应该做什么。)请明确说明
    [猜测]每个循环的增长都是线性的
    。你的问题是什么?你有一条语句,它的成本可以被视为常数,作为它的控制。这是在一个三重嵌套的循环中:如果所有循环都从0运行到N呢?如果是上面的初始值呢?