什么时候应该使用较差的Big-O算法

时间:2019-02-06 12:21:57

标签: algorithm big-o

如果可以选择时间复杂度不同的算法,那么何时选择“ worse” Big-O(例如选择{{ 1}},而不是O(n)

3 个答案:

答案 0 :(得分:3)

大O 意味着 limit 无限许多操作,当我们的代码使用 finite 个操作(因此 Big O 是一个近似值)。比较两个时间复杂度:

t ~ 1e100 * N
t ~ N * N

对于现实世界的输入而言,第二种算法(更糟糕的是N的平方时间复杂度)是可取的,而且速度更快。

答案 1 :(得分:1)

复杂度不会告诉您有关性能的任何信息,因此仅了解复杂度来决定某个方法是否值得另一方法是不够的。 要了解在给定情况下(即对于给定的问题规模)一种方法是否比另一种方法更好,基准测试是必经之路。一旦对不同的方法进行了基准测试,复杂性就可以帮助您预测问题随着规模的扩大将如何扩展。

了解算法的复杂性可能非常有用-例如,在图像处理中:

想象一下,您有两个不同的滤镜在2D图像上给出非常相似的结果,对于“正常”图像(例如,有些像素为百万像素),一个滤镜要比另一个滤镜快。如果将它们应用于3D图像,它们的行为会如何(即,如果问题大小为千兆像素,怎么办)?知道复杂度并拥有参考基准可以帮助您预测使用哪种过滤器将“值得”使用,但最终……您仍将对这两种解决方案进行基准测试以确保。

答案 2 :(得分:0)

任何渐近符号,描述达到特定大小的输入(n > n_0)后特定算法的行为。 通常不会描述的是可能存在的任何其他常数乘法项(以及其他可忽略的项,例如n^2 + n属于O(n^2)类)。

例如,具有计算复杂度2 * n3 * n的两种算法将在同一O(n)类上,而2 * n^2算法将在{{1}中}。现在,对于足够小的输入(在此示例中为O(n^2)),n = 1的执行效率将高于2 * n^2算法。

对于3 * nO(n)(或任何其他)计算复杂性而言,这也是正确的。