我有一项我不确定的任务;我必须计算以下代码的时间复杂度:
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)时间
我不确定我的思路是否正确,有人可以帮忙吗?
答案 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)
因此,big-o的总复杂度为:
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)。此外,通常您不会考虑在时间复杂度问题中初始化变量。