Mar*_*ark 202 algorithm math recursion complexity-theory big-o
我要显示log(n!)=Θ(n ·log(n)).
给出了一个提示,我应该用n n显示上限,并用(n/2)(n/2)显示下限.这对我来说似乎并不那么直观.那为什么会这样?我绝对可以看到如何将n n转换为n ·log(n)(即记录等式的两边),但这种情况是向后的.
解决这个问题的正确方法是什么?我应该绘制递归树吗?这没有任何递归,所以这似乎不是一个可能的方法..
Mic*_*ick 277
记住这一点
log(n!) = log(1) + log(2) + ... + log(n-1) + log(n)
Run Code Online (Sandbox Code Playgroud)
你可以得到上限
log(1) + log(2) + ... + log(n) <= log(n) + log(n) + ... + log(n)
= n*log(n)
Run Code Online (Sandbox Code Playgroud)
丢掉总和的前半部分后,你可以通过做类似的事情来获得下限:
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)
Run Code Online (Sandbox Code Playgroud)
Nem*_*emo 38
我意识到这是一个非常古老的问题并且已经接受了答案,但这些答案实际上都没有使用提示建议的方法.
这是一个非常简单的论点:
n!(= 1*2*3*...*n)是n每个小于或等于的数字的乘积n.因此它小于n数字的乘积都等于n; 即,n^n.
产品中有一半的数字 - 即n/2它们 - n!大于或等于n/2.因此他们的产品大于n/2数字的乘积都等于n/2; 即(n/2)^(n/2).
记录整个日志以确定结果.
对不起,我不知道如何在stackoverflow上使用LaTeX语法..
对于下限,
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
Run Code Online (Sandbox Code Playgroud)
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)
进一步帮助您,Mick Sharpe 离开您的地方:
它的推导非常简单:参见http://en.wikipedia.org/wiki/Logarithm -> Group Theory
log(n!) = log(n * (n-1) * (n-2) * ... * 2 * 1) = log(n) + log(n-1) + ... + log(2) ) + 日志(1)
将 n 视为无限大。什么是无穷减一?还是减二?等等。
log(inf) + log(inf) + log(inf) + ... = inf * log(inf)
然后将inf视为 n。
| 归档时间: |
|
| 查看次数: |
175182 次 |
| 最近记录: |