探し方ひとつで速さがまるで違う
名簿から「田中さん」を探す方法を2つ考えてみます。
一つは、先頭から1人ずつ順番に見ていく方法。名簿が1万人なら、運が悪いと1万回見ることになります。もう一つは、名簿をあらかじめ五十音順に並べておき、真ん中を開いて「田中さんはこれより前か後か」を確かめ、残った半分でまた真ん中を開く、を繰り返す方法。こちらは、1万人でもせいぜい14回ほどで見つかります。
どちらも「探す」という同じ問題を解いていますが、手順が違うだけで、かかる手間がけた違いになる。アルゴリズムは、この「問題を解くための手順」を、誰が実行しても同じ結果になるよう順序立てて定めたものです。コンピューターは、アルゴリズムを命令として受け取り、その通りに処理を進めます。
料理のレシピにたとえられることもよくあります。「玉ねぎを炒める → 肉を加える → 調味料を入れる → 10分煮る」という手順が正しく書かれていれば、料理が得意でない人でも同じ料理が作れる。手順を変えれば、味や時間が変わります。
身の回りで動いているアルゴリズム
データを素早く探す(検索)、決まった順に並べる(ソート)、カーナビや地図アプリで最短の道を計算する、数値の規則性を見つけて予測する機械学習。どれもアルゴリズムの仕事です。データベースが大量のデータの中から目的の1件をすぐ取り出せるのも、裏で効率のよい手順が使われているからです。
アルゴリズムはプログラム言語に依存しません。どの言語で書いても、手順の考え方は同じです。手順の考え方がアルゴリズム、それを特定の言語で書き表したものがプログラム、という関係です。
「データが増えたら急に遅くなった」とき
少ないデータでは差が出なくても、遅いアルゴリズムは件数が増えたとたんに破綻します。100件では一瞬だった処理が、100万件で何時間もかかる、ということが起こります。システムの性能問題を調べると、原因がアルゴリズムの選び方にあることは珍しくありません。
効率の目安は「計算量」と呼ばれ、O記法(オーダー記法)で表されることが多いです。開発を頼む側がこれを読めなくても、「データが10倍、100倍になったとき、処理時間はどう伸びますか」と聞いてみると、設計の考え方が見えてきます。
作る側の基本は、よく使われる検索や並べ替えなら、自分で一から書かず、標準のライブラリに入っているものをまず使うこと。何十年も磨かれてきた手順を、わざわざ作り直す必要はありません。