1.2.1 算法的定义
对特定问题求解方法和步骤的一种描述,它是指令的有限序列,其中每个指令表示一个或多个操作;简单来说,算法就是解决问题的方法和步骤。
1.2.2 算法的描述
1、自然语言:英文、中文。
2、流程图:传统流程图、NS流程图。
3、伪代码:类语言。
4、程序代码。
1.2.3 算法与程序
算法:是解决问题的一种方法或一个过程,考虑如何将输入转换成输出。
程序:是用程序设计语言对算法的实现。
程序 = 数据结构 + 算法。
1.2.4 算法的五个特性
1、有穷性:一个算法必须在执行有穷步骤后结束,并且每一步都在有穷时间内完成。
2、确定性:算法中的每一条指令必须有确切的含义、无二义性,在任何条件下,只有一条执行路径,即对于相同的输入只能得到相同的输出。
3、可行性:算法的每一步必须是可行的,每一步都可在执行有限次后完成。
4、输入:一个算法有0个或多个输入。
5、输出:一个算法有0个或多个输出。
1.2.5 算法设计的要求
1、正确性:算法的正确性是指算法应该具有输入、输出和加工处理无歧义性、能正确反映问题的需求、能够得到问题的正确答案。
主要分为以下四个层次:
(1)算法程序没有语法错误;
(2)算法程序对于合法的输入能够产生满足要求的输出;
(3)算法程序对于非法的输入能够得出满足规格说明的结果;
(4)算法程序对于精心选择的,甚至刁难的测试数据都有满足要求的输出。
2、可读性:算法的设计的另外一个目的是为了便于阅读、理解和交流。
3、健壮性:当输入数据不合法时,算法也能做出相关处理,而不是产生异常或莫名其妙的结果。
4、高效性:设计算法应该尽量满足时间效率高和存储量低的要求。
1.2.6 算法效率的度量方法
算法效率主要有以下两个方面考虑:
1、时间效率:指执行过程所耗费的时间。
2、空间效率:指执行过程中所耗费的存储空间。
时间效率和空间效率有时候是矛盾的。
算法效率的度量:
1、事后度量方法:通过设计好的测试程序和数据,利用计算机计时器对不同算法编制的程序的运行时间进行比较,从而确定算法效率的高低。
这种方法有很大的缺点:
(1)必须依据算法事先编制好程序,这需要花费大量的时间和精力。
(2)时间的比较依赖计算机硬件和软件等环境因素,有时会掩盖算法本身的优劣。
(3)算法的测试数据设计困难,并且程序运行实际爱你往往还与测试数据的规模有很大关系,效率高的算法在小的测试数据面前往往得不到体现。
2、事前度量方法:在计算机程序编制钱,依据统计方法对算法进行估算。
算法运行时间 = 一个简单操作所需的时间*简单操作次数。
即算法中每条语句的执行时间之和:
算法运行时间 = Σ每条语句的执行次数*该语句执行一次所需的时间。
每条语句的执行次数又称为语句频度。
算法运行时间 = Σ每条语句频度*该语句执行一次所需的时间。
设每条语句的执行一次所需的时间为单位时间,所以我们计算算法运行时间只需考虑每条语句的频度之和。
1.2.7 算法时间复杂度的渐进表示法
为了方便比较不同算法的时间效率,我们仅比较它们的数量级。
age: 和
若有某个辅助函数,使得当n趋近于无穷大时,
的极限值为不等于0的常数,则称
是
的同数量级函数。记作
,称
为算法的渐进时间复杂度(O是数量级的符号),简称时间复杂度。
分析算法时间复杂度的基本方法:
1、找出语句频度最大的那条语句作为基本语句;
2、计算基本语句的频度得到问题规模n的某个函数f(n);
3、取其数量级用符号"O"表示。
age 1:
x = 0;
y = 0;
for (int k = 0; k < n; k++) //执行n+1次
x++; //执行n次
for (int i = 0; i < n; i++) //执行n+1次
for(int j = 0; j < n; j++) //执行n(n+1)次
y++; //执行n*n次
这段代码中可以得到:,根据
可得:
age 2:
for ( int i = 1; i <= n; i++)
for (int j = 1; j <= i; j++)
for (int k = 1; k <= j; k++)
x++;
语句频度 = =
=
=
=
所以:
age 3:
i = 1;
while (i <= n)
i = i*2;
设 i = i * 2;执行x次,可得:,即
即,取最大值
所以时间复杂度:
算法时间复杂度:
最坏时间复杂度:指在最坏情况下,算法的时间复杂度。
平均时间复杂度:指在所有可能输入实例在等概率出现的情况下,算法的期望运行时间。
最好时间复杂度:指在最好情况下,算法的时间复杂度。
一般情况下是考虑在最坏情况下的时间复杂度,以保证算法的运行时间不会比它更长。
算法时间效率的比较
时间复杂度T(n)按数量级递增顺序为:
常数阶 | 对数阶 | 线性阶 | 线性对数阶 | 平方阶 | 立方阶 | ... | K次方阶 | 指数阶 |
渐进空间复杂度
空间复杂度:算法所需存储空间的度量,记作:
算法要占据的空间:
算法本身要占据的空间,输入、输出,指令,常数,变量等。
算法要使用的辅助空间。