我认为是O(n * log(n)),但不确定。
我尝试过log(n * n!)= log(n(n * n-1 * n-2 * ... * 1))= n log(n)+ log(n)+ log (n-1)+ ... + log(1)<= nlog(n)+ nlog(n)= 2n log(n)
有人可以解释这是否正确吗?
答案 0 :(得分:0)
log(n*n!) = log(n) + log(n!)
= log(n) + log(n) + log(n-1) + ... + log(2)
<= log(n) + (n-1)log(n)
= n*log(n)
log(n*n!) = log(n) + log(n) + log(n-1) + ... + log(2)
>= log(n) + (n-1)/2*log(n/2) ; 1st half >= log(n/2), 2nd >= 0
>= log(n/2) + (n-1)/2*log(n/2)
= (n+1)/2*log(n/2)
>= (n/2)log(n/2)
注意: 在这里,我假设log(2)>0
,如果我们以2为底的对数,则为true。这是一个有效的假设,因为不同底数的对数之间的关系是线性的,并且线性关系由big-O保留。
直观地,我们看到这是O(n*log(n))
,对吧?但是为什么是真的吗?
要了解原因,我们需要找到C > 0
和N0
这样的
(N0/2)log(N0/2) >= C*N0*log(N0)
减少为:
log(N0/2)/log(N0) >= 2*C
或
1 - log(2)/log(N0) >= 2*C
因此,选择C < 1/2
,例如C = 1/4
,N0
的值仅需验证:
log(N0) >= 2*log(2) = log(4).
因此足以拍摄N0 = 4
。
请注意,对于两个常数C
和N0
,我们有一个不等式。这就是为什么我们必须选择一个(足够好),然后推断另一个的原因。