見出し画像

アルゴリズムは大事なのよ

どうも。今日はAIのための数学から離れて、HTMLやXMLなどマークアップ言語はわかるけどこれからプログラミングを学びたい人または現在学習中の人、すでに案件を抱えた駆け出しのプログラマ向けに、プログラマにはアルゴリズムがなぜ必要であるかについて話したいと思います。

昨年頃から「プログラミングを学び、それで生計を立てたい(もしくは生計を立てている)」という方をネット上で、主にTwitterでよく見かけます。その中には数ヶ月で案件を抱え報酬を得た、という人も見かけます。それは凄いことです。
しかし、プログラミング言語は学んでいても、アルゴリズムまでしっかり学んだという人は見かけません。それは何故でしょうか。
その答えは、最近の言語はライブラリ(プログラムの塊)が充実しておりアルゴリズムを自分で書かなくてもそれなりのコードが書けてしまうからです。ライブラリの組み合わせのような感じでしょうか。

実際問題、簡単な案件であれば準備されたライブラリだけで対処できてしまいます。しかし、プログラマである以上、絶対にアルゴリズムを学ばなくてはならないと声を大にして宣言します。

では何故アルゴリズムを学ばなければならないのでしょうか。そもそもアルゴリズムとは何なのでしょうか。それをこれから書いていきます。

・アルゴリズムとは?

アルゴリズムと聞くと、ほとんどの人が真っ先に「アルゴリズムたいそう」を思い浮かべるのではないでしょうか。

とはいえ、じゃあアルゴリズムって何なの?と聞かれると解答に困ってしまう。アルゴリズムとは、一言で言ってしまうと「手順」です。
問題や課題を解決するために排他的かつ網羅的(被らず、漏れなく)に記された手順をアルゴリズムと呼びます。

アルゴリズムという言葉は普段目にすることはありませんが、日常の中のあらゆるものに使われています。

もっともわかりやすいのは「料理のレシピ」ではないでしょうか。レシピは、必要な具材とその分量、処理の仕方、調理の方法などが書かれていますね。レシピ通りに作ることで、特定の料理を作ることができます。これは立派なアルゴリズムです。

アルゴリズムであるための条件

手順が書かれているからといって、それをアルゴリズムと呼べるかどうかはまた別の話です。アルゴリズムである条件は以下の通りです。

正しい結果が得られること
必ず終わること

アルゴリズムは「問題や課題を解決するための手順」であるため、間違った結果を出力していてはアルゴリズムと呼べません。正しい結果が得られるというのは最低条件といえます。

また、アルゴリズムは必ず終わる必要があります。途中の処理が間違っていると、開始されたアルゴリズムが永遠に終わらないことがあります。無限ループというやつです。意図的に無限ループを作ることもありますが、それ稀なケースです。当たり前のように思うかもしれませんが、「アルゴリズムは終わるもの」とご理解ください。

・なぜアルゴリズムを学ぶのか

ここまでは、アルゴリズムとは何なのかついて書きました。では次にこの記事の本質でもある、「なぜ学ぶか」について書きます。

さっそくその答えを書きますが「アルゴリズムとはプログラムそのものであるから」です。

プログラムは、処理の手順を書いていきますよね。ちゃんと手順さえ書いていればそれなりのものを作ることができます。しかしそれだけでは不十分です。プログラミングは奥が深いものです。単純につらつらと処理だけを書いていれば目的のものを作ることはできますが、コードが長くなるとそれだけ処理は遅くなるし、読みづらいです。処理が遅くて読みづらいコードはまさに悪そのものです。

そこで学ぶべきことがアルゴリズムなのです。
アルゴリズムを学ぶとこんな利点があります。

・コードの質があがる
・コードの良し悪しを判断できる
・コーディングを効率化できる
・技術向上につながる

上質なプログラマの書くコードの特徴は、高速・効率的・汎用性が高いの三拍子が揃っています。その骨格となるのはやはりアルゴリズムです。
アルゴリズムを学ぶ一番の目的は、より良いアルゴリズムを学び、そして自らアルゴリズムを作ることにあります。

良いアルゴリズムとは

アルゴリズムと言っても、良質なもの、悪質なものももちろん存在します。良質なアルゴリズムとはどんなものなのでしょうか。それは、

高速であるアルゴリズム
効率的であるアルゴリズム
可読性が高いアルゴリズム
汎用性が高いアルゴリズム

です。同じ結果が得られるのであれば、高速である方がいいし、実行した際に使われるメモリが少なく効率的であるほうがいいし、読みやすいほうがいいし、別の場所でも使えるほうがいいし。という理屈です。

アルゴリズムがプログラムそのものであるなら、上記を満たしているコードの方がいいに決まっています。アルゴリズムをしっかり学ぶことで、プログラミングの作業そのものを効率化することができます。辛辣なようですがアルゴリズムを学んでいないプログラマは最悪です。

以前、誰もが知っている企業にお邪魔したことがあって、そこで使われているシステムを拝見したのですが、標準ライブラリに頼ったコードでそれそれは劣悪なものでした。処理速度は遅く、エラーも頻発し、しかもユーザビリティが最低のシステムで、あんなものは世に出てはいけないとすら思いました。

どうせ作るならちゃんとしたものを作らなければならないし、それがプロであると私は思っています。

アルゴリズムの具体例

アルゴリズムと連発してるけど、どんなのがあるんだよ!具体例だせよ!とお思いなのではないでしょうが。そう思ったあなたのために2つの具体例を紹介します。

アルゴリズムの入門書ではまずデータ構造が紹介がされることが多いです。変数、配列、多次元配列、静的配列、動的配列などなど…
プログラムといえばアルゴリズム、アルゴリズムといえばデータ構造と言われるくらい切っても切り離せない関係です。しかし、今回はデータ構造についての説明は省き、定番のアルゴリズムのうちのひとつであるバイナリサーチ(二分探索法)と、クレジットカードの会員番号のアルゴリズムを紹介しようと思います。

バイナリサーチ(二分探索法)

バイナリサーチは整列されている配列から対象となるデータを探すためのアルゴリズムの1つです。対象となる配列はあらかじめ昇順または降順に整理されている必要があり、探索する範囲を半分に絞りながら進めていきます。

今回は1〜9の整列された整数を例とし、6を探してみましょう。↓

STEP 1
まずは配列の中心にある数を調べます。
この配列の場合、中心の数は「5」です。↓

STEP 2
次に「5」と目的の「6」を比較してみます。
5 < 6 なので、6は5より右側にあることがわかります。

STEP 3
必要のなくなった数は候補から除外します。
この場合。5以下の数字つまり、5と5より左側にある数を除外します。

STEP 4
残った配列の中心にある数を調べます。
この場合は「7」になります。

STEP 5
「6」と「7」を比較します。
6 < 7 なので、6 は 7 より左側にあることがわかります。

STEP 6
STEP 3と同様に必要のなくなった数は候補から除外します。

STEP 7
残った配列の中心にある数を調べます。
この場合は「6」になります。
6 = 6 となり目的の数字を探し出すことができました。

今回の例は1から9までの短い配列でしたが、このアルゴリズムは配列が長いほどその威力を発揮します。長い配列の場合、ひとつずつ対象のデータかどうかを探していては時間が膨大にかかってしまうので、こういったアルゴリズムを利用し作業を効率化するのです。

・クレカの会員番号の判別方法

クレジットカードを使ったことがない人はあまりいないと思います。ネットで買い物をするときはカード番号などカードに関する情報を入力して支払いますよね。

クレジットカードにかかれている4文字 × 4セットの合計16桁の数字がありますが、あれはランダムに生成されは数字ではなく「Luhnのアルゴリズム」と呼ばれるアルゴリズムによって生成されています。

Luhnのアルゴリズムは4つのステップからなります。今回は「3491」を例にその解説をします。

STEP 1
一の位から数えて奇数番目の数はそのままにして、偶数番目の数を二倍にします。

3491 から 3 と 9 を取り出し二倍に。

3 ➡︎ 6
9 ➡︎ 18

STEP 2
2倍にした偶数番目の数が10を超える場合は、その各桁を足した数に置き換えます。

18は10以上なので、

18 ➡︎ 1 + 8 = 9


STEP 3
このようにして得られた全ての数を足します。

6 + 4 + 9 + 1 = 20

STEP 4
その合計が10で割り切れれば正当な番号となり、割り切れなければ不当な番号となります。

※これはあくまで基礎となる考え方なので、カード会社によってルールが異なる場合があります。


まとめ

以上でこの記事はおわりとなります。プログラマならアルゴリズムはやったほうがいいぐらいしかに思ってなくて書いてるので真に受けないでください。

以上!ご静聴ありがとうございました!!!



この記事が気に入ったらサポートをしてみませんか?