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