サーチのアルゴリズム (1) 線形探索法|新しい擬似言語で学ぶ 科目 B アルゴリズムとプログラミング入門
基本情報技術者試験は、 2023 年 4 月から新制度で実施されます。
この連載では、新制度で採用される新しい擬似言語(旧制度の擬似言語とは、表記方法に違いがあります)を使って、試験のシラバス(情報処理技術者試験における知識・技能の細目)に示されている代表的なアルゴリズムとデータ構造を、プログラミング入門者向けにやさしく解説します。 受験対策としてだけでなく、アルゴリズムとプログラミングの基礎知識を習得するために、ぜひお読みください。
今回は、サーチアルゴリズムである 線形探索法 を取り上げます。
サーチアルゴリズムの基本
サーチ( search = 探索)アルゴリズムは、配列の中から目的の値を見つけるアルゴリズムです。
基本情報技術者試験のシラバスには、サーチアルゴリズムとして、
- 線形探索法
- 二分探索法
- ハッシュ表探索法
が示されています。 今回は、線形探索法を取り上げます。 他のサーチアルゴリズムは、今後の記事の中で取り上げます。
線形探索法からサーチアルゴリズムの基本を知ることができます。
例として、図 1 に示した配列 a (要素番号は 0 から始まるとします)から、変数 x と同じ値を見つけるとしましょう。
線形探索法のアルゴリズムは、とてもシンプルです。 配列の先頭から末尾に向かって要素を 1 つずつ順番に取り出して、変数 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 で初期化することも、サーチアルゴリズムの基本です。
if 文の処理の中にある break
は、繰り返し処理を中断する命令です。 擬似言語の記述形式を示した資料に break 命令はありませんが、 C 言語、 Java 、 Python など多くのプログラミング言語に break 命令があり、旧制度の試験問題でも break 命令が使われたことがあったので、新制度の試験問題でも break 命令が使われるでしょう。
プログラムの最後にある print は、引数の値を画面に表示する手続だとします。 print(pos)
によって、探索の結果が画面に表示されます。
break 文を使わずに繰り返しを中断するテクニック
先ほどのリスト 1 では、 break 命令を使いましたが、 break 命令を好まない出題者もいるでしょう。 リスト 2 は、リスト 1 と同じ機能のプログラムを、 break 命令を使わずに記述した例です。 リスト 1 では繰り返し処理に for 文を使っていましたが、リスト 2 では while 文を使っています。
整数型の配列: a ← { 56, 34, 90, 78, 12 } 整数型: x, pos, i x ← 90 pos ← -1 i ← 0 while (i ≦ 4 and pos = -1) if (a[i] = x) pos = i endif i ← i + 1 endwhile print(pos)
while 文のカッコの中にある
i ≦ 4 and pos = -1
という条件に注目してください。
i ≦ 4
は、 a[i] の i が 4 以下という条件なので「まだ末尾までチェックしていない」という意味です。
pos = -1
は、 pos が初期値の -1 のままであるという条件なので「まだ見つかっていない」という意味です。
これら 2 つの条件を「かつ」を意味する and
でつないでいるので、「まだ末尾までチェックしていない、かつ、まだ見つかっていない」という条件が真である限り、探索が繰り返されます。
変数 x の値は a[2] に見つかるので、その時点で変数 pos に 2 が格納されます。 これによって「まだ見つかっていない」という条件が偽になり、「まだ末尾までチェックしていない、かつ、まだ見つかっていない」という条件も偽になるので探索が終了します。
このように、変数 pos の値を繰り返しの条件に使うことで、 break 文を使わずに繰り返し処理を中断できます。 プログラミングのテクニックとして覚えておいてください。
線形探索の穴埋め問題にチャレンジする
試験対策として、線形探索法の穴埋め問題にチャレンジしてみましょう。
整数型の配列: a ← { 89, 99, 56, 34, 90, 67, 23, 78, 12, 45 } 整数型: x, pos, i x ← 90 pos ← a i ← 0 while (b) if (a[i] = x) pos = i endif i ← i + 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] なので、「まだ末尾までチェックしていない」は、 i ≦ 9
です。「まだ見つかっていない」は、これまでと同じ pos = -1
です。
したがって、「まだ末尾までチェックしていない、かつ、まだ見つかっていない」は、
i ≦ 9 and pos = -1
です。
以上のことから、選択肢エが正解です。
今回は、基本的なサーチアルゴリズムである線形探索法を取り上げました。
次回は、効率的なサーチアルゴリズムである二分探索法を取り上げる予定です。
それでは、またお会いしましょう!
label 関連タグ免除試験を受けた 74.9% の方が、 科目A免除資格を得ています。
マージソート|新しい擬似言語で学ぶ 科目 B アルゴリズムとプログラミング入門
update二分木の深さ優先探索と幅優先探索|新しい擬似言語で学ぶ 科目 B アルゴリズムとプログラミング入門
update比べてわかるキューとスタックの仕組み|新しい擬似言語で学ぶ 科目 B アルゴリズムとプログラミング入門
update「リスト」というデータ構造|新しい擬似言語で学ぶ 科目 B アルゴリズムとプログラミング入門
updateサーチのアルゴリズム (3) ハッシュ表探索法のアルゴリズム|新しい擬似言語で学ぶ 科目 B アルゴリズムとプログラミング入門
updateクイックソートのアルゴリズム|新しい擬似言語で学ぶ 科目 B アルゴリズムとプログラミング入門
update再帰呼び出しのアルゴリズム|新しい擬似言語で学ぶ 科目 B アルゴリズムとプログラミング入門
updateサーチのアルゴリズム (2) 二分探索法|新しい擬似言語で学ぶ 科目 B アルゴリズムとプログラミング入門
updateサーチのアルゴリズム (1) 線形探索法|新しい擬似言語で学ぶ 科目 B アルゴリズムとプログラミング入門
update多重ループを使うバブルソート|新しい擬似言語で学ぶ 科目 B アルゴリズムとプログラミング入門
update『プログラムはなぜ動くのか』(日経BP)が大ベストセラー
IT技術を楽しく・分かりやすく教える“自称ソフトウェア芸人”
大手電気メーカーでPCの製造、ソフトハウスでプログラマを経験。独立後、現在はアプリケーションの開発と販売に従事。その傍ら、書籍・雑誌の執筆、またセミナー講師として活躍。軽快な口調で、知識0ベースのITエンジニアや一般書店フェアなどの一般的なPCユーザの講習ではダントツの評価。
お客様の満足を何よりも大切にし、わかりやすい、のせるのが上手い自称ソフトウェア芸人。
主な著作物
- 「プログラムはなぜ動くのか」(日経BP)
- 「コンピュータはなぜ動くのか」(日経BP)
- 「出るとこだけ! 基本情報技術者」 (翔泳社)
- 「ベテランが丁寧に教えてくれる ハードウェアの知識と実務」(翔泳社)
- 「ifとelseの思考術」(ソフトバンククリエイティブ) など多数