当前位置:文档之家› 算法设计与分析期末总结

算法设计与分析期末总结

● 算法概述 算法性质:算法是输入、输出、有限性、确定性,若干条指令组成的有穷序列;程序可以不符合有限性是算法用某种程序设计语言的具体实现;算法复杂性:时间复杂性、空间负责性;O 阶数高,欧姆阶低,h 相等。

O 定义:存在正的常数C 和自然是N0,使得当N>=N0时,有f(N)<=Cg(N),则称f(N)当N 充分大时上有界,且g (N )是他的一个上界,记为f(N)=O(g(N)). P 类问题:多项式时间内求解的判定问题,确定性计算模型下的已解类问题类;NP 类问题:非确定性多项式时间可解的判定问题;非确定性计算模型下的易验证问题类。

● 递归与分治策略 递归算法定义:直接或间接调用自身的算法;用函数自身给出定义的函数称为。

;阶乘、数列分治基本思想:将一个规模为n 的问题分解我k 个规模较小的子问题,这些子问题相互独立且与原问题相同。

递归的解决这些问题,然后将各个子问题的解合并得到原问题的解。

分治法的基本步骤:(1)分解:将原问题分解为若干个规模较小、相互独立、与原问题形式相同的子问题;(2)解决:若子问题规模较小容易被解决则直接解决,否则递归递归解决各个子问题;(3)合并:将各个自问的解合并为原问题的解。

分治法解决问题的基本特征:(1)该问题缩小到一定的程度就可以很容易的解决;(2)该问题可以分解为若干个规模较小的相同问题,即该问题具有最优子结构性质;(3)利用该问题分解出的子问题可以合并为该问题的解。

(4)原问题分解出来的子问题是相互独立的,问题之间不包含公共子问题。

二分搜索描述:(分治策略的典型)将n 个元素分成个数大致相同的两半,取a[n/2 ]与x 相比较,如果x=a[n/2 ],找到x 算法终止;如果x<a[n/2 ],则只在数组的a 的左半边分继续搜索x ,如果x>a[n/2 ]。

合并排序:将待排序的元素分成大小大致相同的两个子集合,分别对两个子集合进行排序,最终将排序好的子集合合并成所要求的排好序的集合。

自然排序:自然排序是合并排序的变形;找出所有排好序的子数组段,将相邻的排好序的子数组段两两合并,构成更大的排好序的子数组段,直至整个数组排好序。

快速排序:分解:以a[p]为基准元素,将a[p:r]划分为3段a[p,q-1],a[q],a[q+1,r],使a[p,q-1]中的元素都小于a[q],a[q+1,r]中的元素都大于a[q],下标q 在划分过程中确定;递归求解:通过递归调用快速排序算法对a[p,q-1],a[q+1,r]进行排序;合并:对于a[p,q-1],a[q+1,r]的排序是就地进行的,所以在a[p,q-1],a[q+1,r]都已经排好序,得到的a[p:r]为排好序的数组。

快速排序算法改进:随机选择策略的快速排序算法(舍伍德算法);在a[p:r]中随机选出一个元素作为划分基准,期望得到的划分是较对称的。

线性时间选择:在n 个元素中找出第k 小的元素1<=k<=n ;其基本思想是对输入数组进行递归划分,对划分出的子数组之一进行递归处理。

也属于随机化算法,舍伍德算法。

● 动态规划问题动态规划算法基本思想:将带求解的问题分解为若干个子问题,子问题往往不是相互对立的,对子问题进行求解并用一个表来记录所有已解决的子问题的答案,通过子问题的解获得原问题的解。

动态规划算法设计步骤:(1)找出最优解性质,并刻画其结构特征;(2)递归定义最优值;(3)自底向上的方式计算出最优值;(4)根据计算最优值时得到的信息构造最优解;动态规范算法基本要素:最优子结构性质和子问题重叠性质;最优子结构性质:问题的最优解中包含了其子问题的最优解;重叠字问题:在用递归算法自定向下解决问题时每次产生的问题都不总是新问题,有些子问题被反复计算多次。

备忘录方法:(动态规划算法的变形)用表格保存已解决子问题的答案,需要是直接查看不需要重复求解(相同点),动态规划为自底向上递归,备忘录方法为自顶向下(不同点)。

与直接递归方法的控制结构相同,但是在每个解过的子问题建立备忘录需要时可查看,避免相同自问题重复求解。

矩阵连乘积:最少数乘次数{}11[][][][][1][]min i k j i k ji j m i j m i k m k j p p p i j -≤≤=⎧⎪=+++<⎨⎪⎩ 动态规划—0-1背包问题:m(i,j)为最优值,其中i 表示可以放入的物品为i 、i+1。

n ,j 表示背包剩余容量为j.max{(1,),(1,)}(,)(1,)0i i i i m i j m i j w v j w m i j m i j j w ++-+≥⎧=⎨+≤<⎩ (,)00n nn v j w m n j j w ≥⎧=⎨≤<⎩动态规划算法与分治法的异同:(同)都是将规模较大的问题划分为规模较小的子问题进行求解,通过子问题的解得到原问题的解;(不同点)动态规划算法中分解得到的子问题往往不是相互对立的,分治法中得到的自问题往往是相互对立的。

●贪心算法贪心算法概念:总是做出当前看来最好的选择,及做出的选择为局部最优选择,并期望得到整体最优。

贪心算法的基本要素:贪心选择性、最优子结构性质。

贪心选择性是指,问题的整体最优解可以通过一系列局部最优的选择,即贪心选择来达到。

贪心选择算法与动态规划算法的异同点:同:都要求问题具有最优子结构性质;异:动态规划算法为自底向上的方式解各子问题,贪心算法为自顶向下的方式进行,以迭代的方式作出相继的贪心选择,每做一次贪心选择问题就转换为规模更小的字问题。

活动安排问题:选择具有最早完成时间的活动,是剩余的可安排时间段极大化,一边安排尽可能多的相容活动。

装载策略:重量轻者先装。

前缀码:对每一个字符规定为0,1串作为其代码,并要求任一字符的代码都不是其他字符的代码的前缀。

●回溯法回溯法定义:以深度优先的方法搜索问题解的算法。

回溯法基本思想:确定解空间的组织结构后,从开始结点(根节点)出发,以深度优先的方式搜索整个解空间。

这个开始结点成为活结点,同时也成为当前的扩展结点。

在当前的扩展结点出,搜索向纵深方向移至一个新的结点。

这个新的节点成为当前的扩展结点。

若果当前的扩展结点不能再向纵深方向移动,则当前扩展结点解成为死节点,此时应往回移动至最近的一个活结点处并使这个活结点成为当前扩展结点。

回溯法以这种工作方式递归地在解空间中搜索,直至找到所要求的解,获解空间中已无活结点时为止。

回溯法搜索方法:既有系统性又有跳跃性,在问题的解空间树中按照深度优先的策略,从根节点出发,搜索解空间树。

算法搜索至解空间中的任意一结点时,先判断该节点是否含有问题的解。

如果肯定不包含,则跳过对以该节点为根的子树的搜索,逐层向其祖先节点回溯。

否则进入该子树,继续按照深度优先策略进行搜索。

回溯法求解问题的所有解时要回溯到跟,且根结点的所有字数都已被搜索遍才结束。

若只求一个接,则搜索到该解即可结束。

回溯法解题的算法框架:递归回溯、迭代回溯、子集树算法、排列树算法。

子集树:当所给的问题是从n个元素的集合中找出满足某种性质的子集是,相应的解空间树称为子集树。

这类子集树通常含有2n个叶节点,遍历子集树需要O(2n)计算时间。

排列树:当所给的问题是确定n个元素满足某种性质的排列时,相应的解空间树被称为排列树。

这类子集树通常含有n!个节点,遍历排序树需要O(n!)计算时间。

●分支限界法分支限界法与与回溯法的差异:(1)目标不同:回溯法求解的目标是找出解空间中满足约束条件的所有解,二分支限界发是找出满足约束条件的一个解,或是在满足约束条件的解中找出满足某种条件的最优解。

(2)搜索方式不同,回溯法以深度优先的方式搜索解空间,分支限界法是以广度优先或者最小耗费(最大效益)优先的方式搜索问题的解空间。

(3)对扩展结点的扩展方式不同。

对当前扩展结点采用的方式不同,在分支、、中,每个活结点只有一次机会成为扩展结点。

活结点一旦成为扩展结点就一次性产生其所有儿子结点。

在这些儿子结点中,不可行解或导致非最优解的儿子结点被舍弃,其余儿子结点加入到活结点表中。

从活结点表中取下一个结点成为当前扩展结点,并重复上述结点扩展过程,直到找到所有解,或活结点表为空时为止。

(4)存储空间你要求不同。

分支限定法的搜索策略:在扩展结点处,先生成儿子节点,然后在从当前的活结点表中选择下一个扩展结点。

为了有效地选择下一个扩展结点,加速搜索过程,在每一个活结点出,计算函数值(限界),并根据函数值,从当前活结点表中选择一个最有利的结点作为扩展结点,使搜索朝着解空间上有最优解的分支上推进,以便尽快的找出最优解。

分支限界法的算法框架:队列式分支限界法,优先队列式分支限界法队列式分支限界法:将活结点表组织成一个队列,并按队列的先进先出原则选取下一个结点为当前扩展结点。

优先队列式分支限界法:将活结点表组织成一个优先队列式,并按照优先队列中规定的结点优先级选取优先级最高的下一个结点成为当前扩展结点。

分支限定法算法设计步骤:(1)针对所给问题,定义问题的解空间(2)确定易于搜索的解空间结构;(3)以广度优先获最小耗费的方式搜索解空间,并在搜索工程中用剪枝函数避免无效搜索。

●随机化算法随机化算法分类:数值随机化算法(数值问题求解)、蒙泰卡罗算法(准确解未必正确)、拉斯维加斯算法(一定是正确解但未必找到)、舍伍德算法(总能求到问题的一个正确解)。

线性同余法是产生伪随机数最常用的方法。

舍伍德算法可获得较好的平均性能。

相关主题