アルゴリズムとは、簡単にいうと「手順や計算方法」のことを指します。コンピュータやプログラミングとも深い関わりのある言葉として、有名ですね。
当記事ではアルゴリズムについて説明するとともに、種類や活用場面、学ぶ必要性等についても解説していきます。
アルゴリズムとは簡単にいうと何?
「アルゴリズム」とは、簡単に言うと「手順や計算方法」のことです。さらにざっくりとした言い方をすれば「やり方」とも言えるでしょう。そもそもコンピュータは日本語に訳すと「電子計算機」となります。つまりコンピュータは、人の手では時間がかかりすぎたり、面倒だったりする計算を代わりにやってもらうためにあるのです。
そのときコンピュータにさせる「計算の手順、やり方」こそが「アルゴリズム」である、というわけです。
重要なのは、ある結果にたどり着くためのやり方(アルゴリズム)はたくさんあることです。
でも、最終的に同じ結果になるのであれば、できれば効率よく、すばやく計算してくれるほうが助かりますよね。
ですから、いくつかのアルゴリズムがある場合、より効率よく計算できるアルゴリズムのほうが優れていることになります。
コンピュータを「料理のヘタな友達」にたとえてみよう
話を分かりやすくするために「友達に頼んで、カレーを作ってもらう」ケースを想像してみましょう。友達(自分の代わりに料理をしてくれる人)をコンピュータ、調理の進め方をアルゴリズムと考えてください。残念ながら、コンピュータは勝手に仕事を行ってくれません。
例えると、一人でキッチンに立ったことがなく、一体何をすればいいのか自分では判断できない友達ということになります。ですから友達に、カレーの作り方(アルゴリズム)を教えてあげなければいけません。
カレーの作り方はいろいろありますが、その中にも効率のいい方法、悪い方法はあります。
たとえば野菜を柔らかくする場合、普通は切ったあと、すべてをまとめて茹でますよね。でも理論上は、切ったかけらをひとつずつ茹でていくこともできます。
この方法でも最終的にはすべての野菜が柔らかくなりますが(計算結果が同じになる)、時間がいくらあっても足りません。つまり、効率の悪いやり方(効率の悪いアルゴリズム)だと言えるのです。
代表的なアルゴリズム「二分探索法(にぶんたんさくほう)」
では、次はコンピュータのアルゴリズムについて説明します。アルゴリズムには色々なものがありますが、中でも代表的なのは「二分探索法(にぶんたんさくほう」です。たとえば、親戚の子どもが何歳だったか知りたいとします。
考えられる方法としては、「0歳?」「ちがうよ」「1歳?」「ちがうよ」と、0歳から順に聞いていく方法がありますね。
この方法は最もシンプルですが、親戚の子どもが18歳だった場合、19回も質問を繰り返すことになります。ちょっと面倒くさいですね。
これを効率よくするには、真ん中あたり(10歳)から質問していけばいいのです。「10歳?」と聞いて「それよりは大きいよ」と言われたら、0歳から10歳の間はもう質問しなくても良くなります。さっそく半分の可能性が消えるわけですから、先ほどの方法と比べるとずっと効率が良いわけです。
このように、半分のところで分けて調べる方法が「二分探索法」というアルゴリズムです。親戚の子どもの例であれば最大でも19回の質問で済みますが、コンピュータで計算する場合はまったく桁が違います。
そうなると「面倒くさい」では済まないですよね。ですから、なるべく効率的なアルゴリズムの研究が日々進められているわけです。
他にもある!代表的なアルゴリズム
アルゴリズムには様々な種類があり、用途や目的によって利用されるアルゴリズムは違ってきます。ここでは、代表的なものをいくつか紹介します。探索アルゴリズム(目的となるデータを探す)
まずは探索アルゴリズムの紹介。これは目的となるデータを探すもので、たとえば国語辞書の中から「プログラミング」という単語を探す場合を考えてみましょう。線型探索
線型探索は、最も原始的なアルゴリズムだと言えるでしょう。先頭から順番に探索を行っていき、一致するものを探します。国語辞書の例ですと、「プログラミング」の項目を見つけるために「あ」から探していくことになります。非効率的であり計算量も多くなってしまうのですが、対象となるデータが少ない場合は、これで十分なこともあります。
二分探索法
記事上部でも触れている二分探索法について。辞書の例でいうと、「最初の文字である“プ”は、辞書全体の中で前半と後半のどちらかにあるだろうか?」をまず考えると良いでしょう。前半にあることが分かれば「あ」から探し始めますが、後半にあることが判明しているのであれば、もう「あ」から探す必要はありません。これだけで、線型探索法に比べて探索時間は半分以下になります。ソートアルゴリズム(規則に従ってデータを並べ替える)
次は、あるデータを一定の規則について並べ替えるアルゴリズム(ソートアルゴリズム)について考えてみましょう。たとえば、以下の数字を大きい順に並べ替えるとします。[3,1,1000,233,987]
選択ソート
選択ソートは、ソートアルゴリズムの中で最も基本的なものです。まず、1番目の数字から順番に見ていき、最も大きいものを1番目に配置しなおします。次に2番目の数字から順番に見ていき、その中で最も大きなものを2番目に配置。さらに数字番目の数字を……というように、全ての数字を見ていきながら、順番に大きいものを見つけていくアルゴリズムになります。線型探索と同じように、頭から全ての数字を何度も参照するので、対象となるデータが多ければ多いほど爆発的に計算量が多くなってしまいます。
バブルソート
バブルソートも、ソートアルゴリズムの中では基本的なものです。隣り合うデータ同士の大きさを比較し、もし右側の方が大きければそれを左側に持っていきます。これを繰り返していって、数字の入れ替えが発生しなくなれば、処理を終了することができます。[3,1,1000,233,987]の例で説明すると、まず3と1では3の方が大きいため、入れ替えは発生しません。次に1と1000では1000の方が大きいため、この2つの数字が入れ替わります。これを続けていくと、1度目で以下の形になります。
[3,1000,233,987,1]
これを繰り返していけば、大きい数字は先頭に、小さい数字は最後尾へとどんどん交換されていくことになります。
バブルソートは、基本的には選択ソートよりも計算量を少なく抑えることができます。しかし、最悪の場合は選択ソートと全く同じ手数がかかってしまいますので注意が必要です。また、選択ソートと同様に、対象となるデータが多くなれば爆発的に計算量が増えてしまうという欠点もあります。
暗号化アルゴリズム
暗号化アルゴリズムは、データを暗号化する・暗号化したデータをもとに戻すアルゴリズムのことで、情報セキュリティ対策で使われています。データを暗号化することによって第三者はデータの解読ができなくなります。暗号化したデータは「鍵」を使うことによって、データをもとに戻す復号が可能です。
暗号化アルゴリズムは、大きく分けて以下の2種類があります。
- 公開鍵暗号方式
- 共通鍵暗号方式
公開鍵暗号方式
公開鍵暗号方式は、「公開鍵」と「秘密鍵」の2種類の鍵を使う方式です。- 公開鍵:データを暗号化するための鍵
- 秘密鍵:暗号化したデータを復号するための鍵
公開鍵暗号方式で復号できるのは、秘密鍵を持つ受信者のみ。秘密鍵は送る必要がないため第三者への漏えいリスクも低く、安全性が高い方式です。
共通鍵暗号方式
共通鍵暗号方式は1つの「共通鍵」でデータの暗号化・復号、どちらもできる方式です。暗号化も復号も共通鍵一つで行えるため、安全性は公開鍵暗号方式よりも低くなってしまいます。もしも共通鍵が第三者に渡ってしまうと、せっかくの暗号化の意味もなくなってしまうため、送る際や保管に注意が必要です。
プログラミングにおけるアルゴリズムとは?
プログラミングの学習をしている方は「アルゴリズム」という単語がよく出てきますよね。ここでは、プログラミングとアルゴリズムの関係について見ていきましょう。これまでも紹介しているように、アルゴリズムは問題を解決するための手順・やり方のことを指します。そしてプログラミングとは、コンピュータに問題を解決するための手順ややり方などの指示を作ることです。
つまり、プログラミングには、適切なアルゴリズムが欠かせないといえます。このように、プログラミングとアルゴリズムには、深い関わりがあるのです。
アルゴリズムの理解がプログラミングで重要な理由
アルゴリズムとプログラミングに深い関係があることをご紹介しました。その上で、アルゴリズムの理解がプログラミングをする上でなぜ重要なのか、その理由を見ていきます。
無駄なコードを打ち込む必要がなくなる
アルゴリズムを理解することによって、無駄なコードを打ち込む必要がなくなることが、理由の1つ目です。これまでお伝えしているように、問題を解決するための手段は一つではなく、効率の良い方法・悪い方法があります。アルゴリズムを理解していると、効率の良い方法を選択できるため、プログラミングの際に無駄なコードを打ち込むことをなくせます。
処理スピードが速くなる
処理スピードが速くなることも、プログラミングでアルゴリズムが重要な理由です。先程「料理のヘタな友達」の例でも紹介したように、効率の良い方法・悪い方法どちらでも同じ結果を得ることは可能です。しかし、選んだ方法によって、かかる時間は大きく異なります。同じ結果を得ることができるなら、作業を速く済ませられる、効率の良い方法を選択しますよね。
プログラミングも同様で、効率の良いアルゴリズムを採用すると、処理スピードも速くできます。つまり、アルゴリズムの理解は、処理スピードの速さにもつながると言えるのです。
【具体例】生活のあちこちで活用されるアルゴリズム
アルゴリズムは生活の至るところで使われています。たとえばカーナビや乗り換え案内。
中心となるのは、A地点からB地点まで行く方法が何パターンかあった場合、どの経路を通るのがいちばん早いか?を計算してくれるアルゴリズムです。
それから、時おりニュースを騒がせる「Googleの検索アルゴリズム」。これはGoogleで検索された単語に対して、どのページを上位に表示させるかという計算方法(アルゴリズム)です。
サイトの運営者にとっては、この順序は高ければ高いほど嬉しい状態です。大体の人は、上から順にページを見ていきますよね。逆に、下の方のページはあまり見ないことも多いはずです。
せっかく作ったサイトは、なるべく多くの人に見てもらいたい。そうなると、「Googleはどういうやり方(アルゴリズム)で順位を決めているんだろう?」という点が気になるわけです。
Googleは検索アルゴリズムの詳しい内訳を公開しておらず、その上、ときどき大幅な変更を加えます。
ですから「アルゴリズムが変わった!次は一体どのようなものだろう?」「もしかしたら、自分のサイトも順位が下がる(上がる)かも!」がニュースになるわけです。
ビジネスでも用いられるアルゴリズム
アルゴリズムは、生活の中だけではなくビジネスでも様々な場面で使われています。Googleがアルゴリズムを頻繁に変えたり、そのためにエンジニアにお金を払ったりしているのも、ビジネスに役立つからです。Googleの検索結果がより良いものになることが分かれば、みんなGoogleを使うようになります。そしてGoogleは検索結果に表示する広告で対価を得ていますから、利用者や利用回数が多ければ多いほどビジネス的には効果が高いといえるのです。
また、インターネット広告にもアルゴリズムが使われています。最近のインターネット広告は、広告枠に対して自動的に配信されるものが多くなっています。ではどうやって表示する広告を決めるかというと、裏では「オークション」が行われています。しかし、普段イメージするようなオークションではなく、このオークションは自動かつ一瞬で行われています。事前に広告を掲載したい事業者を募集しておき、掲載希望料金など様々な要素から配信する広告を決めているのです。
ここにも複雑なアルゴリズムが使われています。そのため、インターネット広告に携わる仕事をしたりするのであれば、このアルゴリズムについても勉強したり情報収集したりする必要が出てくるでしょう。その他、非エンジニア・プログラマーであっても、IT企業で働くのであればアルゴリズムに関する知識を持っておいて損はないはずです。
アルゴリズムを学ぶ必要はある?
本記事で紹介した二分探索法は初歩的なアルゴリズムで、日常的に使っているコンピューターやアプリ、Webサービスでは、もっと複雑なアルゴリズムによって動いている場合もあります。プログラマーやシステムエンジニアを目指すのであれば、アルゴリズムの勉強を仕事に活かすことができるかもしれません。しかしプログラミングの現場においても、すでに用意されている関数やパッケージを使うだけで済む場合も多く、実務の中で役に立つと感じることは意外と少ないでしょう。また、そもそもプログラミングを仕事にしないのであれば、アルゴリズムなんて自分には関係ないと思ってしまうかもしれません。
しかし、アルゴリズム的な思考を学ぶことは仕事や生活の上でも役立ちます。それは、前述した「料理のヘタな友達」の例を考えてみてもそうでしょう。ここまで極端ではなくとも、仕事や日常の中に非合理的な作業はたくさん存在しています。アルゴリズムの手法を知っていると、「何とかできないかな?」と常に考える癖がつきます。
アルゴリズム的な考え方を使って物事を改善したりするのは、頭を使わなければならないし面倒なことです。しかし、改善を一度行えば、その作業をするたびに時間を節約することができます。効果が積み上がっていくのですね。
自分には関係ないと思っている方も、アルゴリズムを学ぶこと仕事や生活に応用することができるかもしれません。
アルゴリズムの意味・具体例まとめ
アルゴリズムには様々な種類があり、理解しておくと、役立つ場面も多いでしょう。興味がある方は、アルゴリズムを学んでみてはいかがでしょうか。