コンピュータプログラムの時間と空間の複雑

社説:\(log_2n \)と呼ばれる\(logN個\) 実際にはコンピュータで、\(LNX、LGX \)\(log_2x \)一貫した値、として:
\ [log_ab = \ {log_ca FRAC } {log_cb} \]

従って:
\ [log_2x = \ FRAC LNX} {} = {LN2 LNX(\リム\ limits_ {X \に+ \ inftyの})\]

\ [log_2x = \ FRAC {LGX} {LG2} = LGX(\ LIM \ limits_ {X \に+ \ inftyの})\]

まず、時間の複雑さ

(A)の概念

問題は、サイズがある場合は、\(N \)に必要なこの問題解決のための時間アルゴリズム(T(N)\)\、それはあるが、(N \)\関数である(\ T( N)\)このアルゴリズムの「時間複雑」と呼ばれています。

場合入力\(N \)ケースの複雑さが徐々に増加が制限時間が「漸近的時間計算」アルゴリズムと呼ばれる、時間複雑さのように表すことができます。時間の複雑さは、算術式の合計数に影響される\(N- \) 係数を除く)最大値に影響する変更。

「大\(O \)表記」:本明細書で使用される基本的なパラメータは、(N- \)\、すなわち問題インスタンスのサイズ、複雑さ、または実行中の時間は次のように表される(N- \)\機能。ここで、 " \(O \) "の大きさを表す(\(受注))\、のような"バイナリサーチである(O(nlogn)\)\それが順序で」を必要としていることを、" LOGN(\ \ )のスケール取得するステップ\(N- \)ときアレイ「の表記を示す\(N- \)増加し、\)\(O(F(N))に比例する時間を実行\( F(N)\)成長率。

おおよその比較にこの増分推定理論と解析アルゴリズムは、非常に貴重なものですが、実際にはそれは細部に違いが発生することがあります。例えば、低コスト、追加\(O(N ^ 2) \) アルゴリズム\(N- \)の場合よりも小さい追加の高コストであり得る(O(nlogn)\)\アルゴリズムを高速に実行。もちろん、と\(N \)十分な大きさの後に、低速の立ち上がり関数アルゴリズムで必ずしも速く動作します。

キーファクターの計算時間の複雑さ:サイクル数と再帰

(B)は、いくつかの時間のためのプログラムの複雑さ

\(O(1)\)

temp=i;i=j;j=temp; 

「用途:私たちはしばしば大物が言っ聞く\(O(1)\)クエリ...」実際ました\(N \)だけで文を作り、何の関係もありません。

\(O(n)\)

例1

1 sum=0;             
2 for(i=1;i<=n;i++) {  
3 for(j=1;j<=n;j++) {  
4 sum++;   } 
5 }

1行目:\(1 \)

1行目:\(\ N-)

1行目:\(N-2 ^ \)

1行目:\(N-2 ^ \)

解:\(T(n)=2n^2+n+1 =O(n^2)\)

上記は無視して、通常の手続きの時間の複雑さを解決する方法である(\ T(n)を)\(\ n)は\最高次の項の係数およびその他の項目の(目的は、唯一の最大の項目を検討しています)

(ここで考え物理教師、場合\(M << M \)\(= \ FRAC {M } {M + M} G \) は無視\(mは\)値、すなわち\ (M \)役割を果たしていない結果とする小)

例2

for (i=1;i<n;i++) {
    y=y+1;         ①   
    for(j=0;j<=(2*n);j++)   { 
    x++; }       ②      
}   

ソリューション:
周波数1文です\(N-1 \)

2頻度ステートメント$(N-1)*(2N + 1)= 2N ^ 2N-1 $です

$ F(N)= 2N ^ 2N-1 +(N-1)= 2N ^ 2-2 $

番組の時間複雑\(T(N)= N O(^ 2)\)

\(O(LOGN)\)

i=1;       ①
while (i<=n)
    i=i*2; ②

ソリューション:周波数は1文である1

提供文周波数は2である(\ F(N))\ $ 2 ^ {F(N:次に、 \)}当量のN、F(N)\当量LOGN $

最大値をとる(F(N)= LOGN \ 、T(N)= O(LOGN)\)

\(O(n^3)\)

 for(i=0;i<n;i++)
    {  
       for(j=0;j<i;j++)  
       {
          for(k=0;k<j;k++)
             x=x+2;  
       }
    }

溶液:とき\(I = M、J = K \) 回数が内部ループである\(K \)

とき\(I = M \)する場合、\(J \)は取ることができます\(0,1、...、1-M \)

だからここでは、最も内側のループで行った\(0 + 1 + ... + M-1 = \ FRAC {(M-1)M} {2} \) 回

したがって、\(I \)から\(\ 0)を考慮する(N- \)\、サイクルの合計:\(0+ \ {。FRAC(1-1)\タイムズ1} {2} + ... + \ FRAC {(N-1)N } {2} = \ FRAC {N(N + 1)(N-1)} {6} \)

このため、時間複雑である(O(N ^ 3)\ \)

(C)いくつかの特別な時間複雑

  1. 不安定時の複雑さ

また、最悪の場合の動作のアルゴリズムおよび行動の期待を区別する必要があります。このような最悪の場合、実行時間のクイックソートとして$(^ N-2)Oである\(が、時間が予想され、\) O(nlogn)\(。によっては、慎重に基準値が、我々は正方形のケースに思われるたびに選択します(すなわち、\) O(^ N-2)\(ケース)はほぼ等しい確率\)に還元される 0 $。実際には、クイックソートは、多くの場合、慎重に実装することができます(\ O(nlogn))\時間を実行しています。

  1. いくつかの一般的な表記法:

アレイ内のアクセス要素(1)は、一定時間操作され、又は言う\(O(1)\)動作。

アルゴリズムは、バイナリサーチなどの各半分ステップ、データ要素を削除することができた場合(2)、それは、典型的には、かかる\(O(LOGN)\)時間。

(3)\(strcmpの\) 2を有するコンパレータ\(N- \)文字のストリングが必要\(O(N)\)時間。

(4)従来の行列乗算アルゴリズム\(O(N ^ 3)\)の各要素があることが必要であるとして、計算された\(N- \)要素が一緒に加えて、すべての要素の数で乗算さである(\ 2 ^ N- \)

(5)指数時間アルゴリズムは、通常、すべての可能な結果を見つける必要があるから来ています。例えば、\(N- \)要素の集合が共有\(2N \)サブセットをので、アルゴリズムはすべてのサブセットを必要とすることになり(O(2 ^ N)\ \) 。

しない限り、一般的なインデックス・アルゴリズムは、あまりにも複雑である(\ n)が\この問題に要素を追加すると、加工時間を倍につながる、ため、値は、非常に小さいです。残念ながら、実際に多くの問題がある\((\)など、「巡回セールスマン問題」で有名なように()\ \) アルゴリズムはこれまでに見つかったインデックスです。私たちは本当にこの問題が発生した場合は、通常、最良の結果は、アルゴリズムのおおよその交換を見つけるために使用する必要があります。

ネットワークからの前の段落

計算

一般的に、基本的な演算アルゴリズムの数は、モジュールに繰り返し行う(N- \)\つの機能の(\ F(N))\、従って、アルゴリズムの時間複雑性は示さ:\(T(N)= O (F(N))\) モジュールと\(N- \)増加し、伸び率及びアルゴリズムの実行時間\(F(n)が\)ように、成長の速度に比例する\(F(n)が\)アルゴリズムの小さい、時間計算レベル、アルゴリズムの高効率を低下させます。

計算の複雑さの時間は、第1の基本動作アルゴリズムを見つけるときに、文のそれぞれに応じて、その実行頻度を決定し、検索\(T(n)を\)と同じオーダーであるのと同じ順序(以下のとおりです。\(logN個、N-、nlogn、^ N-2、N-N- ^^ 3,2、N-!\) )、見つけるために\(Fを(N)= \)場合、この程度の\(\ FRAC {T( N)} {F(N) } \) 一定限度得るために必要な\(C \)を、時間の複雑\(T(N)= O(F(N))\)

  1. 共通の時間複雑

プレスの大きさの昇順、共通の時間の複雑さは、次のとおり一定の順序\(O(1)\。) の順の\(O(logN個)\) 線形順序\(O(N)\)ための、直線\(O(nlogn)\) 正方形の順序\(O(N ^ 2)\)立方ため\(O(N ^ 3)\)、...、\(K \)番目の順番\(O(N K ^)\) 指数順序\(O(N-2 ^)\)

その中でも、

1. \(O(N)\)、\ (O(N ^ 2)\) 立方ため\(O(N ^ 3)\)、...、\(K \)番目の順番\(O(N ^ K)\)多項式時間の複雑性のためであり、それは次、二次の時間複雑さの時間複雑度と呼ぶ......

2. \(O(N-2 ^)\) 時間複雑度が指数関数的順序で、種類が実用的ではありません

3.順序\(O(logN個)\) 線形の順序\(O(nlogn)\) 一定の順序に加えて、一種の最も効率的な

例:アルゴリズム:

 for(i=1;i<=n;++i)
  {
     for(j=1;j<=n;++j)
     {
         c[i][j]=0; //1

          for(k=1;k<=n;++k)
               c[i][j]+=a[i][k]*b[k][j]; //2
     }
  }

1回のステップの数:\(N-2 ^ \)

2:倍のステップ数:\(N- ^ 3 \。)

T $(N)+ 2 = N-N- ^^。3があり、\(、上記括弧に同じ順序に従って、我々は\決定することができる)、N- ^ 3 \(\など)(N)T $と同程度の

そこ\(F(N)= N ^ 3 \) その後に応じて\((\ LIM \ limits_ { N \に+ \ inftyの})\ FRAC {T(N)} {F(N)} \) の制限の$ C $の定数が得られ

このアルゴリズムの複雑さ:\(T(N)= O(N ^ 3)\)。

重要:

\(O(1)<O(LOGN)<O(N)<O(nlogn)<O(N ^ 2)<O(N ^ 3)<... <O(N ^ K)<O(2 ^ n)の<O(N!)\)

(参考のためにネットワークからの方法)

あなたは時間を計算するために減算することで、時間に頭やプログラムの尾の端、及び方法を注意しようとすることができます!

#include <time.h>これは、(時間のヘッダファイルを含めるようにしてください)ヘッダファイルのようです

float start_time = clock();あなたは開始時にカウントするプログラム

float end_time = clock();あなたが最後の時間にカウントするプログラム

#include<ctime>

printf("Time used=%.2lf\n",(double)clock()/CLOCKS_PER_SEC);

演習:計算以下のプログラムの時間複雑\(O(K)\)

#include <cstdio>
using namespace std;
int a[100],b[100];
int k;
int main(){
    for(int i=0;i<10;i++){//1
        a[i]=i+1;
    }
    for(int i=0;i<10;i++){//2
        for(int j=0;j<a[i];j++){//3
            b[k]=a[i];
            k++; 
        }
    }
    for(int i=0;i<k;i++){//4
        if(i==0){
            printf("%d",b[i]);
        }
        else{
            printf(",%d",b[i]);
        }
    }
    return 0;
}

第二に、スペースの複雑さ

アルゴリズムの宇宙複雑さは、動作中のストレージスペースの一時的な職業の尺度である、傾向はまた、$ Sで反射した(N)$に定義されています。

アルゴリズムの宇宙複雑さは、運転中に占有されている一時的なストレージスペースの尺度、表記です\(S(N)= O(F(N))\) そのような直接挿入ソート時間複雑であるように\(O(^ N-2)\) 空間的複雑である\(O(1)\) そして、一般的な再帰アルゴリズムがあるはずです\(O(N)\)各再帰的な復帰情報が格納されているので、スペースの複雑さ。アルゴリズムの実行時間とストレージスペースを取るために必要な2つの主要な側面を測定するためのアルゴリズムの長所と短所。

空間複雑一般的に使用される:\(O(1)\)、\ (O(N)\)、\ (O(^ N-2)\)

  1. 宇宙複雑$ O(1)$

アルゴリズムの実行に必要な一時領域は、可変の大きさの変化に伴って変化しないN、即ち、アルゴリズムの空間複雑さが一定である、のように表すことができる場合(\ O(1))\

例えば:

int i = 1;
int j = 2;
++i;
j++;
int m = i + j;

$ Iコード、空間jは、m個の$は、処理量データの変更に割り当てられていないので、空間の複雑\(S(N)= O (1)\)

  1. 宇宙複雑\(O(n)は、\)

私たちは、コードを見て:

int n=1000;
int new[n];
for(i=1; i=n; ++i)
{
   j = i;
              
   j++;
}

このコードは、最初の行の\(新しい新しい\)アレイうち、データ占有のサイズ\(N- \) このコード\(2-6 \)ライン、サイクルが、しかし、もはや新たな領域を割り当てるため、このコードの空間の複雑さは、主に、すなわち、最初の行を見ることができる\(S(N)= O (N)\)

\(125メガバイト= 131072000B \ approx10 ^ 8B \)

タイプ 会計バイト
\(INT \) 2
$長い$ \(ロング\) 4
\(\符号なし) $長い$ (\ロング)\ 8
\(浮く\) 4
\(ダブル\) 8
\(ロング\) \(ダブル\) 16
\(ブール値\) 1

計算方法:

もしオープン\(N- \)アレイの異なるタイプ、オープンタイプの各\(D_I \) 次いで= {I}} ^ {N-D_I N_T = $ \ sum_ 1の合計\(各タイプバイト\)占有 P_I \(\サイズの各アレイの各タイプ)におけるY_ {i_j}(J \ [1、D_I]、I \でN- [1、])を$

プログラムのための最大の空間\(P \) \(MB \) \(= 1048576P \) \(B = C \) \(B \)

ため\(S = \ sum_ {iが = 1} ^ {N} \ lbrack \ sum_ {J = 1} ^ {D_I}(P_I * Y_ {i_j})\ rbrack \当量C \) に沿った条件を満たす、すなわち、

例:
3つの配列、\(BOOL [1000]、INT [20000]、ダブル[300000] \)

\(S = 1 \ times1000 + 2 \ times20000 + 8 \ times3000000 = 24041000> 13107200 \)

スペースの複雑さは準拠していないので、

2019年11月28日

おすすめ

転載: www.cnblogs.com/liuziwen0224/p/fuzadu.html
おすすめ