复杂度
- 时间复杂度
- 空间复杂度
基本概念:
复杂度用于分析程序运行消耗的时间(1),和硬件资源(2)的程度。
时间复杂度
算法的时间复杂度是一个函数,算法中进行的基本操作次数,为算法的时间复杂度。
一般使用大O的渐进表示法表示。
推导大O阶方法:
- 常数1取代运行时间中的所有加法常数;
- 在修改后的运行次数函数中,只保留最高项阶;
- 如果最高阶存在且不为1,置1,得到结果即为大O阶。
算法存在不同输入下的时间复杂度差异情况:
最坏:任意输入规模的最大运行次数
最好:任意输入规模的最小运行次数
平均:任意输入规模的期望运行次数
在一个长度为n的数组中查找一个数x:
最坏:n
最好:1
平均:n/2
而一般情况下我们关注的是算法的最坏运行情况,因此其时间复杂度为O(n)。
冒泡排序的时间复杂度:
运算的次数相当于其中每个数和除此数以外的所有数做一次比较。结果为1~(n-1)的等差数列之和。
最坏情况:(n-1)*n/2—>O(n^2)
最好情况:原本数列就是有序的,只需全部遍历一边,O(n)
二分查找的时间复杂度(以数组有序为前提):
由于二分查找每次将数组的查找范围减半,那么意味着最差的情况下是只剩最后一个数的时候找到目标数。那么此时假设已经进行了x 次减半,就意味着数组大小n<=2^x。所以x>=log(2)n
最坏情况:O(log(2)n)
最好情况:1
以递归算法计算阶乘的时间复杂度
由于递归算法的时间复杂度为:递归次数*每次递归函数的次数
阶乘递归n次,因此时间复杂度为O(n)
不同算法对时间复杂度的影响
求出斐波那契数列
-
方法1,使用递归计算
fib(n)=fib(n-1)+fib(n-2)
其每次向下递归一次,单层递归次数*2。最终的递归次数相当于一个1+2+22+…+2n-1的等比数列求和过程,其运算次数近似等于2n-1,时间复杂度为O(2n)。 -
方法2,使用指针数组算法
申请一个空间为n个整数的数组,将前两项的和存储在第三项中,依次类推,那么得到第n项的值只需要进行n次运算,时间复杂度为O(n)。
空间复杂度
空间复杂度计算的是占用变量的个数。
如递归阶乘的调用次数为n阶,每次调用都要多开辟一块存储空间,空间复杂度为O(n)。
斐波那契数列的指针数组解法,由于其占用的运算资源是申请的数组大小和常数的变量申请,空间复杂度为O(n)。