昨日質問したのですが、よく分からなかったので、具体的な質問です。
最小ヒープを配列として表しています。私はminheapsについてよく理解していると思いますが、その中の特定の概念については曖昧です。最小ヒープは、常にルートとして最小のノードを持つことになっています。値を削除するには、ルートを配列表現 (リーフ ノード) の最後の要素に設定し、配列のサイズを減らします。次に、siftDown/PercolateDown または任意の名前を使用して、ルート ノードを正しく配置します。これは超効率的です。例えば:
ここでは、最後の要素から 29 が取得され、siftDown(1) によって配置されます。
- 29 を 15 および 38 と比較します。29 と 15 を交換します。
- 29 は 25 および 20 と比較されます。29 と 20 を交換します。
- 29 は 30 と比較され、29 < 30 であるため、これで完了です。
これで問題ありませんが、最小値を削除する 2 つのインスタンスの間に、他のデータの一部が変更された場合はどうなるでしょうか。例えば:
ここでは、次のようにします。
- 29 を 15 および 38 と比較します。29 と 15 を交換します。
- 29 は 30 および 32 と比較されます。29 < 30 および 29 < 32 したがって、完了です。
1 はツリーの最小値ですが、最小値として設定されておらず、15 が設定されています。これは私にとって大きな問題です。Dijkstras アルゴリズムを実装しようとしています。Java 組み込みクラスに触れずに独自のデータ構造を使用しようとしています。
したがって、私の問題に関連するより適切な例は次のとおりです。
Dijkstras に精通している場合、99 は暫定的な無限距離を表し、その他の数字は次にアクセスする必要があるグラフ ノード (最小距離のノード、この場合は 3) を表します。
解決策は、min を削除するたびにツリーを再構築することですが、これは minheap の能力が失われ、実装が遅くなることを意味します。
これを正しく理解していない場合は申し訳ありませんが、何日もこれに悩まされており、本当に助けが必要です.