1. 如何衡量一个算法的好坏?
同一功能的算法,其算法执行的方式可能不同,在执行方式不同的情况下其运行效率既是一个算法好坏的考证.一般来说有两个参考点 时间复杂度+空间复杂度 也可以看做,运行时间和占用空间。
2. 什么是时间复杂度? 什么是空间复杂度?
时间复杂度:算法中基本操作执行的次数是问题规模n的某个函数f(n),算法的时间度量记作
T(n)=O(f(n))它表示随问题规模n的增大,算法执行时间的增长率和f(n)的增长率相同,称作算法的渐进时间复杂度,简称时间复杂度.
就是算法执行所需要的时间,一般通过算法的代码来进行估算,观察执行的代码行数,每行代码的执行次数,
空间复杂度:s(n)=O(f(n)) 在计算及执行中需要储存空间来存指令变量等等,同时在运行期间还需要其他的辅助空间,辅助空间的多少称为空间复杂度.
3. 时间复杂度为什么不使用时间来衡量而使用基本语句的运行次数来衡量?
不同的机器运行速度不一样,就像我们自己的PC跑一天在天河超计算机上一秒就完了,所以说不能使用.
4. 时间复杂度的O渐进表示法
1.用常数1取代运行时间中的所有加法常数.
2.在修改后的运行次数函数中,只保留最高阶项.
3.如果最高阶项存在且不是1,则除去与这个项目相乘的常数,得到的结果就是大O阶.
5 时间复杂度的:最优、平均、最差情况,为什么时间复杂度看的是最差情况?
1.最优:运行次数最少
2.平均:运行次数的期望值
3:最差:运行次数的上限
凡事都要最好做好最坏的打算,做到最严谨,保证万无一失,所以说要看成最差.
6 如何求解:二分查找、递归求阶乘、递归斐波那契的时间复杂度?
二分查找,因为每次查找的元素减少一半,即n,n/2,n/4…,n/2^k,最坏的情况,最后一次找到
n/2^k=1,而k的值就为O(n)=O(log2 n).
递归求阶乘
fun(size_t N) {
return N < 2 ? N: fun(N - 1)*N;
}
从上表达式中很容易得到执行了N次,时间复杂度为O(N).
递归斐波那契
fun(size_t N){
return N<2?N:fun(n-1)+fun(n-2);
}
递归时间和空间复杂度详解
7. 如何求空间复杂度? 普通函数&递归函数
空间复杂度算的是变量的个数,算法和时间复杂度类似.
普通函数如果使用了常数个空间则空间复杂度为O(1).
递归函数第七题链接.
9. 分析递归斐波那契数列的:时间、空间复杂度,并对其进行优化,递归斐波那契数列
https://blog.csdn.net/lcy6239/article/details/80432880
在优化之后递归斐波那契数列,空间复杂度变为O(1),需要开辟的新空间在编译器的优化下在原基础上执行,但不同编译器可能没有此优化
10. 总结常见时间复杂度
O(1):常数型
O(log2 n):对数型
O(n):线性型
O(nlog2n):二维型
O(n^2):平方型
O(n^3):立方型
O(2^n):指数型