二項ヒープと二項ヒープの主な違いは、ヒープの構造です。バイナリヒープでは、ヒープは単一のツリーであり、完全なバイナリツリーです。二項ヒープでは、ヒープは小さなツリー(つまり、木の森)のコレクションであり、それぞれが二項ツリーです。完全な二分木は任意の数の要素を保持するように構築できますが、ある次数nの二項ツリーの要素の数は常に2nです。。したがって、バイナリヒープをバックアップするために必要な完全なバイナリツリーは1つだけですが、二項ヒープをバックアップするために複数の二項ツリーが必要になる場合があります。興味深いことに、二項ヒープで使用される二項ツリーの順序は、フォレスト内の要素数のバイナリ表現で設定された1ビットに対応します。
二項ヒープをそのまま編成する理由は、次数nの二項ツリーには常に正確に2n個のノードがあるためです。これにより、二項ツリーの構造を実際に検査しなくても、二項ツリーの要素数を推測できます。一方、高さhの完全な二分木には、最後の行の入力方法に応じて、ノードの数が可変になる場合があります。各子が非常に正確に定義された構造を持っている必要があるという事実は、子の数が最大でO(log n)であることを証明するためにも使用できます。ここで、nはヒープ内のノードの総数です。 delete-minのコストはそれほど大きくありません。
この背後にある重要な詳細は、二項ヒープはk個の子を持つツリーではないということです。それは厳密に次のように定義されている木です
- 次数0の二項ツリーは単一ノードであり、
- 次数nの二項ツリーは、子として次数0、1、2、...、n-1の二項ツリーを持つ単一ノードです。
(技術的には、注文0の特別な場合はここでは必要ありません)。あなたはここでこれを見ることができます:
各順序のツリーは1つだけであり、ノードの数や位置に柔軟性がまったくないことに注意してください。
ただし、重要な代替定義は次のとおりです。
- 次数0の二項ツリーは単一ノードであり、
- 次数nの二項ツリーは次数n-1の2つの二項ツリーであり、一方のツリーがもう一方の子になります。
(これらが同等である理由を確認するために少し時間を取ってください)。この2番目の定義を使用すると、ツリー内のノードの数が2nであることを示す簡単な帰納法の証明になります。基本ケースとして、次数0のツリーには、必要に応じて2 0 =1ノードがあります。帰納的ステップの場合、次数n -1のツリーが2つある場合、必要に応じて、それらは集合的に2 n-1 + 2 n-1 = 2nノードになります。したがって、次数nの二項ツリー内のノードの総数は正確に2nです。
最後の段落で説明しているヒープのアイデアは、必ずしも効率的なランタイムにつながるとは限りません。特に、分岐係数が大きく、他の構造上の制約がないツリーがある場合、理論的には、(n-1)個の子を持つ単一ノードで構成されるnノードのヒープを構築できます。その場合、ヒープから最小要素を削除した後、すべてのn-1の子を調べて、どれが新しい最小であるかを判別し、O(n)の実行時間を与える必要があります。完全な二分木、二項木などのツリーに対する他の構造上の制約は、この最悪のケースが発生しないことを保証します。
お役に立てれば!