【问题标题】:Time Complexity Review时间复杂度审查
【发布时间】:2015-12-04 20:38:38
【问题描述】:
以下代码 sn-p 的时间复杂度是多少?
int[][] A = new int [n][];
for (int i=0; i<n; i++) {
if (i % 2 == 0) // i is a multiple of 2
A[i] = new int [n];
else
A[i] = new int [1];
}
for (int i=0; i<A.length; i++)
for (int j=0; j<A[i].length; j++)
sum = sum + A[i][j];
我了解第一个for循环循环n次,那么,将有n/2行长度为n的矩阵,n/2长度为1。总时间是n^2吗?
【问题讨论】:
标签:
time
big-o
time-complexity
【解决方案1】:
是的,复杂度将是 O(n2)。
怎么做?
- 一半的时间(即 n/2 次),您将遍历 n 个元素 = (n/2) * n = n2/2。
- 一半的时间(同样是 n/2 次),您将只有一个元素需要迭代 = (n/2) * 1 = n/2。
- 因此,整体复杂度 = O(n2/2 + n/2) = O(n2)
【解决方案2】:
首先让我们用术语来决定。例如,假设每个操作都等于1。让我们获取您的代码(只是为了保持一致 - 我们将调用此方法)并逐行执行。
int[][] A = new int [n][];
这将等于1。
for (int i=0; i<n; i++) {
这里我们有循环,最坏的情况是n。
if (i % 2 == 0) // 1
A[i] = new int [n]; // 1
else
A[i] = new int [1]; // 1
}
以上操作可算1个。
for (int i=0; i<A.length; i++)
循环等于n-elements。
for (int j=0; j<A[i].length; j++)
内循环相同n。
sum = sum + A[i][j];
这将再次等于1。
内循环是相乘,所以你是对的,但要考虑到这将是大 O 符号 O(n2)。