時間と空間の複雑さ


序文

この記事では時間と空間の複雑さについて説明します


提示:以下是本篇文章正文内容,下面案例可供参考

1. アルゴリズムの効率

1. アルゴリズムの効率をどのように判断するか?

コンピューターのパフォーマンスをアルゴリズムの効率とみなすと、

何が起こるか?

例えば:

アメリカが月面着陸したコンピューターのCPUを使用

現在の i9-13900CPU で次のコードを実行します。

誰が速いですか?

long long Fib(int N)
{
if(N < 3)
return 1;
return Fib(N-1) + Fib(N-2);
}

 現在のCPUであることに疑問の余地はありません

2. アルゴリズムの複雑さ

アルゴリズムが実行可能プログラムにコンパイルされた後、実行時に時間リソースと空間 (メモリ) リソースを消費する必要があります。したがって、アルゴリズムの品質を測定するには、通常、時間と空間の 2 つの次元、つまり時間計算量と空間計算量から測定されます。
時間計算量は主にアルゴリズムの実行速度を測定し、空間計算量は主にアルゴリズムの実行に必要な追加スペースを測定します。コンピューター開発の初期には、コンピューターの記憶容量はほとんどありませんでした。そのため、私は空間の複雑さを非常に懸念しています。しかし、コンピュータ産業の急速な発展に伴い、コンピュータの記憶容量は非常に高いレベルに達しました。したがって、アルゴリズムの空間の複雑さに特別な注意を払う必要はなくなりました。

2. 時間計算量

1. 時間計算量の定義

時間計算量の定義: コンピューター サイエンスでは、アルゴリズムの時間計算量は、そのアルゴリズムの実行時間を定量的に記述する関数です。理論的に言えば、アルゴリズムの実行にかかる時間は計算できず、プログラムをマシンに入れて実行して初めて知ることができます。しかし、コンピューター上で各アルゴリズムをテストする必要があるでしょうか? これらをすべてコンピュータ上でテストすることも可能ですが、非常に面倒なので、時間計算量を解析する手法があります。アルゴリズムにかかる時間は、アルゴリズム内のステートメントの実行数に比例し、アルゴリズム内の基本操作の実行数がアルゴリズムの時間計算量となります。

Func1 の ++count ステートメントが合計何回実行されたかを計算してください。 

void Func1(int N)
{
int count = 0;
for (int i = 0; i < N ; ++ i)
{
for (int j = 0; j < N ; ++ j)
{
++count;
}
}
for (int k = 0; k < 2 * N ; ++ k)
{
++count;
}
int M = 10;
while (M--)
{
++count;
}
printf("%d\n", count);
}

Func1 によって実行される基本操作の数:


N = 10 F(N) = 130
N = 100 F(N) = 10210
N = 1000 F(N) = 1002010
実際には、時間計算量を計算するときに、正確な実行数を計算する必要はありませんが、概算の実行数のみが必要なので、ここでは
ビッグ O の漸近表記を使用します。

2. ビッグオーの漸近表現 


Big O 記法 (Big O 記法): 関数の漸近的な動作を記述するために使用される数学的記法です。
Big O メソッドを導出します。
1. 実行時のすべての加法定数を定数 1 に置き換えます。
2. 修正された実行時間関数では、最上位の項のみが保持されます。
3. 最上位項目が存在し、1 でない場合は、この項目に乗じた定数を取り除きます。結果はビッグオーオーダー。
Big O の漸近表現を使用した後、Func1 の時間計算量は次のようになります。
N = 10 F(N) = 100
N = 100 F(N) = 10000
N = 1000 F(N) = 1000000
上記により、Big が見つかります。 ○ のプログレッシブ表現は、結果に影響の少ない項目を削除し、実行回数を簡潔明瞭に表現します。
さらに、一部のアルゴリズムの時間計算量には、最良の場合、平均の場合、および最悪の場合があります。
最悪の場合: 任意の入力サイズの最大実行数 (上限)
平均の場合: 任意の入力サイズの予想される実行数
最良の場合: 任意実行の最小数 (下限)
例: 長さ N の配列でデータ x を検索する
最良の場合: 1 件の検索
最悪の場合: N 件の検索
平均的な場合: N/2 件の検索
実際には、一般的な場合は次のようになります。アルゴリズムに関係する 最悪の実行ケースであるため、配列内のデータを検索する時間計算量は O(N) です

3. 空間の複雑さ

スペース複雑度も数式であり、動作中にアルゴリズムが一時的に占有するストレージ スペースの量の尺度です。
空間複雑度はプログラムが占めるバイト数ではありません。これはあまり意味がないため、空間複雑度は変数の数によって計算されます。
空間計算量の計算規則は基本的に実際の計算量と同様であり、ビッグ O の漸近表記も使用されます
注:実行時に関数に必要なスタック スペース (ストレージ パラメーター、ローカル変数、一部のレジスタ情報など) はコンパイル中に決定されるため、スペースの複雑さは主に、実行時に関数によって明示的に要求される追加スペースによって決まります

 4. 複雑さの比較表


 

要約する

アルゴリズムの時間と空間の複雑さの概要と理解、およびその使用方法

おすすめ

転載: blog.csdn.net/qq_45591898/article/details/129182704
おすすめ