バイナリ最大ヒープを作成するとき、ツリー ベースではなく配列ベースとして実装する方がよいのはなぜですか (ツリー ベースのように、各ノードはその親へのポインターも持ちます)。ランタイム分析、メモリ使用量、パフォーマンスに関して...
バイナリ最大ヒープの場合、実行時間は次のとおりです。
- 挿入: O(lg n)
- 最小値を削除: O(lg n)
- マージ: O(n)
ツリー実装の場合
- 挿入: O(lg n)
- 最小値を削除: O(lg n)
- マージ: O(n)
誰か詳しく説明してくれませんか?
バイナリ最大ヒープを作成するとき、ツリー ベースではなく配列ベースとして実装する方がよいのはなぜですか (ツリー ベースのように、各ノードはその親へのポインターも持ちます)。ランタイム分析、メモリ使用量、パフォーマンスに関して...
バイナリ最大ヒープの場合、実行時間は次のとおりです。
ツリー実装の場合
誰か詳しく説明してくれませんか?
ツリーはより多くの時間とメモリを使用します。複雑さは同じですが、定数要因が異なります。
ツリーのポインターは、配列ベースのヒープと比較して大量のメモリを使用します。配列ベースのヒープでは、追加のスペースはほとんど必要ありませんが、値自体が占有するスペースが必要です。また、これらのポインターの操作にも時間がかかります。ノードの割り当てと割り当て解除にも時間とスペースがかかる場合があります...
さらに、ツリーのノードがメモリ内で一緒になるという保証はありません。2 つの選択肢のいずれかがキャッシュを利用する場合、それは配列ベースのヒープです。
他の人の回答ですでに述べられていることを参照すると、なぜ BST にも配列を使用しないのか不思議に思うかもしれません。バイナリ ヒープには、完全なバイナリ ツリーである必要があります。したがって、葉ノードの深さは常に h または h-1 です。配列の使用がバイナリ ヒープに理想的であり、BST には適さないのは、このプロパティだと思います (BST には完全なバイナリ ツリー要件がないため、厳密/完全/完全である可能性があります)。