终于放寒假了,松下一口气的博主可以专心地更新博客了,希望寒假能有更大的进步!
本系列在于记载我的算法学习笔录,强化学习,废话不多说,开始吧。
来源
算法的执行时间与代码的执行次数成正比,用 T(n) = O(f(n)) 表示,其中T(n)表示算法执行总时间,f(n)表示每行代码执行总次数,而n往往表示数据的规模。
特点
以时间复杂度为例,由于时间复杂度描述的是算法执行时间与数据规模的增长变化趋势,所以常量阶、低阶以及系数实际上对这种增长趋势不产生决定性影响。所以在做时间复杂度分析时忽略这些项。
复杂度量级:
多项式阶:随着数据规模的增大,算法的执行时间和空间占用,按照多项式的比例增长。包括:
O(1) 、O(logn)、O(n) 、O(nlogn) 、O(n^2)... O(n^k).
非多项式阶:随着数据规模的增大,算法的执行时间和空间占用暴增(NP问题),这类算法性能极差。
O(2^n) 、O(n!)
首先我们要引入几个概念:最好情况时间复杂度(best case time complexity)、最坏情况时间时间按复杂度(worst case time complexity)、平均情况时间复杂度 (average case time complexity)、均摊时间复杂度(amortized time complexity)。
例子:
// 全局变量,大小为 10 的数组 array,长度 len,下标 i。
int array[] = new int[10];
int len = 10;
int i = 0;
// 往数组中添加一个元素
void add(int element) {
if (i >= len) { // 数组空间不够了
// 重新申请一个 2 倍大小的数组空间
int new_array[] = new int[len*2];
// 把原来 array 数组中的数据依次 copy 到 new_array
for (int j = 0; j < len; ++j) {
new_array[j] = array[j];
}
// new_array 复制给 array,array 现在大小就是 2 倍 len 了
array = new_array;
len = 2 * len;
}
// 将 element 放到下标为 i 的位置,下标 i 加一
array[i] = element;
++i;
}
该算法的最好情况时间复杂度(best case time complexity)为O(1);
最坏情况时间复杂度(worst case time complexity)为O(n);
均摊时间复杂度 (amortized time complexity) 为O(1);
以上为本篇内容,若有不足之处,请诸位多多包涵,斧正。笔者在此谢过。
原文:https://www.cnblogs.com/jiaweixie/p/10303091.html