プログラミング

プログラミングする?ちょい待ち!まずはアルゴリズムを理解しよう!

https://toutmagasin.com

プログラミングする際に『アルゴリズム』って言葉聞くけどなんだろう?

今回はこんな内容にお答えしていきます。

本記事はこんな内容

  1. アルゴリズムについて理解する
  2. アルゴリズムの重要性を理解する
  3. 例を用いてアルゴリズムの基本構造を理解する

となっています。

本記事の信頼性

  • 筆者はプログラミング歴が約10年
  • SEとしての仕事経験を持つ
  • 筆者もアルゴリズムを理解することでプログラミングができるようになった
※詳細なプロフィールはコチラ

プログラミングをするうえで『アルゴリズム』という言葉を耳にすることはありませんか?

初めて聞いても何のことやらかと思います。

そこで本記事ではアルゴリズムの解説とともに、アルゴリズムの具体例や基本構造、おすすめ本なども併せてご紹介します。

本記事を読めばプログラミングに必要な考え方が身に付きます!

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

アルゴリズムってなに?

いきなりですが、プログラミングにおけるアルゴリズムって何でしょうか?

結論から言うと、「コンピュータに処理を行わせるための計算手順・方法」です。
プログラミングに限らず言うと、「問題解決のための手順・方法」といったところでしょうか。

「IT用語辞典」によると、下記のように記載されています。

ある特定の問題を解く手順を、単純な計算や操作の組み合わせとして明確に定義したもの。数学の解法や計算手順なども含まれるが、ITの分野ではコンピュータにプログラムの形で与えて実行させることができるよう定式化された、処理手順の集合のことを指すことが多い。

IT用語辞典 e-Words

ポイント

つまりプログラミングというのは、アルゴリズムを考え、それを文字に起こすということなんですね!

アルゴリズムの重要性を理解しよう

プログラミングする際、皆さんならどのように作成するでしょうか?

プログラミングするうえでアルゴリズムをしっかり考えることが非常に重要です。下記3つの観点から見ていきましょう。
※特に3番目は私情です。すみません(笑)

順番に見ていきましょう。

可読性・保守性が高まる

とりあえず手を動かすという経験はありませんか?
とりあえずプログラムを書いてみよう。そうなるとどうなるでしょうか?

思いつくままにプログラミングをしてしまうと、「ああでもない」「こうでもない」と試行錯誤の上、無駄が多くて自分にしか分からないようなプログラムが完成してしまいます。

こうなると、同じプログラムを担当する第三者が非常に困ってしまいます。
そしてさらに煩雑なプログラムができるという無限ループになり得ます。

トラブルが発生したとき、もしくは改定が入るとき、変更・修正しやすいようなプログラムであることがとても重要です。

プログラミングをする前に、アルゴリズムをしっかり考えて、「無駄のない(少ない)」、「他者にも分かる」プログラミングを心がけましょう。

システムのパフォーマンスが向上する

みなさんはこれまで、いろんなシステムを触ってきたかと思います。
その際、「このシステムは速いなあ」だったり「このシステムは遅いなあ」と感じることありませんでしたか?

特に、一般のユーザーが利用するシステムには、高いパフォーマンスは非常に重要です。

1点目でも触れましたが、無駄の多いプログラムは、システムの処理効率が悪くなります(その分のCPUやメモリが使われる等の理由です)。
つまりそのシステムはパフォーマンスが悪いと言えます。

しかしアルゴリズムを勉強することで、「計算量(=データ量に対する処理回数)」の考え方が身に付きます。
当たり前ですが、多くのユーザーが利用するシステムの場合、扱うデータ量は多くなります。

計算量の考え方が身につくことで、速いアルゴリズムが作成でき、システムのパフォーマンスも見込めます。

※扱うデータ量が少ないからアルゴリズムは考えなくて良い、ということではなく、常に計算量を意識したアルゴリズムを考えられるようにしましょう。

思考力が向上する

上記2点を考慮したアルゴリズムを作成することは非常に大変です。私自身もとても難しいと感じます。

しかし、「どうすれば無駄がなくなる?」「分かりやすくメンテナンスしやすいプログラムとは?」「どうすればパフォーマンが高くなる?」を考える過程は、ご自身の思考力の向上に繋がると思っています。

何も考えずにプログラミングしても、いざというときに必要とされるシステムやプログラムは出来上がりません。
構文は身に付くかもしれませんが、それ以外は何も成長しないでしょう。

改めて申します。
難しいと思いますが、どうすれば可読性や保守性が高くなるか、パフォーマンスが向上するかを意識したアルゴリズムを考えて、プログラミングすることに挑戦してみましょう!

日常における例で理解しよう

可読性・保守性

A駅からB駅に電車で行く例で考えましょう。

■前提
 ①A駅からB駅まで1000円かかる。
 ②定期券には150円だけチャージされている。(A駅の改札は通れる)
 ③A駅からB駅の行き方はいろいろあり、直通ルートもあれば、乗り換えルートもある。

パターン1
(1)A駅の改札に入る
(2)来た電車に乗る
(3)・直通の電車であればそのまま乗っていく
   ・乗り換えが必要であれば乗り換えを繰り返す
(4)B駅で降りて、必要な金額をチャージする
(5)B駅の改札を出る

パターン2
(1)A駅で1000円チャージする
(2)A駅の改札に入る
(3)B駅までの直通の電車が来るまで待って電車に乗る
(4)B駅で降りる
(5)B駅の改札を出る

どちらのほうが可読性・保守性が高いでしょうか?

おそらくパターン2を選ぶ方が多いのではないでしょうか?
パフォーマンスという観点では、パターン1のほうが良い場合があるかもしれませんが・・・

パターン1では、チャージする金額の計算が必要であったり、B駅に行くための乗り換え工程をいちいち考えてあげる必要があります。
アルゴリズムとしては複雑ですので、プログラムが煩雑かつ無駄が発生してしまう可能性がありますね。

一方パターン2では、行くまでに必要な金額(固定値)のチャージのみで良いですし、直通の電車を見つけるだけで済みます。

金額や乗り換え方法などに改定が加わった場合は、「どこでチャージをしているか」「どこで乗り換えをしているか」がパッとわかる必要があります。

上記のように文章にするとすぐわかると思いますが、プログラムで見るとなかなかそうもいきません。
行動がシンプル(=アルゴリズムが端的)であるパターン2のほうが、可読性・保守性が高いと言えるでしょう。

システムのパフォーマンス

例として、よく「大根のいちょう切り」が挙げられます。
本記事でも同じ例で見ていきましょう。

みなさんは大根をいちょう切りするとき、どのように切るでしょうか?
様々な切り方があるかと思いますが、下記2パターンで見てみます。

パターン1:まずは丸くスライス切りして、それらをいちょうの形に4等分する。
パターン2:大根を縦に4等分して、カットした4本をまとめてスライス切りする。

それぞれ大根を切る回数(=計算量、処理回数)はどうなるでしょうか?

パターン1の場合
→ 丸くスライスした分を4等分(2回切る)にするので、計算量は「スライス数×2」となります。

パターン2の場合
→ 縦に4等分(3回切る)にした後スライス切りするので、計算量は「3+スライス数」となります。

スライス切りする回数にもよりますが、100回だとすると、計算量はパターン2が圧倒的に少ないことが分かるかと思います。

最終的な結果は同じでも、パターン1とパターン2では計算量が全く違います。

このように、プログラムは、アルゴリズムを少し変更してあげるだけで、計算量(処理効率)が全く異なるものになります。

以上のように、計算量の考え方を身に付けることも、プログラミングにはとても重要であることがお分かり頂けたのではないでしょうか。

上記の例はこちらの記事を参考にさせていただきました。
詳細はリンク先をご確認ください。

アルゴリズムの基本構造

アルゴリズムは3つの構造で表現ができます。
電車を例に、A駅からB駅まで行くアルゴリズムを順番に見ていきましょう。

順次構造

読んで字のごとく、上から下まで順番に処理していく構造です。

早速書いてみましょう。

上記は乗り換えが不要な場合のアルゴリズムです。
単純に、電車に乗ってA駅からB駅まで辿り着きます。

選択構造

条件分岐を利用する方式です。
条件ごとにどの処理を行うか選択して実行するという構造です。

早速書いてみましょう。

上記は1度だけ乗り換えが必要か否か判断するアルゴリズムです。
直通電車か乗り換えが必要か否かを判断して、A駅からB駅まで辿り着きます。

反復構造

特定の条件を満たすまで処理を繰り返す構造です。
ループ処理とも言われます。

早速書いてみましょう。

上記は乗り換えが複数回行われるアルゴリズムです。
乗り換え駅まで電車に乗って行き、A駅から乗り換えを繰り返しながらB駅まで辿り着きます。(B駅に着いたらループ終了)
※選択構造のように、1度の乗り換えで終了する可能性もあり得ます。

おすすめの本をご紹介(5冊)

「もっと知りたい!」という方向けに5つご紹介いたします。
(私なりに易しいと感じた順にご紹介します)


1.アルゴリズム図鑑 絵で見てわかる26のアルゴリズム

iPhone・Androidアプリである「アルゴリズム図鑑」をベースにして、様々なアルゴリズムやデータ構造を図とともに丁寧に解説しています。
文字より図解がメインなため、直感的に分かる印象でした。入門書としてはとても良いと思います。

Amazon


2.アルゴリズムとプログラミングの図鑑

「必ずアルゴリズムの意味がわかるようになる、アルゴリズムの入門書」との記載がある書籍。
"ソートアルゴリズム"と"探索アルゴリズム"を、C・JAVA・Pythonなど、様々な言語で実践しながら学べる内容となっています。
文字数もそこまで多くなく、絵も多めなので、こちらも入門書としては良さそうです。

Amazon


3.アルゴリズムの絵本

アルゴリズムとは何か?という内容から始まり、プログラムの例を、絵をメインに使って解説しています。
また、PC内部、つまりメモリ上でどう処理されているのかも含めて解説しているので、プログラムもしっかり理解したい人にもおすすめ。
こちらも実践形式で学べる内容になっています。

Amazon


4.アルゴリズム はじめの一歩 完全攻略

初級エンジニア、大学、専門学校の学生、基本情報技術者試験の受験者を対象としている書籍。
アルゴリズムの言葉の意味から、"ソートアルゴリズム"、"探索アルゴリズム"、"遺伝的アルゴリズム"に至るまでを解説しています。
確認問題もあるため、より実践を求める方にもおすすめできる内容となっています。

Amazon


5.おうちで学べる アルゴリズムの基本

アルゴリズムの基礎知識を学びたい人、あるいはアルゴリズムを理解して真の問題解決力を身につけたい方を対象とした書籍です。
アルゴリズムの基本はもちろん、音声認識や画像認識、暗号化アルゴリズムや機械学習の仕組みまで紹介しています。
上記4書籍に比べて文字は多いですが、必要に応じて絵を挿し込んで解説しています。

Amazon

まとめ

以上がアルゴリズムの紹介でした。

難しいイメージがあると思いますが、日常生活に置き換えると理解が早くなったのではないでしょうか?
(早くなったと言っていただけるととても嬉しいです!)

とりあえずプログラミングしてみようというのもよいかもしれません。
しかし、アルゴリズムを理解することで「質」は全く違うものになります。

本記事を読んで早速プログラミングしてみてもいいですし、
おすすめの本を読んでさらに理解を深めるのもよいかと思います。

それでは本日のおさらいです。

 アルゴリズムとは?

「コンピュータに処理を行わせるための計算手順・方法」です。
プログラミングに限らず言うと、「問題解決のための手順・方法」を言います。

アルゴリズムの重要性とは?

1.可読性・保守性が高まる
2.システムのパフォーマンスが向上する
3.思考力が向上する

アルゴリズムの基本構造とは?

1.順次構造
2.選択構造
3.反復構造

以上となります。それではまた。

-プログラミング
-, ,

© 2021 Enjoy + Powered by AFFINGER5