プログラミング
 Computer >> コンピューター >  >> プログラミング >> プログラミング

最大ヒープ(データ構造)から要素を削除するアルゴリズムをわかりやすく解説

ここでは、二分最大ヒープ(Binary Max Heap)というデータ構造から要素を削除する方法について解説します。まず、次のような初期状態の木を想定してください。

最大ヒープ(データ構造)から要素を削除するアルゴリズムをわかりやすく解説

最大ヒープからの削除アルゴリズム

最大ヒープに対する削除操作では、通常「根(ルート)にある最大値を取り除く」処理を行います。削除後も親ノードは常に子ノード以上というヒープ条件を維持しなければならないため、単純に要素を取り除くだけでは不十分です。以下の擬似コードのように、末尾の要素を使ってヒープを再構成します。

delete(heap, n) −
Begin
    if heap is empty, then exit
    else
        item := heap[1]
        last := heap[n]
        n := n – 1
        for i := 1, j := 2, j <= n, set i := j and j := j * 2, do
            if j < n, then
                if heap[j] < heap[j + 1], then j := j + 1
            end if
            if last >= heap[j], then break
            heap[i] := heap[j]
        done
    end if
    heap[i] := last
End

アルゴリズムの流れ

  1. 空チェック: ヒープが空であれば、そこで処理を終了します。
  2. 最大値の取り出し: 根の要素 heap[1] を item として保存します。これが削除対象となる最大値です。
  3. 末尾要素の退避: ヒープの最後の要素 heap[n] を last として取り出し、ヒープのサイズ n を1つ減らします。
  4. 下向き調整(Sift-Down): last を根の位置から下へ移動させながら、左右の子のうち大きい方と比較します。last の方が小さければ子を上へ繰り上げ、last が子以上になった時点でループを抜けます。
  5. 最終配置: 空いた位置に last を書き込み、ヒープの再構成を完了します。

この操作の計算量は、木の高さに比例する O(log n) であり、非常に効率的な削除手法となっています。

具体例:値 30 の削除

それでは、最終的なヒープから値 30 を削除するケースを考えてみましょう。

最大ヒープ(データ構造)から要素を削除するアルゴリズムをわかりやすく解説

まず、削除対象である 30 をヒープから取り出します。続いて、ヒープの末尾にある要素を空いた位置へ移動し、子ノードとの大小関係を比較しながら、ヒープ条件を満たす適切な位置まで沈めていきます(Sift-Down 操作)。この一連の手順により、削除後もヒープ条件が保たれた完全二分木が得られます。


  1. データ構造におけるBツリーの削除操作とアルゴリズムを解説

    Bツリー(B-Tree)は、データベースやファイルシステムなどで広く活用されている平衡木データ構造です。ここでは、Bツリーからノード(キー)を削除する手順について詳しく解説します。 Bツリーの例 まず、以下のようなBツリーを想定してみましょう。 削除操作の基本ルール Bツリーからの削除処理は、大きく分けて2つの段階があります。まず最初に、削除対象の要素を検索と同じ要領で見つけます。次に、実際の削除を行う際には、Bツリー特有のルールを守る必要があります。 Bツリーでは、各ノードは最低でもm/2個の要素を持たなければなりません。そのため、要素を削除した結果、あるノードの残り要素数がm/2未満にな

  2. ハーフエッジデータ構造(HalfedgeDS)とは?基本概念とCGAL実装例をわかりやすく解説

    はじめにテンプレートパラメータとして用いられるハーフエッジデータ構造(Halfedge Data Structure、略称 HalfedgeDS)は、頂点・辺・面の接続情報(インシデンス情報)を管理できる、辺を中心としたデータ構造として定義されています。平面地図(planar map)や多面体など、任意の次元空間に埋め込まれた向き付け可能な2次元曲面の表現に適した構造です。このデータ構造では、各辺が逆向きの向きを持つ2つのハーフエッジ(半辺)に分割されます。各ハーフエッジは、隣接する1つの面と1つの頂点への参照を保持し、逆に各面および各頂点にも、それぞれ1つの接続ハーフエッジが格納されます。さ