アルゴリズムとは?探し方の違いでわかる手順の考え方

30秒でわかる答え

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

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

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

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

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

「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でいう「アルゴリズム」も同じ意味ですか?

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

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

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

この記事について

LAB WHITEBOARD

自分の言葉で説明してみよう

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