一、名词解释:
2.程序:程序是算法用某种程序设计语言的具体实现。 3.递归函数:用函数自身给出定义的函数称为递归函数。
4.子问题的重叠性质:递归算法求解问题时,每次产生的子问题并不总是新问题,有些子问题被反复计算多次,这种性质称为子问题的重叠性质。
5.队列式分支限界法:队列式(FIFO)分支限界法是将活结点表组织成一个队列,并按照队列的先进先出(FIFO)原则选取下一个结点为扩展结点。
6.多机调度问题:多机调度问题要求给出一种作业调度方案,使所给的n个作业在尽可能短的时间内由m台机器加工处理完成。同时约定每个作业均可在任何一台机器上加工处理,但未完工前不允许中断处理。作业不能拆分成更小的子作业。
7.最小生成树:G=(V,E)是无向连通带权图,G的子图称为G的生成树,生成树上各边权的总和称为该生成树的耗费,在G的所有生成树中,耗费最小的生成树称为G的最小生成树。 二、简答题:
(1) 什么是算法?算法的特征有哪些?
(2) 什么是P类问题?什么是NP类问题?请描述集合覆盖问题的近似算法的基本思想。 答案:(1)算法是解决某类问题的一系列运算的集合【2分】。具有有穷行、可行性、确定性、0个或者多个输入、1个或者多个输出【8分】。
(2)用确定的图灵机可以在多项式实践内可解的判定问题称为P类问题【2分】。用不确定的图灵机在多项式实践内可解的判定问题称为P类问题。【2分】
集合覆盖问题的近似算法采用贪心思想:对于问题
1、 简单描述分治法的基本思想。
2、 简述动态规划方法所运用的最优化原理。 3、 何谓最优子结构性质? 4、 简单描述回溯法基本思想。 5、 何谓P、NP、NPC问题
6、 分治法的基本思想是将一个规模为n的问题分解为k个规模较小的子问题,这些子问题互相独立且
与原问题相同;对这k个子问题分别求解。如果子问题的规模仍然不够小,则再划分为k个子问题,如此递归的进行下去,直到问题规模足够小,很容易求出其解为止;将求出的小规模的问题的解合并为一个更大规模的问题的解,自底向上逐步求出原来问题的解。
7、 “最优化原理”用数学化的语言来描述:假设为了解决某一优化问题,需要依次作出n个决策D1,D2,…,
Dn,如若这个决策序列是最优的,对于任何一个整数k,1 < k < n,不论前面k个决策是怎样的,以后的最优决策只取决于由前面决策所确定的当前状态,即以后的决策Dk+1,Dk+2,…,Dn也是最优的。
8、 某个问题的最优解包含着其子问题的最优解。这种性质称为最优子结构性质。
9、 回溯法的基本思想是在一棵含有问题全部可能解的状态空间树上进行深度优先搜索,解为叶子结点。
搜索过程中,每到达一个结点时,则判断该结点为根的子树是否含有问题的解,如果可以确定该子树中不含有问题的解,则放弃对该子树的搜索,退回到上层父结点,继续下一步深度优先搜索过程。在回溯法中,并不是先构造出整棵状态空间树,再进行搜索,而是在搜索过程,逐步构造出状态空间树,即边搜索,边构造。
10、 P(Polynomial问题):也即是多项式复杂程度的问题。
NP就是Non-deterministic Polynomial的问题,也即是多项式复杂程度的非确定性问题。 NPC(NP Complete)问题,这种问题只有把解域里面的所有可能都穷举了之后才能得出答案,这样的问题是NP里面最难的问题,这种问题就是NPC问题。
1.备忘录方法和动态规划算法相比有何异同?简述之。
备忘录方法是动态规划算法的变形。与动态规划算法一样,备忘录方法用表格保存已解决的子问题的答案,在下次需要解此问题时,只要简单地查看该子问题的解答,而不必重新计算。
备忘录方法与动态规划算法不同的是,备忘录方法的递归方式是自顶向下的,而动态规划算法则是自底向上递归的。因此,备忘录方法的控制结构与直接递归方法的控制结构相同,区别在于备忘录方法为每个解过的子问题建立了备忘录以备需要时查看,避免了相同的子问题的重复求解,而直接递归方法没有此功能。
2.简述回溯法解题的主要步骤。 回溯法解题的主要步骤包括:
1)针对所给问题,定义问题的解空间; 2)确定易于搜索的解空间结构;
3)以深度优先方式搜索解空间,并在搜索过程中用剪枝函数避免无效搜索。 3.简述动态规划算法求解的基本要素。 动态规划算法求解的基本要素包括:
1)最优子结构是问题能用动态规划算法求解的前提;
2)动态规划算法,对每一个子问题只解一次,而后将其解保存在一个表格中,当再次需要解此子问题时,只是简单地用常数时间查看一下结果,即重叠子问题。 4.简述回溯法的基本思想。
回溯法的基本做法是搜索,在问题的解空间树中,按深度优先策略,从根结点出发搜索解空间树。算法搜索至解空间树的任意一点时,先判断该结点是否包含问题的解。如果肯定不包含,则跳过对该结点为根的子树的搜索,逐层向其祖先结点回溯;否则,进入该子树,继续按深度优先策略搜索。 5.简要分析在递归算法中消除递归调用,将递归算法转化为非递归算法的方法。 将递归算法转化为非递归算法的方法主要有:
1)采用一个用户定义的栈来模拟系统的递归调用工作栈。该方法通用性强,但本质上还是递归,只不过人工做了本来由编译器做的事情,优化效果不明显。 2)用递推来实现递归函数。
3)通过Cooper变换、反演变换能将一些递归转化为尾递归,从而迭代求出结果。 后两种方法在时空复杂度上均有较大改善,但其适用范围有限。 6.简要分析分支限界法与回溯法的异同。
1)求解目标:回溯法的求解目标是找出解空间树中满足约束条件的所有解,而分支限界法的求解目标则是找出满足约束条件的一个解,或是在满足约束条件的解中找出在某种意义下的最优解。
2)搜索方式的不同:回溯法以深度优先的方式搜索解空间树,而分支限界法则以广度优先或以最小耗费优先的方式搜索解空间树。
7.简述算法复杂性的概念,算法复杂性度量主要指哪两个方面?
算法复杂性是算法运行所需要的计算机资源的量,需要时间资源的量称为时间复杂性,需要的空间资源的量称为空间复杂性。这个量应该只依赖于算法要解的问题的规模、算法的输入和算法本身的函数。如果分别用N、I和A表示算法要解问题的规模、算法的输入和算法本身,而且用C表示复杂性,那么,应该有C=F(N,I,A)。
算法复杂性度量主要包括算法的时间复杂性和算法的空间复杂性。 8.贪心算法求解的问题主要具有哪些性质?简述之。 贪心算法求解的问题一般具有二个重要的性质:
一是贪心选择性质,这是贪心算法可行的第一个基本要素;
另一个是最优子结构性质,问题的最优子结构性质是该问题可用贪心算法求解的关键特征。
9.分治法的基本思想是什么?合并排序的基本思想是什么?请分别简述之。
分治法的基本思想:将n个输入分成k个不同子集合,得到k个不同的可独立求解的子问题,其中1 合并排序基本思想:将待排序元素分成大小大致相同的2个子集合,分别对2个子集合进行排序,最终将排好序的子集合合并成为所要求的排好序的集合。 10.简述分析贪心算法与动态规划算法的异同。 贪心算法和动态规划算法都要求问题具有最优子结构性质,这是两类算法的一个共同点。 动态规划算法通常以自底向上的方式解各子问题,而贪心算法则通常以自顶向下的方式进行,以迭代的方式作出相继的贪心选择,每作一次贪心选择就将所求问题简化为规模更小的子问题。 蛮力法: 直接基于问题的描述 (1)蛮力法依赖的基本技术——扫描技术,即采用一定的策略将待求解问题的所有元素依次处理一次,从而找出问题的解 关键——依次处理所有元素 (2)基本的扫描技术——遍历 集合的遍历:按元素序号 线性表的遍历:按元素序号 树的遍历 :按前序、中序、后序、层次 图的遍历 :按深度优先、广度优先 (3)蛮力法可以作为某类问题时间性能的底限,来衡量同样问题的更高效算法。 (4)顺序查找:从表的一端向另一端逐个将元素与给定值进行比较,若相等,则查找成功,给出该元素在表中的位置;若整个表检测完仍未找到与给定值相等的元素,则查找失败,给出失败信息。 三、算法编写及算法应用分析题: 四、算法理解题(本题10分) 根据优先队列式分支限界法,求下图中从v1点到v9点的单源最短路径,请画出求得最优解的解空间树。要求中间被舍弃的结点用×标记,获得中间解的结点用单圆圈○框起,最优解用双圆圈◎框起。 3. 根据优先队列式分支限界法,求下图中从v1点到v9点的单源最短路径,请画出求得最优解的解空间树。要求中间被舍弃的结点用×标记,获得中间解的结点用单圆圈○框起(如○v2),最优解用双圆圈◎框起。 v2621v532610v83v131v3264v72104v9v4 v6 v136v25V26v53v311v6v31v412v410v69v78v813v920v512v713v911v9 (k)A?(a)ri*ri?1,k=1,2,3,4,5,6,r=5,r=10,r=3,r=12,r=5,r=50,r=6,求3.已知kij1234567矩阵链积A1×A2×A3×A4×A5×A6的最佳求积顺序(要求给出计算步骤)。 解:使用动态规划算法进行求解。 求解矩阵为: 1 2 3 4 5 1 0 150 330 405 1655 2 0 360 330 2430 3 0 180 930 4 0 3000 5 0 6 1 2 3 4 5 1 0 1 2 2 4 2 0 2 2 2 3 0 3 4 4 0 4 5 0 6 因此,最佳乘积序列为(A1A2)((A3A4)(A5A6)),共执行乘法2010次。 6 2010 1950 1770 1860 1500 0 6 2 2 4 4 5 0