算法

算法基本概念

1. 定义

  1. 一组严谨地定义运算顺序的规则,并且每一个规则都是有效的,明确的,此顺序将在有限的次数下终止。
  2. 算法是解决某个特定问题的一种方法或一个过程。
  3. 算法是任何定义好了的计算程式,它取某些值或值的集合作为输入,并产生某些值或值的集合作为输出。

2. 特性

  1. 可行性
    ① 算法中每一个步骤都是可以实现的;
    ② 算法执行的结果能达到预期的目的。
  2. 确定性
    算法的每一步骤必须有清楚的语义,即无二义性。
  3. 有穷性
    算法必须在执行有限个步骤之后终止。
  4. 输入
    一个算法有零个或多个数据输入。
  5. 输出
    一个算法产生一个或多个输出。

基本要素

  1. 算法控制结构
    顺序结构
    选择结构
    循环结构
  2. 数据的运算与操作
    算术运算(+,-,*,/)
    逻辑运算(&&,||, !)
    关系运算(<,>,<=,>=,==,!=)
    数据传输(赋值,输入,输出)

设计过程

  1. 通过对问题进行详细地分析,抽象出相应的数学模型;
  2. 确定使用的数据结构,并在此基础上设计对此数据实施各种操作的算法;
  3. 选用某种语言将算法换算成程序;
  4. 调试并运行这些程序。

算法描述语言

算法描述语言是一种面向人而非机器的算法描述工具。

  1. 算法流程图
    在这里插入图片描述
  2. 结构化流程图
    在这里插入图片描述
  3. 伪代码
    在这里插入图片描述

算法描述语言要求

  1. 具有良好的可读性
  2. 无歧义性
  3. 容易转换为程序设计语言

算法设计基本方法

列举法

基本概念

  1. 基本思想
    根据提出来的问题,列举出所有可能的解,并根据问题中所给定的约束,检验哪些解是需要的,哪些是需要排除的,输出符合要求的解。
  2. 特点
    比较简单
    适合解空间小的问题
    常用于解决是否存在或有多少种可能等类型的问题
  3. 难点
    优化列举方案

百鸡问题

  1. 问题描述
    设每只母鸡值3元,每只公鸡值2元,两只小鸡值0.5元。现用100元买100只鸡,一共有多少方案。
  2. 基本思路
    列举出所有符合约束条件的方案,设母鸡i只,公鸡j只,小鸡k只,则有3i+2j+0.50.5k=100。
  3. 算法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
  1. 算法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

归纳法

  1. 基本思想
    通过列举少量的特殊情况,经过分析,找出一般的关系。
  2. 特点
    归纳法比列举法更能反映问题的本质;
    可以解决列举量为无限的问题;
    需要对桂南得到的结论加以必要的证明。

递推法

  1. 基本思想
    从已知条件出发,逐次推出所要求的各中间结果和最后结果,其中初始条件或是问题本身给定,或是通过对问题的分析而得到。
  2. 特点
    递推关系往往是归纳分析的结果;
    递推法在数值计算中极为常见;
  3. 难点
    需要注意数值计算中的稳定性问题。

递归法

  1. 基本思想
    将一个复杂的问题归结为若干个简单的问题,然后将这些较简单的每一个问题再归结为更简单的问题,这个过程可以一直做下去,直到最简单的问题为止。
  2. 特点
    递归的基础是归纳法;
    程序结构清晰,具有良好的可读性;
    执行效率较低。
  3. 分类
    直接递归法;
    间接递归法。
  4. 基本步骤
    ① 初始化算法。递归程序通常需要一个开始时使用的种子值(seed value)。要完成此任务,可以向函数传递参数,或者提供一个入口函数,这个函数是非递归的,但可以为递归计算设置种子值;
    ② 检查要处理的当前值是否已经与基线条件匹配;
    ③ 使用更小的或者更简单的子问题(或多个子问题来重新定义答案);
    ④ 对子问题运行算法;
    ⑤ 将结果合并入答案的表达式;
    ⑥ 返回结果。
  5. 举例
    计算某个数的阶乘就是用那个数去乘包括1在内的所有比他小的数。递归算法描述
int factorial(int n){
	if(n==1)
		then return 1;
		else return n*factorial(n-1);
}
  1. hannoi塔问题

减半递推技术

  1. 基本思想
    综合减半和递推思想,减半指问题规模减半,而递推是指重复减半的过程。
    也称作分治法,即对问题分而治之。
  2. 特点
    归纳法的一个分支;
    在工程上具有重要实用价值。
  3. 举例
    减半递推过程
    在这里插入图片描述
    ① 取中点c=(a+b)/2;
    ② 如果f©=0,则说明c为所求根,如果不为0,f(a)f©<0,取区间前半部分; f(a)f©>0,取区间后半部分;
    ③ 如果区间长度很小,则结束,否则重复上述步骤。

回溯法

  1. 基本思想
    找到问题的一个线索,然后沿着这个线索逐步试探。如果试探成功就得到解,如果不成功就逐步退回,换别的路径试探。
  2. 特点
    回溯法实质上是一个先序遍历一棵状态树的过程,只是这棵树不是遍历前预先建立的,而是隐含在遍历过程中的。
  3. 四皇后问题

算法复杂度分析

评价方法

  1. 正确性
    要求算法能正确执行预先的功能,并达到所期望的性能要求。
  2. 可读性
    为了便于理解、测试和修改,算法应具有良好的可读性。
  3. 健壮性
    算法中拥有对输入数据、打开文件、读取文件记录、分配内存空间等操作的结果检测,并通过与用户对话的形式做出响应的处理选择。
  4. 时间与空间的效率
    算法的时间与空间效率是指将算法变换为程序后,该程序在计算机上运行所花费的时间以及所占据空间的量度。

算法时间复杂度

  1. 执行算法所需要的计算工作量。
  2. 影响程序运行时间的因素
  3. 为客观度量算法的效率,应该与上述因素无关。为此,可以使用执行过程中所需的基本运算执行次数来度量。
  4. 算法所执行的基本运算次数与问题规模相关。因此,分析算法工作量时,还必须对问题规模进行度量。即:算法工作量=f(n)
  5. 算法执行次数还与特定的输入相关,例如搜索问题。因此需要分析算法在一般情况与最坏情况下的工作量。
    在这里插入图片描述

算法空间复杂度

  1. 指算法所需占用内存空间。
  2. 如果额外空间相对于问题规模来书是常数,则称作该算法原地工作。
  3. 算法执行过程需要的内存空间包括:
    程序所占空间
    初始数据所占空间
    执行过程所需额外空间
已标记关键词 清除标记
©️2020 CSDN 皮肤主题: 深蓝海洋 设计师:CSDN官方博客 返回首页