2024年4月15日发(作者:)
计算机算法设计与分析结课论文与实验总结
班级:网络1201
姓名:***
学号:************
辅导老师:***
对于计算机科学来说,算法(Algorithm)的概念是至关重要的。算法是一系列解决
问题的清晰指令,也就是说,能够对一定规范的输入,在有限时间内获得所要求的输出。
如果一个算法有缺陷,或不适合于某个问题,执行这个算法将不会解决这个问题。不同的
算法可能用不同的时间、空间或效率来完成同样的任务。一个算法的优劣可以用空间复杂
度与时间复杂度来衡量。
算法可以理解为有基本运算及规定的运算顺序所构成的完整的解题步骤。或者看成按
照要求设计好的有限的确切的计算序列,并且这样的步骤和序列可以解决一类问题。算法
可以使用自然语言、伪代码、流程图等多种不同的方法来描述。
一个算法应该具有以下五个重要的特征:
1)有穷性:一个算法必须保证执行有限步之后结束;
2)确切性:算法的每一步骤必须有确切的定义;
3)输入:一个算法有0个或多个输入,以刻画运算对象的初始情况,所谓0个输入是
指算法本身定除了初始条件;
4)输出:一个算法有一个或多个输出,以反映对输入数据加工后的结果。没有输出的
算法是毫无意义的;
5)可行性:算法原则上能够精确地运行,而且人们用笔和纸做有限次运算后即可完
成。
一、算法复杂性分析的方法介绍
1.1算法的复杂性是算法效率的度量,是评价算法优劣的重要依据。一个算法的复杂
性的高低体现在运行该算法所需要的计算机资源的多少上面,所需的资源多,我们就说该
算法的复杂性越高;反之,所需的资源越低,则该算法的复杂性越低。计算机的资源,最
重要的是时间和空间(即存储器)资源。因而,算法的复杂性有时间复杂性和空间复杂性
之分。不言而喻,对于任意给定的问题,设计出复杂性尽可能地的算法是我们在设计算法
是追求的一个重要目标;另一方面,当给定的问题已有多种算法时,选择其中复杂性最低
者,是我们在选用算法适应遵循的一个重要准则。因此,算法的复杂性分析对算法的设计
或选用有着重要的指导意义和实用价值。关于算法的复杂性,有两个问题要弄清楚:
1.用怎样的一个量来表达一个算法的复杂性;
2. 对于给定的一个算法,怎样具体计算它的复杂性。
1.2 算法的复杂性是算法运行所需要的计算机资源的量,需要的时间资源的量称作时
间复杂性,需要的空间(即存储器)资源的量称作空间复杂性。这个量应该集中反映算法
中所采用的方法的效率,而从运行该算法的实际计算机中抽象出来。换句话说,这个量应
该是只依赖于算法要解的问题的规模、算法的输入和算法本身的函数。如果分别用N、I
和A来表示算法要解问题的规模、算法的输入和本身,用C表示算法的复杂性,那么应
该有:
C =F(N,I,A)
其中F(N,I,A)是N,I,A的一个确定的三元函数。如果把时间复杂性和空间复杂
性分开,并分别用T和S来表示,那么应该有:
T =T(N,I,A) (2.1) 和 S =S(N,I,A) (2.2)
通常,我们让A隐含在复杂性函数名当中,因而将(2.1)和(2.2)分别简写为 :
T =T(N,I) 和 S =S(N,I)
二、常见的算法分析设计策略介绍
2.1递归算法
递归算法的实质:是把问题转化为规模缩小了的同类问题的子问题。然后递归调用函
数(或过程)来表示问题的解。
递归算法的特点: 递归算法是一种直接或者间接地调用自身的算法。在计算机编写
程序中,递归算法对解决一大类问题是十分有效的,它往往使算法的描述简洁而且易于理
解。
递归算法解决问题的特点:
(1) 递归就是在过程或函数里调用自身。
(2) 在使用递归策略时,必须有一个明确的递归结束条件,称为递归出口。
(3) 递归算法解题通常显得很简洁,但递归算法解题的运行效率较低。所以一般不提
倡用递归算法设计程序。
(4) 在递归调用的过程当中系统为每一层的返回点、局部量等开辟了栈来存储。递归
次数过多容易造成栈溢出等。所以一般不提倡用递归算法设计程序。
递归算法所体现的“重复”一般有三个要求:
一是每次调用在规模上都有所缩小(通常是减半);
二是相邻两次重复之间有紧密的联系,前一次要为后一次做准备(通常前一次的输出
就作为后一次的输入);
三是在问题的规模极小时必须用直接给出解答而不再进行递归调用,因而每次递归调
用都是有条件的(以规模未达到直接解答的大小为条件),无条件递归调用将会成为死循环
而不能正常结束。
2.2分治法
在计算机科学中,分治法是一种很重要的算法。字面上的解释是“分而治之”,就是
把一个复杂的问题分成两个或更多的相同或相似的子问题,再把子问题分成更小的子问
题……直到最后子问题可以简单的直接求解,原问题的解即子问题的解的合并。这个技巧
是很多高效算法的基础,如排序算法(快速排序,归并排序),傅立叶变换(快速傅立叶变
换) 。分治策略是: 对于一个规模为n的问题,若该问题可以容易地解决(比如说规模n
较小)则直接解决,否则将其分解为k个规模较小的子问题,这些子问题互相独立且与原
问题形式相同,递归地解这些子问题,然后将各子问题的解合并得到原问题的解。 分治
法所能解决的问题一般具有以下几个特征:
1) 该问题的规模缩小到一定的程度就可以容易地解决
2) 该问题可以分解为若干个规模较小的相同问题,即该问题具有最优子结构性质。
3) 利用该问题分解出的子问题的解可以合并为该问题的解;
4) 该问题所分解出的各个子问题是相互独立的,即子问题之间不包含公共的子子问
题。
上述的第一条特征是绝大多数问题都可以满足的,因为问题的计算复杂性一般是随着
问题规模的增加而增加;第二条特征是应用分治法的前提它也是大多数问题可以满足的,
此特征反映了递归思想的应用;第三条特征是关键,能否利用分治法完全取决于问题是否
具有第三条特征,如果具备了第一条和第二条特征,而不具备第三条特征,则可以考虑用
贪心法或动态规划法。第四条特征涉及到分治法的效率,如果各子问题是不独立的则分治
法要做许多不必要的工作,重复地解公共的子问题,此时虽然可用分治法,但一般用动态
规划法较好。
分治法在每一层递归上都有三个步骤:
分解:将原问题分解为若干个规模较小,相互独立,与原问题形式相同
的子问题;
解决:若子问题规模较小而容易被解决则直接解,否则递归地解各个子问题合并:将
各个子问题的解合并为原问题的解。
2.3动态规划法
动态规划算法通常用于求解具有某种最优性质的问题。在这类问题中,可能会有许多
可行解。每一个解都对应于一个值,我们希望找到具有最优值的解。动态规划算法与分治
法类似,其基本思想也是将待求解问题分解成若干个子问题,先求解子问题,然后从这些
子问题的解得到原问题的解。与分治法不同的是,适合于用动态规划求解的问题,经分解
得到子问题往往不是互相独立的。若用分治法来解这类问题,则分解得到的子问题数目太
多,有些子问题被重复计算了很多次。如果我们能够保存已解决的子问题的答案,而在需
要时再找出已求得的答案,这样就可以避免大量的重复计算,节省时间。我们可以用一个
表来记录所有已解的子问题的答案。不管该子问题以后是否被用到,只要它被计算过,就
将其结果填入表中。这就是动态规划法的基本思路。具体的动态规划算法多种多样,但它
们具有相同的填表格式。 动态规划适用条件: 任何思想方法都有一定的局限性,超出了
特定条件,它就失去了作用。同样,动态规划也并不是万能的。适用动态规划的问题必须
满足最优化原理和无后效性。
1.最优化原理(最优子结构性质) 最优化原理可这样阐述:一个最优化策略具有这样
的性质,不论过去状态和决策如何,对前面的决策所形成的状态而言,余下的诸决策必须
构成最优策略。简而言之,一个最优化策略的子策略总是最优的。一个问题满足最优化原
理又称其具有最优子结构性质。
2.无后向性 将各阶段按照一定的次序排列好之后,对于某个给定的阶段状态,它以前
各阶段的状态无法直接影响它未来的决策,而只能通过当前的这个状态。换句话说,每个
状态都是过去历史的一个完整总结。这就是无后向性,又称为无后效性。
3.子问题的重叠性 动态规划将原来具有指数级复杂度的搜索算法改进成了具有多项式
时间的算法。其中的关键在于解决冗余,这是动态规划算法的根本目的。 动态规划实质
上是一种以空间换时间的技术,它在实现的过程中,不得不存储产生过程中的各种状态,
所以它的空间复杂度要大于其它的算法。
2.4 贪心算法
所谓贪心算法(又称贪婪算法)是指,在对问题求解时,总是做出在当前看来是最好
的选择。也就是说,不从整体最优上加以考虑,他所做出的仅是在某种意义上的局部最优
解。 贪心算法不是对所有问题都能得到整体最优解,但对范围相当广泛的许多问题他能
产生整体最优解或者是整体最优解的近似解。
贪心算法的基本思路 :
1.建立数学模型来描述问题。
2.把求解的问题分成若干个子问题。
3.对每一子问题求解,得到子问题的局部最优解。
4.把子问题的解局部最优解合成原来解问题的一个解。
实现该算法的过程: 从问题的某一初始解出发;while 能朝给定总目标前进一步 d
o 求出可行解的一个解元素; 由所有解元素组合成问题的一个可行解。
2.5回溯法
回溯法(探索与回溯法)是一种选优搜索法,按选优条件向前搜索,以达到目标。但当
探索到某一步时,发现原先选择并不优或达不到目标,就退回一步重新选择,这种走不通
就退回再走的技术为回溯法,而满足回溯条件的某个状态的点称为“回溯点”。 用回溯法
解题的一般步骤:
(1)针对所给问题,定义问题的解空间;
(2)确定易于搜索的解空间结构;
(3)以深度优先方式搜索解空间,并在搜索过程中用剪枝函数避免无效搜索。
2.6分支界限法
分支限界法是最佳优先(包括广度优先在内)的搜索法,也是一种较为通用的算法。其
搜索的控制是采用有序的队列,即每次优先搜索评价函数值最小的结点,从而希望较快地
找到最佳的路径或排列。与其它算法相比,时间复杂性无本质区别。但好的评价函数可有
小的常数,提高了效率。
三、实验总结及体会
四种算法都各有其优缺点,判断用何种算法,取决于具体问题的具体分析,看是否适
用本身,能达到最优算法。动态规划算法与分治算法相似。用于贪心算法的有活动安排问
题,最优装载问题,哈夫曼编码问题,单源最短路径问题。对于回溯法,通过约束找到满
足条件的所有解,特点为能进就进,不能进就退回来,与递归类似。分支法与回溯法类
似,但解的目标是通过约束找到满足条件的一个解,或找到在某种意义下的最优解。回溯
法以深度优先的方式搜索解空间树,而分支限界法则以广度优先或以最小耗费优先的方式
搜索解空间树。
通过对《计算机算法设计与分析》的学习,让我的编程思路变得更开阔了,能编写出
比原来跟优质的程序。也让我更加的知道怎样分析算法的“好”于“坏”,怎样设计算
法,并以广泛用于计算机科学中的算法为例,对种类不同难度的算法设计进行系统的介绍
与比较。让我拥有了更严格的设计与分析算法的思维方式,别且改变了我随意拼凑算法的
习惯。
发布者:admin,转转请注明出处:http://www.yc00.com/web/1713123318a2187456.html
评论列表(0条)