如果可以选择时间复杂度不同的算法,那么何时选择“ worse” Big-O(例如选择{{ 1}},而不是O(n)
。
答案 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 * n
和3 * n
的两种算法将在同一O(n)
类上,而2 * n^2
算法将在{{1}中}。现在,对于足够小的输入(在此示例中为O(n^2)
),n = 1
的执行效率将高于2 * n^2
算法。
对于3 * n
与O(n)
(或任何其他)计算复杂性而言,这也是正确的。