终于放寒假了,松下一口气的博主能够专心地更新博客了,但愿寒假能有更大的进步!
本系列在于记载个人算法学习笔录,强化学习,废话很少说,开始吧。html
来源c++
算法的执行时间与代码的执行次数成正比,用 T(n) = O(f(n)) 表示,其中T(n)表示算法执行总时间,f(n)表示每行代码执行总次数,而n每每表示数据的规模。算法
特色数组
以时间复杂度为例,因为时间复杂度描述的是算法执行时间与数据规模的增加变化趋势,因此常量阶、低阶以及系数实际上对这种增加趋势不产生决定性影响。因此在作时间复杂度分析时忽略这些项。数据结构
复杂度量级:数据结构和算法
多项式阶:随着数据规模的增大,算法的执行时间和空间占用,按照多项式的比例增加。包括:ide
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);
以上为本篇内容,如有不足之处,请诸位多多包涵,斧正。笔者在此谢过。