有哪些例子说明大O符号在实践中失败了?
也就是说:什么时候算法A的大O运行时间预测比算法B更快,但实际上运行算法B更快?
稍微广义一点:算法性能的理论预测何时与观察到的运行时间不匹配?非大O预测可能基于搜索树中旋转的平均/预期数量或排序算法中的比较次数,表示为因子乘以元素数量。
说明:
尽管一些答案表明,大O符号用于预测算法性能。 也就是说,它是一个缺陷工具:它只涉及渐近性能,并模糊常数因素。它之所以这样做是有原因的:它旨在预测算法性能,而不考虑在哪台计算机上执行算法。
我想知道的是: 这个工具的缺陷何时显现? 我发现大O符号相当有用,但远非完美。 有哪些陷阱、边缘情况和易错点?
我要找的一个例子:使用斐波那契堆而不是二叉堆运行Dijkstra的最短路径算法,对于n个顶点和m条边,您会得到O(m + n log n)时间,而不是O((m + n) log n)。您预计从斐波那契堆中获得速度优势,但在我的实验中,该速度提高从未出现。
(无需证明的实验证据表明,操作均匀随机边权重的二叉堆花费O(1)时间而不是O(log n)时间;这是实验中的一个重要易错点。另一个难以计数的问题是调用DecreaseKey的预期次数)。
[1] 实际上并不是符号而是符号所代表的概念和理论方法来预测算法性能失败了。
关于被接受的答案:
我已经接受了一个答案来突出我所希望得到的答案类型。存在许多同样好的不同答案 :) 我喜欢这个答案的原因是它提供了一个一般规则,可以说明当缓存未命中占据执行时间时,Big-O符号“失败”的情况,这可能也有助于增加理解(在某种意义上,我现在不确定如何最好地表达)。