アルゴリズムの複雑さ
アルゴリズム:
定義:アルゴリズムは、一連の問題を解決するために使用されるステップです
public static int add(int a, int b){
return a + b;
}
public static int sum(int n){
int sum;
for(int i=0;i<n;i++){
sum += i;
}
return sun;
}
同じ問題を解決するために異なるアルゴリズムを使用すると、効率が異なる場合があります
アルゴリズムの品質を判断する方法
概念:
- 時間計算量:命令が実行される回数を見積もります
- スペースの複雑さ:アルゴリズムが占めるストレージスペースを見積もります
複雑さの表現:
Big O表記:一般に、big Oは、アルゴリズムの複雑さを表すために使用されます。これは、アルゴリズムnの複雑さを表します。
定数、係数、低次を無視する
-
9 >> O(1)
-
2n + 3 >> O(n)
-
n 2 + 2n + 3 >> O(n 2)
……
注:Big O表記は大まかな分析モデルであり、推定値であり、アルゴリズムの実行効率を短時間で理解するのに役立ちます。 -
対数次数は通常、底を省略します
- log 2 n {log_2 {n}} l o g2n =log 9 n {log_9 {n}}l o g9n *log 2 9 {log_2 {9}}l o g29
したがって、log 2 n {log_2 {n}}l o g2nおよびlog9 n {log_9 {n}}l o g9nはlogn {log {n}}と呼ばれますl o g n
一般的な複雑さ
実行回数 | 複雑さ | 非公式用語 |
---|---|---|
12 | O(1) | 一定の順序 |
2n + 3 | オン) | 線形順序 |
n 2 + 2n | O(n 2) | スクエアオーダー |
4 log 2 n {log_2 {n}}l o g2n + 6 | O(logn {log {n}}l o g n) | 対数順序 |
n log 2 n {log_2 {n}}l o g2n +34 | O(n logn {log {n}}l o g n) | n logn {log {n}}L O G N順序 |
2n 3 + 3n 2 + 2 | O(n 3) | キュービックオーダー |
2 n | O(2 n) | 指数関数的な順序 |
- O(1)<O(logn {log {n}}l o g n)<O(n)<O(nlogn {log {n}}l o g n)<O(n2)<O(n3)<O(2n)<O(n!)<O(nn)
例:フィボナッチ数列
- アルゴリズム1
/**
* 斐波那契数列 0 1 1 2 3 5 8……
* 求第n个费波纳希数列的值
*/
private static int feb(int n) {
if (n <= 2) {
return n;
}
return feb(n - 1) + feb(n - 2);
}
- アルゴリズム2
/**
* 0 1 2 3 4 5 6 7
* 费斐波那契数列 0 1 1 2 3 5 8 13……
* 求第n个费波纳希数列的值
*/
private static int feb2(int n) {
if (n <= 1) return n;
int first = 0, second = 1, sum;
for (int i = 0; i < n - 1; i++) {
//n=4
sum = first + second; //first:0 second=1
first = second;
second = sum;
}
return second;
}
}
アルゴリズム最適化の方向性
- できるだけ少ないストレージスペースを使用してください
- 実行ステップはできるだけ少なくしてください。
注:スペースは、適切な条件で時間と時間に交換できます。