サーチのアルゴリズム (1) 線形探索法|新しい擬似言語で学ぶ 科目 B アルゴリズムとプログラミング入門


2023-04-04 更新

基本情報技術者試験は、 2023 年 4 月から新制度で実施されます。

この連載では、新制度で採用される新しい擬似言語(旧制度の擬似言語とは、表記方法に違いがあります)を使って、試験のシラバス(情報処理技術者試験における知識・技能の細目)に示されている代表的なアルゴリズムとデータ構造を、プログラミング入門者向けにやさしく解説します。 受験対策としてだけでなく、アルゴリズムとプログラミングの基礎知識を習得するために、ぜひお読みください。

今回は、サーチアルゴリズムである 線形探索法 を取り上げます。

サーチアルゴリズムの基本

サーチ( search = 探索)アルゴリズムは、配列の中から目的の値を見つけるアルゴリズムです。

基本情報技術者試験のシラバスには、サーチアルゴリズムとして、

  • 線形探索法
  • 二分探索法
  • ハッシュ表探索法

が示されています。 今回は、線形探索法を取り上げます。 他のサーチアルゴリズムは、今後の記事の中で取り上げます。

 

線形探索法からサーチアルゴリズムの基本を知ることができます。

例として、図 1 に示した配列 a (要素番号は 0 から始まるとします)から、変数 x と同じ値を見つけるとしましょう。

線形探索法のアルゴリズムは、とてもシンプルです。 配列の先頭から末尾に向かって要素を 1 つずつ順番に取り出して、変数 x と同じ値かどうかをチェックするだけです。 先頭から末尾まで一直線にチェックするので、線形探索法と呼ぶのです。

図 1 配列 a から変数 x と同じ値を線形探索する

図 1 では、変数 x と同じ値が a[2] に見つかります。 この場合には、見つかった位置の 2 を探索の結果とします。 これは、サーチアルゴリズムの基本です。 そして、見つかったら、その時点で探索を終了します。 これも、サーチアルゴリズムの基本です。

もしも、変数 x と同じ値が見つからなかった場合は、配列の要素番号としてあり得ない -1 という値を探索の結果とします(他の値でも構いませんが、多くの場合に -1 とします)。 これも、サーチアルゴリズムの基本です。

線形探索法のプログラムの例

リスト 1 は、先ほど図 1 に示した線形探索法の例を、擬似言語のプログラムにしたものです。 配列 a から変数 x と同じ値を探索します。

変数 pos には、探索の結果を格納します。 変数 pos の初期値を、見つからなかったことを意味する -1 にしていることに注目してください。 この後にある for 文による繰り返しで、 a[0] ~ a[4] を順番にチェックし、もしも見つかったら

(a[i] = x)

なら変数 pos の値を見つかった位置の i で上書きします。 こうすれば、変数 pos の値は、見つからなければ -1 のままであり、見つかれば見つかった位置になります。

このように、探索の結果を「見つからなかった」を意味する -1 で初期化することも、サーチアルゴリズムの基本です。

swipeプログラムは横スクロールできます

リスト 1code 線形探索法のプログラムの例(その 1 )
整数型の配列: a{ 56, 34, 90, 78, 12 }
整数型: x, pos, i
x90
pos-1

for ( i を 0 から 4 まで 1 ずつ増やす)
  if (a[i] = x)
    pos = i
    break
  endif
endfor
print(pos)

if 文の処理の中にある break は、繰り返し処理を中断する命令です。 擬似言語の記述形式を示した資料に break 命令はありませんが、 C 言語、 Java 、 Python など多くのプログラミング言語に break 命令があり、旧制度の試験問題でも break 命令が使われたことがあったので、新制度の試験問題でも break 命令が使われるでしょう。

プログラムの最後にある print は、引数の値を画面に表示する手続だとします。 print(pos) によって、探索の結果が画面に表示されます。

break 文を使わずに繰り返しを中断するテクニック

先ほどのリスト 1 では、 break 命令を使いましたが、 break 命令を好まない出題者もいるでしょう。 リスト 2 は、リスト 1 と同じ機能のプログラムを、 break 命令を使わずに記述した例です。 リスト 1 では繰り返し処理に for 文を使っていましたが、リスト 2 では while 文を使っています。

リスト 2code 線形探索法のプログラムの例(その 2 )
整数型の配列: a{ 56, 34, 90, 78, 12 }
整数型: x, pos, i
x90
pos-1
i0

while (i4 and pos = -1)
  if (a[i] = x)
    pos = i
  endif
  ii + 1
endwhile
print(pos)

while 文のカッコの中にある

i4 and pos = -1

という条件に注目してください。

i4 は、 a[i] の i が 4 以下という条件なので「まだ末尾までチェックしていない」という意味です。
pos = -1 は、 pos が初期値の -1 のままであるという条件なので「まだ見つかっていない」という意味です。
これら 2 つの条件を「かつ」を意味する and でつないでいるので、「まだ末尾までチェックしていない、かつ、まだ見つかっていない」という条件が真である限り、探索が繰り返されます。

変数 x の値は a[2] に見つかるので、その時点で変数 pos に 2 が格納されます。 これによって「まだ見つかっていない」という条件が偽になり、「まだ末尾までチェックしていない、かつ、まだ見つかっていない」という条件も偽になるので探索が終了します。

このように、変数 pos の値を繰り返しの条件に使うことで、 break 文を使わずに繰り返し処理を中断できます。 プログラミングのテクニックとして覚えておいてください。

線形探索の穴埋め問題にチャレンジする

試験対策として、線形探索法の穴埋め問題にチャレンジしてみましょう。

リスト 3 は、要素数 10 個(これまでの例より要素数が多くなっていることに注意してください)の配列 a から変数 x と同じ値を線形探索法で見つけるプログラム( break 文を使わないプログラム)です。 プログラム中のに入る正しい答えの組合せを解答群の中から選んでください。 配列の要素番号は、 0 から始まるとします。

リスト 3code 線形探索法のプログラムの例(その 3 )
整数型の配列: a{ 89, 99, 56, 34, 90, 67, 23, 78, 12, 45 }
整数型: x, pos, i
x90
posa
i0

while (b)
  if (a[i] = x)
    pos = i
  endif
  ii + 1
endwhile
print(pos)

解答群

a b
0 i ≦ 9 and pos = 0
0 i ≦ 9 and pos = -1
-1 i ≦ 9 and pos = 0
-1 i ≦ 9 and pos = -1

配列の要素数が増えても、アルゴリズムは同じです。

空欄 a は、探索の結果を格納する変数 pos の初期値の設定です。 この初期値は、見つからなかったことを意味する -1 が適切です。

空欄 b は、繰り返しの条件です。「まだ末尾までチェックしていない、かつ、まだ見つかっていない」という条件にします。

ここでは、配列の要素が a[0] ~ a[9] なので、「まだ末尾までチェックしていない」は、 i9 です。「まだ見つかっていない」は、これまでと同じ pos = -1 です。

したがって、「まだ末尾までチェックしていない、かつ、まだ見つかっていない」は、

i9 and pos = -1

です。

以上のことから、選択肢エが正解です。

今回は、基本的なサーチアルゴリズムである線形探索法を取り上げました。

次回は、効率的なサーチアルゴリズムである二分探索法を取り上げる予定です。

それでは、またお会いしましょう!

label 関連タグ
科目A試験は、
免除できます。
独習ゼミで科目A試験を1年間免除して、科目B試験だけに集中しましょう。
免除試験を受けた 74.9% の方が、
科目A免除資格を得ています。
科目A免除試験 最大 2 回の
受験チャンス !
info_outline
科目A免除試験 最大 2 回の
受験チャンス !
詳しく見てみるplay_circle_filled
label これまでの『新しい擬似言語で学ぶ 科目 B アルゴリズムとプログラミング入門』の連載一覧

マージソート|新しい擬似言語で学ぶ 科目 B アルゴリズムとプログラミング入門

update

二分木の深さ優先探索と幅優先探索|新しい擬似言語で学ぶ 科目 B アルゴリズムとプログラミング入門

update

比べてわかるキューとスタックの仕組み|新しい擬似言語で学ぶ 科目 B アルゴリズムとプログラミング入門

update

「リスト」というデータ構造|新しい擬似言語で学ぶ 科目 B アルゴリズムとプログラミング入門

update

サーチのアルゴリズム (3) ハッシュ表探索法のアルゴリズム|新しい擬似言語で学ぶ 科目 B アルゴリズムとプログラミング入門

update

クイックソートのアルゴリズム|新しい擬似言語で学ぶ 科目 B アルゴリズムとプログラミング入門

update

再帰呼び出しのアルゴリズム|新しい擬似言語で学ぶ 科目 B アルゴリズムとプログラミング入門

update

サーチのアルゴリズム (2) 二分探索法|新しい擬似言語で学ぶ 科目 B アルゴリズムとプログラミング入門

update

サーチのアルゴリズム (1) 線形探索法|新しい擬似言語で学ぶ 科目 B アルゴリズムとプログラミング入門

update

多重ループを使うバブルソート|新しい擬似言語で学ぶ 科目 B アルゴリズムとプログラミング入門

update
label 著者