SIGMA-SE Math & Tech Library

SIGMA-SE Math & Tech Library


数学と情報技術をテーマに、書籍や教材だけではつかみにくい考え方を具体例とともに簡潔にわかりやすく伝える解説サイトです。
技術の歴史や背景、関連知識の整理、学習のための覚書や要約記事も掲載しています。

応用情報技術 - 基礎:6/21 アルゴリズム(探索・整列・再帰・文字列処理)

概要

情報技術の基礎として理解しておきたいアルゴリズムのうち、フローチャート、探索、整列、再帰、文字列処理を整理する。

アルゴリズムは、問題を解く手順を明確にしたものとなる。
アルゴリズムを理解するには、手順の意味だけでなく、データ数が増えたときの計算量や、処理の流れを正しく追えるかが重要になる。

この記事の構成

  • フローチャート
    フローチャートを順にたどり、各処理の役割を整理。
  • 探索アルゴリズム
    データ群から目的のデータを探すためのアルゴリズムで次の代表的なアルゴリズムがある。
  • 整列アルゴリズム
    データを昇順または、降順にソートするためのアルゴリズムで次の代表的なアルゴリズムがある。
  • 再帰アルゴリズム
    再帰アルゴリズム:その名の通り、 再帰(自分自身を呼出す)するアルゴリズム。
  • 文字列処理のアルゴリズム
    文字列処理のアルゴリズム:文字列探索後に挿入、 削除、 置換、 連結等を行うアルゴリズム。

フローチャート

  • フローチャート(流れ図)
    基本3構造と呼ばれる、順次選択繰返しを用いて、プログラムの処理の流れを図式化したもの。
    順次は、上から下へ順番に命令を実行する処理を指す。
    選択は、if文やswitch文等の分岐処理を指す。
    繰返しは、for文やwhile文等のループ処理を指す。

探索アルゴリズム

データ群から目的のデータを探すためのアルゴリズムで次の代表的なアルゴリズムがある。

※ \(n\) は、データの個数を表すものとする。
計算量については、
応用情報技術 - 情報理論 > 計算量 を参照。

  • 線形探索
    先頭から順番に一つずつ評価して探索するアルゴリズム。

    計算量は、\(O\ (n)\) となる。

  • 2分探索
    事前にデータを整列させた探索されるデータに対して中間データの比較を繰返して探索するアルゴリズム。

    計算量は、\(O\ (log\ n)\) となる。

  • ハッシュ表探索
    ハッシュ関数を用いて探索するアルゴリズム。
    探索されるデータハッシュテーブルに対して、探索するデータのハッシュ値でデータ(値)を逆引きし探索する。

    ハッシュ関数がキーを適切に分散させ、衝突が少ない場合の平均計算量は \(O\ (1)\) となる。
    ただし、多くのキーが同じ位置に衝突する場合は探索回数が増え、最悪計算量は \(O\ (n)\) となる。

  • シノニム(synonym)
    ハッシュテーブルにおいて、異なるキーが同じハッシュ値になること。
    この状態を衝突という。

    ハッシュ表は、衝突が起こる前提で、次のチェイン法やオープンアドレス法などを用いてデータを区別。

  • チェイン法(分離連鎖法)
    シノニム問題の解決法の一つ。

    ハッシュ値にシノニム(衝突)が発生した場合、個々のデータを連結リスト(互いに参照できる仕組みを持つ)で繋ぎ、衝突を解決する方法のこと。

  • オープンアドレス法(ハッシュ法、閉番地法)
    シノニム問題の解決法の一つ。

    ハッシュ値にシノニム(衝突)が発生した場合、再ハッシュ(別バケットにデータを格納する)の繰返しにより、衝突を解決する方法のこと。

整列アルゴリズム

データを昇順または、降順にソートするためのアルゴリズムで次の代表的なアルゴリズムがある。

※ \(n\) は、データの個数を表すものとする。

  • バブルソート
    隣合うデータを大小比較し、ソート順と逆ならば順番を入替えてソートするアルゴリズム。

    すべての隣合うデータに対して大小比較を繰返すため、平均・最悪計算量は \(O\ (n^2)\) となる。

  • 挿入ソート
    整列済のデータに対して線形探索で挿入位置を決め、データを挿入してソートするアルゴリズム。

    挿入位置までの比較と要素の移動を繰り返すため、平均・最悪計算量は \(O\ (n^2)\) となる。
    ほぼ整列済みのデータに対しては高速に動作。

  • 選択ソート
    未整列のデータ群からソート順に応じた最大値(最小値)を検索(特定)後、整列済データに分類し、ソートするアルゴリズム。

    最大値(最小値)の探索をデータ数分行うため、平均・最悪計算量は \(O\ (n^2)\) となる。

  • クイックソート
    ピボット(基準値)を一つ決め、ピボットより小さい要素と大きい要素の部分列に分け、それぞれで同じ操作を繰り返すアルゴリズム。

    分割統治法を利用し、平均計算量は \(O\ (n\ log\ n)\) となる。
    ピボットの選び方とデータの並びによって分割が偏ると、最悪計算量は \(O\ (n^2)\) となる。

  • シェルソート
    挿入ソートの改良版。
    一定間隔おきのデータを対象にした部分列をそれぞれ挿入ソートで整列させ、その間隔が1になるまで狭めてソートするアルゴリズム。

    計算量は間隔の選び方に依存するため、一律に \(O\ (n\ log\ n)\) とは言えない。

  • ヒープソート
    選択ソートの改良版。
    未整列データでヒープを構成することによって、最大値(最小値)となるを整列済データとし、未整列データがなくなるまで繰返しソートするアルゴリズム。

    計算量は、\(O\ (n\ log\ n)\) となる。

    ヒープについては、応用情報技術 - データ構造 > ヒープ を参照。

  • マージソート
    まず、未整列データを前後2つのグループに分け、この操作をデータ数が \(1\) になるまで再帰的に繰返す。
    次に、データ数が小さい方から順に前後2つのグループをソートしつつ併合(マージ)する操作を分割したグループ分、繰返してソートするアルゴリズム。

    クイックソートと同じ分割統治法を利用しており、計算量は、\(O\ (n\ log\ n)\) となる。
    ただし、マージに伴うメモリ消費が多い。

再帰アルゴリズム

  • 再帰アルゴリズム
    その名の通り、再帰(自分自身を呼出す)するアルゴリズム。

    • 例:\(0\) を含む自然数 \(n\) に対して、\(n\) の階乗を返す関数 \(fact\ (n)\) を再帰的に定義。

    ※ Javaで書いた場合

    if (n == 0) {
        return 1;
    } else {
        return n * fact(n - 1);
    }
    

文字列処理のアルゴリズム

  • 文字列処理のアルゴリズム
    文字列の探索挿入削除置換連結などを行うアルゴリズムの総称。
    ここでは、文字列探索のアルゴリズムについて、次の代表的な方法を扱う。

  • 順次探索法
    探索対象の文字列の先頭から、探したいパターンを \(1\) 文字ずつ照合するアルゴリズム。

    • (*1)探索
      探索対象の現在位置とパターンの先頭を合わせ、文字を順に照合する。

    • (*2)照合判断

      • 照合一致の場合、探索対象とパターンの両方を次の文字へ進める。
      • 照合不一致の場合、パターンを先頭に戻し、探索開始位置を \(1\) 文字右へずらして照合し直す。

    探索対象の長さを \(n\)、パターンの長さを \(m\) とすると、最悪計算量は \(O\ (nm)\) となる。

  • BM法(ボイヤームーア法)
    パターンの末尾から先頭へ向かって照合し、不一致時に不要な照合をスキップする文字列探索アルゴリズム。

    • (*1)事前準備
      パターン内の文字位置を用いる不良文字規則と、一致済みの接尾部を用いる良い接尾辞規則のシフト表を準備する。
    • (*2)探索
      探索対象とパターンの先頭位置を合わせ、パターンの末尾から左方向へ文字を照合する。

    • (*3)照合判断

      • 照合一致の場合、パターンの一つ左の文字を続けて照合する。先頭まで一致すると検索成功となる。
      • 照合不一致の場合、事前に作成した表から求めた文字数だけパターンを右へずらし、照合し直す。

上記以外にも代表的なアルゴリズムとして、メモリ管理データ圧縮グラフ近似/統計確率図形描画遺伝的なアルゴリズムなどがある。

まとめ

  • 二分探索は整列済みデータを前提とし、ハッシュ表探索は平均的に高速だが衝突対策が必要になる。
  • 再帰は問題を小さな同種の問題として解く表現で、無限に呼び出さないよう終了条件を明確にする。
  • 文字列探索では、照合する方向や不一致時の移動方法によって処理効率が変わる。
  • アルゴリズムはデータ数が増えたときの計算量の伸び方と、利用できる前提条件を合わせて比較。

参考文献

この記事を共有
Xで共有 Facebookで共有 LINEで共有



Copyright SIGMA-SE All Rights Reserved.
s-hama@sigma-se.jp