アルゴリズムの疑問の時間複雑

オリジナルリンク: https://blog.csdn.net/itachi85/article/details/54882603

はじめの
アルゴリズムは非常に重要であるが、一般的に、多くの場合、モバイル開発を使用していないので、多くの学生が長く、多くの学生があまりにも学習アルゴリズムをされていないほか、アルゴリズムまくるが、先生に送られたと呼ばれています。アルゴリズムのこのシリーズは、頭痛の学生はすぐに基本的なアルゴリズムを把握することができましょう。プレイNBA2K17ゲームのキャリアモードを上演します中国の旧正月の休暇は、何のゲームの日も訓練されていないがありますが、トレーニングは自発的で、誰もが、私は財産になった朝から晩まで、あなたを強制しないアップではありませんが、もし時間をかけて、ではありませんプロパティ値の人々の訓練と訓練は大きなギャップがあります。これは、突然、時間をかけて必要とされるであろうスター意図的な練習(技術牛)になり、単純にそれを書いて、ゲームを鎮圧するためには、現実世界の私を認識して作られました。

1.アルゴリズムの効率は
、コンピュータは、高速演算処理を完了することができ、実際に、アルゴリズムの入力データのサイズと効率に応じて、いくつかのプロセッサリソースを消費する必要があるが。効率的に実行できるプログラムを書くために、我々は考慮に入れたアルゴリズムの効率性を取る必要があります。 
:アルゴリズムの効率を評価するために、2つの主要な複雑さで構成されてい 
た時間の複雑さ:プログラムの実施を評価するのに必要な時間。プログラムは、プロセッサの使用の範囲を推定することができます。 
宇宙複雑:必要なプログラムメモリ空間の実装の評価。プログラムは、コンピュータのメモリの使用の範囲を推定することができます。

アルゴリズムを設計する場合、システムは、一般的に平衡点を選択し、環境を考慮し、時間の複雑さと空間の複雑さを比較検討する必要があります。しかし、スペースの複雑さよりも時間の複雑さが問題になりやすいので、主要なアルゴリズムの研究の時間複雑で、特別な注意せずに、複雑さは、時間の複雑さを指します。

2.の時間計算
時間の頻度 
、時間のかかるを実行するためのアルゴリズムは、理論的にはマシンが知っているテストを実行している必要があり、アウトカウントすることはできません。しかし、我々はできませんし、テストマシン上のすべてのアルゴリズムのために必要ではない、ただそれは、アルゴリズムがそれにかかる時間を短縮するアルゴリズム、時間以上かかることを知っています。そして、アルゴリズム実行アルゴリズムの数と一緒に過ごした時間は、アルゴリズムがより頻繁に、それは時間とより多くを要し、文が実行されたステートメントに比例しています。実行アルゴリズム文の数は、ステートメントの周波数または時間周波数と呼ばれます。T(N)と呼びます。

時間計算 
時間の頻度は、以前T(n)を挙げ、N Nを変更する場合、周波数が時間T(N)に変化していき、問題の規模と呼ばれます。しかし、時には我々はそれが我々が時間の複雑さの概念を導入しているため、法律の変更を、レンダリング何時間かを知りたいです。一般的に、基本的な算術演算の数は、場合nが無限大に近づくようにT(n)を表し、補助関数F(N)であれば、T(で、問題のサイズnの機能を繰り返し実行されますN)/ F(n)がゼロ限界定数と呼ばれるF(n)がT(N)で表される振幅関数とT(n)が、である= O(Fに等しくない )N() が呼び出されます短い時間の複雑さのためのアルゴリズムの進行時の複雑さ、。

3.ランダウの記号
O()表記を持つ以前のように、我々はビッグO記法呼び出すアルゴリズムの時間の複雑さを反映します。 
アルゴリズムの複雑さは、我々はアルゴリズムを設計し、悩みの原因平均的なケースからほとんど変わらないと最悪のケースと最悪の場合の評価は非常に通常の状況下では、回避することができ、最良の場合、平均的なケースと最悪の場合の3つの角度から評価することができます私たちは、直接推定ワーストケースの複雑さがあります。 
大Oは、通常のOが1であってもよい(F(N)は、f(n)の値を表し、nは、LOGN、等をn²ので、我々はできO(1)、O(NN²)は、それぞれ、我々はその後、大O順序を導出する方法を見て?(N)fの値を導出するためにどのようにして、一定の順序、線形順序、及び順の正方形の順序と呼ぶことができます。

大O次導出 
大O-順序を導出するため、我々は次の規則に従って導出することができ、その結果、大きなO記法である: 
1.定数1の全てのランタイム代わり添加定数。 
2.変更後の実行の数、唯一の最高次の項の保持の機能 
3.最高次の項が存在し、その後、定数項の除去が乗算され、1ではない場合。

一定の順序は 
次のように、例を与えます。

int sum = 0,n = 100; //执行一次  
sum = (1+n)*n/2; //执行一次  
System.out.println (sum); //执行一次

アルゴリズムの実行回数の上記機能は、我々は順序の規則に従って大Oを導出するために必要F(N)= 3、1、3、定数であり、アルゴリズムの時間計算量はO(1)。合計=(1 + N)* N / 2この文では、アルゴリズムの時間計算量は依然としてOであるので、nおよびサイズの値は、重要ではありませんので、(1)、我々はそれを呼び出すことができる問題である、10回を実行した場合これは、一定の順序です。

次の線形 
リニア以下に示すように、メインループ構造の動作を分析するため。

for(int i=0;i<n;i++){
//时间复杂度为O(1)的算法
...
}

上記のアルゴリズムコードループを実行n回、時間複雑度は、O(N)です。

オーダーの 
、次のコードを参照してください。

int number=1;
while(number<n){
number=number*2;
//时间复杂度为O(1)的算法
...
}

なお、上記のコードは、2数のたびに乗算され、N数は、ループを終了しますnより小さくない場合、に近くなることがわかります。アルゴリズムの時間や複雑さはO(LOGN)であるので、サイクルは、星によって、2 ^ X = N、X =log₂nを数Xを仮定しました。

広場の順序 
次のコードは、ネストされたループです。

for(int i=0;i<n;i++){   
      for(int j=0;j<n;i++){
         //复杂度为O(1)的算法
         ... 
      }
}

スポークが既に線形順序O(n)が知られているインナーループの時間複雑さは、このアルゴリズムの時間複雑度はO(n²)と比較されているアウターループn回を通して今です。 
次は、以下のアルゴリズムの時間計算量をカウント:

for(int i=0;i<n;i++){   
      for(int j=i;j<n;i++){
         //复杂度为O(1)的算法
         ... 
      }
}

なお、内部ループint型J =、代わりにint型J = 0。I = 0の場合、内側ループが実行さのn倍である; I = 1内部ループは、n-1実行されたときの時間を、I = N-1を1回行った場合、我々は実行の合計数を計算することができます。

N +(N-1)+(N-2)+(N-3)+ ... + 1 
=(N + 1)+ [(N-1)+2] + [(N-2)+3] + [(N-3)+4] + ... 
=(N + 1)+(N + 1)+(N + 1)+(N + 1)+ ...... 
=(N + 1)N / 2 
= N (N + 1)/ 2 
=n²/ 2 + N / 2

これにより、n²/ 2を維持し、唯一の最上位を保持:二番目のルールは、以前に大きなOを導出するために話さ。3番目の項目を除去し、一定の1/2が除去され、このコードの最後の時間複雑度はO(n²)です。

他の一般的な複雑さ

一定の順序、線形順序、順序の正方形のため、ならびに時間計算に加えて: 
F(N)nlogn時間=時間複雑度はO(nlogn)であり、順序をnlognと呼ぶことができます。 
F(N)時間=n³、時間複雑度は、O(n³)であり、それは立方順序と呼ぶことができます。 
F(N)=時間2ⁿ、時間複雑度は、(2ⁿ)、指数関数的な順序と呼ばれることもOです。 
fは(N)= N〕の時間複雑度はO(N!)であり、階乗順序を参照することができます。 
F(N)=(時間√Nは、時間計算量はO(√N)である、順序の平方根と呼ぶことができます。
 

4.複雑さの比較

以下のアルゴリズムは、いくつかの一般的な順序に従って、F(n)の値が一般的である。このテーブルに従って、我々は、様々な差分アルゴリズムの複雑さを見て、リストを使用します。

 

表から分かるように、O(n)は、O(LOGN)、O(√N)、O(nlogn)Nが増加するにつれて、リフトの複雑さが小さく、従って、これらのアルゴリズムの複雑さは、高効率であり、一方O nは50に増加した場合(2ⁿ)とO(N!)、その後、10桁の複雑さを突破、この複雑さの貧しい効率がプログラムに表示されるように、そのプログラムの手で評価することが最善ではありませんアルゴリズムの複雑さは、最悪のケースを書くことです。

以下は、より直感的な図を提示します: 

nがx軸の値を表し、y軸はT(n)の値(時間複雑さ)を表します。Nの変化値T(n)の値は、それが(!N)ここで、O見ることができ、O(2ⁿ)増加n値と、そのT(n)の値が大きく、非常に大きく、かつ変化しますO(N、(LOGN)O )、O(nlogn)はnの値として増加、T(n)は小振幅値が大きくなります。 
一般的に、それはある小から大に要する時間に応じて、時間の複雑さを使用しました。
 

O(1)<O(logn)<O(n)<O(nlogn)<O(n²)<O(n³)<O(2ⁿ)<O(n!)

  参考文献 
「西のデータ構造」 
「チャレンジ・プログラミング・コンテスト2」 
「アルゴリズム」

おすすめ

転載: blog.csdn.net/qaz18201142158/article/details/102746745