目录
时间复杂度是什么?
在计算机科学中,算法的时间复杂度是一个数学函数,它定量描述了该算法的运行时间。
简而言之就是这个算法执行耗费的时间。
那我们是怎么计算时间复杂度的呢?
大O渐进法
我们一般使用大O渐进法来计算时间复杂度,我们计算时间复杂度时,我们其实并不一定要计算精确的执行次数,而只需要大概执行次数
大O渐进法的规则
1.如果有常数,将常数变成1
2.取最高阶项数,其他的都不要
3.最高项数的前面有系数的,要将系数变成1
我们接下来举个例子来用一下大O渐进法的规则吧
所以结果为N^2 +2N +10
然后我们再遵循大O渐进法的法则1,将结果变为N^2 +2N +1
法则2,结果变为N^2
法则3,因为N前面没有系数了
所以最终结果为O(N^2)
在实际中一般情况关注的是算法的最坏运行情况
最终结O(M+N)
遵循法则1,所以最终结果为O(1)
这是一个等差数列,利用求和公式,N^2 / 2
遵循大O渐进法规则,最后的结果为O(N^2)
这是一个二分查找,假设原来是N,每次都会减一半,最后就变成1了
按照这个规律,N/2^X=1 X=logN(这里是log以二为底的嗷)
递归,递归的时间复杂度 的规则是 递归的次数 * 每次递归后代码执行的次数
这里进入递归后每次也就执行一次代码,没有进入for循环啊while循环啊之类的,递归的次数是N,每次递归后执行代码的次数为1
所以这个代码的时间复杂度为O(N)
这是一个斐波那契递归,这里递归后每次也就执行一次代码,而递归的次数还要计算一下
我们不难发现这是一个等比数列,公比是2
我们可以用等比数列的求和公式来进行计算结果为2^N,所以这个的时间复杂度为O(2^N)
空间复杂度是什么?
空间复杂度 是对一个算法在运行过程中临时占用存储空间大小的量度
看问题的规模和临时占用的空间有没有关系
规则:也是用大O渐进法来求
接下来,我们举几个例子
所以根据分析可得这个的空间复杂度为O(1)
所以根据分析可得这个的空间复杂度为O(N)
计算斐波那契递归的空间复杂度,可以带入数字进行类比
我们发现每次在计算左边的时候右边还没被计算,在计算右边的时候,左边的已经计算完了,并且空间也被收回了,所以我们只用看极端情况,也就是这个最深到哪,所以有N个,最后空间复杂度为O(N)
总结
时间复杂度和空间复杂度不应该光看代码就得出结果,还要结合这个代码的思想