メソッドの命名はいくつかの教科書(例えばCLRS)でおそらく意図的です:
- バイナリヒープのキーを「フロートダウン」または「バブリング」するロジックは、どちらの方向(アップ/ダウン)であるかがわかっていれば簡単です。たとえば、キーを「バブルアップ」するのは、ノードの親を再帰的に呼び出すだけであり、再帰的に進む前に各子と比較する必要がある場所でフローティングすることです。
- 最大/最小ヒープを使用する多くのアルゴリズムでは、キーを増減するだけでよいので、対応する「フローティングダウン」または「バブリングアップ」メソッドを提供するだけで十分です。
ジェネリックな「キーの設定」メソッドを実装したい場合は、これらの2つのルーチンを組み合わせて、キーをバブルアップするかフロートダウンする必要があるかどうかに基づいて、どちらの方向に進むかを決定できます。
ヘンドリックの発言に加えて、技術的に言えばキーの減少操作で十分であるダイクストラまたはプリムのアルゴリズムであっても、バイナリヒープを使用しても、各キーの位置を追跡する必要は必ずしもないことに注意してください。
これらのアルゴリズムでは、特定のキーがヒープから一度だけ抽出されます。たとえば、ダイクストラでは、グラフノードは最短パスツリーに一度だけ追加され、プリムのアルゴリズムでは、エッジは最小スパニングツリーに一度だけ追加されます。
したがって、キーの位置を追跡する(またはアルゴリズムがそれらを減らす必要があるときにそれらを検索する)代わりに、キーに新しい(この場合はより低い)値をヒープに挿入するだけです(ヒープの重複につながります)。 、そしてヒープから「キー」を抽出したら(キーは貪欲に消費するものではないため、技術的には衛星データ)、その後の抽出をすべて無視できます(たとえば、O (1 ))。
ヒープ内のそのようなセットとキーの重複は明らかにコストがかかります O (n )スペースは複雑ですが、結合されたソリューションは、ヒープ内の位置の知識や追跡を必要としない「キーを減らす」方法と考えることができます。