很容易看到n!比N几乎任何东西都要慢得多(比如100 ^ N),所以,如果一个问题被认为是NP完全而且一个发生在一个n!算法近似解决方案,人们会做史努比舞蹈。
我对这种情况有2个问题:
当然,这两个问题依赖于第一段是真的;如果我犯了错误,请告诉我。
答案 0 :(得分:36)
没有。阶乘时间不是多项式时间。多项式时间通常表示形式为O(N k )的等式,其中N =正在处理的项目数,并且k =某个常数。重要的是指数是一个常数 - 你将N乘以一定数量的固定 - 不依赖于N本身。因子复杂度算法意味着乘法的数量不固定 - 乘法的数量本身随N增长。
你似乎在这里有同样的问题。 N 2 将是多项式复杂度。 2 N 不会。你的基本规则也是错误的 - 一个因子复杂性算法不意味着“我们有一个相当快的算法”,至少作为一般规则。如果有的话,结论恰恰相反:在一些特殊情况下(即,N非常小),因子算法可能是实用的,但随着N的增长,很快就变得不切实际非常。
让我们试着把它放在一边。二进制搜索是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的数字,它将继续快速增长。