以下哪个函数不是 O(log(N))

Which of the following functions is not O(log(N))

我有一道计算机科学的选择题class:

下面哪个函数不是O(log(N))

  1. log(log(N))
  2. 1000 + log(N)
  3. 1000 log(N)
  4. log(1000 N)
  5. log(N^2)
  6. 1000 log(1000 N^1000)
  7. 以上都是O(log(N))

哪个是正确答案?

正确的选项是 7 - 每一个都是 O(log(N))

让我们看看原因:

  1. log(log(N)) - 这比 log(N) 增长得慢,所以从技术上讲,你可以说它是 O(log(N))(尽管实际上人们通常会尝试获得最紧绑定,所以你会说它是 O(log(log(N)))。 FWIW,你甚至可以说它是 O(N^2)O(N^N).

  2. 1000 + log(N) - 这显然是 O(log(N)) - 记住常量被丢弃;这里感兴趣的术语是 log(N).

  3. 1000 log(N)——同理,这里是O(log(N))(增长因子是log(N),这个常数在渐近分析中可以忽略不计)。

  4. log(1000 N) - 同样,常量...

  5. log(N^2) - 请记住 log(a^b)b log(a) 相同,因此 log(N^2)2 log(N) 相同出于同样的原因 O(log(N)).

  6. 1000 log(1000 N^1000) - 同样,这等同于 10^6 log(1000 N)O(log(N))

如果出于某种原因你仍然不确定为什么在渐近分析中常数被丢弃,你可以看看 the formal definition of Big O notation,但背后的直觉是随着 N 的增长,常数因素很容易变得(在某些时候)可以忽略不计,因此它们不会产生太大的影响。大 O 分析的重点是了解算法的 运行 时间如何随着输入越来越大而增长。