最後に、アルゴリズムの最後の部分に来て、この記事の出現はまた、一連の最終的な勝利チョンチョンチョンに向かって、終わったことを意味します!
アルゴリズム(アルゴリズム)は、正確な問題解決ソリューションと完全な説明を参照し、問題を解決するための明確な一連の命令であり、このアルゴリズムは、体系的な方法で説明した問題を解決するためのポリシーメカニズムを表します。すなわち、特定の仕様では、限られた時間内に必要な出力を得るために入力することができます。アルゴリズムは、欠陥、または問題に適していない場合は、このアルゴリズムの実装は、問題を解決することはできません。異なるアルゴリズムは、同じタスクを達成するために、異なる時間、空間や効率を使用することがあります。アルゴリズムの長所と短所は、測定の空間計算量と時間の複雑さを使用することができます。
私たちは、その後、原則を理解し、それを使用する方法を学ぶことができない場合は、アルゴリズムのこの部分は、一般的に良い前任者がされている完璧な仕上がりにしたいです。
アルゴリズムは、単にコンピュータの指示の有限のシーケンスとして表さステップを解決する特定の問題を解決し、それぞれが1つまたは複数の命令の動作を表す説明されています。ここでは、注意する必要があります。同じ問題が解決するために、多くの異なるアルゴリズムを有していてもよく、普遍的なアルゴリズムはすべての問題を解決することはできません。
このアルゴリズムは、次の持つべき5つの重要な機能を:
- 有限抵抗(有限):有限のアルゴリズムを指すが実行されるアルゴリズムのステップ有限数の後に終了することができなければなりません。
- 正確な性質(定性):アルゴリズムの各ステップは、正確な定義を有していなければなりません。
- エントリ(入力):0アルゴリズムまたは操作オブジェクトの初期状態を特徴付ける複数の入力、0いわゆる初期条件は、アルゴリズム自体を修正する入力を指します。
- 出力項目(出力):このアルゴリズムは、入力データを処理した結果を反映するために、1つ以上の出力を有します。このアルゴリズムは、出力は無意味ではありません。
- 実現可能性(有効性):アルゴリズムにおける任意算出ステップが実行される(これも有効性とも呼ばれる)、すなわち各計算ステップは、限られた時間内に完了することができ、実行可能な基本的なステップに分解することができます。
解決するために、異なるアルゴリズムを使用して、同じ問題が、メリットアルゴリズムの品質の目的は、アルゴリズムとプログラムの効率に影響を与えるだろう、アルゴリズム分析は、適切なアルゴリズムと改善アルゴリズム、対策のスペースの複雑さと時間の複雑さから、主要な評価アルゴリズムを選択することです。
- 時間計算:アルゴリズムの時間計算量は、アルゴリズムを実行するために必要な計算量を指します。一般的に、コンピュータアルゴリズムは、問題のサイズN、アルゴリズムの時間複雑さもこのように表記されるF(N)の関数である:T(N)=Ο( F(N))。このように、N、倍、アルゴリズム実行成長及びf(n)は、成長率と正の相関が大きいほど、プログレッシブ時間(漸近的時間計算)の複雑さと呼ば
- スペース複雑さ:アルゴリズムのスペースの複雑さは、メモリ空間アルゴリズムを消費する必要性を指します。そして、計算の複雑さと表現同様の時間は、通常、漸近複雑で表現しました。同時に複雑と比較すると、分析の空間計算量がはるかに簡単です。
- 正し:アルゴリズムの正しさは、最も重要な基準の長所と短所を評価するためのアルゴリズムです。
- 可読性:可読性アルゴリズムは、使いやすさを読む人のために、アルゴリズムです。
- 堅牢性:堅牢性はまた、フォールトトレランスとして知られている不合理な入力データ及び反応の処理能力、アルゴリズムを指します。
直感的にまとめたものを見つけるために皆のためのインターネットからの写真:
一般統計後に使用されるアルゴリズムの効率の尺度のために、アルゴリズムの効率のレベルを決定するために比較されたプログラムの準備の時間を実行しているコンピュータアルゴリズム異なるタイマーを使用して、良好な試験手順と設計データ。
欠陥の後に統計的手法:
- アルゴリズムは、通常の練習と多くの労力を要し良い準備の手順、に基づいている必要があります。
- 時間は時々、アルゴリズム自体のメリットを分かりにくく、そのようなコンピュータのハードウェアおよびソフトウェアなどの環境要因に依存する必要があります。
- アルゴリズムを設計することは困難でテストデータ、および実行時のプログラムは、多くの場合、テストデータのサイズとの素晴らしい関係を持っています。
そして、それは多くのデータと時間の長い期間、人工知能の開発を必要とするため、今、このアプローチをお勧めしません、私たち一般的に小規模なテスト彼らのアルゴリズムは、主にこのメソッドを使用します。
そして今、人々はコンピュータプログラミングの前にある事前に推定する方法を、発明した、アルゴリズムの推定値は統計的手法に基づいて、これらのプログラムは、任意のコンピュータ上で実行するだけでアルゴリズムを気にする書き込みプログラムに使用する言語を気にしないでください。
コンピュータプログラムの実行時間を決定する要因:
- 戦略アルゴリズムは、この方法を取ら。
- コード品質(ソフトウェアサポート)コンパイラが生成しました。
- 問題の規模を入力:入力量の数を指します。
- 命令の機械速度の実行。
プログラムの実行中の時間を分析する際に、最も重要なことは、プログラミング言語のアルゴリズムまたは一連のステップのプログラムの独立したと見なすべきである、我々は、異なる入力の効果を見て、規模を入力する別の方法を実行します。
アルゴリズムをテストするように、異なる入力のサイズは異なります。
成長の漸近機能
そこで、両者の優れたアルゴリズムにそれをどのように決定しますか?のは、異なる周波数と計算データN回の中に異なるアルゴリズムに基づいた例を見てみましょう:
漸近関数の増加は、(N)は、F二つの機能を与えられ、G(N):これは、同じ入力データに対して異なるアルゴリズムが同一の計算効率でない場合、我々は概念にこのリードが分かります全てのn> N、F(n)が常にG(N)よりも大きいことを整数Nようが存在する場合、我々は、F(n)が高速G(N)より漸進的な増加であると言います。
同時に、私たちは、この例で見ることができます:乗算定数最高度用語は重要ではありません;関数をn個の成長と、より大きな最高次の項の指数は、結果は特に急成長になるだろう。アルゴリズムの効率性を判断するときに、関数の定数およびその他のマイナーな項目は無視することができますが、最高次の項の順序を心配する必要があります。
アルゴリズムの時間複雑
- アルゴリズムの時間計算量はによって示される時間、測定することである:T(N)= O(F(N))を、
- T(n)の実行の合計数のステートメントは、それが問題のn個の機能の規模程度です。
- 私たちは大きなO記法を呼び出すO()表記アルゴリズムの時間の複雑さを反映する、と。
- 一般的に、Nが増加するにつれて、T(n)のアルゴリズムは、最も遅い成長に最適なアルゴリズムです。
大きなOを導出する方法のために:
- 定数1で加えて置換すべての実行時定数;
- 唯一の最高次の項を保持修正後のランの数の関数で、
- 最上位が存在し、1でない場合は、このエントリに定数を掛け削除
私は大規模なO-順序を導出する方法の例を見ています:
簡単に言えば、あること、ちょうど私たちはそれを拡張させ、最上位の数を見てみましょう。
複雑さのオーダーの時定数は、以下の実施例のみとO(1)です。
int n = 1, m = 2;
m += n;
printf("%d", m);
int a[255];
a[0] = 1;
a[1] = 2;
a[2] = 3;
int sum = a[0] + a[1] + a[2];
printf("%d", sum);
for(int i = 0; i < 100; i++){
printf("这是一条printf语句");
}
これらの例では、無入力の N変数のみ定数ため、それらの時間複雑度はO(1)であるので。
しかし限り、入力変数nとして、それは線形順序次のようになります。
int sum = 0;
for(int i = 1; i < n; i++){
sum += i * 2;
}
printf("%d", sum);
for(int i = 0; i < n; i++){
printf("这是一条printf语句");
}
//在这些语句中输入规模都是n,而不是常数,所以是非常数阶
void function(){
printf("这是一条printf语句");
}
void print(int n){
for(int i = 0; i < n; i++){
function();
}
}
//在上面代码中function函数的时间复杂度为常数阶O(1)
//但是print函数的时间复杂度为线性阶O(n)
したがって、上記の導出方法によれば、線形順序は、時間複雑度はO(n)です。
広場の順に少し難しくあります。
for(int i = 0; i < n; i++){
for(int j = 0; j < n; i++){
printf("这是一条printf语句");
}
}
//时间复杂度为O(n*n)
for(int i = 0; i < n; i++){
for(int j = 0; i < m; i++){
printf("这是一条printf语句");
}
}
//时间复杂度为O(n*m)
for(int i = 0; i < n; i++){
for(int j = i; j < n; i++){
printf("这是一条printf语句");
}
}
//时间复杂度为O(f(n))
//f(n) = n + (n - 1) + (n - 2)+ ... + 1
// = n * (n + 1) / 2
// = (n * n) / 2 + n / 2
//时间复杂度为O(f(n)) = O(n*n)
手短に言えば、時間複雑さの正方形の順序は、サイクル数を乗じたループの複雑さです。
オーダーにあり、複雑されています。
int count = 1;
int sum = 1;
while(count <= n){
sum *= 2;
count ++;
}
//这是一种常见的计算2的n次幂的方式
//时间复杂度为O(n)
int count = 1;
while(count <= n){
count = count * 2;
}
//这时候,每次循环count都会乘2,就离n更近一些
//2的f(n)次 = n
//那么f(n) = log以2为底的n
//时间复杂度为O(log n)
这些时间复杂度都是通过输入规模的不同而不同,总结一下:
不管是什么程序,我们将其的执行次数函数推导出来,然后就可以推导出他们的时间复杂度。常用的时间复杂度所消耗的时间从小到大依次排序为:
空间复杂度
- 算法的空间复杂度通过计算算法所需的存储空间实现;
- 算法的空间复杂度的计算公式记作: S(n) = O(f(n)),其中n为问题的规模,f(n)为语句关于n所占存储空间的函数;
- 如果算法执行时所需的辅助空间相对于输入数据量而言是个常数,则称此算法为原地工作,空间复杂度为O(1 )。
我们在判断算法的优劣时,先判断时间复杂度,如果相同再判断空间复杂度。
我们就简单的整理到这里,对于一些优秀的算法如二分法、快速排序、冒泡等大家有兴趣可以自行google或百度查看,这里我们不做过多说明。
最后一部分也写完了,中间可能有些纰漏,大家可以在评论区中告诉我,如果有漏掉的知识点我会再补上。
同时在这里说一下因为开学网课也有一段时间了,以后就不会每天都写文章了,一是没有时间来写,二是不管是新的技术HTML、CSS、Python等还是Java的高阶技术,都不是能简单的整理的,所以我会不定期更新,但每天都会看CSDN,大家的想法和评论我以为会第一时间收到,谢谢大家!