【问题标题】:What is O(log(n!)) and O(n!) and Stirling Approximation什么是 O(log(n!)) 和 O(n!) 以及斯特林近似
【发布时间】:2011-11-14 06:51:42
【问题描述】:

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

我认为这与斯特林近似有关,但我不太明白解释。

如果我错了,有人可以纠正我吗(关于 O(log(n!) = O(n log(n)))?如果可能的话,用更简单的术语来计算数学?我认为我不需要证明在现实中我只是想知道它是如何工作的。

【问题讨论】:

  • n! 就是这样。虽然奇怪的符号......
  • @leppie “就是这样”。啊……太搞笑了。

标签: big-o


【解决方案1】:

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)),它们是等效的 big-Oh 类。

【讨论】:

  • 哇。 log 的力量。
  • @kazuoua 您不能像这样将log 应用于等式的两边。如果可以,那么您也可以争辩说O(n²) = O(n),因为O(log(n²)) = O(2log(n)) = O(log(n))
  • @kazuoua 不能将log 应用于等价的两边的原因是因为每一边都是set 并且集合不在log 函数的域中。
  • @NickAceves 他们不是平等的班级。 O(n!)O(n^n) 的严格子集。这种“证明”毫无意义。 n/n^n 的极限是 n 到无穷大也是 0;与1/n^n 的限制相同。你的推理将证明O(1) = O(n^n)
  • @NickAceves 使用big-Oh的定义也很容易通过反证法证明O(n^n)不在O(n!)中。
【解决方案2】:

通过斯特林近似,

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 as n → ∞,我们可以得出结论 n! ∈ O(n^n) 但 O(n!) 不等价于 O(n^n)。 O(n^n) 中存在 O(n!) 中不存在的函数(例如 n^n 本身)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-01-24
    • 1970-01-01
    • 2012-05-09
    • 2011-12-12
    • 2011-12-11
    • 2019-11-19
    • 1970-01-01
    • 2022-01-20
    相关资源
    最近更新 更多