最終更新日:2023.06.01
公開日:2023.01.24
- アルゴリズム
アルゴリズムとは?意味や簡単な例、種類などをわかりやすく解説します
プログラミングを学習している中で、アルゴリズムという言葉を耳にすることも多いのではないでしょうか。
アルゴリズムとは、「問題を解決するための手順や計算方法」のことをいいます。
プログラミング界隈でよく使われる言葉ですが、実は私たちの普段の暮らしの中にも見られるものです。
「アルゴリズムってどういう意味?」「アルゴリズムにはどんな種類があるの?」と思われる方も多いかもしれません。
この記事では、アルゴリズムの意味や具体例、アルゴリズムの種類について解説していきます。
アルゴリズムとは?どういう意味?
アルゴリズムとは「問題を解決するための手順や計算方法」のこと全般を指しますが、一般的に、プログラミングに関して使われることが多いです。
そもそもプログラミングとは、「コンピュータを動かすための指示を順番に書くこと」をいいます。
その指示の与え方にはいくつも方法(=アルゴリズム)があり、同じ指示であってもアルゴリズムによっては、指示が完了するまでのスピードを大幅に短縮することができます。
たった1件の指示であれば、結果が出るまでのスピードに大きな差はないかもしれません。
しかし、例えばビッグデータと呼ばれるような何千・何万件もの膨大な指示を処理する場合には、アルゴリズムが重要になってきます。
アルゴリズムを例えてみると?
アルゴリズムを使ったサービスや製品
普段何気なく使っているサービスなどにも、さまざまなアルゴリズムが存在しています。
乗り換え案内
現在地から目的地までのルートを調べる「乗り換え案内アプリ」といったものがありますが、ここで使用されている乗り換えルートもアルゴリズムといえます。
目的地に到達するためには、バスで行くルート、歩いて行くルート、電車で行くルート、車で行くルートといった、どの交通手段で行くのかという部分にも複数の方法があり、電車で行くルートの中でもどこで乗り換えるかによって時間や運賃は変わります。
効率よく目的地に到着するためには、最適なルートの選択(=アルゴリズム)が重要です。
他にも、洗濯機を例に挙げると「洗濯物の重さが5キロ以内なら水〇リットルを入れる」といった機能にもアルゴリズムが使われています。
日常の中にあるアルゴリズム例
プログラミングによって開発されたサービスや製品だけではなく、もっと身近なものにもアルゴリズムはあります。
料理
例えば料理の作り方もアルゴリズムといえるでしょう。
1つの料理を作り始めてから完成するまでの手順は、人によってさまざまです。
この時の料理を完成させるという目的に対する手順・やり方がアルゴリズムにあたります。
材料をまとめて切るようにしたり、オーブンを温める、ご飯を炊くなどの時間のかかるものを先に準備しておいたり、洗い物を隙間時間で進めたり、料理の工程をどうやって進めるかによってかかる時間は大きく変わります。
効率よく料理を完成するためには、調理の進め方(=アルゴリズム)が重要です。
買い物
日常の買い物もアルゴリズムといえるでしょう。
買い物リストを持ってスーパーに行く場合、買い物リストの上から順番に店内を探す、という人はあまり多くないのではないでしょうか。
おそらく、買い物リストを野菜・肉・飲料などざっくりと分類分けして、できるだけ店内を行ったり来たりしないように効率的に買い回ることが多いと思います。
これも、スーパーで食材を買うという目的の中で、商品を選ぶ順番や回るルートは無限にあり、その複数の方法から自分にとっての最適な方法で行動しています。
複数の選択肢から、何を重視するのかによって私たちはその時の自分にとっての最適なアルゴリズムを選んでいます。
プログラミングで使用するアルゴリズム例
もう少しプログラミングに近い例で考えていきます。
友人同士の割り勘アルゴリズム
Aさん、Bさんの2人で遊んだ際に、Aさんが1人1000円のランチ代(合計2000円)を代表して支払いました。
その後、Bさんがカラオケ代(合計1400円)を代表して支払いました。
この支払いを清算する方法の例を以下に挙げます。
(1) 総支払額から一人あたりの支払額を算出し、差分を清算する
Aさん:1人あたりの支払額1700円-支払い済み金額2000円=+300円
Bさん:1人あたりの支払額1700円-支払い済み金額1400円=-300円
(2) 1回の会計ごとに1人あたりの支払額を算出し、差分を清算する
ランチ代:BさんがAさんに1000円払う
カラオケ代:AさんがBさんに700円払う
清算方法(1)・(2)はどちらも目的と結果は同じですが、計算の仕方・手順によって行動が変わります。
今回の例のように、少ない人数であればどのような計算方法でもそれほど大変ではありません。
しかし、人数や支払い箇所が増えれば増えるほど(2)のアルゴリズムでは一人ひとりの手間が大きくかかってしまいます。
プログラミングをおこなう際には、上記のように複数あるアルゴリズムの中から適切なアルゴリズムを選んでいく必要があります。
プログラミングにおけるアルゴリズムの必要性
前述の通り、プログラミングにおいて効率のいいアルゴリズムを考えることは非常に大切です。
効率のいいアルゴリズムを考えることがなぜ大切なのか、プログラミングにおいてアルゴリズムがどうして必要なのかを解説します。
プログラミング内の処理が複雑になればなるほど、処理時間は長くなります。
基本的にプログラミングは、手作業ではできないほどの膨大な量を自動化するためにつくることが多く、同じ処理を何千回、何万回と繰り返されることも多くあります。
そのため、1回の処理に組み込むアルゴリズムをどれだけ単純に効率的に作り込めるかは、処理速度に大きく影響します。
そのため、プログラミングで一番重要な要素がアルゴリズムであるともいえるでしょう。
アルゴリズムの種類にはどんなものがある?
プログラミングにおけるアルゴリズムには代表的なものがいくつか存在します。
代表的なアルゴリズムを理解していることで、プログラミングで考えるべきアルゴリズムにも応用することができます。
さまざまなアルゴリズムを理解し、多くの選択肢を持ってプログラミングを進めることで、より効率のいいプログラミングをすることが可能になります。
ここでは、アルゴリズムにはどのような種類があるのか、代表的なアルゴリズムを紹介します。
探索アルゴリズム
目的
特定の値を探すためのアルゴリズム
例:誕生日を当てる(例えば9月1日が誕生日の人を当てる場合)
相手の誕生日を当てる時に、「1月1日?1月2日?1月3日?・・・」と順番に聞いていく方法のことを「線形探索アルゴリズム」といいます。
この方法だと1月1日の人はすぐ当たりますが、9月1日の人を当てるまでに時間がかかります。
誕生日を当てる時に、あたりをつけてその日より前か後かを聞いて絞り込んでいく方法のことを「二分探索アルゴリズム」といいます。
9月1日の人の場合、最初に「6月30日より後か」を聞き「YES」なら次に「9月30日より後か」を聞く、という形で絞り込んでいきます。
範囲を絞り込んでいくため、線形探索より少ない回数で答えに辿り着きやすくなります。
ソートアルゴリズム
目的
順番を並び替えるためのアルゴリズム
例:背の順に並び替える
クラスメイトを背の順に並べ替える時に、「並び替え済みのグループ」に一人ずつ足していく方法のことを「挿入ソートアルゴリズム」といいます。
※挿入ソートアルゴリズムの図
背の順に並べ替える時に、一番小さい人を探して1番目に置く、次に小さい人を探して2番目に置く・・・と並び替えていく方法のことを「選択ソートアルゴリズム」といいます。
※選択ソートアルゴリズムの図
暗号化アルゴリズム
目的
元のデータに処理を施し、別のデータに変換するためのアルゴリズムです。
私たちのクレジットカードや電話番号などの個人情報は漏洩されないように別のデータに変換されて処理されていたりします。
元のデータを別のデータに変換することを暗号化、その反対を復号化と言います。
例:クレジットカードの入力情報
暗号化と復号化に同じ鍵を使用してデータを暗号化したり復号化したりすることを「共通鍵暗号方式」といいます。
クレジットカードなどの暗号化は、共通鍵暗号アルゴリズム「AES」と呼ばれるものが標準暗号として使用されています。
パスワード付きのファイルなども鍵をかける時に設定するパスワードと開く時のパスワードは同じなので共通鍵暗号アルゴリズムを使用しています。
暗号化と復号化に別々の鍵を使用する方法のことを「公開鍵暗号方式」といいます。
暗号化する際と復号化する際で、別々の鍵を使用するため漏洩リスクが減ってセキュリティ強化につながりますが、処理時間がかかってしまうというデメリットもあります。
共通鍵暗号方式と公開鍵暗号方式との弱点を補い合う「ハイブリッド暗号方式」も存在します。
クレジットカードなどの暗号化には、ハイブリッド暗号方式を採用していることも多くあります。
近年では、ハイブリッド暗号方式「SSL」と呼ばれるものが有名になってきています。
アルゴリズムのまとめ
今回はアルゴリズムの意味や必要性、代表的なアルゴリズムについて解説しました。
効率のいいアルゴリズムを考えることは、プログラミングをおこなう上で欠かせないことです。
簡単なプログラムではそれほどアルゴリズムの重要性は感じにくいですが、複雑なプログラムになればなるほど処理時間が膨大になってしまうため、アルゴリズムは重要になってきます。
他にも代表的なアルゴリズムは多数存在しています。
アルゴリズムについて興味を持たれたら、より深く学んでみてはいかがでしょうか。