基本的なアルゴリズム(B):マスター式

免責事項:この記事はブロガーオリジナル記事です、続くBY-SAのCC 4.0を著作権契約、複製、元のソースのリンクと、この文を添付してください。
このリンク: https://blog.csdn.net/qq_42191317/article/details/102746943

簡単な紹介

コードは単純であり広く使用されているが、再帰的プログラム・シーケンス又はサイクルと比較するのでプログラミングは、再帰的なアルゴリズムは、非常に一般的であり、時間の複雑性は、計算することは困難であるが、時間複雑度は、再帰的プロシージャを算出するためのマスター方程式です。

公式

T(N)AT =(N / B)+ O(N ^ D)

  • B:サンプルのサブプロセスの量
  • :サブプロセスの数を計算します。
  • O(N ^ D):サブ時間複雑性の合成結果

プログラムは、上記の式は、マスター方程式の時間複雑さに応じて計算することができる満たします。

  • ログ(B、A)> D:Oの時間複雑度(N ^ログ(B、A))
  • ログ(B、A)= D:Oの時間複雑度(N ^ D * logN個)
  • ログ(B、A)<D:Oの時間複雑度(N ^ D)

アレイの最大値を計算します

/**
 * @ClassNameDemo
 * @Description 递归
 * @Author lzx
 * @Date2019/10/25 17:32
 * @Version V1.0
 **/
public class Demo {

    //非递归
    private static int getMax(int[] arr) {
        if (arr == null || arr.length < 2) {
            return Integer.MIN_VALUE;
        }
        int max = Integer.MIN_VALUE;
        for (int i = 0; i < arr.length; i++) {
            max = arr[i] > max ? arr[i] : max;
        }
        return max;
    }

    //递归
    //将数组划分为左右两部分分别计算 则数组最大值即左边最大值和右边最大值中的比较大的值
    private static int getMax2(int[] arr, int left, int right) {
        if (left == right) {
            return arr[left];
        }
        int mid = (left + right) / 2;
        int maxLeft = getMax2(arr, left, mid);
        int maxRight = getMax2(arr, mid + 1, right);
        return Math.max(maxLeft, maxRight);
    }

    public static void main(String[] args) {
        int[] arr = {1, 8, 11, -9, 0, 16, 94, 21};
        System.out.println(getMax(arr));
        System.out.println(getMax2(arr, 0, arr.length - 1));
    }

}

再帰的な符号として、アレイは、左右部、N / 2の各部分の計算量、O 2つの部分をマージする(すなわち、最大二つの部分比較)時間複雑に分割されている(1)

次いで、2であり、bが2であり、Dは、マスターによる式は、再帰的なアルゴリズムの時間複雑度はO(N)であり、0であります

おすすめ

転載: blog.csdn.net/qq_42191317/article/details/102746943