線形探索のアルゴリズム

学習の目的

  • 1. 線形探索のアルゴリズム

  • 2. フローチャートを完成させよう

1. 線形探索のアルゴリズム

線形探索は先頭の要素から順に比較していく単純な方法ですが、アルゴリズムを考えるときに、「どこまで比較処理を繰り返すか」、繰り返しの条件は注意して考える必要があります。

えっ!見つかるまで繰り返すんじゃないの?

それだと見つからなかった時に処理が終わらないよね。

そうです!探索処理を終了する条件は2つあります。

探索処理が終了するケースは次の2つです。

  • 探索データが見つかった
  • 探索処理が配列の最後まで達した

ここで、「探索処理が配列の最後まで達した」はどういう場合にこの条件で探索処理が終わるかわかりますか?

配列の最後まで探索したということなので、データが見つからなかった時です。

そうです。よくわかりましたね。

もう一つの、探索データが見つかったかどうかについて、今回は「発見フラグ」という変数を使って見つかったか見つかっていないかを管理します。

発見フラグを使った処理手順をフローチャートで確認しましょう。

線形探索のフローチャートで使う変数は次のとおりです。

変数名 説明
data 探索されるデータが格納された配列。
i 配列dataの要素を指定するための添字。
target 探索値。
found_flag 発見フラグ。探索して見つかった場合はTrue、見つからない場合はFalseが入る。

線形探索のフローチャートは次のとおりです。

ただし、フローチャート中の(a)、(b)は空欄になっており完成していません。これから空欄にはいる処理を考えていきましょう。

線形探索のフローチャート

これから空欄に入る処理を一緒に考えていきましょう。

処理手順は次の3つの処理に分けることができます。

  • 1 繰り返し処理
  • 2 比較処理
  • 3 出力処理

それぞれの処理について一つずつ確認していきます。

1 繰り返し処理

① 赤点線部分

点線部分は繰り返し処理を行っています。

②の条件が成立している間繰り返すことで、データを探索します。

② 繰り返し条件

繰り返しの条件を指定します。

条件が成立している間、③の探索処理を繰り返します。

探索処理が終わる条件は2つありました。
記述する条件は2つ必要です。


2 比較処理

④ 比較処理

配列の要素と探索値が同じ値か比較をします。

②の条件が成立している間繰り返すことで
データを探索します。

⑤、⑥ found_flag(発見フラグ)の設定

⑤は探索前なのでfound_flagに False を代入します。

④の比較で一致したときに⑥を実行します。

「一致=探索値の発見」なのでfound_flagに True を代入します。

データを発見したら繰り返し処理を
中断します。

⑦ 添字のカウントアップ

⑦は④の比較で一致しなかった時の処理です。

次のデータと比較するため、添字を1増やします。


3 出力処理

⑧ 出力処理

探索結果の出力処理です。

探索結果は変数「found_flag」に格納されています。

Trueの時:見つかった

Falseの時:見つからなかった

上記の説明を参考に、フローチャートの穴埋めを考えましょう。

2. フローチャートを完成させよう

フローチャートの空欄(a)、(b)にはどのような命令が入るか考えましょう。

空欄(a)について

空欄(a)は繰り返し処理をどこまで行うか判定を行う処理です。

ここは、判断記号なのでif文で条件を指定します。条件が成立した「Yes」の時の処理と、成立しなかった時の「No」の時にどのような処理をしているか確認して下さい。

YesとNoでそれぞれどんな処理を行っていますか?

えーっと、Yesの時は探索処理しているよね。Noの時は・・・

Noの時は繰り返し処理をやめてます。

正解です。

(a)の条件は、成立するときは探索を繰り返して、成立しなかった場合は探索をやめる条件を記述します。

もう一度、繰り返しの条件を整理します。

探索処理を終了する条件

  • 探索データが見つかった
  • 探索処理が配列の最後まで達した

※上記のどちらか一方が成り立った時探索処理を終了する

条件式で表した場合

found_flag == True or i >= 配列の要素数

どちらか一方でよい場合は、論理演算子「or」で2つの条件をつなげます。

あれ?この条件は探索が終わる条件だから、フローチャートでは「No」の時の条件なのかな?

鋭いですね!!条件が「Yes」の時は探索処理を続けるので、探索処理が終了する条件ではなく、探索処理を継続する条件をif文の条件式に記述します。

なるほど、今の条件を逆にすればよいということですね。

そうです。探索処理を終了させる条件の逆を考えればよいということです。

フローチャートの空欄(a)に入る条件式を下記の命令から選んで答えてください。

found_flag == False or i >= len(data)
found_flag != True and i < len(data)

空欄(b)について

空欄(b)は処理の最後に、探索処理で見つかったかどうかで出力する内容を変えるための条件式が入ります。

探索処理の結果が入る変数が「found_flag」でした。この変数の内容によって見つかったかどうかがわかります。

変数found_flagには、TrueかFalseが入るから、これを使えばできそう。

そうそう、見つけた時は「True」が入っているはずだから、「True」の時に「見つかりました」と出力するんだよね。

フローチャートの空欄(b)に入る条件式を下記の命令から選んで答えてください。

found_flag == False
found_flag == True

空欄(a)と(b)が良くわからなかったら、次のスライドでPythonプログラムを作りながらもう一度考えましょう。

※この再現版では提出は行いません(送信先は未接続です)

Well done!

次のステップに進みましょう!

次のステップに進む

← 前のステップにもどる