【问题标题】:Factorial-time algorithms and P/NP阶乘算法和 P/NP
【发布时间】:2011-09-08 06:18:44
【问题描述】:

很容易看出 n!比几乎任何 N 次幂(例如 100^N)都慢,因此,如果一个问题被认为是 NP 完全的并且一个问题发生在 n 上!近似解的算法,人们会跳史努比舞。

我对这种情况有 2 个问题:

  1. n!算法被认为是多项式时间内的解决方案?阶乘肯定不会被提升为幂。
  2. 如果找到 n!解决方案意味着我们有一个相当快的算法,因为 n!增长快于 2^N,那么这是否意味着某些 NP 完全问题不需要启发式/逼近算法(晦涩的情况除外)?

当然,这两个问题依赖于第一段的真实性;如果我错了,请告诉我。

【问题讨论】:

  • n!确实比 k^n 增长得快。考虑一下,一旦 n > k 然后 n!肯定会增长得更快。
  • 我不明白你的评论,因为 n!对 n 的某个值进行评估,使得 n 大于 k 是单个数字(例如:如果 k = 10, 10! = 3628800)。
  • 考虑n的前100项!和 100^n。到目前为止,100^n 的增长速度已经超过了 n! (即,每个因素在 100^n vs n 中都更大!-- 1 vs 100, 2 vs 100, ...)。然而,过了这一点,n!将大于 100^n 中的相应项(101 对 100、102 对 100,...)。

标签: algorithm np-complete


【解决方案1】:
  1. 没有。阶乘时间不是多项式时间。多项式时间通常表示 O(Nk) 形式的方程,其中 N = 正在处理的项目数,k = 某个常数。重要的部分是指数是一个常数——你将 N 乘以它自己,其中一些是固定的——不依赖于 N 本身。阶乘复杂度算法意味着乘法的数量不是固定的——乘法的数量本身会随着 N 增长。

  2. 您似乎在这里遇到了同样的问题。 N2 将是多项式复杂度。 2N 不会。您的基本规则也是错误的——阶乘复杂度算法意味着“我们有一个相当快的算法”,至少作为一般规则。如果有的话,结论恰恰相反:阶乘算法在一些特殊情况下可能是实用的(即 N 非常小),但随着 N 的增长,非常很快就会变得不实用。

让我们试着正确看待这一点。二进制搜索是 O(log N)。线性搜索是 O(N)。在排序中,“慢”算法是 O(N2),“高级”算法是 O(N lg N)。阶乘复杂度(很明显)是 O(N!)。

让我们试着给出一些数字,考虑(目前)只有 10 个项目。这些中的每一个将大致是处理 10 个项目而不是 1 个项目的处理时间的多少倍:

O(log N): 2
O(N):10
O(N log N): 23
O(N2): 100
O(N!):3,628,800

目前我有点作弊,并使用自然对数而不是以 2 为底的对数,但我们只是在这里尝试进行大致估计(无论如何,差异都是一个相当小的常数因子)。

如您所见,阶乘复杂度算法的增长率比其他任何算法都快很多。如果我们将其扩展到 20 项,则差异会更加显着:

O(log N): 3
O(n): 20
O(N log N): 60
O(N2): 400
O(N!): 2,432,902,008,176,640,000

N! 的增长率!速度如此之快,几乎可以保证它们是不切实际的,除非涉及的项目数量已知非常少。对于 grins,我们假设上述进程的基本操作都可以在单个机器时钟周期内运行。只是为了争论(并保持计算简单),让我们假设一个 10 GHz CPU。因此,基础是处理一项需要 0.1 ns。在这种情况下,有 20 个项目:

O(log N) = .3 ns
O(N) = 2 ns
O(N log N) = 6 ns
O(N2) = 40 ns
O(N!) = 7.7 年。

【讨论】:

  • 非常感谢您确认我的直觉。 >“乘法本身的数量随着 N 增长。”更清楚地说,由于即使是 O(n) 算法也会使该陈述成立,因此增加样本大小 (n) 会增加序列中的乘法次数,该序列的增长速度比多项式时间的增长速度更快。 (更多内容在另一条评论中)
  • Re: 评论的后半部分和我的错误! vs. ^n 我被骗了! (或者至少,我应该查看 WolframAlpha 图表以获得更大的 X 和 Y 值;参见 wolframalpha.com/input/?i=x%21+vs.+5%5Ex)。感谢您纠正我。
  • 多年来我一直有一个奇怪的误解,即 $O(n)
【解决方案2】:

很容易看出阶乘在行为上是(大约)指数级的。

它可以(非常粗略地)近似为 nn(更具体地说,是 sqrt(2πn)(n/e)n)。

因此,如果您发现任何特定的 M,您认为 Mn 是一个很好的近似值,那么您(可能)错了。 269!大于 100n 并且作为 n!将乘以大于 100 的数字,它会继续增长得更快。

【讨论】:

  • +1 表示斯特林的近似值。虽然除非你自己推导出来,否则你可能应该提到他的名字。 :-)
  • 是的,经过进一步检查,即使是令人困惑的 WolframAlpha 图 (wolframalpha.com/input/?i=x%21+vs.+5%5Ex) 也揭示了 n!和 5^x 或多或少是彼此的翻译版本。
  • @Nemo:是的,我自己通常使用 n^n 作为粗略的近似值。
猜你喜欢
  • 1970-01-01
  • 2013-02-19
  • 2010-12-17
  • 1970-01-01
  • 2015-04-19
  • 2022-01-17
  • 1970-01-01
  • 2023-03-22
  • 2011-03-28
相关资源
最近更新 更多