アルゴリズムとは

回 2-0 道 2 データ構造とアルゴリズム

アルゴリズムは、問題を解くための、あいまいさの無い決まった手順のことです。どの手順も、上から順に進む順次、条件で道を分ける分岐、同じことを繰り返す反復の 3 つの形を組み合わせて書けます。同じ答えを出す手順でも、手順しだいで手間は大きく変わり、最大公約数を求める 2 つの手順は、同じ数で 999,999 回と 1 回の差が出ました。

身近な手順を、順次、分岐、反復の 3 つの形だけで書き直し、その手順が必ず終わるか、何回で終わるかを数えられるようになります。

5 つの値段から一番安い物を、知らない人に渡せる手順で書けますか

アルゴリズムとは、問題を解くための、あいまいさの無い決まった手順のことです。人に渡しても、コンピュータに渡しても、同じ答えに着く手順を指します。

480 円、320 円、650 円、299 円、410 円の 5 つの値段から、一番安い物を見つけてください。目で見ればすぐに 299 円と分かります。では、その見つけ方を、初めて会う人に 1 行ずつ渡せる形で書けますか。

「一番安いのを選ぶ」と書くだけでは、渡された人は困ります。値段が 1,000 個並んでいたら、どこから見て、何を覚えておけばよいのかが書かれていないからです。たとえば次のように書けば、誰がやっても同じ答えになります。

  1. 最初の値段を、今いちばん安い値段として覚える
  2. 残りの値段を 1 つずつ見る
  3. 見た値段が覚えている値段より安ければ、覚え直す
  4. 全部見終わったら、覚えている値段が答え

この 4 行がアルゴリズムです。この回では、手順を 3 つの形だけで書けること、同じ答えでも手順によって手間が大きく変わること、手順がどこで壊れるかを、動かして確かめます。

アルゴリズムはどう書くのか

アルゴリズムは、順次、分岐、反復の 3 つの形を組み合わせて書きます。どの形で書いたかより、あいまいさが無く、必ず終わり、正しい答えに着くことが大事です。

決まった手順で、必ず終わる

アルゴリズムは、望む答えに着くための、計算できる手順の並びです。アメリカの国立標準技術研究所 (NIST) のアルゴリズムとデータ構造の辞典は、「望む結果を得るための、計算できる手順の集まり」と定めています。

この回では、手順がアルゴリズムと呼べるかを、次の 3 つで見ます。

  • あいまいさが無い。「塩少々」のように人によって量が変わる書き方をしない
  • 必ず終わる。繰り返しには、止まる条件がある
  • 答えが正しい。どんな入力を渡しても、望む答えを返す
レシピのように順番に書いた手順がアルゴリズムで、同じ手順は別の言葉でも書け、手順が違うと手間が違うことを示す図

順次、分岐、反復の 3 つの形

どの手順も、次の 3 つの形の組み合わせで書けます。冒頭の値段の手順を当てはめると、次の通りです。

形意味値段の手順ではPython では
順次上から順に 1 つずつ進む最初の値段を覚える行を上から並べる
分岐条件で道を分ける覚えている値段より安ければ覚え直すif 文
反復同じことを繰り返す残りの値段を 1 つずつ見るfor 文、while 文

分岐は選択、反復は繰り返しとも呼びます。料理のレシピは、ほとんどが順次です。「沸騰したら火を弱める」が分岐、「全部の具に火が通るまで 1 分ずつ煮る」が反復です。乗り換え案内が経路を探す手順も、この 3 つで書かれています。

ループは周回数を数えながら回り、条件が外れたら止まり、数を増やし忘れると止まらないことを示す図

言葉、フローチャート、擬似コード、プログラム

同じアルゴリズムを、いくつもの書き方で表せます。書き方が違っても、手順が同じなら同じアルゴリズムです。

書き方向いている場面
言葉 (日本語の箇条書き)人に手順を伝える、考えを整理する
フローチャート (流れ図)分岐と反復の道を目で追う
擬似コード (言語に寄らない書き方)試験や設計書で、言語を決めずに書く
プログラム (Python など)コンピュータに実行させる

プログラムは、アルゴリズムをコンピュータが読める言葉で書いた物です。アルゴリズムは手順そのもので、プログラムはその手順の 1 つの書き方です。

フローチャートは、形に意味があります。始まりと終わりは角の丸い形、処理は四角、分岐はひし形で書き、ひし形からは条件ごとの道が出ます。

フローチャートでは角の丸い形が始まりと終わり、四角が処理、ひし形が分岐で、どの道も終わりに着くことを示す図

同じ答えでも、手順しだいで手間が変わる

同じ答えを出す手順が、いくつもあることがあります。そのとき、手順の良さは、正しさ、手間 (比べた回数などの数)、読みやすさで比べます。

値段の手順は、最初の 1 つを覚えたあと、残りと 1 回ずつ比べるので、比べる回数は値段の数より 1 少なくなります。下のコードで、5 個なら 4 回、100 万個なら 999,999 回になることを数えます。値段が 2 倍になると比べる回数もほぼ 2 倍になるこの増え方を、計算量の言葉で O(n) と書きます。

もっと差がつく例が、2 つの数の最大公約数 (どちらも割り切れる最大の数) です。古代ギリシャのユークリッドの『原論』第 7 巻の命題 2 は、2 つの数の小さいほうを大きいほうから引き続け、残った数で同じことを続ける手順を書いています。引き算を割り算の余りに替えると、同じ答えに、ずっと少ない回数で着きます。下のコードで数え比べます。

探す手順 (2-1)、並べる手順 (2-2 と 2-3) など、この道の残りの回は、同じ問題を解く別の手順を数え比べていきます。

動かして確かめる

1 本目は、冒頭の 4 行の手順をそのままコードにした物です。7 行で、順次、分岐、反復の 3 つが全部入っています。値段を足したり変えたりして、もう一度実行してください。

動かす 一番安い値段を探す

python実行可能
出力

▶ 実行ボタンを押すと結果がここに表示されます

実行すると、次の通りに出ます

299

cheapest = prices[0] が順次、for が反復、if が分岐です。答えは 299 で、目で見た答えと同じです。

2 本目は、値段の数を 5 個から 100 万個まで変えて、比べた回数と、覚え直した回数を数えます。値段は、高い順に並べた場合と、安い順に並べた場合の 2 通りで試します。出力は左から、値段の数、比べた回数、高い順のときに覚え直した回数、安い順のときに覚え直した回数です。

動かす 比べた回数を数える

python実行可能
出力

▶ 実行ボタンを押すと結果がここに表示されます

実行すると、次の通りに出ます

5 4 4 0
10 9 9 0
1000 999 999 0
1000000 999999 999999 0

比べた回数は、どの並びでも値段の数より 1 少なくなりました。100 万個なら 999,999 回です。覚え直した回数は並びで変わり、高い順なら毎回覚え直し、安い順なら 1 回も覚え直しません。分岐の中身を通る回数は入力しだいですが、比べる回数は変わらない、という違いが数で見えます。

3 本目は、最大公約数を求める 2 つの手順を数え比べます。引き算の手順は、大きいほうから小さいほうを引き続けます。割り算の手順は、大きいほうを小さいほうで割った余りに置き換えます。どちらも答えを Python の math.gcd と照らします。出力は左から、2 つの数、答え、引き算の手順の回数、割り算の手順の回数です。

動かす 最大公約数の 2 つの手順

python実行可能
出力

▶ 実行ボタンを押すと結果がここに表示されます

実行すると、次の通りに出ます

48 18 6 4 3 True
1071 1029 21 26 3 True
1000000 1 1 999999 1 True

3 組とも、2 つの手順の答えは同じで、math.gcd とも一致しました (最後の True)。回数は、48 と 18 では 4 回と 3 回でほとんど差がありません。1,000,000 と 1 では、引き算の手順が 999,999 回、割り算の手順が 1 回です。同じ答えでも、手順しだいで手間がここまで変わります。

アルゴリズムはどこで壊れるのか

手順は、止まる条件が外れたとき、順番を入れ替えたとき、初めの値の置き方を誤ったときに壊れます。どれもエラーが出ずに起きることがあるので、気づきにくい壊れ方です。

止まる条件に届かない反復

反復は、止まる条件にいつか届かなければ終わりません。次のコードは、数から 2 ずつ引いて、0 になったら止まる手順です。偶数なら止まりますが、奇数は 0 を飛び越えて止まりません。ここでは 1,000 回で打ち切って確かめます。

動かす 止まらない反復

python実行可能
出力

▶ 実行ボタンを押すと結果がここに表示されます

実行すると、次の通りに出ます

10 5
7 打ち切り

10 は 5 回で 0 に着きました。7 は 5、3、1、−1 と進み、0 を飛び越えたので、1,000 回で打ち切るまで回り続けました。続ける条件を n != 0 ではなく n > 0 と書けば、0 を飛び越えたところで止まるので、奇数でも終わります。

順番を入れ替えると答えが変わる

順次は、並べた順に意味があります。1,000 円の品に「10% 引き」と「500 円引きの券」を使う手順で、順番を入れ替えて比べます。

動かす 順番を入れ替える

python実行可能
出力

▶ 実行ボタンを押すと結果がここに表示されます

実行すると、次の通りに出ます

10% 引きが先 400
券が先 450

同じ 2 つの操作でも、10% 引きが先なら 400 円、券が先なら 450 円です。手順を書くときは、どの順で行うかまで決めて書かないと、人によって答えが変わります。下の実例は、コードの一部を前に動かしたことが事故の始まりになった記録です。

初めの値を 0 にすると、一番安い値段を見落とす

一番安い値段を探すとき、覚える値段の初めを 0 にすると、どの値段も 0 より安くないので、答えは 0 のままです。

動かす 初めの値の誤り

python実行可能
出力

▶ 実行ボタンを押すと結果がここに表示されます

実行すると、次の通りに出ます

初めを 0 0
初めを先頭 299

初めを 0 にすると、答えは並びに無い 0 になりました。初めを先頭の値段にすれば、299 が出ます。エラーは出ないので、答えを確かめる試験が無いと見落とします。

手順が正しいかを仕事でどう確かめるのか

仕事では、自分の書いた手順の答えを、確かな道具の答えと照らし、境目の入力を試験に入れて確かめます。

  1. 確かな答えと照らす。一番安い値段なら Python の min、最大公約数なら math.gcd と同じ答えになるかを、たくさんの入力で比べる
  2. 境目を試す。値段が 1 つだけ、同じ値段が並ぶ、負の数がある、空の並び、の 4 つは書き間違いが出やすい。Python の min は、空の並びを渡すと ValueError を出すと公式文書に書かれている。自分の手順も、空のときどうするかを決めておく
  3. 反復ごとに、止まる条件へ近づいているかを読む。while を書いたら、どの値が毎回どちらへ動くかを言葉で言えるようにする
  4. 回数を数える。比べた回数を出して、データが 2 倍になったとき回数が何倍になるかを見る

照らす試験

def test_cheapest():
    cases = [[5], [3, 3],
             [-1, 4, -7],
             [480, 320, 650]]
    for xs in cases:
        assert cheapest(xs) == \
            min(xs)

関わる実例

コードの順番の入れ替えと止まらない注文 (2012年8月1日)

2012年8月1日、アメリカの証券会社 Knight Capital の注文を振り分ける仕組みが、取引の始まりから 45 分の間に、212 件の客の注文を埋めようとして 400 万件を超える注文を市場に送りました。アメリカの証券取引委員会 (SEC) が 2013年10月16日に公表した発表によると、会社は 3 億 9,700 万株を超える株を売り買いし、4 億 6,000 万ドルを超える損を出しました。

発表は、2 つの技術の誤りを挙げています。1 つは、2005 年に、振り分けの仕組みのコードの一部を、コードの流れの前のほうへ動かし、使わない予定の機能を壊れたまま残したことです。もう 1 つは、2012 年 7 月の終わりに新しいコードを正しく入れられず、特定の注文がその壊れた機能を動かしたことです。壊れた機能は、注文が埋まったことを見分けられませんでした。

崩れた前提は 2 つあります。「コードを動かしても、手順の順番は変わらない」と、「繰り返しは、注文が埋まったら止まる」です。この回の「順番を入れ替える」と「止まらない反復」のコードで見た壊れ方が、実際の仕組みで起きた記録です。

出典は SEC Charges Knight Capital With Violations of Market Access Rule (SEC) です。

よくある問い

アルゴリズムの読み方と語源は何ですか

読み方は「アルゴリズム」で、英語の algorithm です。NIST の辞典は、この語が、825 年ごろに計算の決まりの本を書いたペルシャの著者アル・フワーリズミーの名前から来ていると書いています。

アルゴリズムとプログラムは何が違いますか

アルゴリズムは手順そのもので、プログラムはその手順をコンピュータが読める言葉で書いた物です。同じアルゴリズムを、Python でも JavaScript でも、日本語の箇条書きでも書けます。上の一番安い値段の手順は、言葉で 4 行、Python で 7 行でした。

SNS のアルゴリズムとは何のことですか

SNS で言うアルゴリズムは、どの投稿を、誰の画面に、どの順で出すかを決める手順のことです。投稿を絞り込み、並べ替える手順なので、この道の探索とソートの考え方につながっています。中身は各社が決めていて、公開されていない部分が多くあります。

アルゴリズム思考とは何ですか

問題を、順次、分岐、反復で書ける小さな手順に分けて考えるやり方のことです。「一番安い物を選ぶ」を、「覚える」「1 つずつ見る」「安ければ覚え直す」に分けたのがその例です。分けた手順が必ず終わるか、何回で終わるかまで考えるのが、プログラミングでの考え方です。

アルゴリズムはどう勉強すればよいですか

まず、身近な手順を 3 つの形で書き、コードにして動かします。次に、探索やソートのような代表的な手順を、同じ問題を解く別の手順と回数で比べます。この道は、2-1 の線形探索と二分探索から 2-9 の動的計画法までをその順に並べ、2-10 でエンジニアの採用のコーディングテストの形で確かめます。

確認クイズ

答えだと思う選択肢を押すと、その場で正誤と理由が開きます。4 問すべてに正しく答えると、この回は修了で、石が緑に変わります (この端末のブラウザに残ります)。間違えた問いは、あとから解き直せます。

1 問目

「全部の具に火が通るまで、1 分ずつ煮る」は、3 つの形のうちどれにあたりますか。

2 問目

値段が 1,000 個並んでいます。この回の一番安い値段を探す手順で、値段どうしを比べる回数は何回ですか。

3 問目

止まる条件に届かずに回り続ける手順はどれですか。

4 問目

このコードを動かすと何が出ますか。

一番高い値段

prices = [480, 320, 650,
          299, 410]
top = 0
for p in prices:
    if p > top:
        top = p
print(top)

説明課題

朝起きてから家を出るまでの手順を 5 行から 8 行で書き、どの行が順次、分岐、反復にあたるかを書き添えてください。反復には、止まる条件も書いてください。書いたら、下の模範解答を開いて比べてください。

模範解答

自分の説明を書いてから開いて、比べてください。

この回の先の一歩

仕事では、決まった手順を人に頼まずコードに書くことで、作業の抜けと順番の取り違えを減らします。手順を 3 つの形で書けると、レビューで「この繰り返しはどこで止まるか」を問えるようになります。

一次資料

どれも 2026年10月27日に開いて、題と中身を確かめました。

次へ

道 2 データ構造とアルゴリズムの回

  1. 2-0アルゴリズムとは順次、分岐、反復の 3 つで書く手順この回
  2. 2-1線形探索と二分探索100 万件でも 20 回で見つかる頁で読む
  3. 2-2バブルソートと挿入・選択ソート遅いソート 3 つ、2 倍で約 4 倍頁で読む
  4. 2-3クイックソートとマージソート速いソート 2 つ、平均と最悪頁で読む
  5. 2-4スタックとキュー積む順と並ぶ順頁で読む
  6. 2-5再帰自分を呼んで小さくする頁で読む
  7. 2-6木と二分探索木たどる順、片寄り頁で読む
  8. 2-7ハッシュテーブル鍵から一気に引く、衝突頁で読む
  9. 2-8ダイクストラ法と最短経路点と線、幅優先、重みのある道頁で読む
  10. 2-9動的計画法同じ計算を 2 度しない頁で読む
  11. 2-10試験と面接で確かめる基本情報 科目B、道場 10 問、面接 20 問頁で読む

道 2 の頁へ戻るほかの道を見る