一、时间复杂度
1、含义:
时间复杂度代表一个算法的执行效率时间随数据规模增长的变化趋势。
2、计算公式:
时间复杂度与代码的执行次数成正比。
写法:T(n) = O(f(n)) 其中f(n)代表代码的执行次数总和。
3、计算法则:本质上是计算代码执行次数
- 常数项省略:其对增长趋势没有影响。
- 只需要计算循环执行最多的一段代码。
- 函数想加,等于量级最大的那一段循环代码执行次数。
- 嵌套循环,等于内外循环次数的乘积。
4、常见时间复杂度
- 多项式量级:
- 非多项式量级:指数阶于阶乘阶。即NP问题,其算法非常低效,不采纳。
特别说明:O(m+n)于O(m*n):执行了两个不同数量级的循环,所以不能混为一体。如下代码其复杂度为O(m+n):
int cal(int m, int n) {
int sum_1 = 0;
int i = 1;
for (; i < m; ++i) {
sum_1 = sum_1 + i;
}
int sum_2 = 0;
int j = 1;
for (; j < n; ++j) {
sum_2 = sum_2 + j;
}
return sum_1 + sum_2;
}
二、空间复杂度
1、含义:
算法的存储空间与数据规模之间的增长关系。
三、补充:
1、常见时间复杂度函数图:
2、最好、最坏、平均情况时间复杂度
下述代码为查找某个数x在数组中的位置,由于原数组array中x位置的不确定,导致循环的次数也不一样。
所以引出了最好(x在数组开头)、最坏(x在数组最后或不在数组内)、平均(求平均次数)情况时间复杂度。
只有同一代码块存在量级的差距时才会进行区分求时间复杂度,一般用不到。
// n表示数组array的长度
int find(int[] array, int n, int x) {
int i = 0;
int pos = -1;
for (; i < n; ++i) {
if (array[i] == x) {
pos = i;
break;
}
}
return pos;
}