算法基本概念
1. 定义
- 一组严谨地定义运算顺序的规则,并且每一个规则都是有效的,明确的,此顺序将在有限的次数下终止。
- 算法是解决某个特定问题的一种方法或一个过程。
- 算法是任何定义好了的计算程式,它取某些值或值的集合作为输入,并产生某些值或值的集合作为输出。
2. 特性
- 可行性
① 算法中每一个步骤都是可以实现的;
② 算法执行的结果能达到预期的目的。 - 确定性
算法的每一步骤必须有清楚的语义,即无二义性。 - 有穷性
算法必须在执行有限个步骤之后终止。 - 输入
一个算法有零个或多个数据输入。 - 输出
一个算法产生一个或多个输出。
基本要素
- 算法控制结构
顺序结构
选择结构
循环结构 - 数据的运算与操作
算术运算(+,-,*,/)
逻辑运算(&&,||, !)
关系运算(<,>,<=,>=,==,!=)
数据传输(赋值,输入,输出)
设计过程
- 通过对问题进行详细地分析,抽象出相应的数学模型;
- 确定使用的数据结构,并在此基础上设计对此数据实施各种操作的算法;
- 选用某种语言将算法换算成程序;
- 调试并运行这些程序。
算法描述语言
算法描述语言是一种面向人而非机器的算法描述工具。
- 算法流程图
- 结构化流程图
- 伪代码
算法描述语言要求
- 具有良好的可读性
- 无歧义性
- 容易转换为程序设计语言
算法设计基本方法
列举法
基本概念
- 基本思想
根据提出来的问题,列举出所有可能的解,并根据问题中所给定的约束,检验哪些解是需要的,哪些是需要排除的,输出符合要求的解。 - 特点
比较简单
适合解空间小的问题
常用于解决是否存在或有多少种可能等类型的问题 - 难点
优化列举方案
百鸡问题
- 问题描述
设每只母鸡值3元,每只公鸡值2元,两只小鸡值0.5元。现用100元买100只鸡,一共有多少方案。 - 基本思路
列举出所有符合约束条件的方案,设母鸡i只,公鸡j只,小鸡k只,则有3i+2j+0.50.5k=100。 - 算法1
for i=0 to 100 do
for j=0 to 100 do
for k=0 to 100 do{
sum=i+j+k;
value=3*i+2*j+0.25*k;
if(sum==100&&value==100)
then output(i,j,k);
}
return 0 //循环总次数为101^3
- 算法2
for i=0 to 33 do
for j=0 to 50 do{
k=100-i-j;
if(3*i+2*j+0.25*k==100)
then output(i,j,k);
}
return 0; //循环次数为894
归纳法
- 基本思想
通过列举少量的特殊情况,经过分析,找出一般的关系。 - 特点
归纳法比列举法更能反映问题的本质;
可以解决列举量为无限的问题;
需要对桂南得到的结论加以必要的证明。
递推法
- 基本思想
从已知条件出发,逐次推出所要求的各中间结果和最后结果,其中初始条件或是问题本身给定,或是通过对问题的分析而得到。 - 特点
递推关系往往是归纳分析的结果;
递推法在数值计算中极为常见; - 难点
需要注意数值计算中的稳定性问题。
递归法
- 基本思想
将一个复杂的问题归结为若干个简单的问题,然后将这些较简单的每一个问题再归结为更简单的问题,这个过程可以一直做下去,直到最简单的问题为止。 - 特点
递归的基础是归纳法;
程序结构清晰,具有良好的可读性;
执行效率较低。 - 分类
直接递归法;
间接递归法。 - 基本步骤
① 初始化算法。递归程序通常需要一个开始时使用的种子值(seed value)。要完成此任务,可以向函数传递参数,或者提供一个入口函数,这个函数是非递归的,但可以为递归计算设置种子值;
② 检查要处理的当前值是否已经与基线条件匹配;
③ 使用更小的或者更简单的子问题(或多个子问题来重新定义答案);
④ 对子问题运行算法;
⑤ 将结果合并入答案的表达式;
⑥ 返回结果。 - 举例
计算某个数的阶乘就是用那个数去乘包括1在内的所有比他小的数。递归算法描述
int factorial(int n){
if(n==1)
then return 1;
else return n*factorial(n-1);
}
减半递推技术
- 基本思想
综合减半和递推思想,减半指问题规模减半,而递推是指重复减半的过程。
也称作分治法,即对问题分而治之。 - 特点
归纳法的一个分支;
在工程上具有重要实用价值。 - 举例
减半递推过程
① 取中点c=(a+b)/2;
② 如果f©=0,则说明c为所求根,如果不为0,f(a)f©<0,取区间前半部分; f(a)f©>0,取区间后半部分;
③ 如果区间长度很小,则结束,否则重复上述步骤。
回溯法
- 基本思想
找到问题的一个线索,然后沿着这个线索逐步试探。如果试探成功就得到解,如果不成功就逐步退回,换别的路径试探。 - 特点
回溯法实质上是一个先序遍历一棵状态树的过程,只是这棵树不是遍历前预先建立的,而是隐含在遍历过程中的。 - 四皇后问题
算法复杂度分析
评价方法
- 正确性
要求算法能正确执行预先的功能,并达到所期望的性能要求。 - 可读性
为了便于理解、测试和修改,算法应具有良好的可读性。 - 健壮性
算法中拥有对输入数据、打开文件、读取文件记录、分配内存空间等操作的结果检测,并通过与用户对话的形式做出响应的处理选择。 - 时间与空间的效率
算法的时间与空间效率是指将算法变换为程序后,该程序在计算机上运行所花费的时间以及所占据空间的量度。
算法时间复杂度
- 执行算法所需要的计算工作量。
- 影响程序运行时间的因素
- 为客观度量算法的效率,应该与上述因素无关。为此,可以使用执行过程中所需的基本运算执行次数来度量。
- 算法所执行的基本运算次数与问题规模相关。因此,分析算法工作量时,还必须对问题规模进行度量。即:算法工作量=f(n)
- 算法执行次数还与特定的输入相关,例如搜索问题。因此需要分析算法在一般情况与最坏情况下的工作量。
算法空间复杂度
- 指算法所需占用内存空间。
- 如果额外空间相对于问题规模来书是常数,则称作该算法原地工作。
- 算法执行过程需要的内存空间包括:
程序所占空间
初始数据所占空间
执行过程所需额外空间