1、如何分析代码的复杂度
简单来讲,代码复杂度指的是代码的执行效率,复杂度越高,执行效率越查 一般用以下三种方法来分析代码的复杂度
- a.只关注循环次数最多的一块代码
- b.加法法则
- c.乘法法则
几种常见的复杂度分析
- 常量阶 O(1)
- 线性阶 O(n)
- 对数阶 O(logn)
- 线性对数阶 O(nlogn)
- 平方阶O(n2)、立方阶等 O(n3)....K次方阶O(nk)
- 指数阶O(2n)
- 阶乘阶O(n!)
2、最好、最坏、平均、均摊时间复杂度
eg:
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;
}
- 最好时间复杂度,当i<length时, O(1)
- 最差时间复杂度,当i>=length时,O(n)
第一种计算方式: (1+1+...+1+n)/(n+1) = 2n/(n+1) 【注: 式子中1+1+...+1中有n个1】,所以平均复杂度为O(1);
第二种计算方式(加权平均法,又称期望): 1*(1/n+1)+1*(1/n+1)+...+1*(1/n+1)+n*(1/(n+1))=1,所以加权平均时间复杂度为O(1);
第三种计算方式(均摊时间复杂度): 前n个操作复杂度都是O(1),第n+1次操作的复杂度是O(n),所以把最后一次的复杂度分摊到前n次上,那么均摊下来每次 操作的复杂度为O(1)