我需要证明 log(n!) = Θ(n·log(n))。
提示说我应该用 nn 来证明上界,并用 (n/2)(n/2) 来证明下界。这对我来说似乎并不是那么直观。为什么会这样呢?我确实可以看到如何将 nn 转换为 n·log(n)(即在等式两边取对数),但这有点像倒推。
应该采取什么正确的方法来解决这个问题?我应该画递归树吗?这个问题没有递归,所以这似乎不是一个可行的方法。
我需要证明 log(n!) = Θ(n·log(n))。
提示说我应该用 nn 来证明上界,并用 (n/2)(n/2) 来证明下界。这对我来说似乎并不是那么直观。为什么会这样呢?我确实可以看到如何将 nn 转换为 n·log(n)(即在等式两边取对数),但这有点像倒推。
应该采取什么正确的方法来解决这个问题?我应该画递归树吗?这个问题没有递归,所以这似乎不是一个可行的方法。
请记住
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)
log(n!)
的一部分,即 log(n/2) + log(n/2 + 1) + ... + log(n - 1) + 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我意识到这是一个很老的问题,并且有一个被接受的答案,但是这些答案都没有使用提示所提出的方法。
这是一个非常简单的论点:
n!
(= 1*2*3*...*n)是n
个小于或等于n
的数字的乘积。因此,它比所有等于n
的n
个数字的乘积n^n
要小。
在n!
中,一半的数字(即n/2
个数字)大于或等于n/2
。因此,它们的乘积大于所有等于n/2
的n/2
个数字的乘积;即(n/2)^(n/2)
。
通过取对数可以证明结果。
log
将其带到负值,因此渐近结果实际上是O(nlogn) - {something}
。仍然需要证明该“something”在渐近意义下与nlogn
相比是微不足道的 - 而这个答案并没有提供它。这不会影响大O,但可能会影响Omega。无论如何,这是过度复杂化了,可以看看其他答案。 - SomeWittyUsername对于下界,
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)
谢谢,我认为你的回答很有说服力,但在我的情况下,我必须使用Θ属性:
log(n!) = Θ(n·log n) => log(n!) = O(n log n) and log(n!) = Ω(n log n)
为了验证我发现的问题,我找到了这个网站,其中详细解释了整个过程:http://www.mcs.sdsmt.edu/ecorwin/cs372/handouts/theta_n_factorial.htm
在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。
eln(x) = x和
(lm)n = lm*n
如果你重新构思这个问题,你可以用微积分来解决!这个方法最初是通过Arthur Breitman向我展示的https://twitter.com/ArthurB/status/1436023017725964290。
首先,你要对log(x)从1到n进行积分,结果是n*log(n) - n + 1
。这证明了一个紧密的上界,因为log是单调的,对于每个点n,从n
到n+1
的log(n)
的积分大于log(n) * 1
。你可以类似地使用log(x-1)
来构造下界,因为对于每个点n,1*log(n)
大于从x=n-1
到n
的log(x)
的积分。从0
到n-1
的log(x)
的积分是(n-1)*(log(n-1) - 1)
,或者n log(n-1) - n - log(n-1) + 1
。
这些约束非常紧密!