プログラムの勉強を進めていくなかでアルゴリズムという言葉に出会います。今日はアルゴリズムって何ってところを説明していきたいと思います。
アルゴリズムとは
さて早速ですがアルゴリズムとは何か?
Wikipediaによりますと
数学、コンピューティング、言語学、あるいは関連する分野において、問題を解くための手順を定式化した形で表現したものを言う。算法と訳されることもある。
ということですが、要はプログラムで問題を解くやり方です。
プログラムを書いているんだから、問題を解いていることとイコールなんじゃないの? 確かにそうですね、厳密にいうとプログラムはコンピュータに何かを指示する手順を書いたものであり、その手順で問題を解決できるのかという組合せ方が、アルゴリズムとなります。
そのアルゴリズムがあれば(そのアルゴリズムを正しく理解していれば)、どのようなプログラム言語であっても、問題を解くアプローチが同一ですので、問題解決できるプログラムを作ることができます。
アルゴリズムって重要なの?
アルゴリズムは重要なのか?
もちろん答えは重要です。簡単なプログラムだとアルゴリズムは意識しないかもしれないですが、ちょっと難しい問題を解こうとするとアルゴリズムをちゃんと理解していないとプログラムを書く手が止まってしまいます。
またアルゴリズムによっては求める答えにたどり着く時間が短縮させることができます。言い換えるとコンピュータに効率的に計算をさせることができます。
有名な例としてはガウスの足し算ですね。ドイツの天才数学者ガウスが1 から 100 までの数字すべてを足すように課題を出された際に、単純に1から100までを足していくのではなく、1と100の和である101が50個あるからだと瞬時に答えを出したという。すなわちこれは等差数列の和を求める公式になります。
これを実際にコンピュータに計算させると答えがでるまでの時間が違ってきます。それについて書いた記事はこちらです。
この記事にもあるとおり、ガウスの計算法を使った方が、より早く結果を求めることができるので、コンピュータに効率よく計算させるためにもアルゴリズムを知っていると知っていないでは、より高度なプログラムを書いていく際に大きな違いがでます。
アルゴリズムは先人の知恵
アルゴリズムって難しそう。毎回考えないといけないの?
いえいえ、代表的なアルゴリズムは先人達がとっくのうちに編み出しており、「芝浜」や「時そば」のような古典落語のように使い古されています。我々はそれをありがたく覚えるだけでいいのです。
アルゴリズムの種類
さて古典落語的な代表的なアルゴリズムを以下に示します。ここに書いたのもホント一例です。
アルゴリズム分類例 | 有名なアルゴリズム |
ソートアルゴリズム | バブルソート、選択ソート、挿入ソート シェルソート、ヒープソート、マージソート クイックソートなど |
サーチアルゴリズム(リスト) | リニアサーチ、バイナリサーチ、ハッシュ探索など |
サーチアルゴリズム(グラフ) | 幅優先探索、深さ優先探索など |
数学的なアルゴリズム | 最大値・最小値、素数判定、ガウスの足し算など |
データ圧縮 | ランレングス符号、ハフマン符号など |
セキュリティ | 共通鍵暗号方式、デジタル証明書、ハッシュ関数など |
これが実際どんなものかについては、リンクのあるものについては、この「もしプロ」ブログの中でも取り上げて説明しています。それ以外のものについて、全てを説明するとなると、それって大学や専門学校で学ぶような領域に入ってくるので、それは専門書に任せるとします。
とはいえ、専門書だととっつきにくいので市販で易しく解説している本を紹介しますね。
まずはデータの型の説明と簡単な数学アルゴリズムおよびソートアルゴリズム・サーチアルゴリズム(リスト)について、イラストで表現し、さらに実際にプログラム記載例をJavascript/PHP/C/Java/Swift/Python/BASIC/Scratchの8言語で記載しているため初学者にはとても理解しやすい本がこちらです。
また、種類の多さという意味では上記の表で記したアルゴリズムがほぼ網羅されている本がこちらです。ただ、アルゴリズムとプログラミング図鑑のようにプログラム記載例がないため、こちらの本はアルゴリズムを広く浅く理解するという本になります。
なお、こちらの本はアプリも存在します。ある程度は無料でみることができ、すべてのアルゴリズムを見る場合は400円ほどの有料課金となります。本と違い、アプリでは動画で動きを確認できるため、より理解が深まりますよね。
iOS版
Android版
まとめ
今回はアルゴリズムとは何ってことで記事を書きました。
アルゴリズムは今後、効率的なプログラムを書いていく上で代表的なものだけでも覚えておいて損はないです。以前の「大学で学ぶプログラミングとは」の記事でも書きましたが、情報工学を学ぶ意義は、このアルゴリズムを体にしみこませるというところでもあります。単純なキーパンチャー的なプログラマーと、そうではないプログラマーの違いは、このアルゴリズムを理解できるかどうかにあると思っています。
でも、言った通り古典落語的な代表的アルゴリズムを理解しているだけで、まずは十分です。教育用プログラミング言語でちょっと力がついてきたら、ここで紹介した本やアプリを使って、アルゴリズムの勉強にもトライしてみましょう。
逆に新しいアプローチの解法は新作落語のようなもの、あなたが世界中の誰も考えたことがないようなアルゴリズムを編み出したら、世界は変わるかもしれません。
コメント