for (int j=0,k=0; j<n; j++)
for (double m=1; m<n; m*=2)
k++;
我认为这是O(n ^ 2),但我不确定。我正在研究练习题,我有以下选择:
答案 0 :(得分:5)
外环似乎很明显是O(n)。每次迭代增加1。 然而,内环增加了2的幂。指数当然与对数相关(实际上是相反的)。
为什么要来O(n ^ 2)解决方案?证明它。
答案 1 :(得分:3)
O(nlog 2 n)。代码块运行n * log 2 n次。
假设n=16
;然后第一个循环运行16(= n)次。第二个循环运行4(= log 2 n)次(m = 1,2,4,8)。所以内部语句k++
运行64次=(n * log 2 n)次。
答案 2 :(得分:2)
让我们看一下最坏的情况。对于第二次循环搜索从1,2,4,8继续....假设对于某些k> = 0,n是2 ^ k。在最坏的情况下,我们可能最终搜索直到2 ^ k并且意识到我们超过了目标。现在我们知道目标可以是2 ^(k - 1)和2 ^ k。该范围内的元素数量为2 ^(k - 1)(想想一秒)。到目前为止我们检查的元素数量是O(k),它是O(logn),对于第一个循环,它是O(n)。(太容易找到)。那么整个代码的顺序就是O(n(logn))。
答案 3 :(得分:1)
解决这些问题的一般方法是考虑每个循环的顺序,并且因为它们是嵌套的,所以可以乘以“O”符号。
大“O”的一些简单规则:
O(n)O(m) = O(nm)
O(n) + O(m) = O(n + m)
O(kn) = O(n)
其中'k'是常量'j'循环迭代n个元素,所以很明显它是O(n)。 'm'循环遍历log(n)元素,因此它是O(log(n))。
由于循环是嵌套的,我们的最终结果是O(n) * O(log(n)) = O(n*log(n))
。