如何判别一个算法的好坏:首先,这个算法必须是正确的
其次,好的算法应具有幸福感,便于人们理解和交流,并且是机器可执行的。
这个算法还需要足够健壮,即当输入的数据非法或不合理时,也能适当的做出正确的反应或进行相应的处理
最后它还必须拥有高效率和低存储量要求。也就是时间复杂度和空间复杂度占的地方越小,算得越快的算法才是好算法。
什么是时间复杂度?在计算机科学中,算法的时间复杂度是一个函数,它定性描述该算法的运行时间。这是一个代表算法输入值的字符串的长度的函数。时间复杂度常用大O符号表述,不包括这个函数的低阶项和首项系数。使用这种方式时,时间复杂度可被称为是渐近的,亦即考察输入值大小趋近无穷时的情况。
时间复杂度为什么不使用时间来衡量而使用基本语句的运行次数来衡量?因为时间复杂度可以推演,能预测就是它的价值所在。
而实际运行时间只能在实践中记录,不能预测。这就意味着,想要看看是否改进了,还得先运行一遍。对于运行一遍时间成本太高的程序以及需要通过预估来衡量不同算法优劣时,预测的价值就会显现出来。
时间复杂度的O渐进表示法?1.用常数1取代运行时间中的所有加法常数.2.在修改后的运行次数函数中,只保留最高阶项3.如果最高阶项存在且不唯1,则去除与这个项目相乘的常数,得到的结果就是大o阶.
时间复杂度的:最优、平均、最差情况,为什么时间复杂度看的是最差情况?
1.如果最差情况下的复杂度符合我们的要求,我们就可以保证所有的情况下都不会有问题。
2、也许你觉得平均情况下的复杂度更吸引你,但是:第一,难计算. 第二,有很多算法的平均情况和最差情况的复杂度是一样的. 第三,而且输入数据的分布函数很可能是你没法知道。
什么是空间复杂度?
空间复杂度(Space Complexity)是对一个算法在运行过程中临时占用存储空间大小的量度,记做S(n)=O(f(n))。
如何求空间复杂度? 普通函数&递归函数
普通函数使用了常数个额外空间,一般空间复杂度为O(1),递归函数一般空间复杂复杂度位为O(n).
分析递归斐波那契数列的:时间、空间复杂度,并对其进行优化,伪递归优化--->循环优化
可参考以下博文:https://blog.csdn.net/Austin_Yan/article/details/89429436