コラム7.  アルゴリズム

アルゴリズムとは何か

アルゴリズム(algorithm)とは、問題を解くための数学的計算手順を表す言葉です。算法とも言い、必ずしもコンピュータのみの概念ではありません。

これを図式化したものがフローチャートで、コンピューターで処理するための具体的な手順を記述したものがプログラムです。したがって、アルゴリズムの考え方はC言語のみならず、他の言語でも共通です。

アルゴリズムの語源

アルゴリズムの言葉の語源は、アラビアの数学者フワーリズミーが語源と言われています。アル・フワーリズミーは、アラビアの数学者であり、天文学者です。その生涯について詳しいことはわかっていませんが、初等代数学とインド・アラビア記数法に関する書物を著わした人物として知られています。

その書のタイトルは、『インドの数の計算法』と言い、この本は12世紀にラテン語に翻訳され、以後500年にもわたって、ヨーロッパで使われてきました。また、この書は、冒頭に「algoritmi dicti(アル・フワリズミーに曰く)」という一節があるので『algoritmi(アルゴリトミ)』と呼ばれている、と言われています。

アルゴリズムの詳細

本文でも触れましたが、アルゴリズムのうち最も基本的なものが、順次処理分岐処理繰り返し処理です。すべてのコンピュータのプログラムは、この3つの処理の組み合わせで表現可能です。なお、コンピュータのアプリケーション全体は、複数のアルゴリズムを含んでいますが、通常、アプリケーション自体をアルゴリズムとは呼びません。

また、ある程度複雑なプログラムとなると、より高度なアルゴリズムが必要になり、実用的なプログラムを作るために様々なアルゴリズムが研究されてきました。そのなかで特に大事なのが、並べ替え(ソート)やマージ、分類、探索などといった処理です。

また、アルゴリズムと切っても切り離せないのが、データ構造と呼ばれるものです。データ構造には、リスト、スタック、キュー、ハッシュテーブルなどがあり、さまざまなアルゴリズムを実現するために必要なものです。

そのため、通常プログラミングの世界では、このアルゴリズムとデータ構造がセットで用いられるのが普通です。

アルゴリズムを学ぶ利点

どの言語を用いるかとは無関係に、プログラマーは是非ともこのアルゴリズムとデータ構造について学んでほしいものです。なぜなら、これらはいわば、プログラムの「定石」であり、さまざまなデータ処理の枠組みが含まれています。

そのため、アプリケーション作成に用いる必要がある様々な処理は、特定のアルゴリズム、もしくはその組み合わせで処理できてしまいます。そのため、そういった処理を一から考えるよりも、はるかに効率的に処理を行うことができるのです。これが、プログラマーがアルゴリズムとデータ構造を学ぶ必要がある理由です。

C言語とアルゴリズム

現在、JavaやC#などといった、主要な言語はすべてその標準ライブラリのなかにこのアルゴリズムとデータ構造を持っており、またC言語をオブジェクト指向に拡張したC++言語でも、STLという形で、それらを言語の体系のなかに組み込んでいます。

ところが、C言語は、一部の例外を除き、このアルゴリズムとデータ構造を記述している標準ライブラリを持っていません。これは、実はC言語の短所でもあり、長所とも言えます。

長所は、自分自身でシステムに最適なアルゴリズムとデータ構造を自分自身で記述できるという点にあります。C言語は、プログラミング言語の中では非常にコンパクトであり、アセンブラに近い高速な処理速度を得ることができます。

そのため、コンパクトで高速なプログラムを作ることができるのが最大の特徴です。この長所を生かすには、C言語自身はなるべくコンパクトである必要があり、さらに自分自身でアルゴリズムを記述することにより、処理速度などをチューニングしやすくなります。

その一方で、当然ながら短所もあります。一つは、アルゴリズムの記述が非常に難しいという点にあります。もともと言語にそれらを含んでいる言語と違い、それらを一から自分で作らなくてはならないということは、それだけ手間もかかりますし、プログラムのバグの温床になります。

ですので、アルゴリズムを用いる際にはできる限りその言語で標準的に用いられているライブラリを用いることをお勧めします。