インオーダートラバーサルリストが与えられた場合、バイナリ最小/最大ヒープを作成するための最良の方法は何ですか?
私は次の構成に限定しようとしています:
バイナリヒープで使用される配列はありません。実装はノードベースです。
BinaryNode { value, parent, l_child, r_child }
Max-Heapに固執しましょう。
質問: BubbleDownを含む標準の挿入よりもうまくいくことができますか?
インオーダートラバーサルリストが与えられた場合、バイナリ最小/最大ヒープを作成するための最良の方法は何ですか?
私は次の構成に限定しようとしています:
バイナリヒープで使用される配列はありません。実装はノードベースです。
BinaryNode { value, parent, l_child, r_child }
Max-Heapに固執しましょう。
質問: BubbleDownを含む標準の挿入よりもうまくいくことができますか?
値のコレクションから最大ヒープを構築するための洗練された線形時間アルゴリズムがあります。これは、n個のバブルステップを実行するよりも漸近的に高速です。アイデアは、より小さな最大ヒープのフォレストを構築し、すべての要素が単一の最大ヒープに結合されるまで、それらをペアごとに継続的にマージすることです。正確な分析を使用して、このアルゴリズムが非常に良好な定数係数でO(n)時間で実行されることを示すことができます。多くの標準ライブラリにはこの関数が含まれています。たとえば、C++にはstd::make_heap
アルゴリズムがあります。
アルゴリズムのスケッチ、正当性の証明、ランタイム分析など、このアルゴリズムの詳細については、https ://stackoverflow.com/a/6300047/501557の以前の質問を確認してください。
お役に立てれば!