一、时间复杂度
1.1什么是时间复杂度
- 简单的来说就是执行一个程序代码所需要的时间(执行一个语句定义位一个单元)
时间复杂度体现 了一个算法的好坏 是至关重要的
列如下面这个代码
int n=1000;//执行1次
for(int i=1;i<=n;i++) //int i=1执行一次 i<=1000执行1001次 i++执行了1000次
a+=1;//执行1000
//总的执行次数就是3003次 这个就是这个代码的时间复杂度
可以看出当n很大的是时候 后面的常数次数对于总次数来说是影响不大的,所以在初略计算时间的=复杂度的时候我们一般把常数忽略不计,只保留最高阶项如果最高阶项有系数那么我们也罢系数去掉
1.2 时间复杂度推导原则
- 如果运行时间是常数量级,用常数1表示;
- 只保留时间函数中的最高阶项;
- 如果最高阶项存在,则省去最高阶项前面的系数。
1.3 常见的时间复杂度的大小关系
-O(1) < O(logn) < O(n) < O(nlogn) < O(n2) < O(n3) < O(2n)
二、空间复杂度
2.1什么是空间复杂度
- 简单来说就是储存一个程序代码所需要的空间
举例说明一下
常量空间
类似于时间复杂度O(1)我们记一个执行语句的代码空间大小固定 和输入出输出没有直接的关系 空间复杂度记为O(1)
int m=2;
线性的空间
当算法执行一个线性的集合(列如数组) 集合大小和输入是成正比的,记空间复杂度为O(n) 二维数组的时候空间复杂度记为O(m*n)
1|int a[n];
2|int arr[m][n]
三、总结
- 为什么要有空间和时间复杂度?
- 判断一个算法的好坏用时间和空间复杂度来判断 主要关注时间复杂度 要会计算时间复杂度
- 有什么用?
- 在些算法题中可以用数据给定的范围计算时间复杂度反推使用的算法