【问题标题】:How is log(n!) = Ω( n*log(n))? [closed]log(n!) = Ω(n*log(n)) 怎么算? [关闭]
【发布时间】:2014-03-30 16:40:42
【问题描述】:

我知道

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

 n*log(n)= log(n) + log(n) + .... + log(n) or just adding log(n)'s  n times. 

我可以将 n*log(n) 乘以哪个常数使其小于 log(n!)?

我阅读了一些关于它是 n/2*log(n/2) 的解决方案。那是什么常数?一半?

一个解决方案来自这里。 Is log(n!) = Θ(n·log(n))?

如果C = 1/2,那不就是(n/2)*log(n)吗?日志中的 n 是如何受到影响的,或者为什么 n 突然变成了 n/2?

我知道 log(a/b) = log a - log b 的日志规则。这条规则有用吗?

【问题讨论】:

标签: algorithm math big-o


【解决方案1】:

让第一个答案更加简单:

考虑n!=1*2*3*...*(n-1)*n与自身倒序组合,即为

   (n!)^2=(n)*(1*(n-1))*(2*(n-2))*...*((n-1)*1)*(n)

那么每个内积都允许以下估计

    k*(n-k)>=1*max(k,n-k)>=n/2

通过算术几何平均值,或者只是 x*(1-x) 在 0 和 1 中间的 1/2 处最大这一事实,

    k*(n-k)<=((n-k)+k)/2)^2=(n/2)^2

结合我们得到的一切

    n*(n/2)^(n-1)*n <= (n!)^2 <= n*(n/2)^(2(n-1))*n

取对数除以2

    (n+1)/2*log(n/2)+log(2) 
         <= log(n!) 
             <= n*log(n/2)+log(2)

所以下界的前导项为1/2*n*log(n),上界的前导项为n*log(n)

【讨论】:

    【解决方案2】:
    log(n!) = log(1) + ... + log(n) >= log(n/2) + log(n/2+1) + ... + log(n)
    >= n/2*log(n/2) = n/2 *log(n) - n/2*log(2) >= (*) n/2 log(n) - n/4 log(n) 
    = n/4 log(n) = 1/4 nlog(n) 
    

    (*) 是因为对于 n 的“足够高”值(对于某个常数 N,n>N)n/2log(2) &lt; n/4log(n),所以我们减少了“更大”的元素 - 这会导致结果更低。

    所以,我们得到了 log(n!) &gt;= 1/4*nlog(n) - 这让我们知道它在 Omega(nlogn) 中,定义为 c=1/4

    关于第一部分,我们如何到达log(n/2) + log(n/2+1) + ... +log(n)

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

    【讨论】:

    • 最后一个不等式不应该是另一个方向吗?我的意思是:n/2 *log(n) - n/2*log(2) &lt;= 1/2 * n*log(n).
    • 嗨,阿米特,我想知道你能否解释一下你是如何得到 log (n/2)+ log(n/2+1) + ... + log(n) 的?
    • @MattC 他只拿了后半部分的组件。这意味着他扔掉了前半部分,所有的成分都是非负的。
    • @Bolo 是的,你是对的 - 进行了必要的更改,对错误感到抱歉。
    • @MattC 查看答案的最后一部分,添加了解释。
    【解决方案3】:

    这不是一个简单的常数。我认为您正在考虑证明O(log(n!)) = O(n*log(n)),如果是这种情况,那么您需要使用Sterling's approximation。如果你使用这个近似值,你可以证明对于任何值 c &lt; 1 都应该有一个值 N 使得 n >= N c * n*log(n) &lt; log(n!)

    【讨论】:

    • (1)这个问题是关于 Omega,而不是 big-O。 (2) 不需要精确的(最紧的)常数,只需要显示这样一个常数存在,这相当简单。
    • @amit 我看到它是关于欧米茄的,但我认为我们需要最紧的。也许我误解了这个问题?
    • 根据我对问题的理解,@MattC 想知道如何证明 log(n!) 在 Omega(nlogn) 中,所以你只需要证明这样一个常数存在。
    • 我假设这个线程中有一个常量(我不明白)stackoverflow.com/questions/2095395/is-logn-nlogn
    • @MattC 你需要 a 常数还是尽可能紧的常数。如果您只需要任何 amit 的答案对您来说是完美的。如果您需要尽可能严格,您将需要我上面提到的内容。
    猜你喜欢
    • 1970-01-01
    • 2022-01-20
    • 1970-01-01
    • 1970-01-01
    • 2011-11-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-12
    • 2011-11-27
    相关资源
    最近更新 更多