アルゴリズムの時間計算量と空間の複雑さをつかみ

序文

アルゴリズムの長所と短所の品質は、プログラムが実行された時間、およびスペースを決定します。たぶん、この効果は明ら​​かではなく、大量のデータがある場合には、アルゴリズムが良いか悪いかの性能差であるデータのとき、少量行うには悪い日をもたらすでしょう。直接、製品の高さと幅に影響を与えると言うことができます。すべてのプログラマは、問題を解決する最善のアルゴリズムを使用したい、私たちは自分のコードがシンプルかつ効率的で書くことを楽しみにしています。しかし、どのようなアルゴリズムのDOの品質を判断するには?時間の複雑さと空間の複雑さは良い標準です。

1.時間複雑

1.1コンセプト

アルゴリズムの実行のために必要な計算努力は、我々は多くの場合、時間の複雑さと言うことです。この値は、必ずしも導入する次の実行の基本的な数と等しくありません。統計的有意性の近似値。

1.2基本的な実行時間T(n)は、

計算によれば、入力データ量、実際の実行回数Nが得られるアルゴリズム。特定の値の正確な値は、数学的な意味があります。

1.3時間計算

実質的係数、定数項等を除去して得られた実行の進行数の時間複雑。大きなO.と表記 すなわち、サージデータ、各種係数と定数項の量は、一般的になっているように実質的アルゴリズムの実行の回数に影響を与えることができません。時間の複雑さの無意味なの係数と定数項を計算します

1.4説明

  1. T(N)= 2:この関数は二つの文の合計を行い、基本周波数を行うことが2であり、時間複雑度はO(1)されている:、時間複雑度はO(1)のみ定数項を行う回数の基本的な機能であります
void test(int n)
{
    int a;
    a = 10;
}
  1. T(N)= 2N:実質的に2Nの全サイクル関数をn回、ステートメント2の各実行、実行時間。時間計算量係数はO(N)として廃棄しました
void test(int n)
{
    int cnt;
    for (cnt = 0; cnt < n; cnt++) {
        int a;
        a= 10;
    }
}
  1. T(N)= 2 *(1 + 2 + 3 + 4 + ... + N)+ = 2 1 *(1 + N)* N / 2 + 1 = N ^ 2 + N + 1。時間複雑;総実行(1 + 2 + 3 + 4 + ... + N)サイクル、すべてのサイクル後の各サイクルの実行文2、および最後に実行されるステートメント、実行回数上記理由あるO(N ^ 2)、定数項1およびnは無視されるため、場合急激な増加は、曲線の実行回数は、ほとんど効果があるデータの量
void test(int n)
{
    int cnt1, cnt2;
    for (cnt1 = 0; cnt1 < n; cnt1++) {
        for (cnt2 = cnt1; cnt2 < n; cnt2++) {
            int a;
            a = 10;            
        }
    }
    a = 11;
}
  1. T(N)= 2 *各ループのでLOGNは、総サイクルLOGN実行文2を実行し、時間計算量はO(LOGN)、無視因子2であります
void test(int n)
{
    int cnt;
    for (cnt = 1; cnt < n; cnt *= 2) {
        int a;
        a = 10;
    }
}
  1. T(N)= N * LOGN * 2以降の各ステートメントサイクル2、N * LOGN実行サイクルの合計、O(nlogn)の時間計算量は無視因子2
void test(int n)
{
    int cnt1, cnt2;
    for (cnt1 = 0; cnt1 < n; cnt1++) {
        for (cnt2 = 1; cnt2 < n; cnt2 *= 2) {
            int a;
            a = 10;
        }
    }
}
  1. O(N ^ 2)の時間計算量、係数2を無視し、T(N)= 2 * N ^ 3各ステートメントサイクル2、N ^ 3つの総実行サイクルが原因
void test(int n)
{
    int cnt1, cnt2, cnt3;
    for (cnt1 = 0; cnt1 < n; cnt1++) {
        for (cnt2 = 0; cnt2 < n; cnt2++) {
            for (cnt3 = 0; cnt3 < n; cnt3++) {
                int a;
                a = 10;
            }
        }
    }
}
  1. 再帰的な実装のフィボナッチ数は、関数を呼び出すたびに関数を呼び出すために分解し、その後、再び二回します。このため、時間複雑度は、O(2 ^ n)は
int test(int n)
{
    if (n == 0 || n == 1) {
        return 1;
    }
    return (test(n-1) + test(n-2));
}

時間の複雑さの1.5比較

O(1)<O(log2n)<O(N)<O(nlog2n)<O(N ^ 2)<O(N ^ 3)<O(2 ^ N)<O(N!)<O(N ^ n)は

2.宇宙複雑

2.1概念

このアルゴリズムは、スペースを占有しています:

  • プログラム自体の占有スペース
  • 占有出力変数入力スペース
  • 動的に割り当てられた一時的なスペース、通常の補助変数

入力データのフットプリントは、唯一の問題自体、およびアルゴリズムに依存しないに依存します。私たちは、アルゴリズムの空間計算量は、動作中のストレージスペースの大きさ、第三項の一時的な職業の尺度で呼び出します。一般的に言えば、限りアルゴリズムは、空間分布および動的な再帰的空間に必要なスタック空間複雑に関係しないように0(1)通常です。

2.2説明

  1. S(N)= O(1)空間的複雑のみ、B、C、CNT 4つの一時変数ので、O(1)です。かかわらず、一時的な変数や入力データの数とサイズの。
int test(int n)
{
    int a, b, c;
    int cnt;
    for (cnt = 0; cnt < n; cnt++) {
        a += cnt;
        b += a;
        c += b;
    }
}
  1. 各再帰新しい一時変数aを作成するため、S(N)= O(N)。空間的複雑度は、O(N)です。そして、共同再帰n回。
int test(int n)
{
    int a = 1;
    if (n == 0) {
        return 1;
    }
    n -= a;
    return test(n);
}

3.プログレッシブ成長と進歩的な時間の複雑さの機能

上記の例では、我々は通常破棄し、定数項。サージ入力、無限に近いタイミング、および定数項は、実行回数曲線に影響を与えることができないときからです。異なる曲線と定数項が完全に一致します。Iは、サージ時間を比較する線グラフをしたときに、入力値n、N ^ 2、およびグラフ曲線2N ^ 2 + 100。データサージ、および定数項の統計は、もはや時間の複雑さのために重要である場合には、それを見られないことができ、2つの曲線がほぼ完全にオーバーラップします。

4.アルゴリズム&異なった空間の複雑さの時間複雑

以下は、ソート異なる時間のご参考のためのアルゴリズムの複雑さと空間の複雑さを並べ替え、私はテーブルです。

読んでくれてありがとうは、誰もが助けてくださいポイントを好きお勧めします。背後には、エキサイティングなコンテンツを継続していきますので、お楽しみに!


注意:

この記事の元、再版学習へようこそ

再現は、目立つ位置に明記してください。

ブロガーID:CrazyCatJack

オリジナルボーエンリンクアドレス:https://www.cnblogs.com/CrazyCatJack/p/12657097.html


CrazyCatJack

おすすめ

転載: www.cnblogs.com/CrazyCatJack/p/12657097.html