用大O计算时间复杂度

时间:2016-10-05 14:55:01

标签: algorithm math time-complexity big-o

我有一项我不确定的任务;我必须计算以下代码的时间复杂度:

int a[][] = new int[m][n];        //O(1)
int w = 0;                        //O(1)
for (int i = 0; i < m; i++)       //O(n)
    for (int j = 0; j <n; j++)    //O(n)
         if (a[i] [j] % 2 == 0)   //O(logn)
         w++;                     //O(1)

所以根据我的估计,我把它们加起来:

O(1)+ O(1)+ O(n)*(O(n)*(O(logn)+ O(1)/ 2))
O(1)+ O(1)+ O(n)*(O(nlogn)+ O(n)/ 2)
O(1)+ O(1)+(O(n 2 logn)+ O(n 2 )/ 2)
= O(N 2 logn)时间

我不确定我的思路是否正确,有人可以帮忙吗?

3 个答案:

答案 0 :(得分:3)

 for (int i = 0; i < m; i++)  //O(m)
  {   
    for (int j = 0; j <n; j++) //O(n)
    {
      // your code
    }
  }  

因此i循环将持续m次,并且j循环将运行n次。 总的来说,代码将持续m*n次,这将是它的时间复杂度:O(m.n)

答案 1 :(得分:3)

for (int i = 0; i < m; i++)       //O(m)
    for (int j = 0; j <n; j++)    //O(n)
         if (a[i] [j] % 2 == 0)   //O(1)
         w++;                     //O(1)

因此,的总复杂度为:

O(m)*(O(n) + O(1) + O(1)) = O(m)*O(n) = O(m*n)

答案 2 :(得分:-1)

最终的复杂性是O(n ^ 2)

你的逻辑很接近,除了......

int a[][] = new int[m][n];        //O(1)
int w = 0;                        //O(1)
for (int i = 0; i < m; i++)       //O(n)
    for (int j = 0; j <n; j++)    //O(n)
         if (a[i] [j] % 2 == 0)   //O(1)
         w++;                     //O(1)

嵌入在第二个for循环中的if语句只是引用数组中的元素并进行基本比较。这是时间复杂度O(1)。此外,通常您不会考虑在时间复杂度问题中初始化变量。