はじめに

私はプログラミングの勉強を始めた頃、「アルゴリズム」って何のことか全く理解していませんでした。その単語自体を難しく受け取り、本当に熟練されたプログラマにしか理解できないものと認識し、勝手に苦手意識を持ってしまっていました。
本当に初めの頃は、「取りあえず動いてくれー!」って必死にソースコードを書いていた状況でしたし…。そんな私が「アルゴリズム」について、理解した概要をざっくりとご紹介していければと思います。

アルゴリズムとは

普段皆さんは様々なプログラミング言語を勉強をされるうえで、何を意識し学習しておりますでしょうか?
1つとして「プログラミング言語の構文を理解し読み解き、ソースコードを実際に書き習得すること」が上げられると思われます。
確かにとても大切なことですよね。

しかしプログラミングを行ううえで、もう1つ大切なことを一緒に覚えていただきたく。

それはアルゴリズムを理解し習得すること。

じゃあそのアルゴリズムとは何を指すのでしょうか。

端的に言うと
何らかの問題を解決するための数学的計算手順(算法ともいう)アルゴリズムと呼びます。
そして固まった手順をコンピュータに理解させるように記述したものがプログラムと呼ばれます。

ということは、プログラムを書いている以上何らかのアルゴリズムに触れていることになりますね。
つまりアルゴリズムは、プログラミングを作成するうえでの基礎となるのです。

アルゴリズムが必要なわけ

そもそもプログラミングとはビジネス課題を解決するため、システムを構築したり、新しい機能をリリースするためにあります。しかし課題を解決できるものであればどんなプログラムでもいいというわけにはいきません。

それはなぜか。

例えばプログラムの処理能力の差というのは、データ量などが増えると大きくなる傾向にあります。試しに1から100の合計を求める時、同じ機能を満たすために、Aのアルゴリズムは数分で処理が完了とすれば、Bのアルゴリズムは数秒で処理が完了する場合もあるのです。

処理時間の差については少し大げさな表現になってしまったかもしれませんが・・・。
では、なぜAとBの処理時間に差が生じてしまっているのか。

今度は分かりやすいように、人参のいちょう切りに例えて考えてみましょう。

<Aの場合>
①1枚ずつ輪切りに20枚カットする。(カットした回数19回)
②輪切りにしたものを1まいずつ4等分にカットする。(カットした回数40回)
=包丁を入れた回数59回

<Bの場合>
①縦4本にカットする。(カットした回数3回)
②カットした4本を2本ずつ横にカットする。(カットした回数19×2回)
=包丁を入れた回数41回

出来上がるものは同じでも、最終的にAよりBの方が包丁をいれた回数が少なくなっています。

何が言いたいかというと。
手順(アルゴリズム)の違いによりプログラムの処理能力に大きな差が生まれているということ。

同じ機能を満たすための手順(アルゴリズム)はたくさんありますが、より効率良くリクエストやデータを処理できることが大切なのです。もちろんシステムパフォーマンス向上のためでありますが、同時にシステムの保守性を高めるためでもあります。データ量が少ないうちは遅いアルゴリズムでも問題なくても、データ量が増えた際に、処理時間が大きくかかるとその重要性に気づきます。つまりアルゴリズムとは、効率の良いプログラムを作成するための手順、計算方法なのです。

良いアルゴリズムの指標

アルゴリズムの良し悪しの判断材料の1つ計算量という概念があります。
計算量には、アルゴリズムの実行に必要な時間を表す時間計算量、アルゴリズム実行に必要なメモリ領域を表す領域計算量の2つがあります。
計算回数が少ないアルゴリズムは、従って時間計算量も少なくなるため、早く結果が出力されるでしょう。
メモリ使用量が少ないアルゴリズムは、領域計算量が少なく、メモリを多く搭載できない場合でも動作が可能でしょう。
つまりは、時間計算量と領域計算量が共に少ないものが良いアルゴリズムにするための1つの指標となります。
ただし、時間計算量と領域計算量は両立が難しい関係性にあり、一方をとると他方を失う可能性があるため、優先すべきはどちらかプログラムの目的に応じて2つの要素を調整する必要があります。

代表的なアルゴリズム

  • ソートアルゴリズム
    (バブルソート、クイックソート、マージソート等)
  • 探索アルゴリズム
    (二分探索、線形探索、ハッシュ探索等)
  • 暗号化アルゴリズム
    (共通鍵暗号、公開鍵暗号等)
  • 幾何学系アルゴリズム
    (凸包、レイトレーシング等)
  • その他…

上記のように様々なアルゴリズムの種類があり、それぞれ違う役割を担い、社会の様々なシステムで利用されています。
これらのアルゴリズム身近なものに例えると、Googleなどの検索サービス、TwitterやFacebookやInstagramなどのSNS(ソーシャルネットワーキングサービス)、電車の乗り換え案内などで活用されています。
膨大な情報が行き交う現在社会において、情報を整理したり、必要なもののみを選定するアルゴリズムは、効率的な情報社会を作るための必要不可欠な存在となっているのでしょう。

ソートアルゴリズムについては別記事でまとめました!

さいごに

プログラミングの勉強をし始めの頃は思いつかなくても、ある程度プログラミングの知識を積むと、「もっと効率の良いやり方があるのでは?」と気づいたりします。ぜひその際には、それぞれの役割に担ったアルゴリズムを調べてみてください。今よりずっと効率の良いものが仕上がるかもしれませんね。

作者情報
三度の飯より珈琲が好き。自宅で挽いた珈琲をマイタンブラーに入れ、仕事へ持って行くのがこだわり。今は3Dラテアートを修行中の元飲食店員。いつか創作動画とかアップしてみたいです。