一般に、時間計算量と空間計算量は、リソース使用量がどのようにスケールされるかに基づいてアルゴリズムの効率を測定する方法です。入力のサイズ。基本といくつかの一般的な例を見てみましょう。
時間計算量
時間計算量は、入力のサイズ (n で示されることが多い) に基づいてアルゴリズムが完了するまでにかかる時間を表します。
-
定数時間 – O(1):
- アルゴリズムの実行時間は入力サイズによって変わりません。
- 例: arr[5].
のように、インデックスによって配列内の要素にアクセスします。
-
対数時間 – O(log n):
- アルゴリズムの実行時間は、入力サイズが増加するにつれて対数的に増加します。これは、各ステップで問題が半分に分割されることを意味します。
- 例: ソートされた配列の二分検索。
-
線形時間 – O(n):
- アルゴリズムの実行時間は、入力サイズに応じて直線的に増加します。
- 例: n 要素の配列を 1 回走査します。
-
線形時間 – O(n log n):
- 各要素が対数的に処理される効率的な並べ替えアルゴリズムで一般的で、通常は再帰的な除算と線形結合または処理が原因です。
- 例: マージソート、クイックソート。
-
二次時間 – O(n²):
- 実行時間は入力サイズの 2 乗に比例して増加します。
- 例: 配列内の各要素を他のすべての要素と比較するなど、入れ子になったループ。
-
3次時間 – O(n³):
- 実行時間は入力サイズの 3 乗に応じて増加します。まれですが、3 つのネストされたループを持つアルゴリズムで発生する可能性があります。
- 例: ブルート フォース アルゴリズムを使用して特定の行列演算を解決します。
-
指数時間 – O(2^n):
- 実行時間は、入力に要素が追加されるたびに 2 倍になります。通常は、考えられるすべての組み合わせで部分問題を解決する再帰的アルゴリズムによるものです。
- 例: フィボナッチ数列の単純な解法。各呼び出しがさらに 2 つの呼び出しにつながります。
-
階乗時間 – O(n!):
- 実行時間は入力サイズに比例して増加します。多くの場合、考えられるすべての順列または組み合わせの生成を伴うアルゴリズムからのものです。
- 例: 巡回セールスマンの問題を総当たりで解決します。
空間の複雑さ
空間複雑度は、入力サイズと比較してアルゴリズムが使用するメモリの量を測定します。
-
定数スペース – O(1):
- アルゴリズムは、入力サイズに関係なく、固定量のメモリを使用します。
- 例: 整数やカウンターなどのいくつかの変数を保存します。
-
対数空間 – O(log n):
- メモリ使用量は対数的に増加します。これは、ステップごとに問題を半分にする再帰的アルゴリズムでよく見られます。
- 例: 再帰的バイナリ検索 (呼び出しスタックによるスペースの複雑さ)。
-
線形空間 – O(n):
- メモリ使用量は入力サイズに応じて直線的に増加します。これは、入力を保存するために追加の配列またはデータ構造を作成するときによく発生します。
- 例: サイズ n の配列のコピーを作成する。
-
二次空間 – O(n²):
- サイズ n x n の 2D 行列を保存する場合など、メモリ使用量は入力サイズの 2 乗に応じて増加します。
- 例: n 個のノードを持つグラフの隣接行列を保存します。
-
指数空間 – O(2^n):
- メモリ使用量は、入力の可能なサブセットごとにデータを保存する再帰的ソリューションで多くの場合、入力サイズに応じて指数関数的に増加します。
- 例: 多くの重複する部分問題を伴う再帰的アルゴリズムでのメモ化。
実践例
複雑さを分析する
時間と空間の複雑さについてコードを分析する場合:
-
ループを識別する: ネストされたループは通常、複雑さを増加させます (たとえば、1 つのループでは ( O(n) ) が与えられ、2 つのネストされたループでは ( O(n^2) ) が与えられます。
-
再帰を探す: 再帰呼び出しは、分岐係数と再帰の深さに応じて、時間と空間の複雑さが指数関数的に増加する可能性があります。
-
データ構造を考慮する: 配列、リスト、ハッシュ マップなどの追加のデータ構造を使用すると、空間の複雑さに影響を与える可能性があります。
一般的なヒント
-
時間計算量は、入力サイズの関数として演算をカウントすることに関するものです。
-
Space Complexity は、必要な追加メモリの量をカウントすることです。
これらの要素を評価することで、アルゴリズムがどの程度効率的に実行されるか、入力サイズに基づいて消費されるメモリ量を推定できます。