アルゴリズムとは何ですか?
アルゴリズム(アルゴリズム)は、正確な問題解決ソリューションと完全な説明を参照し、問題を解決するための明確なコマンドのシリーズで、機構は、アルゴリズムが系統的な方法で問題を解決するための戦略を表す説明しました。すなわち、特定の仕様では、限られた時間内に必要な出力を得るために入力することができます。アルゴリズムは、欠陥、または問題に適していない場合は、このアルゴリズムの実装は、問題を解決することはできません。異なるアルゴリズムは、同じタスクを達成するために、異なる時間、空間や効率を使用することがあります。測定に利用可能なスペースの複雑さと時間の複雑さの長所と短所のアルゴリズム。
このアルゴリズムは、それぞれ、二つの数字ため一緒に問題を解決することができ、2つのコードと呼ばれ、nは1添加であることができます。限り、アルゴリズムという特定の問題を解決するようなアルゴリズムは、コードの行数万に多くのコードの非常に複雑な、小さなラインである必要、としていません。
アルゴリズムのメリットを評価する方法
同じ問題を解決するために異なるアルゴリズムを使用して、効率が非常に異なる場合があります
二つは、フィボナッチ(フィボナッチ数)アルゴリズムを求めて、既存の
(フィボナッチ数:112358 ......)
public static int fib1(int n) {
if (n <= 1) return n;
return fib1(n - 1) + fib1(n - 2);
}
public static int fib2(int n) {
if (n <= 1) return n;
int first = 0;
int second = 1;
for (int i = 0; i < n - 1; i++) {
int sum = first + second;
first = second;
second = sum;
}
return second;
}
これら2つのアルゴリズムのどちら良いこと?
効率の実装の一つの評価は、このようなスキームを期待するかもしれない場合
入力の同じセットに対して異なるアルゴリズムを比較するための実行処理時間
事後の統計情報:このプログラムとしても知られています
我々のアプローチは以下のとおりです。
public static void main(String[] args) {
int n = 45;//求第45个斐波那契数
TimeTool.check("fib1", new Task() {
public void execute() {
System.out.println(fib1(n));
}
});//5.815秒
TimeTool.check("fib2", new Task() {
public void execute() {
System.out.println(fib2(n));
}
});//0.0秒
}
上述した実施形態は、明らかな欠点があります
実行時間は、ハードウェアに大きく依存していると不確実性の環境要因の様々な実行します
あなたは、コードに対応する推定値を書き込む必要があります
選択した試験データは、公平性を確保することはより困難である(100のために、N =短くてもよい第一のアルゴリズムは、第2のアルゴリズムは短くてよい場合、N = 200)
一般的に以下の寸法からのアルゴリズムを評価するために使用
(無理な入力応答能力および処理能力に対して)正確さ、読みやすさ、堅牢
時間の複雑さ(時間計算):実行プログラム命令数の推定値(実行時間)
宇宙複雑(スペースの複雑さ):占有に必要なストレージ容量を見積もります
私たちは、このプログラムに数学1 + 2 + ... + n個のアルゴリズムを評価します
第2のアルゴリズムは明らかに優れています。それは、第二の方法のコードは、それが短いためですか?フィボナッチ数の例としては、私たちにできる限り短くコードを語っていません。この場合、第2のアルゴリズムは、三段階の操作は、問題を解決することができる必要はなく、ループのn倍にする必要があり。まず第一には、正確性、可読性、堅牢性の基準を満たしていると、時間の複雑さが関係しているから、その後、一定と仮定すると、我々はそれが命令が実行される回数、あなたは2つのアルゴリズムを比較することができ大体とるステップ実行時間の動作を調べます時間の長さ、およびスペースの複雑さの考慮から、以下の変数の必要性、小さなオープン収納スペース、より良いアルゴリズム。
ランダウの記号
ランダウの記号は、一般的に複雑さを記述するために使用され、それはnに対応するサイズの複雑データを表します
手順:
(1)時間複雑さ/空間の複雑さを推定する(ほとんどの時間複雑さ)
(2.1)を無視定数、係数、下位
$9$>> O(1)
$2n+6$ >> O(n)
$n^2+2n+6$ >> O($n^2$)
$4n^3+3n^2+22n+100$ >> O($n^3$)
一般に略さベースで順序の(2.2)
$log_2n=log_29+log_9n$ (任意底数的对数可通过乘以一个常数相互转化)
所以 $log_2n$、$log_9n$ 统称为 $logn$
注:ランダウの記号は単にラフ解析モデルでは、アルゴリズムの効率性を理解するために私たちに短い時間を助けることができる推定値であります
次の段落にコードの時間の複雑さを計算します
java
public static void test1(int n) {
//1(进行一次判断操作)
if (n > 10) {
System.out.println("n > 10");
} else if (n > 5) { // 2
System.out.println("n > 5");
} else {
System.out.println("n <= 5");
}
// 1(定义一次i) + 4(i累加四次) + 4(判断i<4四次) + 4(循环体一条语句执行四次)=9
for (int i = 0; i < 4; i++) {
System.out.println("test");
}
// 大O表示法时间复杂度O(1)
}
java
public static void test2(int n) {
// 1(定义一次i)+ 3n(i累加n次+判断i<n n次+循环体一条语句执行n次)=1+3n
for (int i = 0; i < n; i++) {
System.out.println("test");
}
// 大O表示法时间复杂度O(n)
}
java
public static void test3(int n) {
// 1(定义一次i) + 2n(i累加n次+判断i<n n次) + n(外层循环体语句执行n次) * (1(定义一次j) + 3n(j累加n次+判断j<n n次+内层循环体一条语句执行n次))=3n^2 + 3n + 1
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
System.out.println("test");
}
}
// 大O表示法时间复杂度O(n^2)
}
Java
public static void test4(int n) {
// 8 = 2^3
// 16 = 2^4
// 3 = log2(8)
// 4 = log2(16)
// 执行次数 = log2(n)
while ((n = n / 2) > 0) {
System.out.println("test");
}
// 大O表示法时间复杂度O(logn)
}
java
public static void test5(int n) {
// log5(n)
while ((n = n / 5) > 0) {
System.out.println("test");
}
// 大O表示法时间复杂度O(logn)
}
Javaの
パブリック静的ボイドTEST7(N-INT){
//。1(I一度定義)2 + IOG2(N)(I演算の2数)+ LOG2(N)(アウターループ実行回数)(+。1 3N付き)(内層サイクル)を行う
(INT I =ため1; I <N-; I I = 2){
// 1 3N +と。
(INT J = 0; J <N-; J ++){
するSystem.out.println( "試験") ;
}
}
// 3. 1 + IOG2 2 +(N-) nlog2(N-)
// O記法大きな時間複雑性O(nlogn)
}
(1)$ O <O(logN個)<O(N)<O( nlogn)<O(N ^ 2 )<O(N ^ 3)<O(2N)<O(N!)<(N ^ n)のO $
関数発生手段は、ツールのサイズの複雑さを比較することができます
https://zh.numberempire.com/graphingcalculator.php
説明するのはあまりないが、限られたスペース、。すべてのすべてで、あなたは、単に質問に答えるための最速の方法と時間の有効期間として理解できるアルゴリズムの目的は、これは、多くのコーダはのために働い誘致、魅力のアルゴリズムです。
あなたは、自分自身を向上させる複数のアルゴリズム、高レベルのプログラミング言語のスキルを習得したい場合は、無料の学習教材があり、マイクロ文字を追加してください:より技術的なアップグレード攻略のために19950277730を。それは小さな志を同じくするパートナー、より多数の無料プログラミングのスキル、学習ビデオや情報に加え、マイクロチャネル技術だけでなく、それを議論することを学ぶことです!!