# アルゴリズムの効率の評価 アルゴリズムの設計では、次の二つの目標を順に目指します。 1. **解法を見つける**:指定された入力範囲で、問題の正しい解を確実に求められる必要があります。 2. **最良の解法を探す**:同じ問題に複数の解法がある場合、できるだけ効率的なアルゴリズムを見つけたいと考えます。 つまり、問題を解けることを前提に、その効率がアルゴリズムの良し悪しを測る主な基準になります。効率には次の二つの側面があります。 - **時間効率**:アルゴリズムの実行時間の長さです。 - **空間効率**:アルゴリズムが使うメモリ空間の大きさです。 **目標は、「速くて省メモリ」なデータ構造とアルゴリズムを設計することです**。そのためには、効率を適切に評価することが欠かせません。評価できて初めて、アルゴリズム同士を比較し、設計や最適化の指針を得られるからです。 効率の評価方法は、主に実測と理論的な見積もりの二つに分けられます。 ## 実測 同じ問題を解けるアルゴリズム `A` と `B` の効率を比べたいとします。最も直接的なのは、コンピュータで両方を実行し、実行時間とメモリ使用量を計測・記録する方法です。実態を反映できますが、大きな制約もあります。 一つは、**測定環境の影響を取り除きにくいこと**です。性能はハードウェア構成に左右されます。並列性が高いアルゴリズムならマルチコア CPU に適し、メモリ操作が多いアルゴリズムなら高性能なメモリでよい結果を得られます。つまり、マシンが違えば測定結果も異なる可能性があります。さまざまなマシンで測定して平均的な効率を求める必要がありますが、それは現実的ではありません。 もう一つは、**十分な測定には大量の資源が必要なこと**です。入力データ量によって効率は変わります。データが少なければ `A` の方が `B` より速くても、多ければ結果が逆転するかもしれません。説得力のある結論には、さまざまな規模の入力を試す必要があり、大量の計算資源を使います。 ## 理論的な見積もり 実測には大きな制約があるため、計算だけで効率を評価することを考えます。この見積もり方法を漸近計算量解析(asymptotic complexity analysis)、略して計算量の解析と呼びます。 計算量の解析は、実行に必要な時間・空間資源と入力データの大きさの関係を表します。**入力データが大きくなるにつれ、必要な時間や空間がどのように増えるかを記述するものです**。少し抽象的な定義なので、三つに分けて理解しましょう。 - 「時間・空間資源」は、それぞれ時間計算量(time complexity)と空間計算量(space complexity)に対応します。 - 「入力データが大きくなるにつれ」とは、実行効率と入力データの大きさの関係を表すという意味です。 - 「時間や空間がどのように増えるか」とは、具体的な実行時間や使用量ではなく、増加の「速さ」に注目するという意味です。 **計算量の解析は、次の点で実測の欠点を補えます**。 - 実際にコードを動かす必要がなく、省エネルギーです。 - 測定環境に依存せず、結果をすべての実行環境に適用できます。 - 異なるデータ量での効率、特に大量のデータに対する性能を示せます。 !!! tip まだ計算量の概念がわかりにくくても、心配はいりません。後の節で詳しく説明します。 計算量の解析は効率を評価する「物差し」です。必要な時間・空間資源を見積もり、異なるアルゴリズムの効率を比較できます。 計算量は数学的な概念なので、初学者には抽象的で、やや難しいかもしれません。その意味では、最初に説明する内容として適していない面もあります。しかし、データ構造やアルゴリズムの特徴を論じる際は、実行速度や空間使用量の分析を避けられません。 そこで、データ構造とアルゴリズムを深く学ぶ前に、**計算量の解析をひとまず理解し、簡単なアルゴリズムの計算量を分析できるようにしておくこと**をおすすめします。