什么是O(log(n!))和O(n!)和斯特林近似

时间:2011-11-14 06:51:42

标签: big-o

什么是O(log(n!))O(n!)?我相信它是O(n log(n))O(n^n)?为什么?

我认为这与斯特林近似有关,但我没有得到很好的解释。

如果我错了(约O(log(n!) = O(n log(n))),有人可以纠正我吗?如果可能,数学用简单的术语表示?我认为我不需要证明实际上我只是想知道它是如何工作的。

2 个答案:

答案 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本身)。