トラック2・🧭プログラミング的思考

良い手順・悪い手順——効率の予感

読む目安 約10分・ゴール:同じ結果でも手順によって手数が大きく変わることを、探索の例で実感する

アプリでこのトピックを学ぶ(無料・登録不要)

このトピックの要点

同じ答えにたどり着く手順が2つあったとき、どちらが良いのでしょうか。正しさが同じなら、次に見るのは手数です。

辞書で「たまご」を引く

紙の辞書で言葉を探す方法を2つ考えます。

1000ページの辞書で比べます。方法Aは、運が悪ければ1000回めくります(平均500回)。方法Bは、1回ごとに範囲が半分になるので、1000 → 500 → 250 → 125 → 63 → 32 → 16 → 8 → 4 → 2 → 1 で約10回です。

100倍近い差です。しかも辞書が10万ページに増えても、方法Bは17回程度しか増えません。データが増えたときの伸び方が違う——ここが効率の話の核心です。

師範速い機械より、良い手順のほうが効くことがある。桁が違うからのう。

この方法Aを線形探索、方法Bを二分探索と呼びます。第4部でC言語として自分の手で書くことになりますが、大事なのは名前ではなく、半分に割る発想そのものです。

ただし、方法Bには条件がある

二分探索が使えるのは、あらかじめ並んでいる場合だけです。辞書は五十音順に並んでいるから半分に割れます。バラバラの紙の束では使えません。

つまり効率の良い手順には、たいてい前提条件が付きます。「速いほうを選ぶ」ではなく、「その前提が成り立つか」を確かめる。これが正しい順序です。

手数の数え方に慣れる

アルゴリズムを比べるときは、データの個数を n として「n が増えると手数はどう増えるか」を見ます。

最後の型はとくに注意が必要です。手元の10件では一瞬でも、本番の1万件では数時間かかる、ということが起こります。この考え方には計算量という名前があり、第4部でO記法として学びます。

身近な例で言えば、写真フォルダから重複を探す処理が最後の型です。「全部の組み合わせを比べる」やり方だと、1万枚では約5000万回の比較になります。1秒に1000万回比べられるとしても5秒。10万枚なら100倍の約8分です。枚数が10倍で時間が100倍という伸び方の怖さが、少し実感できるでしょうか。

とはいえ、最初から凝らない

初心者がやりがちな失敗は、動く前から速さを気にしてコードをこねくり回すことです。順番は決まっています。

  1. まず正しく動くものを作る
  2. 遅くて困ったら、どこが遅いかを測る
  3. 測った場所だけ直す

推測するな、測れというのが、この世界の古い格言です。今の段階では「手順しだいで桁が変わることがある」という予感だけ持っておけば十分です。

アプリでこのトピックを学ぶ(無料・登録不要)

確認問題

確認問題 1

まん中を開いて半分ずつ捨てていく探し方(二分探索)が使えるのは、データが ____ 場合だけです。

  1. あらかじめ並んでいる
  2. すべて数値である
  3. 個数が2の累乗である
  4. 個数が偶数である
答えを見る

正解:A(あらかじめ並んでいる)

辞書のまん中を開いて「後ろだから前半を捨てる」と判断できるのは、五十音順に並んでいるからです。バラバラの紙の束では、まん中を見ても捨ててよい側が決まりません。辞書は文字列を扱うので「すべて数値」は不要ですし、個数が2の累乗や偶数である必要もありません(余りが出ても半分に割り続けられます)。効率の良い手順にはたいてい前提条件が付く、というのがこのトピックの要点です。

確認問題 2

1000ページの辞書から目的の語を探します。「まん中を開き、目的の語より後ろなら前半を捨てる」というやり方を繰り返すと、最大でおよそ何回開くことになるでしょう。

  1. 約1000回
  2. 約10回
  3. 約100回
  4. 約500回
答えを見る

正解:B(約10回)

1回ごとに範囲が半分になるので、1000 → 500 → 250 → … → 1 と約10回でたどり着きます(2を10回かけると1024)。1ページ目から順にめくる方法なら最大1000回なので、100倍の差です。ただしこのやり方は「あらかじめ並んでいる」ことが前提で、バラバラの束には使えません。

「プログラミング的思考」の目次

  1. 問題を分解する(Decomposition)
  2. パターンを見つける(Pattern Recognition)
  3. 抽象化——捨てる勇気
  4. アルゴリズム——手順を組み立てる
  5. 擬似コードで書いてみる
  6. フローチャート入門
  7. 日常の問題をアルゴリズム化する
  8. 良い手順・悪い手順——効率の予感

もっと先へ:ポインタ・メモリ・ファイル入出力・セキュアコーディングを含む全26トラックと、段位検定・模試のフルセットは完全版に収録しています。

完全版の販売ページは準備中です。

ほかのトラック

📚 姉妹教材:手を動かして覚える Linux 教材 — Linuxとインフラの仕組みを地図で学ぶ

Web版