相关概念
1、算法的定义
算法是求解问题的一系列计算步骤,用来将输入数据转换成输出结果。
算法是若干指令的有穷序列。
2、算法设计应满足的目标:
1、正确性
2、可使用性
3、可读性
4、健壮性
5、高效率与低存储量需求
3、算法的五个重要特性
1、有限性
2、确定性
3、可行性
4、输入性
5、输出性
4、算法设计的基本步骤
(1)分析求解问题
(2)选择数据结构和算法设计策略
(3)描述算法
(4)证明算法正确性
(5)算法分析
5、算法分析:
5.1衡量算法效率的方法:
通常有两种衡量算法效率的方法:事后统计法和事前分析估算法。
事后统计法存在一些缺点:一是必须执行程序,二是存在其他因素掩盖算法本质。所以一般采用事前分析估算法来分析算法效率。
5.2算法时间复杂度分析
一个算法是由控制结构(顺序、分支和循环3种)和原操作(指固有数据类型的操作)构成的,算法的运行时间取决于两者的综合效果。
算法的执行时间主要与问题规模有关,为了客观的反映一个算法的执行时间,可以用算法中基本语句的执行次数来度量,算法中基本语句是执行次数与整个算法的执行次数成正比的语句,他对算法执行时间贡献最大,是算法中最重要的操作。
6、递归
6.1递归的定义
在数学与计算机科学中,递归是指在函数的定义中又调用函数自身的方法。
若p函数定义中调用p函数,称之为直接递归;若p函数定义中调用q函数,而q函数定义中又调用p函数,称之为间接递归。
如果一个递归过程或递归函数中的递归调用语句最后一条执行语句,则称这种递归调用为尾递归。
直接或间接地调用自身的算法称为递归算法。
用函数自身给出定义的函数称为递归函数。
6.2递归的优点
递归算法通常把一个大的复杂的问题层层转化为一个或多个与原问题相似的规模较小的问题来求解,递归策略只需要少量的代码就可以描述出解题过程需要的多次重复计算,大大减少了算法的代码量。
递归过程的优点:结构清晰,程序易读,正确性容易证明 。
缺点:运行的效率比较低 、花时间。
6.3能够使用递归解决的问题应满足的条件:
(1)需要解决的问题可以转化为一个或多个子问题来求解,而这些子问题的求解方法与原问题完全相同,只是在数量规模上不同。
(2)递归调用的次数必须是有限的。
(3)必须有结束递归的条件来终止递归。
6.4递归算法的一般步骤
递归算法通过求解过程的特征是先将整个问题划分为若干个子问题,通过分别求解子问题,最后获得整个问题的解。这些子问题具有与原问题相同的求解方法,于是可以再将它们划分成若干个子问题,分别求解,如此反复进行,直到不能再划分成子问题或已经可以求解为止。
这种自上而下将问题分解,再自下而上求值、合并,求出最后问题解的过程称为递归求解过程,它是一种分而治之的算法设计方法。
递归算法的关键是提取求解问题的递归模型。
用户在实际应用中要使用递归算法通常需要分析以下3个方面的问题:
(1)每一次递归调用在处理问题的规模上都应有缩小(通常问题规模可减半)。
(2)相邻两次递归调用之间有紧密的联系,前一次要为后一次递归调用作准备,通常是前一次递归调用的输出作为后一次递归调用的输入。
(3)在问题的规模极小时必须直接给出问题解而不再进行递归调用,因此每次递归调用都是有条件的,无条件递归调用将会成为死循环而不能正常结束。
提取递归模型的基本步骤:
(1)对原问题f(sn)进行分析,抽象出合理的“小问题”f(sn-1)(与数学归纳法中假设n=k-1时等式成立相似)
(2)假设f(sn-1)是可解的,在此基础上确定f(sn)的解,即给出f(sn)与f(sn-1)之间的关系(与数学归纳法中求证n=k时等式成立的过程相似)。
(3)确定一个特定情况(如f(1)或f(0)的解),由此作为递归出口(与数学归纳法中求证n=1或n=0时等式成立相似)。
7、分治法
7.1分治法的定义:
对于一个问题规模为n的问题,若该问题可以容易的解决(例如规模n较小)则直接解决,否则将其分解为K个规模较小的子问题,这些子问题互相独立且与原问题形式相同,递归地解这些子问题,然后将各个子问题的解合并得到原问题的解,这种算法设计策略叫分治法。
分治法所能解决的问题一般具有以下几个特性:
(1)该问题规模缩小到一定的程度就可以容易地解决。(绝大多数问题都可以满足)
(2)该问题可以分解为若干个规模较小的相似问题。(应用分治法的前提)
(3)利用该问题分解出的子问题的解可以合并为该问题的解。(关键)
(4)该问题所分解出的各个子问题是相互独立的,即子问题之间不包含公共的子问题。
7.2分治法的求解过程:
递归特别适合解决结构自相似的问题,所谓结构自相似,是指构成原问题的子问题与原问题在结构上相似,可以采用类似的方法解决。所以分治法通常采用递归算法设计技术,在每一层递归上都有三个步骤:
(1)分解成若干个子问题:将原问题分解为若干个规模较小、相互独立、与原问题形式相同的子问题。
(2)求解子问题:若子问题规模较小,容易被解决,则直接求解,否则递归地求解各个子问题。
(3)合并子问题:将各个子问题的解合并为原问题的解。
其余暑假再更新,期末周有点忙·······