算法复杂度

2019-12-18  本文已影响0人  张_何

算法优劣评估

算法复杂度表示法

执行次数 复杂度 非正式术语
12 O(1) 常数阶
2n + 3 O(n) 线性阶
4n^2 + 2n + 6 O(n^2) 平方阶
4log2n + 25 O(logn) 对数阶
3n + 2nlog3n + 15 O(nlogn) nlogn 阶
4n^3 + 3n^2+22+100 O(n^3) 立方阶
2^n O(2^n) 指数阶

数据规模较小时

数据规模较小时 .png

数据规模较大时

数据规模较大时.png

算法的优化方向

怎么估算算法的复杂度

假设计算机执行每一条指令的时间都是一样的

public static void test(int n) {
        for (int i = 0; i < n; i++) {
            for (int j = 0; j < n; j++) {
                System.out.println("test");
            }
        }
}

对于上面的这个函数
外部for循环 i = 0 执行1次,i<n执行n次、i++执行n次
内部整个for循环执行n次
对于内部for循环每次执行,j = 0执行一次,j < n执行n次,j++执行n次,System.out.println()执行n次
总体加起来就是 1+n+n+n*(1+n+n+n) = 3n^2 + 3n + 1

如果有多个变量的话需要那么要将多个变量都表示出来
比如:

public static void test(int i, int k) {
  for(int i = 0; i < n; i++) {
    System.out.println("test");
  }
  for(int i = 0; i < k; i++) {
    System.out.println("test");
  }
}

其时间复杂度就是O(n+k)

常见的递推式与复杂度

递推式 复杂度
T(n)=T(n/2)+O(1) O(logn)
T(n)=T(n-1)+O(1) O(n)
T(n)=T(n/2)+O(n) O(n)
T(n)=2*T(n/2)+O(1) O(n)
T(n)=2*T(n/2)+O(n) O(nlogn)
T(n)=T(n-1)+O(n) O(n^2)
T(n)=2*T(n-1)+O(1) O(2^n)
T(n)=2*T(n-1)+O(n) O(2^n)
上一篇 下一篇

猜你喜欢

热点阅读