0

ヒープからランダムノードを削除したいという状況がありますが、どのような選択肢がありますか?ヒープの最後のノードと最初のノードを簡単に削除できることはわかっています。ただし、最後のノードを削除すると言うと、ヒープからランダムノードを削除するための動作が正しく定義されているかどうかはわかりません。

例えば

_______________________
|X|12|13|14|18|20|21|22|
------------------------

したがって、この場合、ノード12と22を削除できますが、これは定義されていますが、たとえば、ランダムノード(たとえば13)を削除しても、ヒープの完全なツリープロパティを(他のプロパティとともに)維持できますか?

4

2 に答える 2

3

A[N] <= A[N*2]配列に保持されているバイナリヒープを、不変のthatとA[N] <= A[N*2 + 1](min-heap)で記述していると仮定します。

はいの場合、削除の方法は簡単です。削除された要素を最後の要素に置き換え、ふるいにかけて適切な場所に配置されるようにします。そしてもちろん、ヒープ内のエントリの総数を保持する変数をデクリメントします。

ちなみに、ヒープの例を使用している場合は、全順序がない例を使用する方がよいと思います。ヒープの定義には(たとえば)を必要とするものは何もありませんA[3] <= A[5]。例にそのような順序があると、誤解されやすくなります。

于 2011-04-06T19:34:34.910 に答える
0

これは、ヒープからランダムな要素を削除することは可能ではないと思います。この例を見てみましょう(同じ規則に従います):

3, 10, 4, 15, 20, 6, 5.

要素15を削除すると、ヒープは次のようになります。3, 10, 4, 5, 20, 6

これにより、の5子であるため、ヒープに一貫性がなくなります10

ランダム削除が機能しないと思う理由は、ヒープ内の(ルートまたはリーフの代わりに)内部ノードを置き換えることができるためです。したがって、 (の場合のパスheapifyと比較して)へのパスが2つ(親と子)あります。または)。ここで何かが足りない場合に備えて、私に知らせてください。1pop()insert()

于 2015-11-03T20:46:52.443 に答える