算法的定义及特性
算法是为了解决某类问题而规定的一个有限长的操作序列。
五个特性:1.有穷性 2.确定性 3.可行性 4.输入 5.输出
评价算法的标准
1.正确性 2.可读性 3.健壮性 4.高效性
算法的时间复杂度
1.问题规模和语句频度
不考虑计算机的软硬件等环境因素,影响算法时间代价的最主要因素是问题规模。问题规模是算法求解问题输入量的多少,是问题大小的本质表示,一般用整数n表示。
一条语句的重复执行次数称作语句频度。
2.算法的时间复杂度定义
算法中基本语句重复执行的次数是问题规模n的某个函数f(n),算法的时间量度记作T(n)=O(f(n))。它表示随问题规模n的增大,算法执行时间的增长率和f(n)的增长率相同,称作算法的渐近时间复杂度,简称时间复杂度。
3.算法的时间复杂度分析
分析算法的时间复杂度的基本方法为:找出所有语句中语句频度最大的那条语句作为基本语句,计算基本语句的频度得到问题规模n的某个函数f(n),取其数量级用符号“O”表示即可。具体计算数量级时,可以遵循以下定理。若
则
上面定理说明,在计算算法时间复杂度时,可以忽略所有低次幂项和最高次幂的系数,这样可以简化算法分析,也体现了增长率的含义。在多数情况下, 当有若干个循环语句时,算法的时间复杂度是由最深层循环内的基本语句的频度f(n)决定的,这也是计算时间复杂度的一种方法。
4.最好、最坏和平均时间复杂度
算法的时间复杂度不仅与问题的规模有关,还与问题的其他因素有关。再如某些排序的算法,其执行时间与待排序记录的初始状态有关。因此,有时会对算法有最好、最坏以及平均时间复杂度的评价。
称算法在最好情况下的时间复杂度为最好时间复杂度,指的是算法计算量可能达到的最小值;称算法在最坏情况下的时间复杂度为最坏时间复杂度,指的是算法计算量可能达到的最大值;算法的平均时间复杂度是指算法在所有可能情况下,按照输入实例以等概率出现时,算法计算量的加权平均值。
算法的空间复杂度
关于算法的存储空间需求,类似于算法的时间复杂度,我们采用渐近空间复杂度作为算法所需存储空间的量度,简称空间复杂度,它也是问题规模 n 的函数,记作:
S(n)=O(f(n))
一般情况下,一个程序在机器上执行时,除了需要寄存本身所用的指令、常数、变量和输入数据外,还需要一些对数据进行操作的辅助存储空间。其中,对于输入数据所占的具体存储量取决于问题本身,与算法无关,这样只需分析该算法在实现时所需要的辅助空间就可以了。若算法执行时所需要的辅助空间相对于输入数据量而言是个常数,则称这个算法为原地工作,辅助空间为O(1)。另外有的算法需要占用临时的工作单元数与问题规模 n 有关。
对于一个算法,其时间复杂度和空间复杂度往往是相互影响的,当追求一个较好的时间复杂度时,可能会导致占用较多的存储空间,即可能会使空间复杂度的性能变差,反之亦然。