log(n!)=Θ(n·log(n))吗?


217

我要证明log(n!)=Θ(n ·log(n))

提示我应该用n n表示上限,而用n / 2)n / 2)表示下限。在我看来,这似乎并不那么直观。为什么会这样呢?我绝对可以看到如何将n n转换为n ·log(n(即,记录方程的两边),但这有点倒退。

解决这个问题的正确方法是什么?我应该画递归树吗?对此没有任何递归,因此这似乎不是一种可行的方法。


1
您应该真正编写它,包括“ as n->∞”
MartW 2010年

2
有趣的练习:使用类似的技巧来显示谐波系列1/1 + 1/2 + 1/3 + 1/4 + ...趋于无穷大。
Yoo 2010年

10
这不应该在c.stackexchange.com吗?
CodyBugstein 2013年

5
@ CodyBugstein,cs.stackexchange.com早在提出问题时就不存在了
MrMartin

Answers:


303

请记住

log(n!) = log(1) + log(2) + ... + log(n-1) + log(n)

您可以通过以下方式获得上限

log(1) + log(2) + ... + log(n) <= log(n) + log(n) + ... + log(n)
                                = n*log(n)

在丢弃总和的前一半之后,可以通过执行类似的操作来获得下界:

log(1) + ... + log(n/2) + ... + log(n) >= log(n/2) + ... + log(n) 
                                       = log(n/2) + log(n/2+1) + ... + log(n-1) + log(n)
                                       >= log(n/2) + ... + log(n/2)
                                        = n/2 * log(n/2) 

5
这是一个很好的上限证明:log(n!)= log(1)+ ... + log(n)<= n log(n)=> log(n!)= O(n log n )。但是,为了证明下界(因此证明是大四面体),您可能需要斯特林近似法。
Mehrdad Afshari 2010年

33
您不需要下界的英镑近似值。log(n!)= log(1)+ ... + log(n)> = log(n / 2)+ ... + log(n)> = n / 2 * log(n / 2)=Ω (n log n)。
基思·兰德尔

2
@基思:我还不明白。您(或某人)能否在“ log(n / 2)+ ... + log(n)”的“ ...”部分为我扩展一些术语?谢谢!
j_random_hacker 2010年

6
@j_random_hacker :(log(n/2) + log(n/2 + 1) + ... + log(n - 1) + log(n)占条款的一半log(n!))。实际上,我刚刚阅读了问题,并看到了问题中的线索。基本上,(n/2)^(n/2) <= n! <= n^n=> log((n/2)^(n/2))<=log(n!)<=log(n^n)=>Θ(n/2 * log(n/2))<=log(n!)<=Θ(n*log(n))
Mehrdad Afshari 2010年

4
该解释类似于已接受的答案,但有更多详细信息:mcs.sdsmt.edu/ecorwin/cs372/handouts/theta_n_factorial.htm
gayavat 2015年

40

我意识到这是一个非常老的问题,答案是可以接受的,但是这些答案实际上都没有使用提示所建议的方法。

这是一个非常简单的参数:

n!(= 1 * 2 * 3 * ... * n)是n每个均小于或等于的数字的乘积n。因此它小于n所有等于的数字的乘积n; 即n^n

产品中一半的数字(即n/2其中的一半)n!大于或等于n/2。因此他们的乘积大于n/2全部等于的数字的乘积n/2; 即(n/2)^(n/2)

全面记录日志以确定结果。


9
这实际上与接受的答案中的对数版本相同,但取对数为后而不是之前。(尽管它更清楚地使用了提示)
hugomg

13

在此处输入图片说明

抱歉,我不知道如何在stackoverflow上使用LaTeX语法。


1
这是一个很好的解释!我可以遵循此步骤直到第7步,但是我无法解码在第7步和第8步之间发生的数学运算式... :-(
Z3d4s

3
@ Z3d4s步骤7中的参数基本上是,右边的第一项是主要项,因此log(n!)可以近似为n log(n)或它的阶为n log(n)。用大O表示法O(n * log(n))表示。
随机

1
@ Z3d4s 7-8转换步骤表示n logn == log(n ^ n),并在此处显示界限,可以说第一个项始终大于第二个项,可以检查是否有更大的值,并且为了表示big-O的复杂性,我们将始终把所有事情都放在最主要的位置。因此,n logn有助于big-O时间。
Shiv Prakash


7

对于下限,

lg(n!) = lg(n)+lg(n-1)+...+lg(n/2)+...+lg2+lg1
       >= lg(n/2)+lg(n/2)+...+lg(n/2)+ ((n-1)/2) lg 2 (leave last term lg1(=0); replace first n/2 terms as lg(n/2); replace last (n-1)/2 terms as lg2 which will make cancellation easier later)
       = n/2 lg(n/2) + (n/2) lg 2 - 1/2 lg 2
       = n/2 lg n - (n/2)(lg 2) + n/2 - 1/2
       = n/2 lg n - 1/2

lg(n!)> =(1/2)(n lg n-1)

结合两个界限:

1/2(n lg n-1)<= lg(n!)<= n lg n

通过选择大于(1/2)的下界常数,我们可以补偿括号内的-1。

因此lg(n!)= Theta(n lg n)


2
之所以需要这种扩展推导,是因为“某物”> = n / 2 * lg(n / 2)不等于在先前评论之一中提到的omega(n lg n)。
Vivek Anand Sampath

当我们试图找到一个下限时,它应该显示为“小于(1/2)的常量SMALLER”。任何小于(1/2)的常数c最终都会使c n logn <=(1/2)n * logn-(1/2)n,对于足够大的n。
马修

3

Mick Sharpe离开您的地方进一步为您提供帮助:

它的推导非常简单:请参阅http://en.wikipedia.org/wiki/Logarithm- >组理论

log(n!)= log(n *(n-1)*(n-2)* ... * 2 * 1)= log(n)+ log(n-1)+ ... + log(2 )+ log(1)

认为n 无限大。什么是无限减一?或减两个?等等

log(inf)+ log(inf)+ log(inf)+ ... = inf * log(inf)

然后将inf视为n。



1

这可能会有所帮助:

e ln(x) = x

(l mn = l m * n

3
实际上,这是错误的:1 ^(m ^ n)!= 1 ^(m n)它必须是(1 ^ m)^ n = 1 ^(m n)
Pindatjuh 2010年

错误,我的意思是L而不是上面评论中的1。
达朱2010年

他没有写(l ^ m)^ n的1 ^(m ^ n)
CodyBugstein

1
@CodyBugstein:进行了修改以解决此问题,您在几年后评论了该错误隐藏在历史中时
Ben Voigt

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.