什么是O(log(n!))
和O(n!)
?我相信它是O(n log(n))
和O(n^n)
?为什么?
我认为这与斯特林近似有关,但我没有得到很好的解释。
如果我错了(约O(log(n!)
= O(n log(n))
),有人可以纠正我吗?如果可能,数学用简单的术语表示?我认为我不需要证明实际上我只是想知道它是如何工作的。
答案 0 :(得分:65)
O(n!)
不等同于O(n^n)
。它渐近地小于O(n^n)
。
O(log(n!))
等于O(n log(n))
。这是一种证明:
请注意,通过使用日志规则log(mn) = log(m) + log(n)
,我们可以看到:
log(n!) = log(n*(n-1)*...2*1) = log(n) + log(n-1) + ... log(2) + log(1)
证明 O(log(n!)) ⊆ O(n log(n))
:
log(n!) = log(n) + log(n-1) + ... log(2) + log(1)
小于:
log(n) + log(n) + log(n) + log(n) + ... + log(n) = n*log(n)
因此O(log(n!))
是O(n log(n))
证明 O(n log(n)) ⊆ O(log(n!))
:
log(n!) = log(n) + log(n-1) + ... log(2) + log(1)
哪个大于(表达式的左半部分,所有(n-x)
替换为n/2
:
log(n/2) + log(n/2) + ... + log(n/2) = floor(n/2)*log(floor(n/2)) ∈ O(n log(n))
所以O(n log(n))
是O(log(n!))
的子集。
从O(n log(n)) ⊆ O(log(n!)) ⊆ O(n log(n))
开始,它们就等同于大班哦。
答案 1 :(得分:9)
通过斯特林的近似,
log(n!) = n log(n) - n + O(log(n))
对于大n,右侧由术语n log(n)支配。这意味着O(log(n!))= O(n log(n))。
更正式地说,"Big O"的一个定义是f(x)= O(g(x))当且仅当
lim sup|f(x)/g(x)| < ∞ as x → ∞
使用斯特林的近似,使用这个定义很容易显示log(n!)∈O(n log(n))。
类似的论点适用于n!。通过取斯特林近似两边的指数,我们发现,对于大n,n!行为渐近地像n ^(n + 1)/ exp(n)。由于n / exp(n)→0为n→∞,我们可以得出n! ∈O(n ^ n)但O(n!)不等于O(n ^ n)。 O(n ^ n)中的函数不在O(n!)中(例如n ^ n本身)。