背景
ウィキペディアや私が見つけた他の情報源によると、空のバイナリヒープから始めてn個の要素を挿入することでn個の要素のバイナリヒープを構築するのはO(n log n)です。これは、バイナリヒープの挿入がO(log n)だからです。そしてあなたはそれをn回やっています。これを挿入アルゴリズムと呼びましょう。
また、要素の前半/上半分をシンク/トリクルダウン/パーコレーションダウン/カスケードダウン/ヒープダウン/バブルダウンする別のアプローチも示します。これは、中央の要素から始まり、最初の要素で終わります。 O(n)、はるかに優れた複雑さ。この複雑さの証拠は、各要素のシンクの複雑さがバイナリヒープ内の高さに依存するという洞察に基づいています。それが下部に近い場合、それは小さく、おそらくゼロになります。上部に近い場合は、大きくなる可能性があります。おそらくlognです。重要なのは、このプロセスで沈められたすべての要素の複雑さがlog nではないため、全体的な複雑さはO( n log n )よりもはるかに小さく、実際にはO(n)。これをシンクアルゴリズムと呼びましょう。
質問
同じ理由で、挿入アルゴリズムの複雑さがシンクアルゴリズムの複雑さと同じではないのはなぜですか?
挿入アルゴリズムの最初のいくつかの要素に対して行われた実際の作業を検討してください。最初の挿入のコストはlognではなく、ゼロです。これは、バイナリヒープが空であるためです。2番目の挿入のコストは最悪の場合1スワップであり、4番目の挿入のコストは最悪の場合2スワップであり、以下同様です。要素を挿入する実際の複雑さは、バイナリヒープの現在の深さに依存するため、ほとんどの挿入の複雑さはO(log n )未満です。n個の要素がすべて挿入されるまで、挿入コストは技術的にはO(log n)に達しません[最後の要素の場合はO(log( n -1))です]。
これらの節約は、シンクアルゴリズムによって得られる節約と同じように聞こえますが、なぜ両方のアルゴリズムで同じようにカウントされないのでしょうか。