关于大o:什么时候使用更糟糕的Big-O算法是值得的

When would it be worth it to use a worse Big-O algorithm

本问题已经有最佳答案,请猛点这里访问。

如果有不同时间复杂度的算法可供选择,那么何时更值得选择"更糟"的大O,例如选择O(n)而不是O(log n)


当我们的代码使用有限数量的操作时,big o意味着极限,无穷多的操作(因此big o是一个近似值)。比较两种时间复杂性:

1
2
t ~ 1e100 * N
t ~ N * N

第二种算法(具有更差的-N平方时间复杂性)对于实际输入更为可取,速度更快。


复杂性并不能告诉你任何关于性能的信息,所以不足以知道复杂性来决定一种方法是否比另一种方法更有价值。要知道一种方法在给定的情况下是否比另一种方法更好(即对于给定的问题大小),基准测试是一种方法。一旦你确定了不同的方法,复杂度可以帮助你预测当问题增长时,事情会如何变化。

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

假设您有两个不同的过滤器,在二维图像上产生非常相似的结果,一个比另一个更快的"正常"图像(例如,百万像素)。如果你将它们应用于3D图像,它们的行为会怎样(例如,如果问题的大小是千兆像素呢)?了解复杂性并有一个参考基准可以帮助您预测什么样的过滤器是"值得"使用的,但最终…您仍然需要对这两个解决方案进行基准测试以确保这一点。


任何渐进式表示法,都描述了某个算法在达到一定大小的输入(n > n_0后的行为。通常不描述的是可能存在的任何附加常数乘法项(以及其他可忽略的项,例如n^2 + n属于O(n^2)类)。

例如,计算复杂度为2 * n3 * n的两个算法将在同一个O(n)类上,而2 * n^2算法将在O(n^2)类中。现在,对于足够小的输入(本例中的n = 12 * n^2将比3 * n算法更有效地执行。

这也适用于O(n)O(log(n))的计算复杂性。