Каковы некоторые примеры, когда нотация Big-O [1] не работает на практике?
То есть: когда будет выполняться алгоритм алгоритма A с большим временем O, чтобы алгоритм A был быстрее алгоритма B, но на практике алгоритм B быстрее, когда вы его запускаете?
Чуть шире: когда теоретические предсказания о несоответствии производительности алгоритма наблюдаются во время работы? Предсказание не-Big-O может быть основано на среднем/ожидаемом числе вращений в дереве поиска или количестве сравнений в алгоритме сортировки, выраженном как фактор, умноженное на количество элементов.
Разъяснение
Несмотря на то, что некоторые ответы говорят, нотация Big-O предназначена для прогнозирования производительности алгоритма. Тем не менее, это инструмент недостаток: он говорит только об асимптотической производительности, и он размывает постоянные факторы. Он делает это по какой-то причине: он предназначен для прогнозирования алгоритмической производительности, независимо от того, на каком компьютере вы выполняете алгоритм.
Что я хочу знать, так это: когда проявляются недостатки этого инструмента? Я нашел примечание Big-O разумно полезным, но далеким от совершенства. Каковы подводные камни, краевые случаи, gotchas?
Пример того, что я ищу: запуск алгоритма кратчайшего пути Dijkstra с кучей Fibonacci вместо двоичной кучи, вы получаете O (m + n log n) время по сравнению с O ((m + n) log n), для n вершин и m ребер. Вы ожидали бы увеличения скорости от кучи Фибоначчи рано или поздно, но скорость роста никогда не была реализована в моих экспериментах.
(Экспериментальное доказательство, без доказательства, предполагает, что бинарные кучи, работающие на равномерно случайных весах краев, проводят время O (1), а не время O (log n), что один большой результат для экспериментов. Еще один, который сука считает - ожидаемое количество вызовов DecreaseKey).
[1] Действительно, это не обозначение, которое терпит неудачу, но концепции, обозначенные позицией, и теоретический подход к прогнозированию производительности алгоритма. </анти-педантство >
В принятом ответе:
Я принял ответ, чтобы выделить те ответы, на которые я надеялся. Много разных ответов, которые так же хороши, существуют:) Что мне нравится в ответе, так это то, что он предлагает общее правило, когда нотация Big-O "терпит неудачу" (когда кеш-промахи доминируют над временем выполнения), что также может увеличить понимание (в некотором смысле Я не уверен, как наилучшим образом выразить ATM).