文章目录
- 定义与分类
- 时间复杂度
- 概念
- 大O的渐进表示法
- 举例
- 情况
- 注意
- 内涵
- 空间复杂度
- 最优解
定义与分类
复杂度:衡量算法效率的标准
时间效率:衡量这个算法的运行速度,也就是我们常说的时间复杂度
空间效率:衡量这个算法所需要的额外空间,也就是我们常说的空间复杂度
时间复杂度
概念
在计算机科学中,算法的时间复杂度是一个函数,它定量的描述了该算法的运行时间。
一个算法执行所耗费的时间,从理论上说是不能算出来的,只有你把你的程序放在机器上跑起来才能知道,但是我们需要每个算法都需要上机测试吗?那样是不是很浪费时间,还很麻烦,所有才有了时间复杂度这个分析式。
一个算法所花费的时间与其中语句执行的次数成正比,算法中基本操作的执行次数,为算法的时间复杂度
大O的渐进表示法
一般我们用大O的渐进法来表示时间复杂度,并给出了一个问题的规模,这个规模我们统称为N
推导方法:
- 用常数1取代运行时间中的所有加法函数
- 在修改后的运行次数函数中,只保留最高阶限
- 如果最高阶存在且不是1,去掉最高项的系数
得到的结果就是大O阶
简单的说:时间复杂度就是一个和数据量有关,只要高阶项,不要低阶项,不要常数项的操作次数表达式
举例
1.选择排序
public void selectSort(){
int[] arr = {1,5,9,6,3};
for (int i = 0; i < arr.length -1; i++) {
for (int j = i; j < arr.length -1; j++) {
if (arr[i] >arr[j+1]){
int temp = arr[i];
arr[i] = arr[j+1];
arr[j+1] = temp;
}
}
}
}
第一次:索引从0到N-1过一遍选出最小值,循环次数为N
第二次:索引从1到N-1过一遍选出最小值,循环次数为N-1
第三次:索引从2到N-1过一遍选出最小值,循环次数为N-2
依次类推…
第N次:索引从N-1到N-1过一遍选出最小值,循环次数为1
循环次数为(N+N-1+N-2+…+1),为等差数列
我们知道等差数列最后的结果为
根据推导方法我们得出选择排序的时间复杂度为
2.插入排序
这里插入一个知识点:严格固定流程的算法,一定强调最差情况!
插入排序中,被进行排序的数组可以是有序数组,也可以是无序数组。
有序数组中,数组插入一次,进行比大小,不需要换位置,所以最后的时间复杂度为;在无序数组中,可以是随机无序,最坏的情况就是一个降序数组,但是你需要一个升序的数组,数组插入一次,就要与前面交换位置,前面几个元素就要交换几次,时间复杂度为1+2+3+…+N为,那最后插入排序的时间复杂度到极为多少呢?
遇到这种情况,因为插入排序的代码是固定的,所以称为固定流程的算法,我们要用最差情况来计算时间复杂度,所以插入排序的时间复杂度为
情况
- 算法流程上利用随机行为作为重要部分的,要看平均或者期望的时间复杂度,因为最差的时间复杂度无意义(生成相邻值不同的数组)
- 时间复杂度的均摊,(动态数组,N个数的时间复杂度为,那么一个数的时间复杂度为)
注意
- 不要用代码结构来判断时间复杂度,比如只有一个while循环的冒泡排序,时间复杂度为
- 不要用代码结构来判断时间复杂度,比如N/1+N/2+…+N/N,这个流程的时间复杂度为调和级数
- 时间复杂度只能是对算法流程充分理解才能分析出来的,而不是简单的看代码结构!
- 时间复杂度很重要,可以直接判断某个方法能不能通过一个题目,根据数据量猜解法
内涵
描述算法运行时间和数据量的关系,而且当数据量很大很大时,关系相当的本质,排除了常熟时间的干扰
空间复杂度
实现该算法所需的额外空间
最优解
先满足时间复杂度最优,然后尽量少用空间的解