什么是有效算法?


10

从渐近行为的角度来看,什么被视为“有效”算法?当时画线的标准/原因是什么?就我个人而言,我认为任何可能被我天真地称为“次多项式”的事物,例如例如都是有效的,而任何将是“无效的”。但是,我听说过任何多项式阶数都被称为有效的东西。这是什么原因?f(n)=o(n2)n1+ϵΩ(n2)


Answers:


11

这取决于上下文。在理论计算机科学中,通常每个多项式时间算法都被认为是“高效”的。在近似算法中,例如将被认为是有效的,即使它对于任何合理值在实践中都不可用。在中运行的SAT算法将是一个了不起的突破。 ε Ñ 2 100ñ1个/ϵ1个/ϵϵñ2100

在经典算法中,即80年代以前的算法,运行时间在以下(例如矩阵乘法,最小成本匹配,流,线性编程)被认为是有效的。我会说,大多数人仍然认为它们是高效的。当然,如果已知算法,则算法不被认为是有效的,例如用于排序。n 2 n 日志nñ3ñ2ñ日志ñ

如今,趋势是能够处理数TB数据的亚线性算法或流算法。尝试使用矩阵乘法来计算Google索引中所有页面的页面排名。那行不通。

当然,尽管算法确实很有用,但它的渐近运行时间并不能说明全部问题。有些算法具有良好的渐近运行时间,但是常量太大,以致无法有效使用。曾经 立顿称它们为银河算法。罗伯特·塞奇威克(Robert Sedgewick)甚至在他的将科学重新纳入计算机科学的演讲中指出,最坏情况的界限“通常对预测无用,对保证通常无用”,“最坏情况的分析对预测性能无用” 。


9
简而言之:高效是在适合您的时间范围内解决您的问题的方法。
拉斐尔

这实际上并不一定需要它自己的答案,但是BPP是具有多项式运行时功能的函数类(如答案中所述),并且具有随机性,通常被认为是有效的。换句话说,以上是正确的,但是通常允许计算机访问随机性以进行计算。随机性最重要的实际用途之一是散列。
SamM 2013年

也许“高效”一词并不是真正正确的术语吗?我只是回顾我的一本微积分书,作者称多项式运行时为“易处理的”,而指数运行时为“难处理的”。
罗伯特·S·巴恩斯

1
@ RobertS.Barnes:不同的词,同样的问题。
拉斐尔

4

从分布式算法的角度来看,我的2美分:在查看大型网络(P2P,社交网络等)时,如果对于某些常数c >,其运行时间为O log c n ,则认为分布式算法是有效的。0算法使用O log n 位的消息。注意,对消息大小的要求通常比运行时间更为重要,特别是对于运行时间下限较大的“全局”问题,例如分布式MST。Ø日志CñC>0 Ø日志ñ


3

背后的原因是,从渐近行为的角度来看,多项式增长率微不足道地小于超多项式增长率。实际上,当输入大小增加时,多项式时间算法的运行速度比超多项式时间算法快得多。

当然,没有人会说具有多项式复杂度例如的算法是“有效的”,但是大多数算法很少超过O n 5的复杂度。Øñ2000Øñ5

实际的考虑甚至可能导致您说不能有效地处理非常大的输入,这就是为什么我们尝试证明下限并设计与这些下限匹配的顺序算法,并在一侧求助于并行的原因。另一方面。对于某些问题,如果您愿意接受概率保证,您甚至可以利用亚线性时间算法(极快,但可能无法以很小的概率提供正确的答案)。 Øñ2


3

从理论上讲,如果算法的最坏情况下的运行时间受到输入长度中多项式的限制,则该算法是有效的。理由是多项式具有很好的闭包特性。加,乘,组成多项式是产生多项式的运算,如果您将问题彼此减少,则这些运算很好。

当然,随着输入长度的增加,多项式和指数之间的差距会变得非常大,因此多项式时间算法会更好。在实践中,多项式时间算法可能需要很长时间才能终止,但在某些情况下,它可能是一种最佳算法(最好的),在这种情况下,我会说它是有效的。


虽然我可以理解,如果某种方法是解决特定问题的最快已知算法,那么从该角度来看,它可以被认为是“有效的”,但对于我来说,很难想到在multitime中运行的任何方法都是有效的。:-)
罗伯特·S·巴恩斯

对于多项式运行时,“有效”只是一个词,而在那是一个误导性的词。
拉斐尔

@Raphael也许易处理是使用一个更好的词...?
罗伯特·S·巴恩斯

1
@ RobertS.Barnes:天哪,好多了。“可牵引”与“高效”相对。
拉斐尔

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.