アルゴリズムとは
アルゴリズムとは、問題の解法や解決手法などの手続きを一般化したものを指します。アルゴリズムは定められたルールや法則を導いて一般化したものですので、プログラミング利用で効率的にコード開発ができます。
世界最古のアルゴリズムは、ユークリッドの互除法だと言われています。2つの自然数A・Bがあり、余りとすると、AとBの最大公約数がBとrの最大公約数と等しいことが証明されています。高校の数学で学んだ記憶がある人も多いと思います。
高校時代には必要ないと思われたかもしれませんが、このような数学の公式や解法はコンピュータプログラミングに活用されています。
プログラミングとは
プログラミングとは、コンピュータ上で動作するプログラムを低水準言語や高水準言語を用いてソースコード(ソースプログラム)を記述することです。一般的にはコンパイラやインタープリタを用いて作成したプログラムのソースコードを、コンピュータが理解しやすい中間コードや実行ファイルに変換して利用します。
プログラミング言語とは
プログラミング言語とは、プログラム作成するために必要な規則を定めて演算子や文字列等の記号をを用いる言語仕様を指します。言語仕様はプログラミング言語ごとに構文として策定されています。
古くは機械語やアセンブリ言語が低水準言語として用いられていましたが、現在ではコンパイラやインタープリタを用いる高水準言語で記述していきます。
コンパイラ言語はC言語・C++・Java・C#等があります。インタープリタはPerl・Ruby・Python等が利用されています。
アルゴリズムが必要な理由
ある目的を達成するための手段は様々です。
例えば登山を考えてみましょう。登山口から山頂まではいくつかのルートが設定されています。ある人は山の景色を楽しむルートを選び、別の人は山から見下ろす海岸線の風景を楽しみたいので別のルートをたどります。目的は山頂を訪れることですが、目的達成までには多くの選択肢があります。
同様のことは、他にも見られます。自宅から観光地へ行く際の移動ルート設定は自動車でも多数ありますし、電車でもいくつかの路線が選択できます。料理のレシピも同様で、カレーを作る際の材料や香辛料の選択も異なりますし、調理の順番や時間もそれぞれあります。
このようにあることをする際の手順や方法は多岐にわたりますので、特にコンピュータで利用する際に効果が得られます。コンピュータはプログラムで指定された指示通りに、命令を実行しているだけです。この命令実行の指示を効率的に与えてやることが重要です。
詳細は以降で解説していきますが、アルゴリズムを理解することで、プログラマ脳を鍛えることもできます。
理由:正確性の向上
事務処理や数値計算を考えると、計算の順番や近似方程式によっては計算結果に差が生じます。演算誤差や計算誤差と言われるものです。数値解析やシミュレーションでは誤差の大小は非常に影響を与えます。実行結果が想定時間内に完了するために、より正確なプログラムロジックが求められます。
そのため、より誤差の少ないプログラムロジックを組み立てるために、汎用的なアルゴリズムを用います。
理由:高速性の向上
ある処理を行うためのアルゴリズムはいくつか考案されていることもあります。アルゴリズムごとに特性があり、計算速度に違いがある場合があります。自身で独自の解法を検討する場合と比べて、計算精度に加えて計算速度の大きな違いが生じます。
さらに高速なアルゴリズムが考案されていますので、最新のアルゴリズムを採用しコンピュータ性能を最大限発揮することができます。
理由:保全性の向上
標準的なアルゴリズムを採用した場合は、ソフトウェアの不具合が発生した際の保全性向上も期待できます。プログラム言語ごとにアルゴリズムを適用したコードが公開されることもありますし、簡単に作成できるものもあります。コード開発者以外の方はメンテナンスする際にも問題特定が容易です。
また、1度テスト工程をクリアしたアルゴリズムのコードはライブラリ化しやすいので、開発コードの品質が確保できます。
理由:互換性の向上
アルゴリズム自体は、言語依存性がありません。そのため、あらゆるプログラム言語でコード化することができます。プログラム言語間の差異を吸収できますし、同一言語においてもアプリケーションの移植性を高めることができます。
典型的なアルゴリズム例
コンピュータ入門やプログラミング入門において、標準的に用いるアルゴリズムがあります。アルゴリズム自体はプログラムコードではなく、計算や課題の解法です。コンピュータプログラミングを理解する上で、アルゴリズムの理解は有効です。
アルゴリズムを比較検討後、個別のプログラムコードを記述していきます。すでに公開されているアルゴリズムのコードもプログラム言語ごとに活用することができます。主要アルゴリズム一覧については、以降で解説していきます。
検索処理のアルゴリズム
検索処理は、求める数値や文字列をはじめとする各種データがデータの集合リストに含まれているか調べる手法です。検索処理では、検索アルゴリズムが用いられています。主要アルゴリズムは「二分探索」「線形探索」「k近傍法」「ハッシュ関数」等があります。
・二分探索 ソート済みのデータを検索する際に中央の値を確認し、その値の大小から次の探索候補を探していく手法です。ソート済みである必要がありますが、高速に検索が可能です。
・線形探索 先頭から順番に比較を行うオーソドックスな手法です。どんなデータでも検索できますが、検索時間を要します。
・k近傍法 機械学習の回帰分析で用いられるもので、標本とオブジェクトの距離を求める手法です。
・ハッシュ関数 検索キーからハッシュ値を求める手法で、データベースの検索処理に利用されています。
検索処理は、エディタのテキスト検索やウェブ検索に活用されています。テキスト検索では正規表現を用いるアルゴリズムがいくつか考案されています。ウェブ検索の良し悪しは、SEO(Search Engine Optimization)の分析には欠かせないものとなっています。
ソート処理のアルゴリズム
ソート処理は、データの集合リストを一定のルールに従い並べ替えを行うための処理です。ソートアルゴリズムは、「バブルソート」「挿入ソート」「マージソート」「クイックソート」等があります。
・バブルソート データの集合の隣り合う要素を、順次比較し並べ替えを行います。処理は安定していますが、計算量が多く時間がかかります。
・挿入ソート 要素をソート整列済みのデータと順次比較し、入れ替えを行います。バブルソートより高速で改良版にシェルソートがあります。
・マージソート ソート整列済みのデータ集合リストをマージする際に、小さい値から順に並べていく手法です。
・クイックソート データ配列を分割し、適当な区切りを単位として並べ替えを行っていきます。高速処理が可能ですが、逆に遅くなるリスクもありますので、一定処理以上時間を要さないよう計算量調整を考慮する必要もあります。
ソート処理によって、データ分析・解析を円滑に行うことができます。計算時間が少なく安定しているアルゴリズムを利用用途に応じて採用していきます。
暗号化のアルゴリズム
通信領域では、アルゴリズムの重要性が高まっています。暗号化は通信の安全性確保の他、データ保護にも用いられています。「RSA暗号方式」「DSA」「DES」「AES」等があります。
・RSA(Rivest–Shamir–Adleman:発明者3名の苗字から命名)暗号方式 公開鍵と秘密鍵のペアを作成し、公開鍵を公開します。暗号化は公開鍵で実施し、復号化は秘密鍵を用います。計算アルゴリズムは素因数分解の計算量が膨大であるため、解読が困難です。
・DSA(Digital Signature Algorithm:デジタル署名アルゴリズム) デジタル署名は、公開鍵・秘密鍵を用い暗号化された電子的な署名で、署名本人のもの・改ざんされていないことが証明できます。DSAは、デジタル署名の規格としてFIPSで標準化されています。用いるハッシュ関数も、SHA-0・SHA-1・SHA-2・SHA-3とセキュリティ強度を高めています。
・DES(Data Encryption Standard:データ暗号化標準) 古くから用いられている暗号アルゴリズムで、鍵長56ビットの共通鍵暗号方式です。長らく標準暗号方式として利用されていましたが、鍵長が短いため現在では安全とみなされていません。トリプルDES等のアルゴリズムが検討されましたが、AESが代わりのアルゴリズムとして正式採用されています。
・AES(Advanced Encryption Standard:先進暗号化標準) これまで標準利用されていたDESは、コンピュータの性能向上により解読に要する期間が短縮され、暗号強度が低下しました。代わる暗号化標準としてAESが登場しました。鍵長は、128ビット・192ビット・256ビットと強化され暗号強度が高まりました。AESは公募により、Rijndael方式が選定され採用されています。
誤り検出訂正のアルゴリズム
誤り検出訂正は、データ通信の符号の誤り検出と訂正を行います。こちらも通信処理やデータ記憶装置に用いられるアルゴリズムとなります。「リード・ソロモン符号」「ハミング符号」「ターボ符号」等があります。
・リード・ソロモン符号 誤り訂正の能力が高いので、デジタル放送やCD・DVD等のデジタルメディアに用いられています。複数ビットを固まりとして誤り検出を行うので、連続して生じるバースト誤りに対応しやすいのが特徴です。
・ハミング符号 古くから用いられているアルゴリズムで、検査行列と生成行列から成る行列計算で求めます。高速処理が可能ですが、冗長ビット数の違いによりエラー訂正ではリード・ソロモン符号に劣ります。用途としては、ビット誤りが少ないECCメモリに代表されるRAMで用いられています。
・ターボ符号 ターボ符号は、データ転送で用いる低消費電力の誤り訂正符号アルゴリズムです。復号処理が複雑で時間がかかりますが、遅延(レイテンシ)の影響を受けにくい移動体通信や宇宙通信等に用いられています。
アルゴリズムを理解し、プログラミング能力を鍛えましょう
プログラミング言語を理解したものの、どういうプログラムコードを記述すべきか頭を悩ませることもあるかと思います。アルゴリズムは問題解法の手法や手続きですので、プログラムの仕様化の際にも重要な要素となります。
深く思い込まずにゲーム感覚で楽しむことができれば、理解度は向上していきます。結果としてプログラミング能力の高まりを感じていくはずです。ぜひお役立てください。
編集部オススメコンテンツ
アンドエンジニアへの取材依頼、情報提供などはこちらから