因子时间算法和P / NP

时间:2011-06-04 05:32:39

标签: algorithm np-complete

很容易看到n!比N几乎任何东西都要慢得多(比如100 ^ N),所以,如果一个问题被认为是NP完全而且一个发生在一个n!算法近似解决方案,人们会做史努比舞蹈。

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

  1. n!算法被认为是多项式时间的解?一个阶乘当然似乎不是一个提升权力的术语。
  2. 如果找到一个n!解决方案意味着我们有一个相当快的算法,因为n!增长快于2 ^ N,这是否意味着一些NP完全问题不需要启发式/近似算法(除了模糊的情况)?
  3. 当然,这两个问题依赖于第一段是真的;如果我犯了错误,请告诉我。

2 个答案:

答案 0 :(得分:36)

  1. 没有。阶乘时间不是多项式时间。多项式时间通常表示形式为O(N k )的等式,其中N =正在处理的项目数,并且k =某个常数。重要的是指数是一个常数 - 你将N乘以一定数量的固定 - 不依赖于N本身。因子复杂度算法意味着乘法的数量固定 - 乘法的数量本身随N增长。

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

  3. 让我们试着把它放在一边。二进制搜索是O(log N)。线性搜索是O(N)。在排序中,“慢”算法是O(N 2 ),而“高级”算法是O(N lg N)。阶乘复杂度(显然足够)O(N!)。

    让我们尝试给它一些数字,考虑(暂时)只有10个项目。这些中的每一个大致是10个项目而不是1个项目需要多长时间处理:

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

    目前我有点作弊,并使用自然对数而不是基数2对数,但我们只是在这里尝试球场估计(并且差异在任何情况下都是一个相当小的常数因子)。

    正如您所看到的,因子复杂度算法的增长速度很多比其他任何算法都快。如果我们将它扩展到20个项目,差异会变得更加显着:

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

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

    O(log N)=。3 ns
    O(N)= 2 ns
    O(N log N)= 6 ns
    O(N 2 )= 40 ns
    O(N!)= 7。7年。

答案 1 :(得分:5)

很容易看出阶乘是(近似)行为的指数。

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

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