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

最大ヒープへの挿入アルゴリズムをわかりやすく解説|二分ヒープの基本操作

本記事では、二分最大ヒープ(Max Heap)というデータ構造に新しい要素を挿入する方法について詳しく解説します。ヒープは優先度付きキューの実装などで広く使われる重要なデータ構造であり、挿入操作の仕組みを理解することはアルゴリズム学習の基礎となります。

まず、以下のような初期状態のヒープ(完全二分木)を想定します。

最大ヒープへの挿入アルゴリズムをわかりやすく解説|二分ヒープの基本操作

最大ヒープへの挿入アルゴリズム

最大ヒープへの挿入は、次の手順で行われます。

  1. ヒープに空きがあるか確認し、満杯であれば処理を終了します。
  2. 新しい要素をヒープの末尾(配列の最後の位置)に仮置きします。
  3. 親要素と値を比較しながら、親より大きい場合は親と入れ替えて上へ移動させます(この操作を「アップヒープ化」または「遡上(percolate up)」と呼びます)。
  4. 適切な位置に到達した時点で挿入完了です。

擬似コード

insert(heap, n, item) −
Begin
    if heap is full, then exit
    else
        n := n + 1
        for i := n, i > 1, set i := i / 2 in each iteration, do
            if item <= heap[i/2], then break
            heap[i] = heap[i/2]
        done
    end if
    heap[i] := item
End

このアルゴリズムでは、変数 n は現在のヒープの要素数を表し、i/2 によって親ノードの位置を計算しています。挿入する値が親以下であればループを抜け、その位置に値を格納することでヒープの性質(親 ≥ 子)が保たれます。

具体例:30 をヒープに挿入する

それでは、実際に上記のヒープへ値 30 を挿入してみましょう。まず30を末尾に配置し、親ノードとの大小比較を繰り返しながら適切な位置まで移動させます。手順は以下の図の通りです。

最大ヒープへの挿入アルゴリズムをわかりやすく解説|二分ヒープの基本操作

計算量について

挿入操作では、最悪の場合でも要素が根から葉までの高さ分しか移動しません。そのため、n 個の要素を持つヒープへの挿入の計算量は O(log n) となり、非常に効率的です。一方、要素数の更新や位置の特定は O(1) で行えます。

  1. B木(B-Tree)への要素の挿入方法をわかりやすく解説

    この記事では、B木(B-Tree)データ構造への要素の挿入方法について詳しく解説します。まず、次のようなB木を例に考えてみましょう。 B木の例 挿入の基本ルール 要素を挿入する際の基本的な考え方は二分探索木(BST)と似ていますが、B木ではいくつかのルールに従う必要があります。各ノードは最大 m 個の子と m−1 個のキーを持つことができます。ノードに新しい要素を挿入する場合、状況は次の2つに分けられます。 ノード内のキー数が m−1 個未満の場合:新しい要素をそのまま該当ノードに挿入します。 ノード内のキー数がすでに m−1 個(満杯)の場合:既存のすべてのキーと挿入対象の要素を合わせた

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

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