一、算法的基本概念
算法是对特定问题求解步骤的一种描述,它是指令的有限序列,其中的每条指令表示一个或多个操作。具有以下性质:
1.有穷性:一个算法必须总是在执行有穷步之后结束,且每一步都可在有穷时间内完成
2.确定性:算法中每条指令必须有确切的含义,不会产生二义性,对于相同的输入只能得出相同的输出。
3.可行性:一个算法是可行的,即算法中描述的操作都是可以通过已经实现的基本运算执行有限次来实现的。
4.输入:一个算法有零个或多个输入,这些输入取自于某个特定的对象的集合。
5.输出:一个算法有一个或多个输出,这些输出是与输入有着某种特定关系的量。
我们的目标是设计出正确、可读、健壮、高效率、低存储量需求的算法!
二、算法效率的度量:时间复杂度与空间复杂度
1.时间复杂度
(1)基本概念
一个语句的频度是指该语句在算法中被重复执行的次数。算法中所有语句的频度之和记为T(n),它是该算法问题规模n的函数,时间复杂度主要分析T(n)的数量级,因此通常采用算法中基本运算的频度f(n)来分析算法的时间复杂度。因此,算法的时间复杂度记为
T(n)=O(f(n))。
式中,O的含义是T(n)的数量级,其严格的数学定义是:若T(n)和f(n)是定义在正整数集合上的两个函数,则存在正常数C和n0 ,使得当n≥n0 时,都满足0≤T(n)≤Cf(n)。
算法的时间复杂度不仅依赖于问题的规模n,也取决于待输入数据的性质(如输入数据元素的初始状态)
例如,在数组[0…n-1]中,查找给定值k的算法大致如下:
(1)i=n-1;
(2)while(i≥0&&(A[i]!=k)
(3)i--;
(4)return i;
在上面的算法中语句(3)为基本运算,我们令t=i,则程序结束条件为t=n-1,也就是基本运算执行了n-1次,所以时间复杂度为O(n);
当然,我们在上面也说过,时间复杂度也与输入元素取值有关,例如在上例中,若A中没有与k相同的元素,则(3)语句频度为f(n)=n;若A中最后一个元素为k,则语句(3)频度f(n)=0。
据此,我们得到最坏时间复杂度,平均时间复杂度,最好时间复杂度。
(2)最坏时间复杂度、平均时间复杂度、最好时间复杂度
最坏时间复杂度:在最坏情况下,算法的时间复杂度。
平均时间复杂度:在所有可能输入实例在等概率出现的情况下,算法的期望运行时间。
最好时间复杂度:在最好情况下,算法的时间复杂度
一般总是考虑在最坏情况下的时间复杂度,以保证算法的运行时间不会比它更长。
(3)计算规则
a.加法规则
b.乘法规则
常用渐进时间复杂度为
2.空间复杂度
算法的空间复杂度S(n)定义为该算法所耗费的存储空间,它是问题规模n的函数。渐进空间复杂度也常简称为空间复杂度,记为S(n)=O(g(n))