前言:
但凡涉及到了算法,我们逃不过去的一个问题,也是不可以逃避的一个问题就是时间复杂度与空间复杂度。这两项是检验算法优劣的标准之一,或者说是主要标准。
时间复杂度:
例子 : | 时间复杂度 : | 装逼术语 : |
5201314 | O(1) | 常数阶 |
3n+4 | O(n) | 线性阶 |
3n^2+4n+5 | O(n^2) | 平方阶 |
3log(2)n+4 | O(logn) | 对数阶 |
2n+3nlog(2)n+14 | O(nlogn) | nlogn阶 |
n^3+2n^2+4n+6 | O(n^3) | 立方阶 |
2^n | O(2^n) | 指数阶 |
时间复杂度记为:T(n)= O(f(n))。其实在考虑时间复杂度的时候可以看做是极限,一种求极限的思想可以帮助我们很好的理解时间复杂的计算问题。当n—>无穷时,对整个式子其主要因素的是数量级的影响,一种Max思想。用考研数学的一句顺口溜来记就是:高指低对低次走,归幂之后低次留。
时间复杂度消耗时间从小到大依次是: O(1) < O(logn) < (n) < O(nlogn) < O(n^2) < O(n^3) < O(2^n) < O(n!) < O(n^n) 。一般n^3之后的就不考虑了,太大了已经。
空间复杂度:
空间复杂度记为:S(n)= O(f(n))。相对于时间复杂度来讲空间复杂度就显得相对于弱一些,或者说体现算法的主要因素还是时间,我们可以牺牲一部分空间来换取时间,当然也可以牺牲一部分时间来换取空间,不同情况要不同考虑。只是一般情况下以时间复杂度为优先考虑。反例就是比如你玩的是单片机,硬件流派。你的内存空间是有限的,就那么大,你要以空间为主。
我们再来举个例子:判断一个年份是不是闰年。
- 写一个简单算法来判断,如
bool isLeapYear(int y){
return (y%4==0&&y%100!=0)||(y%400==0);
}
- 或者是定义一个数组,如arr[2050],将所有年份存进去,是闰年就为1,否为0 。
- 这时候我们来区分一下这两个,第一种利用算法,消耗的是cpu,每次年份都要进行运算。而第二种利用数组,每次年份只需要一次索引判断即可。这也就是,时间换空间还是空间换时间的问题。