计算机算法设计与分析 五种常用算法
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
浅论五个常用算法
软件工程
姓名:余智昆
专业班级:软件102班
日期:2012.2.18
【摘要】随着信息工业的发展,计算机已然成为人们日常生活中不可或缺的工具。目前,
各行业、各领域都广泛采用了计算机信息技术,并由此产生出开发各种应用软件的需求。为了以最少的成本、最快的速度、最好的质量开发出适应各种应用需求的软件,必须遵循软件工程的原则。设计一个高效的程序不仅需要编程小技巧,更需要合理的数据组织和清晰高效的算法,这正是计算机科学领域数据结构与算法设计所研究的主要内容。通过对计算机算法系统的学习与研究,掌握算法设计的主要方法,培养对算法的计算复杂性正确分析的能力,为独立设计算法和对算法进行复杂性分析奠定了坚实的理论基础。
在计算机语言中,算法的概念是至关重要的,一个优秀的软件,设计出有效的算法将起决定性的作用。本篇论文将对五种常用算法概括总结,希望能够对算法有更深入的理解。
【关键词】递归与分治策略、动态规划、贪心算法、回溯法、分之界限法
【正文】
一、递归与分治策略
A.1.递归:一个直接或间接调用自身的算法称为递归算法。在计算机算法设计与分析中,使用递归技术往往使函数的定义和算法的描述简洁且易于理解。有些数据结构如二叉树等,由于其本身固有的递归特性,特别适合用递归形式来描述。还有一些问题,虽然本身并没有明显的递归结构,但是用递归技术来求解设计出的算法简洁易懂且易于分析。
2.递归算法要求:递归算法所体现的“重复”一般有三个要求
一是每次调用在规模上都有所缩小(通常是减半);
二是相邻两次重复之间有紧密的联系,前一次要为后一次做准备(通常前一次的输出就作为后一次的输入);
三是在问题的规模极小时必须用直接给出解答而不再进行递归调用,因而每次递归调用都是有条件的(以规模未达到直接解答的大小为条件),无条件递归调用将会成为死循环而不能正常结束。
3.递归过程实质:
算法的嵌套调用,只是
调用算法和被调用算法
是同一个算法。和每次
调用相关的一个重要概
念是递归算法的调用层
次。若调用一个递归算
法的主算法为第0层算
法,则主算法调用递归
算法为进入第一层调
用;从第i层递归调用
本算法为进入第i+1层
调用。反之,退出第i
层调用,则返回第i-1
层递归调用。为了保证
递归调用正确执行,系
统要建立一个递归调用
工作栈,为各层次的调
用数据存储区。
4.递归算法的优缺点:结构清晰、可读性强,且容易用数学归纳法证明算法的正确性,
因此它为设计算法、调试程序带来很大的方便。然而,递归算法的运行效率较低,无论是耗费的计算时间还是占用的空间都要比非递归算法要多。因此,我们使用递归算法,必须权衡运行时间与内存这两者的消耗。
B.1.分治策略:对于一个规模为n的问题,若该问题可以容易地解决(比如说规模n较小)则直接解决,否则将其分解为k个规模较小的子问题,这些子问题互相独立且与原问题形式相同,递归地解这些子问题,然后将各子问题的解合并得到原问题的解。这种算法设计策略叫做分治法。
它的一般算法设计模式:
Divid-and-Conquer(p)
{
If(|p|<=n0) Adhoc(p);
Divid P into smaller subinstances
P1,P2,…,Pk;
for(i=1;i<=k;i++)
yi=Divide-and-Conquer(pi);
return Merge(y1,y2,…yk);
}
2.分治法的基本步骤:分治法在每一层递归上都有三个步骤:
分解:将原问题分解为若干个规模较小,相互独立,与原问题形式相同的子问题;
解决:若子问题规模较小而容易被解决则直接解,否则递归地解各个子问题;
合并:将各个子问题的解合并为原问题的解。
3.分治的应用:
分治法所能解决的问题一般具有以下几个特征:
(1)该问题的规模缩小到一定的程度就可以容易地解决;
(2)该问题可以分解为若干个规模较小的相同问题,即该问题具有最优子结构性质;(3)利用该问题分解出的子问题的解可以合并为该问题的解;
(4)该问题所分解出的各个子问题是相互独立的,即子问题之间不包含公共的子子问题。
分治策略在计算机算法中应用还是比较多的,如:二分搜索技术、大整数乘法、Strassen 矩阵乘法、期盼覆盖、合并排序、快速排序、线性时间选择。最接近点问题、循环赛日程表。
二、动态规划
1.基本思想与分治法类似,也是将待求解的问题分解为若干个子问题(阶段),按顺序求解子阶段,前一子问题的解,为后一子问题的求解提供了有用的信息。在求解任一子问题时,列出各种可能的局部解,通过决策保留那些有可能达到最优的局部解,丢弃其他局部解。依次解决各子问题,最后一个子问题就是初始问题的解。由于动态规划解决的问题多数有重叠子问题这个特点,为减少重复计算,对每一个子问题只解一次,将其不同阶段的不同状态保存在一个二维数组中。
与分治法最大的差别是:适合于用动态规划法求解的问题,经分解后得到的子问题往往不是互相独立的(即下一个子阶段的求解是建立在上一个子阶段的解的基础上,进行进一步的求解)。
2.适合解哪类问题:
能采用动态规划求解的问题的一般要具有3个性质:
(1) 最优化原理:如果问题的最优解所包含的子问题的解也是最优的,就称该问题具有最优子结构,即满足最优化原理。
(2) 无后效性:即某阶段状态一旦确定,就不受这个状态以后决策的影响。也就是说,某状态以后的过程不会影响以前的状态,只与当前状态有关。
(3)有重叠子问题:即子问题之间是不独立的,一个子问题在下一阶段决策中可能被多次使用到。(该性质并不是动态规划适用的必要条件,但是如果没有这条性质,动态规划算法同其他算法相比就不具备优势)
3、求解的基本步骤
动态规划所处理的问题是一个多阶段决策问题,一般由初始状态开始,通过对中间阶段决策的选择,达到结束状态。这些决策形成了一个决策序列,同时确定了完成整个过程的一条活动路线(通常是求最优的活动路线)。如图所示。动态规划的