如何计算以下函数的时间复杂度?

时间:2017-02-20 16:06:22

标签: algorithm time-complexity

以下功能的时间复杂度是多少?

void function(int n){
        for(int i=0; i<n; i++){. //n times
            for(int j=i ; j< i*i; j++){ // n*n times
                if(j%i == 0){
                    for(int k=0; k<j; k++){ // j times = n * n times.
                        ++counter;
                    }
                }
            }
        }
    }

书上写着O(n^5)。但我无法理解为什么书没有考虑j%ik循环基于此确定。你能说清楚吗?

2 个答案:

答案 0 :(得分:1)

让我们考虑你怀疑的代码部分:

for(int j=i ; j< i*i; j++)
{ 
  if(j%i == 0)
        {
               for(int p=0; p<j; p++){ 
               ++counter;
        }
      }

让我们分析这部分代码。 对于每i j%i==0,只要ji的倍数, i, 2i, 3i, .... i*i // upto i*i only,since j<i*i 就为真,即

j

现在,对于每个O(j),内部复杂度为O(n*n^3)

这部分代码的复杂性是:

enter image description here

因此,总体复杂度= O(n^4) = function.php

答案 1 :(得分:1)

实际上函数在时间O(n ^ 4)中运行,因为if条件每n个循环只发生一次。请参阅下面的精确分析。

void function (int n) {
    for(int i=0; i<n; i++) {
        // Runs a total of n times
        for(int j=i; j< i*i; j++) {
            // Runs a total of (n^3 - n)/3 = O(n^3) times
            if(j%i == 0) {
                // Runs a total of (n^2 - n)/2 = O(n^2) times
                for(int k=0; k<j; k++) {
                    // Runs a total of (3n^4 - 10n^3 + 9n^2 - 2n)/24 = O(n^4) times
                    ++counter;
                }
            }
        }
    }
}