探索アルゴリズムと計算量
線形探索・2分探索・ハッシュ探索の違い(前提条件と計算量)を説明でき、2分探索の流れ図の空欄補充と、計算量の比例計算・平均比較回数の計算を自力で解けるようになる。
「データの山から目的の1件をどう速く探すか」は、DB のインデックスや API の検索処理の土台になる考え方です。試験では「2分探索は整列済みが前提」「2分探索の計算量は log₂n」の2点が、本試験・免除試験の両方で繰り返し出ています。
このレッスンで稽古する(用語チェック・過去問)まず全体像:探索の3兄弟
探索の方法は、試験ではほぼ線形探索・2分探索・ハッシュ探索の3つに絞られます。違いは「データがどう並んでいる必要があるか(前提)」と「データ量 n が増えたとき、手間がどう増えるか(計算量)」の2点です。まずこの表を丸ごと覚えてください。
| 線形探索 | 2分探索 | ハッシュ探索 | |
|---|---|---|---|
| やり方 | 先頭から1件ずつ比べる | 真ん中と比べ、範囲を半分に絞る | キーから計算した位置(ハッシュ値)を直接見る |
| データの前提 | なし(バラバラでよい) | キーで整列済み(昇順など) | ハッシュ関数で決まる位置に格納済み |
| 計算量(オーダ) | n | log₂n | 1(衝突を無視した場合) |
| n=1,024 件のときの比較回数の目安 | 最大 1,024 回 | 約 10 回 | 約 1 回 |
計算量とは「データ数 n に対して処理の手間がどう増えるか」を表すもので、オーダはその増え方の大まかな形(n に比例、log₂n に比例など)を指します。定数倍は無視して、形だけで比べます。
線形探索:流れ図は「どこで止まるか」を読む
線形探索は、配列の先頭(k=1)から順に「目的の値 X と等しいか」を比べ、等しければそこで終了します。見つからなければ k を 1 増やし、k が N を超えたら終了します。
流れ図の問題では、終了したときの k の値だけを押さえれば解けます。
| 状況 | 終了時の k |
|---|---|
| X が配列にない | N+1(N を超えた時点でループを抜けるため) |
| X が1か所だけにある | その位置 |
| X が複数か所にある | 最初に一致した位置(そこで止まるので後ろは見ない) |
比較回数を減らすコツ:線形探索は前から調べるので、よく出るものを前に置くほど平均の比較回数が減ります。処理区分の判定なら、出現比率が大きい区分から先に判定するのが正解です。
2分探索:前提は「整列済み」、中央は (x+y)/2
2分探索は、辞書で単語を引くときに真ん中あたりを開き、「目的の語はこのページより前か後か」で半分を捨てる動きと同じです。辞書が五十音順に並んでいるから前後を判断できるのであって、バラバラに並んだデータには使えません。これが最頻出の「前提条件」の論点です。
流れ図の決まり文句(探索範囲の下端を x(lo)、上端を y(hi)とする):
- 中央の添字(配列の何番目かを表す番号):(x+y)/2(小数点以下切捨て)
- 中央の値 < 探す値 → 目的は右半分 → 下端を m+1 にする
- 中央の値 > 探す値 → 目的は左半分 → 上端を m−1 にする
- 下端 > 上端 になったら範囲が空 → 見つからない
±1 するのは、今調べた m 自体はもう候補ではないからです。
flowchart TD
A["x←1, y←n"] --> B{"x ≦ y ?"}
B -- "No" --> Z["見つからない"]
B -- "Yes" --> C["m←(x+y)/2"]
C --> D{"A(m) と k を比較"}
D -- "等しい" --> E["見つかった"]
D -- "k が小さい" --> F["y←m−1(左半分へ)"]
D -- "k が大きい" --> G["x←m+1(右半分へ)"]
F --> B
G --> B
探索表の並び方で手法を選ぶ問題も同じ考え方です。コード順に並んだ表 → 2分探索、使用頻度順に並んだ表(整列していない)→ 線形探索、コードから一意に場所が決まる表 → ハッシュ表探索、と対応させます。
計算量:log₂n を体で覚える
2分探索は1回比べるごとに候補が半分になります。n 件が 1 件になるまでに半分にする回数は、2 を何乗すると n になるか、つまり log₂n 回です。1,024 件なら 2¹⁰=1,024 なので約 10 回、約100万件でも約 20 回で済みます。
| オーダ | 代表例 | n=1,000 のときの目安 |
|---|---|---|
| 1 | ハッシュ探索 | 1 |
| log₂n | 2分探索 | 約 10 |
| n | 線形探索 | 1,000 |
| n log₂n | 速い整列(クイックソートの平均など) | 約 10,000 |
| n² | 単純な整列(バブルソートなど) | 1,000,000 |
| n³ | 連立一次方程式の解法など | 1,000,000,000 |
注意点として、2分探索は「1件を探す」処理なので log₂n、n log₂n は「全件を整列する」処理のオーダです。選択肢で並ぶので取り違えないでください。また、2分探索が線形探索より「常に」速いわけではありません(目的が先頭にあれば線形探索は1回で終わります)。
ブロック分割探索:2段階の線形探索
整列済みの n 件を m 件ずつのブロックに分け、まず各ブロックの最後尾だけを線形探索して「どのブロックにあるか」を決め、次にそのブロック内を線形探索します。線形探索の平均比較回数は「候補数の約半分」なので、ブロック選び (n/m)/2 回+ブロック内 m/2 回で、平均 m/2 + n/(2m) になります。
比例計算:「何乗に比例」をそのまま使う
「計算時間が n³ に比例する」と言われたら、n が 10 倍になると時間は 10³=1,000 倍です。そのうえで、演算速度が 4 倍のコンピュータなら時間は 1/4 になります。データ量の倍率を指数どおりに乗じる → 速度の倍率で割る、の2段階で解きます。
線形探索の流れ図:終了時の k を小さな配列でなぞる
ア X と同じ値が配列中にない場合,k には 1 が設定されている。
イ X と同じ値が配列中にない場合,k には N が設定されている。
ウ X と同じ値が配列の 1 番目と N 番目の 2 か所にある場合,k には 1 が設定されている。
エ X と同じ値が配列の 1 番目と N 番目の 2 か所にある場合,k には N が設定されている。
出典:基本情報技術者試験 科目A免除 修了試験 20221211 実施分 問9
解き方と答えを見る
- N=3 の小さな例を作る。複数一致のケース:A=(5, 7, 5)、X=5 とする(1番目と N=3 番目が一致)。
- k←1。判定 k:N は 1≦3 なので X:A(1) へ。A(1)=5=X なので「=」で終了。終了時 k=1。
- → 2か所にあっても最初の位置 1 で止まるので、ウ「k には 1 が設定されている」が正しい。エ(k=N)は誤り。
- 念のため不一致のケース:A=(1, 2, 3)、X=9。k=1,2,3 と進んでどれも「≠」なので k←4。
- 判定 k:N は 4>3 で終了。終了時 k=4=N+1。よってア(k=1)もイ(k=N)も誤り。
答え:ウ(複数一致なら最初の位置、見つからなければ k=N+1)
出現比率の大きい順に判定すると比較回数が減る理由
ア 出現比率が中間の処理区分のものを先に判定すると,全体の比較回数が少なくなる。
イ 出現比率が最も大きい処理区分から先に判定すると,全体の比較回数が少なくなる。
ウ 出現比率が最も小さい処理区分から先に判定すると,全体の比較回数が少なくなる。
エ どのような順番でも全体の比較回数は同じである。
出典:基本情報技術者試験 科目A免除 修了試験 20221211 実施分 問47
解き方と答えを見る
- 例として処理区分 A・B・C の出現比率を 60%・30%・10% とする。
- 大きい順(A→B→C)に判定:A は1回、B は2回、C は3回の比較で確定する。
- 平均比較回数 = 0.6×1 + 0.3×2 + 0.1×3 = 0.6 + 0.6 + 0.3 = 1.5 回。
- 小さい順(C→B→A)に判定:平均 = 0.1×1 + 0.3×2 + 0.6×3 = 0.1 + 0.6 + 1.8 = 2.5 回。
- 1.5 回 < 2.5 回なので、出現比率が大きいものから判定すると全体の比較回数が少なくなる。
答え:イ
2分探索の流れ図:lo と hi の更新を実際の値で確かめる
ア a: k+1→hi,b: k−1→lo
イ a: k−1→hi,b: k+1→lo
ウ a: k+1→lo,b: k−1→hi
エ a: k−1→lo,b: k+1→hi
出典:基本情報技術者試験 科目A免除 修了試験 20131215 実施分 問6
解き方と答えを見る
- n=7、A=(2, 4, 6, 8, 10, 12, 14)、探す値 x=12 とする。
- lo←1、hi←7。k←(1+7)/2=4。A(4)=8。
- A(k)=8 < x=12 なので、目的は右半分(5〜7番目)。下端を k+1 に動かす:lo←4+1=5。これが a の操作「k+1→lo」。
- lo=5 ≦ hi=7 なのでループ先頭へ。k←(5+7)/2=6。A(6)=12=x なので「x は存在する」で終了。
- 逆に A(k)>x なら目的は左半分なので上端を k−1 に動かす:「k−1→hi」が b。
- a=k+1→lo、b=k−1→hi の組合せはウ。
答え:ウ
2分探索の流れ図:a に入る中央の添字
ア (x+y) → m
イ (x+y)/2 → m
ウ (x−y)/2 → m
エ (y−x)/2 → m
解き方と答えを見る
- 探索範囲は x 番目から y 番目。その真ん中の添字を求めたい。
- 例:x=1、y=10 なら真ん中は (1+10)/2=5.5 → 切捨てで 5。範囲 1〜10 の中にある。
- ア (x+y)=11 は範囲外(10 を超える)なので誤り。
- ウ (x−y)/2=(1−10)/2 は負の数で誤り。エ (y−x)/2=(10−1)/2=4(切捨て)は、x が 1 以外のとき範囲外になる。例:x=6、y=10 なら (10−6)/2=2 で範囲 6〜10 に入らない。
- 常に範囲の中央を指すのは (x+y)/2。
答え:イ
ブロック分割探索の平均比較回数
ア m+n/m
イ m/2+n/(2m)
ウ n/m
エ n/(2m)
出典:基本情報技術者試験 科目A免除 修了試験 20230122 実施分 問9
解き方と答えを見る
- ブロック数は n/m 個。
- 段階1:各ブロックの最後尾を先頭から線形探索。目的のブロックは平均して真ん中あたりで見つかるので、平均比較回数は (n/m)/2 = n/(2m)。
- 段階2:ブロック内の m 件を線形探索。平均比較回数は m/2。
- 合計 = m/2 + n/(2m)。
- 数値で確認:n=10,000、m=100 なら 100/2 + 10,000/(2×100) = 50 + 50 = 100 回。
- ア m+n/m は最悪の場合(どちらも最後まで調べる)の回数なので、平均ではない。
答え:イ(m/2 + n/(2m))
n³ に比例する計算時間の比例計算
ア 5
イ 50
ウ 500
エ 5,000
解き方と答えを見る
- 元のコンピュータ:100 元で 2 秒。
- 元数の倍率:1,000 ÷ 100 = 10 倍。
- 計算時間は 3 乗に比例:10³ = 1,000 倍。同じコンピュータなら 2 × 1,000 = 2,000 秒。
- 演算速度が 4 倍なので時間は 1/4:2,000 ÷ 4 = 500 秒。
- ひっかけ:比例(10 倍)で計算すると 2×10÷4=5 秒(ア)、2 乗(100 倍)だと 2×100÷4=50 秒(イ)、速度で割らずに掛けると誤った値になる。
答え:ウ(500 秒)
要点(試験直前に読む)
- 2分探索は「キーで整列済み」が前提。ランダム配置・ハッシュ配置・頻度順の表には使えない。
- オーダ:ハッシュ探索 1、2分探索 log₂n、線形探索 n。n log₂n は整列のオーダ。
- 2分探索の流れ図:中央は (x+y)/2(切捨て)、中央<探す値なら x←m+1、中央>探す値なら y←m−1。
- 線形探索の流れ図:見つからなければ k=N+1、複数一致なら最初の位置で止まる。判定は出現比率の大きい順が最も速い。
- ブロック分割探索の平均比較回数は m/2 + n/(2m)。
- 「n³ に比例」の比例計算:(n の倍率)³ を掛けて、演算速度の倍率で割る。
ひっかけ
- 2分探索の計算量に n log₂n が並ぶ → 1件を探すのは log₂n。n log₂n は整列のオーダと覚えて切る。
- 「2分探索は線形探索より常に速い」 → 「常に」は誤り。目的が先頭にあれば線形探索は1回で終わる。
- 流れ図の空欄に (x−y)/2 や (y−x)/2 → 差の半分は範囲の「幅の半分」で、位置ではない。下端と上端を足して2で割るのが中央。
- 線形探索で「見つからないと k=N」「複数一致なら最後の位置」 → ループは N を超えてから抜けるので N+1、一致した瞬間に止まるので最初の位置。
- ブロック分割探索や n³ の比例計算で最悪値・1乗・2乗の値が並ぶ → 「平均」か「最大」か、何乗に比例するかを問題文で確認してから計算する。
用語(13)
配列の先頭から1件ずつ順に比べて目的の値を探す方法で、データの並び順を問わない。
⚠ 2分探索と比べ、前提条件が「なし」、計算量が n。頻度順に並べた表はこちらで探す。
整列済みのデータの中央と比べ、探す範囲を毎回半分に絞っていく探索方法。
⚠ 線形探索と違い、キーで整列済みであることが前提。計算量は log₂n(n log₂n ではない)。
キーから計算したハッシュ値を格納位置として使い、目的のデータを直接取り出す探索方法。
⚠ 2分探索と違い整列は不要。衝突を無視すれば計算量は 1(定数)。
キーを決まった計算式(ハッシュ関数)に通して得られる、格納位置を表す値。
異なるキーから同じハッシュ値が出て、格納位置が重なること(シノニムとも呼ぶ)。
⚠ 試験の計算量の問題では「衝突は無視できる」と条件が付き、そのときハッシュ探索は 1 になる。
データをキーの昇順や降順に並べ替えること。
⚠ 2分探索の前提条件。整列処理自体の計算量は n log₂n や n² で、探索の log₂n と混同しない。
データ数 n が増えたとき、処理の手間(比較回数や時間)がどのように増えるかを表す尺度。
計算量の増え方を、定数倍を無視して n、log₂n、n² などの形だけで表したもの。
⚠ 「n² のオーダ」は cn²(c は定数)で抑えられる意味。具体的な回数そのものではない。
2 を何乗すると n になるかを表す値で、n を半分にし続けて 1 になるまでの回数に当たる。
⚠ n log₂n(整列の計算量)と取り違えやすい。1件探すだけなら log₂n。
配列の何番目の要素かを表す番号で、A(m) の m に当たる。
処理の手順を、処理・判定・ループの記号と矢印でつないで表した図。
いろいろな探す値について比較回数を平均した期待値で、線形探索なら候補数の約半分になる。
⚠ 最悪比較回数(最後まで調べたときの回数)と取り違えやすい。問題文が「平均」か「最大」かを必ず確認する。
整列済みデータを一定件数のブロックに分け、ブロックを特定してからその中を探す2段階の探索方法。
このレッスンの過去問
- 線形探索の流れ図読解基本情報技術者試験 科目A免除 修了試験 20221211 実施分 問9
- 線形探索の比較回数最小化(出現頻度順)基本情報技術者試験 科目A免除 修了試験 20221211 実施分 問47
- 2分探索の前提条件(整列済みデータ)平成29年度 春期 基本情報技術者試験 午前 問7
- 2分探索法のフローチャート読解(中央要素の添字)平成24年度 秋期 基本情報技術者試験 午前 問6
- 2分探索法の計算量(log2 n)平成27年度 春期 基本情報技術者試験 午前 問6
- ブロック分割探索の平均比較回数基本情報技術者試験 科目A免除 修了試験 20230122 実施分 問9
- 探索アルゴリズムの計算量(線形・2分・ハッシュ)基本情報技術者試験 科目A免除 修了試験 20211212 実施分 問5
- 計算量のオーダ(n³に比例する計算時間)の比例計算平成23年度 秋期 基本情報技術者試験 午前 問3