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

マージアルゴリズムとは|2つのソート済みリストを統合する仕組みを解説

マージアルゴリズムとは

マージ(併合)アルゴリズムは、2つの整列済み(ソート済み)リストを1つの整列済みリストに統合するための基本的なアルゴリズムです。さまざまな場面で利用されており、特にマージソートでは、分割された各部分リストを並べ替えた後、それらを大きなリストへと結合する段階でこのマージ処理が必須となります。

基本的な考え方

アプローチは非常にシンプルです。まず2つのリストを用意し、それぞれの先頭要素を指す2つのポインタを準備します。

次に、両ポインタが指す値を比較し、小さい方の要素を結果となる統合リストへ取り出します。そして、取り出した要素が属していた側のポインタを1つ進めます。この操作を、どちらか一方のリストが空になるまで繰り返します。最後に、まだ要素が残っている側のリストを、統合リストの末尾にそのまま連結すれば完成です。

下の図を見ると、一連の流れがより直感的につかめるでしょう。

マージアルゴリズムとは|2つのソート済みリストを統合する仕組みを解説

具体例

たとえば、次の2つのソート済みリストを統合する場合を考えてみます。

  • 左リスト:[10, 23, 51]
  • 右リスト:[7, 15, 40]

先頭同士を比較すると 10 > 7 なので 7 を取り出し、続いて 10 と 15 を比較して 10 を取り出す……という要領で進めます。右リストが先に空になった時点で、左リストに残った 51 を末尾に追加します。

結果:[7, 10, 15, 23, 40, 51]

アルゴリズム(擬似コード)

Merge(array, left, middle, right) −

Begin
    nLeft := middle − left + 1
    nRight := right − middle
    左側用の配列 leftArr(サイズ nLeft)と
    右側用の配列 rightArr(サイズ nRight)を定義する
    for i := 0 to nLeft−1 do
        leftArr[i] := array[left + i]
    done
    for j := 0 to nRight−1 do
        rightArr[j] := array[middle + j + 1]
    done
    i := 0, j := 0, k := left
    while i < nLeft AND j < nRight do
        if leftArr[i] <= rightArr[j] then
            array[k] := leftArr[i]
            i := i + 1
        else
            array[k] := rightArr[j]
            j := j + 1
        end if
        k := k + 1
    done
    while i < nLeft do
        array[k] := leftArr[i]
        i := i + 1
        k := k + 1
    done
    while j < nRight do
        array[k] := rightArr[j]
        j := j + 1
        k := k + 1
    done
End

この擬似コードでは、まず元の配列を中央(middle)で左右2つの部分配列にコピーし、それぞれをソート済みとして扱います。その後、両者の先頭から順に比較しながら元の配列へ書き戻していき、どちらかに余りが出ればそれをそのまま後ろへ詰める、という構造になっています。

計算量

マージ処理では、2つのリストの要素数をそれぞれ n、m としたとき、すべての要素をちょうど1回ずつ比較・格納するだけで完了します。

  • 時間計算量:O(n + m)
  • 空間計算量:O(n + m)(統合結果を格納する作業領域が必要)

線形時間で安定した結果が得られるため、マージソートの中核処理としてだけでなく、外部ソートや大量データの結合処理など、実務上のさまざまなシーンでも活用されています。

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

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

  2. 【データ構造】適応型マージソート(Adaptive Merge Sort)の仕組みと計算量を徹底解説

    適応型マージソート(Adaptive Merge Sort)とは適応型マージソートは、通常のマージソートと同様にソート済みの部分リストをマージ(併合)していくソートアルゴリズムです。ただし、従来のマージソートが要素数1の部分リストから処理を開始するのに対し、適応型マージソートでは、リスト内にすでに存在する「整列済みの並び」を検出し、そのまとまりをそのまま初期の部分リストとして利用します。これにより、順序が整った要素を無駄に分割・再マージすることなく、マージの回数を大幅に削減できます。例として、次の図のようなリストを考えてみましょう。このリストは、あらかじめ2つのソート済み部分リストで構成されて