这是一个算法教科书的问题,我认为时间复杂度是log(n!),但是我的同学说它是nlog(n)。非常感谢你回复!!
count ← 0
for i ← 1 to n do
j ← ⌊n/2⌋
while j ≥ 1 do
count ← count + 1
if j is odd then
j←0
else
j ← j/2
end if
end while
end for
答案 0 :(得分:3)
我认为时间复杂度为
log(n!)
,但我的同学说它是nlog(n)
。
你是对的。从Stirling's formula可以看出,
log n! = n * log n - n +O(log(n)),
(log
是这里的自然对数)更准确地说:
log n! = (n + 1/2) * log n - n + 1/2 * log (2π) + O(1/n)
因此O(log n!)
和O(n*log n)
属于同一类。
答案 1 :(得分:1)
在最坏的情况下,n = 2 p
因此,n * log
2 (n)
次迭代,或时间复杂度为O(n log(n))
-
(根据评论,日志库的复杂性不是必需的,因为 log 2 (x)实际上是 log(x)/ log(2) )即 log(x)乘以常数)