我为计算机科学课提出了一个多项选择题:
以下哪项功能不是O(log(N))
log(log(N))
1000 + log(N)
1000 log(N)
log(1000 N)
log(N^2)
1000 log(1000 N^1000)
O(log(N))
哪一个是正确答案?
答案 0 :(得分:5)
正确的选项是7 - 每个选项都是O(log(N))
。
让我们看看原因:
log(log(N))
- 这比log(N)
慢,所以从技术上来说,你可以说它是O(log(N))
(虽然实际上人们通常会尝试获得最严格的约束,所以你会说它是O(log(log(N))
)。 FWIW,您甚至可以说O(N^2)
或O(N^N)
。
1000 + log(N)
- 这显然是O(log(N))
- 请记住常量被删除;这里感兴趣的是log(N)
。
1000 log(N)
- 出于同样的原因,这是O(log(N))
(增长因子是log(N)
,常数在渐近分析中可以忽略不计。)
log(1000 N)
- 再次,常数...
log(N^2)
- 请记住log(a^b)
与b log(a)
相同,因此log(N^2)
与2 log(N)
相同,原因相同是O(log(N))
。
1000 log(1000 N^1000)
- 再次,这相当于10^6 log(1000 N)
O(log(N))
。
如果由于某种原因你仍然不确定为什么常量渐近被丢弃,你可以看一下the formal definition of Big O notation,但背后的直觉是随着N
的增长,常数因素很容易变得(在某些时候)可以忽略不计,因此它们并没有产生太大的影响。 Big O分析的目的是让人们了解算法的运行时间随着输入越来越大而增长。