テクノロジー
2024年11月21日アルゴリズムとは
アルゴリズムとは、ある問題を解決するための手順やロジックのことです。単純なものであれば頭の中で描けますが、複雑なものは書き出すことで初めて、解決までの手順を明確にすることができます。 アルゴリズムを開発言語でプログラムとして記述することで、コンピュータに特定の問題を解決させることができます。
著者プロフィール
IT分野における教育の先駆者として、多くのエンジニアを育成するプログラミングスクールの運営、Web開発やAI研修を行なっています。幅広いレベルの受講生に対して実践的なスキルを提供。生徒の成長を第一に考え、効果的で魅力的な教育プログラムの設計に情熱を注いでいます。
ゴール
- アルゴリズムとはなにかを理解する
- アルゴリズムを学ぶ必要性を理解する
アルゴリズムとはなにか
アルゴリズムとは、ある問題を解決するための手順やロジックのことです。単純なものであれば頭の中で描けますが、複雑なものは書き出すことで初めて、解決までの手順を明確にすることができます。
アルゴリズムを開発言語でプログラムとして記述することで、コンピュータに特定の問題を解決させることができます。
アルゴリズムは、特別なものではありません。あなたが日常生活をするうえで、常に行っている行動もアルゴリズムとして表現できます。朝起きて、顔を洗い、食事をして、仕事をするといった一連のルーチンワークもアルゴリズムです。
例えば、あなたが食事を作ることを考えてみましょう。
ここでは、野菜カレーの作り方について考えてみます。
野菜カレーの作り方は、人によってさまざまですが、今回は次のような手順で作ることとします。
野菜カレーの作り方
- 具材として次の野菜を用意する
- ほうれん草
- ニンジン
- ピーマン
- ナス
- ブロッコリー
- ニンジンが嫌いかどうかでニンジンの調理方法を変える
- ニンジンが好きな場合は、ざく切りにする
- ニンジンが嫌いな場合は、すりおろす
- ほうれん草、ピーマン、ナス、ブロッコリーは、適当な大きさに切る
- 具材を良い色合いになるまで軽く炒める
- 適量の水を入れる
- 具材が適度に煮詰まるまで煮る
- カレー用のルーを入れる
- ルーが溶けて、トロトロになるまで弱火で煮詰める
- 辛いのが好きかどうかでルーを追加するか決める
- 辛いのが好きな場合は、ルーを追加する
- 辛いのが苦手な場合は、ルー追加しない
- 完成
以上が野菜カレーの作り方の一つの手順ですが、これも一つのアルゴリズムとなります。
あなたは、この中に次の3つのパターンがあることがわかるでしょうか。
- 作業を順番に進める手順
- ある状態になるまで繰り返す作業
- 条件によって選択する作業
すべてのアルゴリズムは、実はこの3つのパターンの組み合わせで構成できます。詳細は、後ほど説明します。
代表的なアルゴリズム
古くから、人間はいろいろな問題に対して、どのような手順で解決するかを試みてきました。その中には、いくつかの代表的な問題を解決するための、特徴的なアルゴリズムが用意されています。先人が考えたアルゴリズムを知ることで、同じような問題に遭遇したときに、その方法を簡単に利用することができます。
代表的なアルゴリズムとして、次のようなものがあります。
これらは、複数の数字要素の配列に対して、該当する要素を検索したり、並べかえたりする方法です。アルゴリズム名とその内容について簡単に紹介します。
アルゴリズム名 | アルゴリズムの内容 |
---|---|
線形探索 | 複数の数字要素の配列を先頭から順に一つづつ比較し、目的に一致する要素を見つける |
二分探索 | 複数の数字要素の配列がソート済みの状態(順に並べた状態)にあるとき、中央要素の値と比較し、半分にわけながら目的の要素を見つける |
バブルソート | 隣り合う数字要素を比較しながら並べかえる |
クイックソート | 基準となる数字要素をひとつ決め、それより小さい要素を前に、大きい要素を後ろに分け、これを繰り返して並べかえる |
また、最も古いアルゴリズムのひとつとして、「ユークリッドの互除法」があります。
「ユークリッドの互除法」は、次のような方法で、2つの正の整数(自然数)の最大公約数を求めるアルゴリズムです。
「2つの整数の大きい数字を分子、小さい数字を分母(除数)として割り算し、余りを求めたとき、2つの整数の最大公約数は、分母となった数字(除数)と余りの最大公約数に等しい」という性質があります。この性質を利用して、余りを割り算の分母(除数)として繰り返すことで、余りが 0 になったときの分母の値(除数)が最大公約数である、というものです。
具体的な例として、5,120 と 244 という 2つの整数の最大公約数を考えてみましょう。最大公約数を求める手順は次のようになります。
- 5120 を 244 で割ったときの余りが 240
- 244 を 240 で割ったときの余りが 4
- 240 を 4 で割った時の余りが 0
- したがって、最大公約数は 4 となる
以上のような代表的なアルゴリズムは、プログラムを組み立てる上では、直接使用することはあまりありません。なぜなら、このようなアルゴリズムで組み立てられたアルゴリズムの部品(メソッドあるいは関数と呼ぶ)がすでに用意されていて、それを選んで使うことができるからです。
アルゴリズムをなぜ学ぶのか
コンピュータのプログラムは、一連の手順を通して、ある目的を実行するための解決手段です。つまり、コンピュータのプログラムそのものが、1つのアルゴリズムになります。
アルゴリズムをどのように組み立てるかは、組み立てる人の裁量によって異なるため、組み立て方によっては、効果的な手順だったり、非効率な手順だったりすることがあります。より効果的でスマートなプログラムを作成するためには、よりよいアルゴリズムの組み立て方を知っておくことは重要です。
すでに記載した古典的なアルゴリズムは、先人が残した知恵でもあり、優れたアルゴリズムを使用することは、コンピュータプログラムを効果的に処理するための一つの方法でもあります。
よいアルゴリズムとはなにか
アルゴリズムは、作る人によって異なります。
アルゴリズムが複雑になればなるほど、作る人の裁量でアルゴリズムの手順の複雑さが変わってきます。良いアルゴリズムとは、見やすくシンプルなものです。シンプルであるほど、無駄な処理がなく、効率的に高速に実行することができます。
また、シンプルであることは、アルゴリズムの一部を変更したり、新しいアルゴリズムを付加するときにわかりやすく、楽になるということです。
このようなアルゴリズムのことを「保守性に優れている」といいます。
一方で、世の中で既に動いているシステムの多くには、複雑に入り組んだプログラムが使われています。これらは、決して最初から複雑なのではなく、開発を続けていくうちに「複雑にしてしまった」といった方が正しいです。
そのようなプログラムは、アルゴリズムが絡み合い、解析が困難になり、しばしば「スパゲティのようなプログラム」、「スパゲティコード」といわれます。
自分自身で作成したプログラムでも、あとで見返したときに解析が困難になるものは、決して良いプログラムとはいえません。第三者が保守することは困難になり、お荷物のプログラムとなっていきます。そのため、常にシンプルでわかりやすいアルゴリズムがどうあるべきかを心掛けながら、プログラムを作成していくことが重要です。
まとめ
- アルゴリズムとは、ある問題を解決するための手順であり、問題を処理するためのロジックを表現したものである。
- 古典的なアルゴリズムを知ることは、同じ問題を解決するときに有用な手段となる。
- コンピュータのプログラムは、一つのアルゴリズムであり、作る人によって左右されるため、適切なアルゴリズムを学ぶ必要がある。
- 良いアルゴリズムとは、シンプルでわかりやすく構成されたもので、効率的に手順を実行することができ、保守性も向上する。