アルゴリズムの基本的な紹介とその複雑さ

アルゴリズムの複雑さ

アルゴリズム:

定義:アルゴリズムは、一連の問題を解決するために使用されるステップです

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;
}

同じ問題を解決するために異なるアルゴリズムを使用すると、効率が異なる場合があります


アルゴリズムの品質を判断する方法

概念:

  1. 時間計算量:命令が実行される回数を見積もります
  2. スペースの複雑さ:アルゴリズムが占めるストレージスペースを見積もります

複雑さの表現:

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 g9nlogn {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;
    }
}

アルゴリズム最適化の方向性

  • できるだけ少ないストレージスペースを使用してください
  • 実行ステップはできるだけ少なくしてください。
    注:スペースは、適切な条件で時間と時間に交換できます。

おすすめ

転載: blog.csdn.net/weixin_42143994/article/details/109641271