这个伪代码的复杂度(Ø)是多少?

What is the complexity(Ø) of this pseudo code?

我的问题是关于找出这个算法的复杂性。 J值与n有关,所以我对此感到困惑。

这个伪代码的渐近复杂度是多少?

for i=1 to n
  do
  j = 1;
  while (j < n)
    do
    j = j * 2;

谢谢。

我相信是 O(n log<sub>2</sub>n)

外循环被调用 n 次,内循环被调用 log<sub>2</sub>n 次,因为在每个迭代,j 加倍。对于第一次迭代,即 k=0j 等于 1 并继续像 2, 4, 8, ... 直到 2<sup>k</sup>>=n

如果我在内部循环的末尾添加打印,我会看到:

(1,2,5)
(1,4,5)
(1,8,5)
(2,2,5)
(2,4,5)
(2,8,5)
(3,2,5)
(3,4,5)
(3,8,5)
(4,2,5)
(4,4,5)
(4,8,5)
(5,2,5)
(5,4,5)
(5,8,5)

所以它看起来是 O(n^2),但内部循环看起来是常数,所以可能是 O(n)——如果 (j < n) 部分切换到 (j < i),那将更接近于O(n log(n)):

(2,2,5)
(3,2,5)
(3,4,5)
(4,2,5)
(4,4,5)
(5,2,5)
(5,4,5)
(5,8,5)