株式会社 PRUMのmasaです。
今日は「アルゴリズムの基本概念」という内容について、プログラミング初学者向けに記事を書きました。
この記事を読むことで、難しく感じがちなアルゴリズムを身近なものとして理解し、論理的にコードを組み立てるきっかけを得られると思います。
興味があれば読んでいただけると嬉しいです。
アルゴリズムは「問題を解くための手順」
未経験から学習を始めると、どこかのタイミングで必ず アルゴリズム という言葉に出会うと思います。
僕もエンジニアになりたての頃は、この言葉を聞くたびに「理系出身の人がやる難しい計算的なやつでしょ?」と身構えてしまいました。
でも、結論から言うと、アルゴリズムとは 「問題を解くための手順」 のことです。
コンピュータに効率よく動いてもらうための「レシピ」だと思ってください。
カレー作りで考える「手順の最適化」
例えば、あなたが今日の夕飯にカレーを作るとします。
以下の2つの作り方、どちらが早く完成するでしょうか?
- 野菜とお肉を全部切り終わるまで待ち、それからお湯を沸かし始める。
- お湯を沸かしながら、その横で野菜とお肉を切る。
当然、2番目の「並行して作業する」方が早く完成しますよね。
同じ「カレーを作る」という目的でも、手順(段取り)を変えるだけで、かかる時間が大きく変わる。この 「効率よく美味しく作るための段取りを考えること」 が、まさにアルゴリズムなんです。
開発現場の「ログイン機能」もアルゴリズム
日常の例だけだとピンとこないかもしれないので、実際の開発現場でよく作る「ログイン機能」を例にしてみましょう。
ログイン機能も、分解すると以下のような手順でできています。
- ユーザーが入力したIDとパスワードを受け取る
- データベースの中に、そのIDが存在するかを探す
- IDがあったら、パスワードが一致するかを確認する(※実際にはパスワードは暗号化された値で比較)
- 一致していれば「ログイン成功」の画面へ、違っていれば「エラー」の画面を返す
このように、コンピュータにやらせたいことを順序立てて論理的に組み立てる作業。これも立派なアルゴリズムです。
「どうやったら一番スムーズに目的の動きをしてくれるかな?」と道筋を考えること自体がアルゴリズムなので、決して特別な数学の知識が必須というわけではありません。
最初は「レシピ」を作る感覚でOK
コードを書き始める前に、日本語で「まずこれをして、次にこれをする」と箇条書きにする癖をつけると、頭の中がスッキリ整理されますよ!
データをキレイに並べる「ソート(整列)」をやってみよう
アルゴリズムのイメージが少し湧いてきたところで、もう少しプログラミングらしい例を見てみましょう。
代表的なアルゴリズムの一つに 「ソート(整列)」 があります。これは、バラバラのデータを「大きい順」や「小さい順」など、特定のルールに従ってキレイに並べ替える手順のことです。
ここでは、一番シンプルで有名な 「バブルソート(泡立ち法)」 という手順を紹介します。
トランプを「小さい順」に並べてみる
目の前に、バラバラの数字が書かれた5枚のトランプがあるとします。
[ 5, 3, 8, 1, 4 ]
これを一番左から小さい順に並べ替えたい時、バブルソートでは 「隣り合う2つのカードを比べて、右の方が小さければ入れ替える」 という、とてもシンプルな作業を繰り返します。
実際にどう動くか、ゆっくり追ってみましょう。
【1周目の作業】
-
5 と 3 を比べる → 3の方が小さいので入れ替える。
[ 3, 5, 8, 1, 4 ] -
5 と 8 を比べる → 5の方が小さいのでそのまま。
[ 3, 5, 8, 1, 4 ] -
8 と 1 を比べる → 1の方が小さいので入れ替える。
[ 3, 5, 1, 8, 4 ] -
8 と 4 を比べる → 4の方が小さいので入れ替える。
[ 3, 5, 1, 4, 8 ]
これで1周目が終わりました。見ての通り、一番大きな「8」が一番右端に移動しましたね。
水の中で泡(バブル)がポコポコと水面に浮かび上がっていくように、一番大きな数字が端っこに浮かび上がってくることから「バブルソート」と呼ばれています。
あとは、残りの4枚に対して同じ作業を2周目、3周目……と繰り返していくだけで、最終的に [ 1, 3, 4, 5, 8 ] というキレイな順番に並び替わります。
コンピュータは一瞬で並べ替えをしてくれる魔法の箱のように思えますが、裏側ではこうやって「地道に2つを見比べて入れ替える」という作業を、ものすごいスピードで実行しています。
もしもアルゴリズムを意識しないとどうなるのか?
「なるほど、手順が大事なのは分かった。でも、いま学習している段階では、とりあえず動けばいいんじゃないの?」と思う方もいるかもしれません。
たしかに、最初は動くコードを書けるだけで素晴らしいです!
ですが、アルゴリズム(手順)をまったく意識せずにコードを書く癖がついてしまうと、やがて 「なんとなく動くけど、なぜ動くのか分からないコード」 になってしまい、後から自分でも直せなくなり、開発現場の負担が増加してしまいます。
「目分量で作った料理」は後から修正できない
アルゴリズムを持たずにコードを書くのは、 「レシピを見ずに、適当な目分量で作った料理」 と似ています。
最初はたまたま美味しくできるかもしれません。でも、次に作った時に味がブレてしまった場合、「どの調味料を間違えたのか」「火加減が強すぎたのか」を後から振り返ることができませんよね。
「今、自分はどういう手順でコンピュータを動かそうとしているのか?」を意識
プログラミングでも同じことが起きます。
少し複雑な処理を書いてエラーが出たとき、アルゴリズムという明確な「手順の道筋」が頭にあれば、「全体の3番目の処理まではうまくいっているから、4番目の手順がおかしいはずだ」とエラーの原因にアタリをつけることができます。
しかし、手順を意識せずに「とりあえずコピペで動かした」ような状態だと、エラーが出た瞬間に「どこを見ればいいか全く分からない」と完全に迷子になってしまいます。
エラー解決で何日も悩んでしまい、プログラミング自体が嫌になってしまう。これは、僕を含め多くの初学者がぶつかる大きな壁です。
だからこそ、最初のうちから「今、自分はどういう手順でコンピュータを動かそうとしているのか?」を意識することが、結果的に自分の身を助けてくれます。
さいごに
アルゴリズムとは特別な数学などではなく 「目的を達成するための段取り」 です。一回で完璧に理解しなくても大丈夫です。まずは「そういう工夫があるんだな」と知っただけで、昨日の自分より確実に一歩前進しています。これからも焦らず、一緒に少しずつ積み上げていきましょう!
PRUMのエンジニアの95%以上は未経験からの採用です。
よければコーポレートサイトにも遊びに来てください。
▶ コーポレートサイト
エンジニアの方に役立つ記事をまとめたサイトも運営しています。もしご興味あれば覗いてみてくださいね。
▶ エンジニアに役立つ記事サイト