Algorithm 阶乘时间算法与P/NP

Algorithm 阶乘时间算法与P/NP,algorithm,np-complete,Algorithm,Np Complete,很容易看出,n!增长速度几乎比任何事物都慢到N次方(比如,100^N),因此,如果一个问题被认为是NP完全问题,而一个问题发生在一个N上!一种近似解的算法,人们会跳史努比舞 关于这种情况,我有两个问题: 我会的!算法是否被视为多项式时间的解?阶乘显然不是一个被提升为幂的项 如果找到一个n!解决方案意味着我们有一个相当快的算法,因为n!增长速度超过2^N,那么这是否意味着某些NP完全问题不需要启发式/近似算法(不清楚的情况除外) 当然,这两个问题取决于第一段是否正确;如果我错了,请告诉我 不,阶乘

很容易看出,n!增长速度几乎比任何事物都慢到N次方(比如,100^N),因此,如果一个问题被认为是NP完全问题,而一个问题发生在一个N上!一种近似解的算法,人们会跳史努比舞

关于这种情况,我有两个问题:

  • 我会的!算法是否被视为多项式时间的解?阶乘显然不是一个被提升为幂的项
  • 如果找到一个n!解决方案意味着我们有一个相当快的算法,因为n!增长速度超过2^N,那么这是否意味着某些NP完全问题不需要启发式/近似算法(不清楚的情况除外)
  • 当然,这两个问题取决于第一段是否正确;如果我错了,请告诉我

  • 不,阶乘时间不是多项式时间。多项式时间通常指形式为O(Nk)的方程式,其中N=正在处理的项目数,k=某个常数。重要的一点是指数是一个常数——你将N乘以它本身,其中一些是固定的——不依赖于N本身。阶乘复杂度算法意味着乘法的数量不是固定的——乘法的数量本身随着N的增加而增加

  • 你似乎也有同样的问题。N2是多项式复杂度。2N不会是。你的基本观点也是错误的——阶乘复杂度算法并不意味着“我们有一个相当快的算法”,至少一般来说是这样。如果有什么不同的话,结论恰恰相反:阶乘算法可能在一些特殊情况下是可行的(即,N非常小),但随着N的增长,它很快变得不切实际

  • 让我们试着正确地看待这一点。二进制搜索是O(logn)。线性搜索是O(N)。在排序中,“慢”算法是O(N2),而“高级”算法是O(N)。阶乘复杂性(显然足够)是O(N!)

    考虑到(目前)只有10项,让我们试着给出一些数字。其中每一项大约是10项而不是1项处理所需时间的几倍:

    O(对数N):2
    O(N):10
    O(N对数N):23
    O(N2):100
    O(N!):3628800

    目前我有点作弊,使用自然对数而不是以2为底的对数,但我们这里只尝试大概的估计(在任何情况下,差值都是一个相当小的常数因子)

    如您所见,阶乘复杂度算法的增长速度比其他任何算法都快。如果我们将其扩展到20个项目,差异将变得更加显著:

    O(对数N):3
    O(n):20
    O(N对数N):60
    O(N2):400
    O(N!):2432902008176640000

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

    O(对数N)=.3ns
    O(N)=2纳秒
    O(N对数N)=6纳秒
    O(N2)=40纳秒

    O(N!)=7.7年。

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

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


    所以,如果你发现了任何你认为Mn是一个很好的近似值的特定M,你(可能)错了。269! 大于100n且为n!将乘以大于100的数字,它将继续以更快的速度增长。

    n!确实比k^n增长得快。考虑一下,一旦n> k,然后n!我不理解你的评论,因为n!评估n的某个值,使得n大于k是单个数(例如:如果k=10, 10!=3628800)。考虑n的前100项;和100^n。到目前为止,100^n的增长速度超过了n!(即,在100^n对n!——1对100,2对100,…)中,每个因子都较大。然而,超过这一点,每一项都在n!将大于相应的项,单位为100^n(101对100,102对100,…)。+1表示斯特林近似。虽然除非你自己推导出来,否则你可能应该提到他的名字。:-)是的,进一步检查后,即使是令人困惑的WolframAlpha图()也显示n!和5^x或多或少是彼此的翻译版本。@Nemo:是的,我自己通常用n^n作为粗略的近似值。非常感谢您确认我的直觉。>“乘法本身的数量随着N的增加而增加。”更清楚地说,因为即使是O(N)算法也会使该语句成为真,增加样本大小(N)会增加序列中的乘法数量,该序列的增长速度比多项式时间快。(另一条评论中还有更多)Re:评论的后半部分和我的错误!vs.^n我被骗了!(或者至少,我应该看看WolframAlpha图,看看更大的X和Y值;参见)。谢谢你纠正我。多年来我一直有一个奇怪的误解,$O(n)