アルゴリズムとは?プログラムとの違いと、探し方の例でわかる手順

30秒でわかる答え

アルゴリズムは、目的の答えを得るための具体的な手順です。同じ数字を探す場合でも、順に調べる方法と、並び順を使って範囲を半分に絞る方法では、必要な比較や使える条件が異なります。

ラボの机に、番号が書かれたカードが8枚あります。「13を探してください」と言われたら、左から一枚ずつ見るでしょうか。それとも、並び方を確かめて別の探し方を選ぶでしょうか。

同じ答えを探す場合でも、そこへ至る手順は一つではありません。この手順の考え方が、アルゴリズムの入口です。

漫画:大きいカードは、どっち? 全4ページ

数字カードを仕分けるユイとイト。「大きいカードを青い箱へ」と頼まれたイトは、いちばん大きな紙を選びます。けれどユイが考えていたのは……。

画像を押すと拡大できます。+/−で大きさを変え、拡大中はドラッグして読めます。

1 / 4大きいのは、どのカード?

ラボで数字のカードを仕分けるユイとイト。大きな紙の2、中くらいの8、小さな13が並んでいる。「大きいカードを青い箱へ」と頼まれたイトは、大きな2を選ぶ。ユイは思っていた結果と違い、立ち止まる。

1ページ目:大きいのは、どのカード?
「大きい」だけでは、紙の大きさか数字かが決まりません。

1ページ目のセリフ

  • ラボで数字のカードを仕分けるユイとイト。大きな紙の2、中くらいの8、小さな13が並んでいる。「大きいカードを青い箱へ」と頼まれたイトは、大きな2を選ぶ。ユイは思っていた結果と違い、立ち止まる。
  • ユイ「大きいカードを、青い箱へお願いします。」
  • イト「これが、一番大きいぞ!」
  • ユイ「あれ……?」
  • カードは紙のサイズが2>8>13、数字は2<8<13。青と白の浅い箱は一つずつ。最初は2を青へ入れる。
  • 背景にはPicoRouteのマークと、小さな紙「やってみよう きっとできる」。手順メモはまだない。

2 / 4何を見るかを、決める

カードの紙サイズと数字を別々に考え、ユイが依頼を言い直す。左から一枚ずつ数字を見る。10以上なら青、それ以外は白。最後まで見たら終わり、と手順をメモする。カードを左から2、8、13へ戻し、二つの箱を空にして、イトが試す。

2ページ目:何を見るかを、決める
目的だけでなく、見る条件・進む順番・終わり方まで具体的に決めます。

2ページ目のセリフ

  • カードの紙サイズと数字を別々に考え、ユイが依頼を言い直す。左から一枚ずつ数字を見る。10以上なら青、それ以外は白。最後まで見たら終わり、と手順をメモする。カードを左から2、8、13へ戻し、二つの箱を空にして、イトが試す。
  • イト「カードの大きさじゃないの?」
  • ユイ「数字の大きいほう、のつもりでした。」
  • ユイ「何を見るか、決めましょう。」
  • ユイ「この手順で、試してみましょう。」
  • イト「ぼくが、やる!」
  • 手順のメモ「左から一枚ずつ」「数字が10以上なら青」「それ以外は白」「最後まで見たら、おしまい」。カードを元の左から2/8/13へ戻し、青と白の箱は空。

3 / 4手順を試して、もう一枚

イトが左から2、8、13を一枚ずつ確認する。2と8は白い箱、13は青い箱へ入れる。最初の三枚を見終えたところで、ユイが新しく10のカードを出す。イトは境目の数字を見て考える。

3ページ目:手順を試して、もう一枚
数字を条件に沿って比べると、紙のサイズに関係なく仕分けられます。

3ページ目のセリフ

  • イトが左から2、8、13を一枚ずつ確認する。2と8は白い箱、13は青い箱へ入れる。最初の三枚を見終えたところで、ユイが新しく10のカードを出す。イトは境目の数字を見て考える。
  • イト「2は、白!」
  • イト「8も、白!」
  • イト「13は、青!」
  • ユイ「じゃあ、この一枚は?」
  • イト「ちょうど10……。」
  • 白い箱に2と8、青い箱に13。新しい10はまだユイの手。大きい2を青へ入れ直すことはない。

4 / 4数字も、大きさも

イトはメモの「10以上」を確かめ、新しい10を青い箱へ入れる。ユイは結果を喜ぶ。仕分けを終えたイトは、白い箱から大きな2のカードを取り出し、うちわのようにあおぐ。紙の大きさを別の遊びに使い、二人が笑う。

4ページ目:数字も、大きさも
条件の10以上は10を含みます。この例のアルゴリズムは、数字をどの順に見て、どの箱へ入れ、いつ終わるかまで定めた仕分けの手順です。

4ページ目のセリフ

  • イトはメモの「10以上」を確かめ、新しい10を青い箱へ入れる。ユイは結果を喜ぶ。仕分けを終えたイトは、白い箱から大きな2のカードを取り出し、うちわのようにあおぐ。紙の大きさを別の遊びに使い、二人が笑う。
  • イト「10も、青だ!」
  • ユイ「ちゃんと分けられましたね。」
  • イト「この大きさは、うちわ向き!」
  • ユイ「そちらは、ちゃんと大きいですね。」
  • 10を追加して試した結果は青に13と10、白に2と8。その後うちわ遊びで2だけを取り出し、白は8だけ、青は13/10を保つ。カード2は手に一枚で箱に重複しない。

横にスワイプして次のページへ。画像を押すと拡大できます。

漫画は数字でカードを仕分ける具体例です。紙のサイズは判定に使いません。本文では、数字を探す目的に対して異なる手順と条件を比較します。漫画の仕分けは実行時間や探索の効率を測るものではありません。

目的・条件・終わり方を決める手順を本文で読む ↓

100%

拡大中はマウスや指でドラッグできます。100%では左右スワイプ・左右キーでページ送り。

アルゴリズムとは、答えを得るための具体的な手順

アルゴリズムとは、ある目的の結果を得るために、何をどの順番で行うかを具体的に定めた手順です。 数字を探す、名前順に並べる、二地点を結ぶ道を探すなど、さまざまな問題に使われます。

「13を探す」は目的です。「左端から順に比べ、13なら止める。最後までなければ、ないと答える」は手順です。目的だけでは、コンピューターがどんな処理を進めればよいかは決まりません。

手順を考えるときは、次の三つを分けておきます。

  • 入力:何を受け取るか。今回ならカードの列と探す数字。
  • 処理の決まり:どこから見て、どんな条件で次へ進むか。
  • 結果と終わり方:見つけた位置を返すか、見つからないと答えるか。

料理のレシピも、手順をイメージするたとえになります。ただし「いい感じになるまで」のように人の判断へ任せた表現は、そのままでは計算の指示になりません。何を調べて次へ進むかまで明らかにします。そうして決めた手順を、コンピューターに実行させる形へ書くところで、プログラムとつながります。

アルゴリズムとプログラムの違い

アルゴリズムは「どう解くか」という手順、プログラムはその手順などをコンピューターで実行できるように記述したものです。同じ探し方を、異なるプログラミング言語で書くこともできます。

見るもの番号カードを探す例
目的13のカードがあるか知る
アルゴリズム左から順に数字を比べる
プログラムその比較と繰り返しをコードで記述する
実行書いたコードを動かして、実際の数列を調べる

一つのアプリには、入力を受ける処理や結果を表示する処理もあります。アルゴリズムだけで、画面や保存などのすべてが決まるわけではありません。コードを動かす土台は、プログラムが動く仕組みで扱います。

ユイ

アルゴリズムは言語の名前じゃなくて、どんな順番で解くかなんですね

マコト

そう。同じカードで探し方だけ変えると、違いが見えるよ

具体例:同じ13を、二つのアルゴリズムで探す

ここでは「1、3、5、7、9、11、13、15」が小さい順に並んでいます。目的は、13があるかを調べることです。

小さい順の8枚

13579111315

線形探索
1 → 3 → 5 → 7 → 9 → 11 → 13:7枚確認して発見

二分探索
7 → 11 → 13:3枚確認して発見

数字との比較に使ったカード枚数を数えます。二分探索で中央が2枚なら左を選びます。実行時間や並べ替えの手間は含めません。

線形探索:端から一枚ずつ確かめる

左から順に見て、探す数字と同じかを比べます。13に届くまでに確認するのは、1・3・5・7・9・11・13の7枚です。このように要素を順番に調べる方法を、線形探索と呼びます。

この例の線形探索は、並んでいる大小を利用せず、同じ値かだけを見ます。そのため、カードが順不同でも使えます。最後までなければ「該当なし」で終わります。

二分探索:中央を見て、探す範囲を絞る

小さい順に並んでいることを利用すると、中央との比較から、探す数字があり得る側を選べます。これが二分探索です。この例では、中央が2枚あるときは左側を選びます。

  1. 最初は中央の7を見る。13は7より大きいので、7までを候補から外す。
  2. 残った9・11・13・15の中央として11を見る。13は11より大きいので、11までを外す。
  3. 残った13・15から13を見て、発見する。

比較に使ったのは3枚です。7枚と3枚で、どちらも同じ13を見つけられました。答えが同じでも、そこへ至る仕事の量が変わります。では、カードを混ぜてしまっても、同じように半分ずつ候補を外せるでしょうか。

二分探索には「順番に並んでいる」という条件がある

もしカードが「13、3、15、7、1、11、5、9」の順なら、中央の7を見ただけで左側を捨てることはできません。探している13が、その左側にあるからです。

半分を候補から外せるのは、その側に答えがないと判断できる条件があるからです。 二分探索では、調べる基準に沿って整列されていることが、その判断を支えます。

また、二分探索でも、探す値がなければ候補が空になったところで終了します。2を探すと、7・3・1を確認した後、該当するカードはないと分かります。「見つかるまで続ける」だけでは、ないときの手順が足りません。

乱れたデータを先に並べ替えるなら、その作業にも手間がかかります。一度だけ探すのか、同じデータを何度も探すのかによっても、選び方は変わります。探している間の比較回数だけでは、準備を含めた仕事の量までは分かりません。

よいアルゴリズムは、いつも比較回数が少ないもの?

まず必要なのは、想定した条件で正しい結果を返すことです。そのうえで、処理の量、使うメモリ、準備の手間などを比べます。

今回の7枚と3枚は、カードを比べた回数です。実行時間を測った結果ではありません。実際の速さには、データの置き方、途中の要素へアクセスする方法、機械や実装も関係します。

さらに、1を探すなら線形探索は最初の1枚で見つかります。この8枚の例でも、毎回二分探索の確認枚数が少ないわけではありません。特定の一例だけで優劣を決めず、入力が増えた場合や、見つからない場合も考えます。

「速い手順」と聞いたら、何を数え、どんな入力で比べたのかを見ると、説明を読み違えにくくなります。

身近な探し物を、手順として説明してみる

連絡先の名前を探すとき、最初から順に見るのか、名前順の途中から絞るのかを言葉にしてみましょう。「名前順になっている」「同じ名前が複数あるかもしれない」といった条件も、手順を考える材料になります。

上の比較では、探す数字を1や2へ変えると、最初に見つかる場合と、見つからない場合を確かめられます。JavaScriptが使えない場合も、表示されている8枚を指で追って試せます。

Q1. アルゴリズムを学ぶには、先にプログラミングが必要ですか?

カードや紙に手順を書いて、条件や順番を確かめるところから始められます。プログラムにすると、その手順を多くのデータで繰り返し試せます。

Q2. SNSでいう「アルゴリズム」も同じ意味ですか?

投稿を選んだり順番を決めたりする仕組みを指して使われる言葉です。ただし、サービスごとのルールやモデルは、このカード探索の手順とは別です。この記事は個別サービスの表示順位や攻略法を説明するものではありません。

「何を得たいか」「どう進めるか」「いつ、その進め方を使えるか」。この三つを分けられれば、難しい数式がなくてもアルゴリズムを考え始められます。

今回は、すべてのカードを机に並べ、好きな位置を見られました。もし積み重なっていて、一番上からしか取れなかったら、同じ探し方は使えるでしょうか。データ構造とはでは、同じ三つのデータを待ち列と積み重ねで比べます。探す手順の次は、データをどう置き、どこから取り出せるかを見てみましょう。

この記事について

TERM PRIMER

アルゴリズム|この記事で使った言葉

データ
コンピューターが扱う情報。文字、画像、音、動画、Webサイトもデータとして扱われます。

LAB WHITEBOARD

アルゴリズムを一文で説明してみよう

「目的・手順・使える条件を分け、同じ結果でも探し方を変えられると説明できる。」を、いまの自分の言葉で一文にしてみてください。途中の説明でも大丈夫です。