Amazonで利用すべきコスパ最高のサービス一覧

アルゴリズムとは?意味をわかりやすく解説!

この記事はこんなことが書かれています!
  • アルゴリズムという単語の意味
  • 良いアルゴリズムの特徴
  • アルゴリズムを学ぶメリット

今井

こんにちは!
今井(@ima_maru)です。

みなさん「アルゴリズム」って言葉聞いたことがありますか?

小さいころ、「アルゴリズム体操」という子供向け番組でよく流れていた体操にはまっていました。

今井

「一歩進んで前ならえ。一歩進んで偉い人。」っていうものなんですけど知ってますかね?

そんな私が最初アルゴリズムという単語を調べたのは、大学の授業を選択するときでした。

アルゴリズムって何?」「学ぶメリットあるの?と思ったのがきっかけです。

この記事を見ている方も、同じ疑問をお持ちなのではないしょうか。

今回の記事は、プログラミングで重要な「アルゴリズム」について簡単に、そしてわかりやすく解説していこうと思います。

それでは見ていきましょう!

アルゴリズムの意味は「演算法」「算法」

アルゴリズム(algorithmとは日本語に訳すと、演算法」「算法」などと呼ばれます。

もっと簡単に言えば、「方法」です。

アルゴリズムは「方法」と置き換えれば大体うまくいく!?

「アルゴリズムがわからない!」って方は、「方法」と置き換えてもらって大丈夫です。

これで大体うまくいきます。例えば、

アルゴリズム≒方法で大体うまくいく
  • ソートアルゴリズムは「並べ替えの方法
  • 探索アルゴリズムは「探索の方法
  • 遺伝的アルゴリズムは「遺伝的な方法

それなりうまくいきましたね。

今井

あと少しだけニュアンスを付け加えると、そのままプログラムに落とし込めるぐらいまで詳しく書いた方法というような意味になります。抽象的なイメージではないってことです。

階数当てゲームから理解する「アルゴリズム」

早速ですが、階数当てゲームをしましょう。

ルールは簡単。

私は100階建てのマンションの何階かに住んでいます。

そして、

「あなたは何回でも質問してもいい」
「私が答えられるのはYesかNoだけ」

この条件のもと、私が何階に住んでいるか当てるというゲームです。

この問題を解く「アルゴリズム1」「アルゴリズム2」を挙げてみます。

今井

これも「方法1」と「方法2」ととらえれば大丈夫だね。

「アルゴリズム1」は、1階ずつ聞いていく方法

「1階ですか?」→No
「2階ですか?」→No
「3階ですか?」→No
「4階ですか?」→No

このように聞く方法ですね。まあこれならいつかは確実に当たりますが、かなり安直な考え方のようにも思えます。

今井

これはもし私が100階に住んでいたら100回質問しなくてはいけませんね。(正しくは99回かな?)

対する「アルゴリズム2」は、ある階を基準として「それ以下の階」に住んでいるかを聞く方法

最初の質問はこうしましょう。

「50階以下の階ですか?」→No

そうすると、たった一つの質問で、1~50階という半分の選択肢が消えました

つまり残りの候補は「51~100階」。なので次は、

「75階以下の階ですか?」→Yes

これで、残りの候補は「51~75階」になります。

以上からわかることは、「アルゴリズム2」は、たった1回の質問だけで残りの候補を半分にまで絞ることができるということです。

これなら、明らかに「アルゴリズム1」より早く解答にたどり着くことができそうですね。

つまり何が言いたいかというと、

ある問題に対するアプローチはいろいろ考えられるけど、効率的な解き方や非効率的な解き方が存在するってことです。

そのアプローチ・解き方・方法とかそういう意味が「アルゴリズム」なんです。

ソートアルゴリズムとは?

ソートアルゴリズムとは、ぐちゃぐちゃな並び順のデータをきれいに並び替えるアルゴリズムです。

結局どのソートアルゴリズムも同じ結果になるのですが、比較回数や値の交換回数が違うなど、それぞれに特徴があってとても面白いです。

すでにわかりやすい記事がいくつかあるので紹介します。

クイックソートのアルゴリズムをわかりやすく解説します!

良いアルゴリズムの特徴とは?

アルゴリズムは、工夫次第でいろいろなメリットを生みます。

そこで、良いアルゴリズム」とはどのような特徴を持っているのかを考えてみましょう。

良いアルゴリズムの特徴
  • 少ない処理時間で済む
  • メモリをあまり使わない(省メモリ)
  • 安定性がある

それぞれ解説していきます。

少ない処理時間で済む

同じ結果を出すアルゴリズムでも、より少ない処理時間で結果を出してくれるほうが優秀なアルゴリズムといえます。

例えば、同じ結果を導き出すのに「1秒で終わるアルゴリズム」と「1年かかるアルゴリズム」だったらどちらを採用するでしょうか?

明らかに前者の「1秒で終わるアルゴリズム」で実装したいところですよね。

このように、少ない処理時間で済むというのは、良いアルゴリズムの特徴といっていいでしょう。

今井

だからといって、すべて高速化すればいいっていうわけでもないんですけどね。保守性や安定性なども考えていかなくてはいけません。

メモリをあまり使わない(省メモリ)

プログラムが動作するとき、コンピュータはメモリという部分を使うことになります。

メモリがわからない方は、を思い浮かべると良いでしょう。

勉強やお絵かきといったいろんなタスクができるのは、机の作業スペース(=メモリ)が十分に大きいおかげです。

プログラムもメモリという作業スペースを使います。

このメモリは無限にある資源ではないので、何個もプログラムを実行してしまうと使用できなくなってしまいます。

その点で、必要なメモリが少なくて済むというのは、良いアルゴリズムの特徴といっていいでしょう。

今井

ただ、実行速度をだすためにメモリを多く使うことがあります。要は、その辺のバランスが大事ってことですね。

安定性がある

アルゴリズムによっては、「最悪の場合は〇〇」といったことがあります。例えば、

「場合によってはうまくいかない」
「特定の入力でフリーズする」

こんなようなことです。

その点で、安定性があるというのは、良いアルゴリズムの特徴といってもいいでしょう。

アルゴリズムを学ぶとどんなメリットがある?

プログラミングにおいて、アルゴリズムを勉強しているといいことがたくさんあります。

今回はその中でも3つのメリットを紹介します。

アルゴリズムを学ぶメリット3選
  • 「計算量」の考えが身につく
  • 自分では考え付かないようなアルゴリズムを知ることができる
  • ライブラリを効率的に使えるようになる

それぞれ詳しく見ていきましょう。

「計算量」の考えが身につく

アルゴリズムを勉強すると、「計算量」の考え方が身に付きます。

簡単に言えば、計算量とはデータ数に対しての処理回数になります。

それをよく「(O)」(オーダ)という記号と任意のデータ数(n)を使って表します。

簡易的に表せば以下のようになります。

MEMO

(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技術に使われる学習アルゴリズムなんかも用意されています。

だから、そのアルゴリズム自体を学ばなくても、機械学習やディープラーニングが実装できちゃうんです。

今井

実際、ほとんど理解していない私も、Pythonのライブラリで機械学習を実装することができました。

でも、ここで考えていただきたいことがあります。それは、

中身で何をやっているかわかってないのにそれらを効率的に使えるのか?

ということです。

やはり、ある程度中身がどうなっているか、アルゴリズムはどういうものなのかを知っておく必要はあると思います。

これらのアルゴリズムをどの場面で使うことが有効であって、どのような場面で使ってはいけないのか

知識としてではなく、実践的なスキルとしてみにつくはずです。

今井

「こうやって処理をするのだから、この場面で使ったら効率悪いだろ!」っていう風に。これって、すごい重要な感覚じゃないですかね。

まとめ

今回は「アルゴリズム」についての解説になりました。

そのアルゴリズムとは以下のような意味でしたね。

アルゴリズムとは?
  • 日本語にすると「演算法」「算法」
  • 「方法」と置き換えると大体うまくいく!
  • アルゴリズムには良し悪しがある。

また、良いアルゴリズムの特徴として、以下のような特徴を挙げました。

良いアルゴリズムの特徴
  • 少ない処理時間で済む
  • メモリをあまり使わない(省メモリ)
  • 安定性がある

最後に、アルゴリズムを学ぶメリットを3つ紹介しました。

アルゴリズムを学ぶメリット
  • 「計算量」の考えが身につく
  • 自分では考え付かないようなプログラミング手法を知ることができる
  • ライブラリを効率的に使えるようになる

最後にアルゴリズムの勉強をするためにおすすめのサイトを教えます。

それは、「paiza」「AtCoder」です。

paizaもAtCoderもプログラミングのスキルチェックができるサイトです。

僕は、paiza→AtCoderの順にやっていました。

Paizaの評判ってどうなの?Sランクをとってもあまり意味がない。 AtCoderとはなに?就職・転職で有利になるのは何色から?

以上「アルゴリズムとは?意味をわかりやすく解説!」でした!

今井

最後までご覧いただきありがとうございます。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です