時間と空間の複雑さについて学ぶ

アルゴリズムの時間計算量の定義

アルゴリズムを分析する場合、ステートメントの総実行数T(n)は問題のサイズnの関数でありnによるT(n)の変化が分析され、 T(n)の大きさのオーダーが決定されます。アルゴリズムの時間計算量は、アルゴリズムの時間測定値です。T(n)=O(f(n)) として記録されますこれは、問題nが増加するにつれて、アルゴリズムの実行時間の増加率が f(n) の増加率と同じになることを意味します。これは、アルゴリズムの漸近時間計算量 (時間計算量 と呼ばれます) と呼ばれますこのうち、f(n) は問題サイズ n の関数です。

標準アルゴリズム測定ユニット

漸近表記

1、Θ(ビッグシータ)

n ≥ n0 のとき、不等式 0 ≤ c1g(n) ≤ f(n) ≤ c2g(n) が常に真となるような正の定数 c1、c2、n0 がある場合、g(n) はメンバーであると言われます。 f(n) の漸近的にコンパクトな境界は Θ として示されます。これには、漸近的な上限漸近的な下限が含まれます。

簡単に理解すると、 n ≥ n0 の場合、 f(n) は c1g(n) と c2g(n) の間に挟まれ、 c1g(n) はf(n) の漸近下限であり、 c2g(n) は f( n) の漸近上限は下図のとおりです。

ここに画像の説明を挿入します

2、O(ビッグオー)

正の定数 c と n0 があり、n ≥ n0 のとき、不等式 0 ≤ f(n) ≤ cg(n) が常に成り立つ場合、g(n) は f (n) の漸近上限であると言われます。 、Oと表記されます。

簡単に理解すると、n ≥ n0 の場合、cg(n) は常に f(n) よりも大きくなります。cg(n) はf(n) の漸近上限です。以下に示すように。

ここに画像の説明を挿入します

3、Ω(ビッグオメガ)

正の定数 c と n0 があり、n ≥ n0 のとき、不等式 0 ≤ cg(n) ≤ f(n) が常に真となる場合、g(n) は f(n) の漸近下限であると言われます ) 、Ωで表されます。

簡単に理解すると、n ≥ n0 の場合、cg(n) は常に f(n) を下回ります。cg(n) はf(n) の漸近下限です。以下に示すように。
ここに画像の説明を挿入します

O は最悪の場合のアルゴリズムの時間計算量を表し、Ω は最良の場合のアルゴリズムの時間計算量を表し、Θ は平均的な場合のアルゴリズムの時間計算量を表します。これはアルゴリズムの本では比較的標準的なものですが、最近のインターネットでは O を直接使って要約していることがほとんどですので、ここで理解してください。

私はここのインターネット上の記事から学びました。
元のリンク: https://blog.csdn.net/qq_31116753/article/details/81602582

時間計算量のステップとルールの導出

ステップ

  1. アルゴリズム内の基本ステートメントを見つけます。
    アルゴリズム内で最も多く実行されるステートメントが基本ステートメントであり、通常は最も内側のループのループ本体です。

  2. 基本ステートメントの実行数の桁数を計算します。
    最上位の項のみを保持して、基本ステートメントの実行数の桁数を計算します。これにより、アルゴリズム分析が簡素化され、最も重要な点である成長率に焦点が当てられます。

  3. 実行時のすべての加算定数を定数 1 に置き換えます。

  4. 最上位の項が存在し、1 ではない場合は、この項に乗じた定数を削除します。結果はビッグオーオーダー。

O(log2n)、O(n)、O(nlog2n)、O(n2)、O(n3) は多項式時間と呼ばれ、O(2n) と O(n!) は指数時間と呼ばれます。コンピュータ科学者は一般に前者が効果的なアルゴリズムであると信じており、このような問題をP(Polynomial、多項式)問題と呼び、後者はNP(Non-Deterministic Polynomial、非決定的多項式)問題と呼ばれます。

  1. 一部の単純な入出力ステートメントまたは代入ステートメントの場合、O(1) 時間がかかると推定されます。

  2. シーケンシャル構造の場合、一連のステートメントを順番に実行するのに必要な時間を、Big O の「合計ルール」の使用に使用できます。合計ルールとは、アルゴリズムの 2 つの部分の時間計算量が T1( n)=O(f(n) )) および T2(n)=O(g(n)) の場合、T1(n)+T2(n)=O(max(f(n),g(n)) )。特に、T1(m)=O(f(m))、T2(n)=O(g(n)) の場合、T1(m)+T2(n)=O(f(m)+g( n))

  3. if ステートメントなどの選択構造の場合、主な時間消費は then 句または else 句の実行に費やされる時間であり、テスト条件にも O(1) 時間がかかることに注意してください。

  4. ループ構造の場合、ループ ステートメントの実行時間は主に、ループ本体の実行と複数の反復でのループ条件のテストに費やされる時間に反映されます。一般に、ビッグ オーの「乗算ルール」を使用できます。乗算
    ルール: を指します。アルゴリズムの 2 つの部分の時間計算量。それぞれ T1(n)=O(f(n)) および T2(n)=O(g(n))、T1*T2=O(f(n)*g (n))

  5. 複雑なアルゴリズムの場合は、推定しやすいいくつかの部分に分割し、加算ルールと乗算ルール技術を使用できます。アルゴリズム全体の時間計算量にも、次
    の 2 つの演算ルールがあります。 n)=O (f(n)) の場合、O(f(n))+O(g(n))=O(f(n)); (2)O(Cf(n)) = O(f (n)) 、ここで C は正の定数です。

1.一定の順序

シーケンス構造の複雑さ。次に、ガウスの定理を使用して、1、2、3...n の数値の合計を計算します。

ここに画像の説明を挿入します
この要素を関数として扱います。この関数には f(n) = 3 として示される 3 つのステートメントがあります。上記の規則によれば、関数は n の影響を受けず、定数項であるため、時間計算量はOとして示されます。 (1). . このアルゴリズムは、問題の大きさ(n の大きさ)に関係なく実行時間が一定であるため、時間計算量 O(1) と呼ばれ、定数次数とも呼ばれます

2. 線形秩序

線形順序の循環構造はさらに複雑になります。アルゴリズムの順序を決定するには、多くの場合、特定のステートメントまたはステートメントのセットが実行された回数を決定する必要があります。したがって、アルゴリズムの複雑さを分析したい場合、鍵となるのはループ構造の動作を分析することです。

ここに画像の説明を挿入します
上図では、ステートメント 1 の頻度は 1、
ステートメント 2 の頻度は 1、
ステートメント 3 の頻度は 1、
ステートメント 4 の頻度は n、
ステートメント 5 の頻度は n、
ステートメント 6 の頻度はは n である
ため、二次関数は f (n) = 1 + 1 + 1 + n + n + n = 3n + 3 として記録されます。ルールによれば、このアルゴリズムの時間計算量は O(n) です。

3. 対数次数

ここに画像の説明を挿入します

上の図に示すように、 n>1 、 1 ステートメントの頻度は 1、
2 ステートメントの頻度は 2^f(n) <= n
f(n) = log2^nであることがわかっています。
最大値 f(n) = log2^ n を取る
ため、時間計算量は O(log2^n) として記録されます。

4. スクエアオーダー

ここに画像の説明を挿入します
上の図に示すように
、ステートメント 1 の頻度は 1、
ステートメント 2 の頻度は n n
f(n) = 1 + n
n = n^2+1である
ため、時間計算量は O(n ^2)。

5. 三次秩序

ここに画像の説明を挿入します
上の図に示すように、
f(n) = 1 + n n n = n^3+1
であるため、時間計算量は O(n^3) として記録されます。

以前遭遇した興味深い質問をさらに詳しく説明します

ここに画像の説明を挿入します
ここに画像の説明を挿入します
数学公式の補足

式 1: 1 2/2+2 3/2+3*4/2+……+n(n+1)/2=n(n+1)(n+2)/6
式 2: 1 2+ 2 2+3 2+……+n 2=n(n+1)(2n+1)/6式3
1 3+2 3+3 3+……+n 3=[n(n+1) / 2]^2
ここに画像の説明を挿入します
f(n) = n(n+1)(n+2)/6
= n(n^2 +3n +3)/6
= (n^3 + 3n^2 + 3n)/
6時間計算量は O(n^3)

一般的な時間計算量の比較

一般に使用される時間計算量は、小さいものから大きいものまで、次のとおりです。
O(1) < O(log2 ^ n) < O(n) < O(nlog2 ^ n) < O(n ^ 2) < O(n ^ 3) < O(2 ^ n) < O(n!) < O(n ^ n)

指数次数 O(2^n) や階乗次数 O(n!) など。よほど小さな n 値でない限り、たとえ n が 100 であっても悪夢のような実行時間になります。したがって、通常、この非現実的なアルゴリズムの時間計算量については議論しません。

最悪のケースと平均的なケースの比較

n 個の乱数の配列内で数値を検索します。最初の数値が である場合、アルゴリズムの時間計算量は O(1) が最適ですが、数値が最後の位置で待機している可能性もあります. . の場合、アルゴリズムの時間計算量は O(n) となり、これは最悪のケースです。
最悪の場合のランタイムは、ランタイムが決して悪化しないことを保証します。これが最も重要な要件の 1 つであるアプリケーションでは、通常、特に指定がない限り、ここで言及する実行時間は最悪の場合の実行時間です。
平均実行時間は確率の観点から見たもので、各位置でのこの数値の可能性は同じであるため、ターゲット要素を見つけるまでの平均検索時間は n/2 回となります。平均実行時間は予想される実行時間であるため、最も重要です。言い換えれば、プログラム コードを実行するときに、平均実行時間を確認したいと考えます。ただし、実際には、平均実行時間を解析によって求めることは難しく、ある程度の実験データを実行することで推定するのが一般的です。一般に、特に指定がない限り、これは最悪の時間計算量を指します。

アルゴリズム空間の複雑さ

時間計算量の議論と同様に、アルゴリズムの空間計算量 S(n) は、アルゴリズムによって消費される記憶容量として定義され、これも問題サイズ n の関数です。漸近的な空間複雑性は、単に空間複雑性とも呼ばれることがよくあります。スペースの複雑さは、アルゴリズムが動作中に一時的に占有するストレージ スペースの量の尺度です。コンピューター メモリ上でアルゴリズムが占める記憶スペースには、記憶アルゴリズム自体が占める記憶スペースアルゴリズムの入出力が占める記憶スペース動作中にアルゴリズムが一時的に占める記憶スペースの3 つの側面があります。アルゴリズムの入出力データが占める記憶領域は、解決する問題によって決定され、呼び出し関数によってパラメータ テーブルを通じて渡され、アルゴリズムが異なっても変わりません。ストレージ アルゴリズム自体が占有するストレージ スペースは、アルゴリズムの作成時間に比例するため、この領域のストレージ スペースを圧縮するには、より短いアルゴリズムを作成する必要があります。動作中にアルゴリズムが一時的に占有する記憶領域は、アルゴリズムによって異なります。一部のアルゴリズムは、少数の一時的な作業単位のみを占有する必要があり、問題のサイズによって変化しません。このアルゴリズムを「インプレース」と呼びます。前述のストレージ節約アルゴリズム。一部のアルゴリズムが占有する必要がある一時作業ユニットの数は、問題の規模 n に関連しており、n が増加すると増加します。n が大きくなると、より多くのストレージ ユニットが占有されます。

アルゴリズムの空間計算量が一定の場合、つまり処理するデータ量 n の大きさによって変化しない場合は O(1) で表せますが、アルゴリズムの空間計算量が比例する場合は O(1) で表すことができます。 n の底 2 の対数に比例する場合は 0(log2^n) と表現でき、アルゴリズムの空間計算量が n に線形比例する場合は 0(n) と表現できます。仮パラメータは配列であるため、そのためのストレージを割り当てるだけで済みます 実パラメータによって送信されるアドレス ポインタの空間、つまりマシン語長の空間; 仮パラメータが参照の場合は、アドレスを格納するスペースを用意し、そこに対応する実パラメータ変数のアドレスを格納することで、実パラメータ変数がシステムから自動的に参照されるようになります。

アルゴリズムの空間複雑度は、アルゴリズムが必要とする記憶域を計算することによって実現されます。アルゴリズムの空間複雑度の計算式は、次のように記録されます: S(n) = O(f(n))、ここで、n はスケールです。問題として、f(n) は、n に関するステートメントが占める記憶領域の関数です。

一般に、マシン上でプログラムを実行する場合、プログラム自体の命令、定数、変数、入力データを保存するだけでなく、データ操作のための記憶装置も必要になります。入力データが占めるスペースが問題自体にのみ依存し、アルゴリズムとは何の関係もない場合、アルゴリズムの実装に必要な補助ユニットのみを分析する必要があります。アルゴリズムの実行に必要な補助空間が入力データの量に対して一定である場合、アルゴリズムは適切に機能すると言われ、空間の複雑さは O(1) になります。O(1)の問題ですが、O(1)というのはデータサイズと一時変数の数は関係ないという意味であり、一時変数が1つしか定義されていないという意味ではありません。例: データサイズがどんなに大きくても、変数を 100 個定義しますが、これをデータサイズと呼び、一時変数の数は関係ありません。つまり、空間複雑度は O(1) です。

アルゴリズムの場合、時間計算量と空間計算量は相互に影響を与えることがよくあります。より良い時間計算量を追求すると、空間計算量のパフォーマンスが悪化する、つまり、より多くのストレージ領域を占有する可能性があり、逆に、より良い時間計算量を追求すると、時間計算量が悪化する可能性があり、パフォーマンスが低下し、結果が悪化する可能性があります。より長い稼働時間に。さらに、アルゴリズムのすべてのパフォーマンス間に多かれ少なかれ相互影響があります。したがって、アルゴリズム (特に大規模なアルゴリズム) を設計する場合は、アルゴリズムのパフォーマンス、アルゴリズムの使用頻度、アルゴリズムによって処理されるデータ量、アルゴリズム記述言語の特性、マシンの特性などを総合的に考慮する必要があります。アルゴリズムが実行されるシステム環境など、さまざまな要素を考慮することによってのみ、より良いアルゴリズムを設計することができます。

一般的に使用されるアルゴリズムの時間計算量と空間計算量

ここに画像の説明を挿入します

いくつかの計算ルール

1. 加算ルール

 T(n,m) = T1(n) + T2(m) = O(max{f(n), g(m)})

2. 掛け算のルール

 T(n,m) = T1(n) * T2(m) = O(max{f(n)*g(m)})

3. 複雑さと時間効率の関係

c(常数) < logn < n < n*logn < n^2 < n^3 < 2^n < 3^n < n!
l------------------------------l--------------------------l--------------l
               较好                          一般                    较差

元のリンク: https://blog.csdn.net/daijin888888/article/details/66970902#commentBox

おすすめ

転載: blog.csdn.net/qq_42194657/article/details/135438355