是否有一个广泛使用算法,这有时间复杂性 更糟糕 比另一种已知的算法,但它是一个 更好的 选择在 所有 实际情况(更糟糕 但复杂性 更好的 否则)?

一个可以接受的答案可能的形式:

有算法 AB 那 已 O(N**2)O(N) 时间 复杂性也相应地,但是 B 有如此大的恒定的,它没有 优点 A 对于投入较少的 然后一个数目的原子 宇宙。

例摘要的答案:

  • 单的算法--最糟糕的情况下被指数时间-- 已知的多项式的时间算法凸优化问题。

  • 一个天真的中间值的中位数的算法--最坏情况O(N**2) 知O(N)的算法。

  • 回溯regex引擎--最坏情况的指数 O(N)汤普森NFA基引擎。

所有这些例子利用的最坏情况与平均的情况。

有没有实例,不需要依赖之间的差异的最糟糕的情况下与平均的情况?


相关:

  • 上升的`更糟糕的是更好".(对于这个问题的目的的"更糟糕的是更好地"的短语是用于 (即--计算时间的复杂性)的意义比在文章)

  • 蟒蛇的设计理念:

    ABC组致力于完善。例如,他们使用基于树的数据 结构算法已经证明 要最佳渐大 集(但不那么伟大 小集的).

    这个例子就是答案如果没有计算机能够存储这些大型集合(换句话说大不够大,在这种情况下)。

  • 铜匠–Winograd算法 对方阵乘是一个很好的例子(这是最快的(2008年),但是它低劣糟糕算法)。 任何其他人吗? 从维基百科文章:"这不是在实践中使用,因为它只提供了一个利用矩阵如此之大,它们无法处理的现代硬件(Robinson2005年)。"

有帮助吗?

解决方案 5

铜匠–Winograd算法 对方阵乘法运算。它的时间复杂性是O(n2.376) O(n3)的一个天真的乘法运算法或 O(n2.807)为 施特拉的算法.

从维基百科文章:

然而,不同的施特拉 算法,它不是用在实践 因为它只提供了一个优点 对于矩阵的如此之大,它们不能 处理现代化的硬件 (Robinson2005年)。

其他提示

快进行排序 有最糟糕的是时间复杂性O(N^2)但是它通常被认为比其他排序的算法,其中有O(N记录n)时间的复杂性,在最糟糕的情况。

单纯 是的算法具有指数时的复杂性,在最糟糕的情况下,但对于任何实际的情况下,它是多项式。许多项式的算法为线性规划 存在 但他们是非常复杂且通常具有很大的常数。

"糟糕的是更好"可以看出,在语言,例如背后的理念Perl,蟒蛇,红宝石,Php甚至C#或Java,或任何一种语言,不是汇编或C(C++可能适合在这里或不)。

基本上总有一种"完美"的解决方案,但很多时候最好使用"坏的"工具/算法/语言得到的结果更快,并以较少的痛苦。这就是为什么人们使用这些更高水平的语言,尽管他们是"坏"从理想的计算机语言的观点,而不是更多的人为导向。

蒙地卡罗一体化 是一个概率的计算方法确定的积分,没有保证的返回正确的答案。然而,在现实世界的情况返回一个准确的答案,远远快于可证明正确的方法。

这一声明可以应用到 几乎任何平行的算法.该原因,他们不重研究了早期的计算是因为,对于一个单一的线的执行(为单处理器),他们确实速度较慢于其众所周知的顺序的对应条款的渐近的复杂性,定因素对于小 n, 或两者。然而,在这方面的当前和未来计算平台,算法,这可以使用的几(觉得多),几百(认为GPU),或几千(觉得超级计算机)的处理要素将打裤子的顺序版本在壁钟的时间,即使总的时间/能源花费通过的所有处理器大得多的平行的版本。

各种各样,图的算法,和线性代数技术一样可以加速在墙上的钟时间承担成本的一点额外的簿记、通信和运行开销为了并行.

往往一个算法(喜欢 快速排序),可以很容易 并行随机的 将选择过相互竞争的算法,缺乏这些品质。此外,它往往是这种情况, 近似解决方案 一个问题是可以接受的精确算法将产生的指数运行时为在 旅行推销员问题.

这个例子就是答案如果没有计算机能够存储这些大型的集合。

大概是大小的集合是641K.


当工作在技术计算基BAE系统,其后结构和空气动力学的代码的各种飞机,我们有一个代码回的至少25年(第三工作人员已有长)。

许多的算法是优化业绩16位的大型机,而不是可扩缩性。这些优化被完全适用于1970年代的硬件,但执行不佳,在更大的数据集的32和64位系统取代它。如果你选择一些与更糟糕的可扩展其工作更好地在你的硬件,目前的工作,要知道,这是一种优化和它可能不适用的未来。当时那些1970年代程序编写、数据尺寸的我们把他们在2000年是不实际的。不幸的是,试图提取一个明确的算法从那些代码然后可以实施以适应现代的硬件不是微不足道的。

短沸腾海洋,重要的作'的所有实际情况'往往是一个时间相关的变量。

一个例子是从计算的几何形状。 多边三角测量 有最糟糕的是O(N)的算法由于 Chazelle, 但这是几乎从来没有在实践中落实由于韧性的执行和巨大恒定。

不相当于该标记,而是回溯基于规则的表达有一个指数最糟糕的是对O(N)为DFA基于规则的表达,还回溯基于规则表达几乎总是使用相当于外交部-根据的。

编辑:(JFS)

Regular Expression Matching可以简单和快速(而是缓慢的,Perl,PHP,Python,Ruby,...):

的权力,反向引用增加 在伟大的费用:在最糟糕的 情况中,最知名的实现 需要指数的搜索算法。

经常表达的引擎:

这种方法(外交部)真的是更有效率,和 甚至可以适用于允许捕获和非贪婪的匹配, 但它也有重要缺陷:

  • Lookarounds是不可能的
  • 回来-参考文献也是不可能的
  • Regex预汇编是较长,并需要更多的存储器

在光明的一面,以及避免最坏的情况下指数的运行时间,DFA办法避免最坏的情况下堆使用的是线性的尺寸的输入数据。

[3]:

存在着一个时间多项式的算法确定素性,但在实践中,总是快要使用的指数的时间算法或执行足够的概率计算,具有足够的确定性。

基数的排序有时间复杂性O(n)对于固定长度的投入,但是快速排序更经常用,尽管更糟asympotic运行,因为每个元件的费用基数排序通常要高得多。

Ok,考虑解决该行销售的人的问题。的 完美的解决方案是以测试所有可能的路线。但是,变得不可能与我们的硬件和时限如N增加。因此,我们想到的许多启发。

这给我们带来回答您的问题。试探(糟糕)胜过蛮力于NP-完整的问题。这描述的情况"更糟糕的是更好"总是真实的。

在计算中的一组数字,可以使用一种算法非常类似于快速排序.你分区周围的数量,并且所有的更大的人走到一边,而所有的小人去另一侧。然后你扔掉的一侧和递归计算中的更大侧。这需要O(n^2)在最糟糕的情况,但是很快(O(n)与低恒定)的平均情况。

你可以得到保证的最坏情况O(n)性能,有一个恒定的约40。这就是所谓的 中值的中位数的算法.在实践中,你将永远不会用这个。

如果我理解这个问题,你要求的算法是理论上更好,但实际上更糟糕的是在所有情况。因此,人们不会期望他们实际上被使用,除非通过的错误。

一个可能的例子是普遍的 性记忆化.从理论上讲,所有确定性功能的电话应该是memoized对所有可能的投入。这样复杂的计算可以被替换为简单的表中查找。对于范围广泛的问题,这种技术有效地交易时,对储存空间。但是,假设有一个中央储存库的结果的所有可能的投入所有可能的功能使用的所有的人类计算机。第一时间任何地方的任何人做了一个计算,这将是最后一次。随后的所有试图将导致在一个表中查找。

但是,有几个原因我可以认为不这样做:

  1. 存储空间需要存储的所有结果可能会是不可能很大。这似乎可能数量的需要位将超过的数量颗粒在宇宙中。(但即使是任务的估计数是艰巨的。)

  2. 这将是难以构建一个高效率的算法做memoiztion的,巨大的一个问题的空间。

  3. 通信成本与中央储存库可能会超过受益客户数量的增加。

我敢肯定你可以想到的其他问题。

事实上,这种时间/空间的贸易是令人难以置信的常见做法。理想的情况下,所有数据将被存储在L1缓,但由于尺寸限制你总是需要把一些数据的磁盘上或(恐怖!) 带。推进技术降低了一些痛苦的这些权衡,但是如我上面所建议有限制。


为响应约翰塞巴斯蒂安的评论意见:

假设而不是一个普遍性记忆化存储库,我们考虑的一个因子存储库。它不会举结果为所有可能的投入。相反,它将是有限的结果 1N! 现在很容易看到,任何计算机有阶乘将受益于寻找的结果,而不是做计算。甚至用于计算 (N+1)! 查询将是一个巨大的胜利以来,计算将减少到 N!(N+1).

现在让这个"更好"的算法更糟糕的是,我们可以增加N或数量的增加使用计算机储存库中。

但我可能不理解一些微妙的问题。他们的方法,我想它,我来了实例,规模很好,直到他们不这样做。

成了归并排序对快速排序

快速排序的平均时间的复杂程度O(n 日志 n).它可以排序中的阵列的地方,即一个空间的复杂程度O(1)。

合并排序也有一个平均时间复杂性O(n 日志 n),但是它的空间复杂得多 更糟糕: Θ(n).(有一个特殊的情况下为联清单)

因为最糟糕的是时间复杂的快速排序是Θ(n^2)(即所有元素都落在同一边的每一个枢轴),并成了归并排序的最糟糕的情况是O(n 日志 n),成了归并排序是将默认选择,用于图书馆实施者。

在这种情况下,我认为的可预测性成了归并排序的最糟糕的是时间复杂性胜过快速排序会低得多的存储要求。

鉴于它能够极大地减少可能的最坏情况下的快速排序的时间复杂性(通过随机选择的枢例如),我认为有人可能会争辩说,成了归并排序更糟糕,但在所有的病理情况下的快速排序.

我总是理解的术语,更糟糕的是更好'涉及的问题有正确的解决方案是非常复杂的其中一个近似(或足够好的)解决方案的存在,是比较容易理解。

这使得更容易设计、制作和维护。

还有一个O(n)的算法,用于选择的第k个最大的元素从一个未排定,但是很少使用,而不是排序,这当然是O(n的).

插入排序尽管具有O(n2)的复杂性更快的小集(n < 10)比任何其他排序的算法。这是因为嵌套的循环是小型和执行速度快。许多图书馆(包括STL)已实现的排序方法的实际使用这小子集的数据,以加快速度。

蒙地卡罗一体化已经提出但一个更具体的例子是,蒙特卡洛的价格中的资金也是一个建议。这里的方法更容易代码,可以做更多的事情,比其他一些人,但这是远远慢于说,有限的差别。

它不实际的做20dimensional有限的差异算法,但有20维价格执行是容易建立。

意大利面进行排序 是更好的比任何其他排序的算法,这是O(n)设立,O(1)执行和O(n)中提取的排序的数据。它完成所有这一切都在O(n)空间复杂性。(总体性能:O(n)在时间和空间两者。) 然而,对于一些奇怪的(明显的)原因,没有人可以用它为什么宁愿远远不如O(nlogn)的算法和它们之流。

迭代深化

相比微不足道的深度优先增强搜索 alpha beta修剪 一个 迭代深化 搜索结合使用,在一个穷人(或不存在)支序启发式将会导致更多的节点是进行扫描。然而,当一个良好的支序启发式算法是用一个重要部分的树是消除由于增强效果的alpha beta修剪。第二个优点无关时间或空间的复杂性是一种猜测的解决方案的问题领域是建立的早期,猜得到的精致的搜索进展。这是第二个优势,使得它很有吸引力在许多问题领域。

Quick-sort has worst case time complexity of O(N^2)! 
It is considered better than other sorting algorithms 
like mergesort heapsort etc. which have O(N log n) time complexity 
in the worst case.
The reason may be the 
1.in place sorting 
2.stability, 
3.very less amount of code involved.
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top