1.算法效率*``
要衡量算法效率,可以从两个方面去分析。第一个时间复杂度,第二个空间复杂度。计算机发展至今,存储容量已经无法估量,所以不用特别关注空间复杂度,而程序猿的关注焦点转向了时间复杂度。
2.时间复杂度
2.1时间复杂度概念 那么时间复杂度是指什么呢?简而言之就是程序运行所耗费的时间,从理论上讲,时间复杂度无法计算出来,只能运行程序才知道具体的时间耗费。但是为了提高算法效率,我们就得做时间上的估计,所以这就有了时间复杂度的分析方式。一个算法所耗费的时间和程序语句的执行次数成正比,算法中的基本操作执行的次数,就是时间复杂度。 2.2大O渐进表示法 下面我们通过一个程序来体会: fun执行的基本操作次数: F(n)=n^2+2*n+20; 实际计算时并不需要那么精确,只需要计算出大概的执行次数,那么这里使用大O的渐进表示法,推导的大O阶方法: 1.用常数1来表示所有的常数。 2.在修改后的运行次数函数中,只保留大O阶项。 3.如果最高阶项存在且不是1,则去除与这个项目相乘的常数,得到的结果就是大O阶。 使用大O阶的表示法后,fun的时间复杂度为O(n^2); 但也有一些算法存在最坏最好的情况: 最坏情况:任意输入规模的最大运行次数(上界) 平均情况:任意输入规模的期望运行次数 最好情况:任意输入规模的最小运行次数(下界) 例如:在一个元素为n的数组中找某个数x 最快次数:1 最坏次数:n 平均次数:n/2 在实际情况中,我们一般用最坏情况作为算法的效率,所以数组中搜索数据的时间复杂度为O(n)。
2.3常见时间复杂度计算举例 实例1: 实例2: 实例3: 实例4: 实例5: 实例6: 实例答案及分析:
- 实例1基本操作执行了2N+10次,通过推导大O阶方法知道,时间复杂度为 O(N)
- 实例2基本操作执行了M+N次,有两个未知数M和N,时间复杂度为 O(N+M)
- 实例3基本操作执行了100次,通过推导大O阶方法,时间复杂度为 O(1)
- 实例4基本操作执行最好N次,最坏执行了(N*(N-1))/2次,通过推导大O阶方法+时间复杂度一般看最坏, 时间复杂度为 O(N^2)
- 实例5基本操作执行最好1次,最坏O(logN)次,时间复杂度为 O(logN) ps:logN在算法分析中表示是底数 为2,对数为N。有些地方会写成lgN。 6.实例6递归基本操作执行了2^N次,所以时间复杂度为O(2^N)。
3.空间复杂度
3.1空间复杂度概念 空间复杂度是对一个算法在运行过程中临时占用存储空间大小的量度 。空间复杂度算的是变量的个数,计算规则基本跟时间复杂度 类似,也使用大O渐进表示法。 3.2常见空间复杂度计算举例 实例1:
实例2:
- 实例1使用了常数个额外空间,所以空间复杂度为 O(1)
- 实例2动态开辟了N个空间,空间复杂度为 O(N)