Big-O記法[1]が実際に失敗する例は何ですか?
つまり、アルゴリズムの Big-O 実行時間から、アルゴリズム A がアルゴリズム B よりも高速であると予測されるのはいつで、実際にアルゴリズム B を実行するとアルゴリズム B の方が高速になるのでしょうか?
もう少し広い: アルゴリズムのパフォーマンスの不一致に関する理論的予測で実行時間が観察されるのはいつですか? Big-O 以外の予測は、検索ツリーの平均/予想回転数、または並べ替えアルゴリズムの比較数に基づく場合があり、係数と要素数の積として表されます。
明確化:
一部の回答が述べていることにもかかわらず、Big-O 表記はアルゴリズムのパフォーマンスを予測することを目的としています。とはいえ、これは欠陥のあるツールです。漸近的なパフォーマンスについてのみ話し、定数要因をぼやけさせます。これには理由があります。アルゴリズムを実行するコンピューターに関係なく、アルゴリズムのパフォーマンスを予測するためです。
私が知りたいのはこれです: このツールの欠陥はいつ現れますか? Big-O 記法はそれなりに便利ですが、完璧にはほど遠いことがわかりました。落とし穴、エッジケース、落とし穴は何ですか?
私が探しているものの例: バイナリ ヒープの代わりにフィボナッチ ヒープを使用してダイクストラの最短パス アルゴリズムを実行すると、n に対して O(m + n log n) 時間と O((m+n) log n) 時間が得られます。頂点と m 個の辺。遅かれ早かれ、フィボナッチ ヒープによる速度の向上を期待するでしょうが、私の実験では速度の向上は実現しませんでした。
(証明なしの実験的証拠は、一様にランダムなエッジの重みで動作するバイナリ ヒープが O(log n) 時間ではなく O(1) 時間を費やすことを示唆しています。 DecreaseKey の呼び出し回数)。
[1] 実際、失敗するのは表記法ではなく、表記法が表す概念と、アルゴリズムのパフォーマンスを予測するための理論的アプローチです。</反ペダントリー>
受け入れられた答えについて:
私が望んでいた種類の回答を強調する回答を受け入れました。同じくらい良い多くの異なる答えが存在します:)私が答えについて気に入っているのは、Big-O表記が「失敗」するとき(キャッシュミスが実行時間を支配するとき)の一般的なルールを示唆していることです。これにより、理解が深まる可能性があります(ある意味でATM の最適な表現方法がわかりません)。