アルゴリズムとは?意味をわかりやすく簡単に解説!
- アルゴリズムという単語の意味
- 良いアルゴリズムの特徴
- アルゴリズムを学ぶメリット
みなさん「アルゴリズム」って言葉聞いたことがありますか?
小さいころ、「アルゴリズム体操」という子供向け番組でよく流れていた体操にはまっていました。
そんな私が最初アルゴリズムという単語を調べたのは、大学の授業を選択するときでした。
「アルゴリズムって何?」「学ぶメリットあるの?」と思ったのがきっかけです。
この記事を見ている方も、同じ疑問をお持ちなのではないしょうか。
今回の記事は、プログラミングで重要な「アルゴリズム」について簡単に、そしてわかりやすく解説していこうと思います。
それでは見ていきましょう!
アルゴリズムの意味は「演算法」「算法」
アルゴリズム(algorithm)とは日本語に訳すと、「演算法」「算法」などと呼ばれます。
もっと簡単に言えば、「方法」です。
アルゴリズムは「方法」と置き換えれば大体うまくいく!?
「アルゴリズムがわからない!」って方は、「方法」と置き換えてもらって大丈夫です。
これで大体うまくいきます。例えば、
- ソートアルゴリズムは「並べ替えの方法」
- 探索アルゴリズムは「探索の方法」
- 遺伝的アルゴリズムは「遺伝的な方法」
それなりうまくいきましたね。
階数当てゲームから理解する「アルゴリズム」
早速ですが、階数当てゲームをしましょう。
ルールは簡単。
私は100階建てのマンションの何階かに住んでいます。
そして、
「あなたは何回でも質問してもいい」
「私が答えられるのはYesかNoだけ」
この条件のもと、私が何階に住んでいるか当てるというゲームです。
この問題を解く「アルゴリズム1」と「アルゴリズム2」を挙げてみます。
「アルゴリズム1」は、1階ずつ聞いていく方法。
「1階ですか?」→No
「2階ですか?」→No
「3階ですか?」→No
「4階ですか?」→No
...
このように聞く方法ですね。まあこれならいつかは確実に当たりますが、かなり安直な考え方のようにも思えます。
対する「アルゴリズム2」は、ある階を基準として「それ以下の階」に住んでいるかを聞く方法。
最初の質問はこうしましょう。
「50階以下の階ですか?」→No
そうすると、たった一つの質問で、1~50階という半分の選択肢が消えました。
つまり残りの候補は「51~100階」。なので次は、
「75階以下の階ですか?」→Yes
これで、残りの候補は「51~75階」になります。
以上からわかることは、「アルゴリズム2」は、たった1回の質問だけで残りの候補を半分にまで絞ることができるということです。
これなら、明らかに「アルゴリズム1」より早く解答にたどり着くことができそうですね。
つまり何が言いたいかというと、
ある問題に対するアプローチはいろいろ考えられるけど、効率的な解き方や非効率的な解き方が存在するってことです。
そのアプローチ・解き方・方法とかそういう意味が「アルゴリズム」なんです。
ソートアルゴリズムとは?
ソートアルゴリズムとは、ぐちゃぐちゃな並び順のデータをきれいに並び替えるアルゴリズムです。
結局どのソートアルゴリズムも同じ結果になるのですが、比較回数や値の交換回数が違うなど、それぞれに特徴があってとても面白いです。
すでにわかりやすい記事がいくつかあるので紹介します。
良いアルゴリズムの特徴とは?
アルゴリズムは、工夫次第でいろいろなメリットを生みます。
そこで、「良いアルゴリズム」とはどのような特徴を持っているのかを考えてみましょう。
- 少ない処理時間で済む
- メモリをあまり使わない(省メモリ)
- 安定性がある
それぞれ解説していきます。
少ない処理時間で済む
同じ結果を出すアルゴリズムでも、より少ない処理時間で結果を出してくれるほうが優秀なアルゴリズムといえます。
例えば、同じ結果を導き出すのに「1秒で終わるアルゴリズム」と「1年かかるアルゴリズム」だったらどちらを採用するでしょうか?
明らかに前者の「1秒で終わるアルゴリズム」で実装したいところですよね。
このように、「少ない処理時間で済む」というのは、良いアルゴリズムの特徴といっていいでしょう。
メモリをあまり使わない(省メモリ)
プログラムが動作するとき、コンピュータはメモリという部分を使うことになります。
メモリがわからない方は、机を思い浮かべると良いでしょう。
勉強やお絵かきといったいろんなタスクができるのは、机の作業スペース(=メモリ)が十分に大きいおかげです。
プログラムもメモリという作業スペースを使います。
このメモリは無限にある資源ではないので、何個もプログラムを実行してしまうと使用できなくなってしまいます。
その点で、「必要なメモリが少なくて済む」というのは、良いアルゴリズムの特徴といっていいでしょう。
安定性がある
アルゴリズムによっては、「最悪の場合は〇〇」といったことがあります。例えば、
「場合によってはうまくいかない」
「特定の入力でフリーズする」
こんなようなことです。
その点で、「安定性がある」というのは、良いアルゴリズムの特徴といってもいいでしょう。
アルゴリズムを学ぶとどんなメリットがある?
プログラミングにおいて、アルゴリズムを勉強しているといいことがたくさんあります。
今回はその中でも3つのメリットを紹介します。
- 「計算量」の考えが身につく
- 自分では考え付かないようなアルゴリズムを知ることができる
- ライブラリを効率的に使えるようになる
それぞれ詳しく見ていきましょう。
「計算量」の考えが身につく
アルゴリズムを勉強すると、「計算量」の考え方が身に付きます。
簡単に言えば、計算量とは「データ数に対しての処理回数」になります。
それをよく「\(O\)」(オーダ)という記号と任意のデータ数\(n\)を使って表します。
簡易的に表せば以下のようになります。
\(n\)個のデータに対して
\(n\)回の処理が必要なら計算量は「\(O(n)\)」
\(n^2\)回の処理が必要なら計算量は「\(O(n^2)\)」
\(log_{ 2 } n\)回の処理が必要なら計算量は「\(O(log_{ 2 } n)\)」
先ほどのマンションの階層当てゲームについて「計算量」という観点から見てみましょう。
アルゴリズム | 計算量 |
アルゴリズム1 | \(O(n)\) |
アルゴリズム2 | \(O(log_{ 2 } n)\) |
「アルゴリズム1」は、\(n\)個のデータ数に対して最悪で\(n\)回の処理が必要になります。
対する「アルゴリズム2」は\(n\)個のデータ数に対して\(log_{ 2 } n\)回の処理で済みます。
ログ(対数)はあまりなじみがないかもしれませんが、実際に値を入れてみるとアルゴリズム2の優秀さがわかります。
データ数 | アルゴリズム1の処理回数 | アルゴリズム2の処理回数 |
データ2個 | 2回 | 1回 |
データ4個 | 4回 | 2回 |
データ8個 | 8回 | 3回 |
データ16個 | 16回 | 4回 |
... | ... | ... |
データ1024個 | 1024回 | 10回 |
データ2048個 | 2048回 | 11回 |
データ4096個 | 4096回 | 12回 |
このように、データ数が増えれば増えるほど、アルゴリズム1は処理回数が膨らんでいき、アルゴリズム2はそこまで増えないのがわかります。
ほかにもいろんな計算量のアルゴリズムを比較するとこんな感じ。
引用元:計算量オーダーのグラフ作った
右側に行く(データ数が増える)ほど、必要な処理回数が増えていくイメージです。
深い部分までは触れませんが、この図のようなイメージを持つことは、データ数の多い場面で非常に有効です。
実装するプログラムが「どのくらいのデータ数まで耐えられるのか」を判断できるようになり、「明らかにこれは動かないだろ...」といったようなコードがわかるようになってきます。
自分では考え付かないようなプログラミング手法を知ることができる
みなさんも「いや、こいつ天才かよ。」と思った経験ありませんか?
そんな体験を多くできるのがアルゴリズムの勉強です。
ある有名なアルゴリズムを使うと、
とっても重い処理だったはずが一瞬で処理が終わる
圧倒的に短い行数のコードで済む
といったようにいいことがたくさんあります。
「こんな方法あったのかよ!」と気づかされます。
そんな意味では、アルゴリズムは数学の公式に似ているかもしれません。
「この公式を使うと速く解けるよ」とかありますよね。
そういうことがプログラミングにもあるわけです。
ライブラリを効率的に使えるようになる
現在のプログラミング言語は、多種多様な機能を「ライブラリ」(追加機能みたいなもの)として用意してくれています。
例えば、AI技術に使われる学習アルゴリズムなんかも用意されています。
だから、そのアルゴリズム自体を学ばなくても、機械学習やディープラーニングが実装できちゃうんです。
でも、ここで考えていただきたいことがあります。それは、
中身で何をやっているかわかってないのにそれらを効率的に使えるのか?
ということです。
やはり、ある程度中身がどうなっているか、アルゴリズムはどういうものなのかを知っておく必要はあると思います。
これらのアルゴリズムをどの場面で使うことが有効であって、どのような場面で使ってはいけないのか。
知識としてではなく、実践的なスキルとしてみにつくはずです。
まとめ
今回は「アルゴリズム」についての解説になりました。
そのアルゴリズムとは以下のような意味でしたね。
- 日本語にすると「演算法」「算法」
- 「方法」と置き換えると大体うまくいく!
- アルゴリズムには良し悪しがある。
また、良いアルゴリズムの特徴として、以下のような特徴を挙げました。
- 少ない処理時間で済む
- メモリをあまり使わない(省メモリ)
- 安定性がある
最後に、アルゴリズムを学ぶメリットを3つ紹介しました。
- 「計算量」の考えが身につく
- 自分では考え付かないようなプログラミング手法を知ることができる
- ライブラリを効率的に使えるようになる
最後にアルゴリズムの勉強をするためにおすすめのサイトを教えます。
それは、「paiza」と「AtCoder」です。
paizaもAtCoderもプログラミングのスキルチェックができるサイトです。
僕は、paiza→AtCoderの順にやっていました。
以上「アルゴリズムとは?意味をわかりやすく簡単に解説!」でした!