定义:解决某一问题的求解步骤的描述,在计算机中表示为指令的有限序列。
算法的特性:
- 输入输出:算法具有零个或多个输入;至少有一个或多个输出
- 有穷性:算法在执行有限的步骤后自动结束而不会出现死循环
- 确定性:算法的每一步都有确定的含义,不会出现二义性
- 可行性:算法的每一步都必须是可行的,也就是说每一步都能通过执行有限次数完成。
算法的设计要求
- 正确性:算法的正确性是指算法至少应该具有输入、输出、加工处理的无歧义性、能正确反应问题的需求、能够得到问题的正确答案。
在实际操作中大致表现为:没有语法错误、对正确的输入能得出正确的结果、对错误的输入能给出相应的说明、对于给出的大量测试数据都能得出正确的结果。 - 可读性:算法设计的另一目的是为了便于阅读、理解和交流
- 健壮性:当输入数据不合法时,算法也能作出相应处理而不是产生异常或者得出莫名奇妙的结果。
- 时间效率高和存储量低:时间效率即是算法的执行时间;存储量是指算法执行过程中需要的最大存储空间
算法效率的度量方法
- 事后统计方法:即通过设计好的测试程序和数据,利用计算机的计时对不同算法编制的程序的运行时间进行比较,从而确定算法效率的高低。
- 事前分析估算方法:在计算机程序编制前,依据统计方法对算法进行估算。
一个使用高级程序语言编写的程序在计算机上的运行时间取决于下列几个因素:
1.算法采用的策略、方法
2.编译产生的代码质量
3.问题的输入规模
4.机器执行指令的速度
而我们使用事前分析估算方法时主要考虑算法采用的策略、方法和问题的输入规模
函数的渐近增长
- 定义:对于函数f(n)与g(n),若存在一个整数N,使得对于任意的n > N;总是f(n) > g(n),那么我们说函数f(n)的增长渐近快于g(n)
- 使用场景:使用事前分析估算方法时可将算法内部的执行操作的次数与问题规模挂钩形成函数T(n),在比较算法的好坏时,我们可以通过比较不同算法所体现出的函数T(n)来分辨算法的优劣
- 判断一个算法的效率时,函数中的常数和其他次要项常常可以忽略,而更应该关注主项(最高阶项)的阶数。
- 某个算法,随着n(即问题规模)的增大,它会越来越优于另一算法,或者越来越差于另一算法