网站大量收购独家精品文档,联系QQ:2885784924

数据结构各章讲稿DS9-3 动态规划.pptx

  1. 1、本文档共24页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多

9.3动态规划;动态规划应用于子问题重叠的情况,即不同的子问题在递归求解的过程中可能会产生相同的子子问题(在递归求解过程中,将子问题划分为子子问题),即公共子问题。

若将分治算法应用于子问题重叠时会反复求解这些公共子问题。而动态规划算法对每个子问题只会求解一次,然后将解保存起来,如果再需要求解相同的子问题时,只需要从存放表格中查找问题的解,避免了不必要的工作量。;9.1动态规划原理;(1)最优子结构性质

如果问题的最优解中所包含的子问题的解也是最优的,我们就称该问题具有最优子结构性质(即满足最优化原理)。最优子结构性质为使用动态规划算法解决问题提供了重要线索。;(2)重叠子问题

动态规划算法将问题分解为相关的子问题,这些子问题在递归求解的过程中会反复地求解相同的子问题,而不是一直生成全新的子问题。如果递归算法反复求解相同的子问题,我们就称最优化问题具有重叠子问题性质。

为了降低子问题空间,避免反复求解相同的子问题,最直接的方法是将求解过的问题的解保存起来,即引入备忘机制。其基本思想是:对每个子问题求解一次,将解保存到一个表中,当再次需要这个子问题时直接查找表得到其解,每次查找表的时间代价相对于问题的重新求解为一个常量。

;求解最优值的两种途径

求解方法分为带备忘的自顶向下法和自底向上法。

第一种方法按递归调用的方式进行,对问题进行递归分解求解,并将产生的子问题的解保存起来。当需要求解某个子问题时,程序会检查是否已经求解过它,如果是,则直接读取问题的解即可,否则,按正常方式递归求解这个子问题。

第二种方法中,按照问题规模从小到大的方式求解。当求解某个问题时,它所依赖的那些规模更小的子问题都已求解完毕,结果已经保存。;9.3.2最优二叉查找树; 由于每个键和虚拟键的搜索概率都是已知的,因此可以确定一棵二叉查找树T进行一次查找的期望代价(代价可以定义为从根节点到目标节点的路径上节点数目):

;假设有5个关键字,对应有6个虚键。给定它们的概率pi(1≤i≤5)和qi(0≤i≤5)。

;?;是否可以用子问题???最优解来构造一棵原问题的最优解?

要利用给定的有序序列k1,k2,…,kn构造一棵最优二叉查找树,需要找出其中某个键作为根,比如说kr(1=r=n),那么kr的左子树包含k1,…,kr-1,其右子树是kr+1,…,kn。

然后分别递归地找出左右子树的根节点。

只要我们遍历所有可能的根节点kr,分别求其总代价值,找到其中最小的即可。

;3.递归求解

在递归求解问题的过程中,总是选取期望搜索代价最低的结点作为根,因此,最优二叉查找树的期望搜索代价的最终递归公式为:

;4.求解算法

为了记录最优二叉查找树的结构,我们定义数组root[i,j]来保存序列ki,…,kj的最优二叉查找树的根结点。

算法9.10最优二叉查找树

doubleroot[n][n];//最优二叉查找树的根结点

doublee[n+1][n+1];//期望搜索代价

doublew[n+1][n+1];//权重

?voidoptimal_BST(double*p,double*q,intn){//寻找最优二叉搜索树

intj;

doubletemp;

for(inti=0;in+1;i++){

e[i][i]=q[i];w[i][i]=q[i];

};for(intk=1;k=n;k++){

for(inti=1;i=n-k+1;i++){

j=i+k-1;

e[i-1][j]=MAXVAL;

w[i-1][j]=w[i-1][j-1]+p[j-1]+q[j];

for(intr=i;r=j;r++){

temp=e[i-1][r-1]+e[r][j]+w[i-1][j];

if(tempe[i-1][j]){

e[i-1][j]=temp;root[i-1][j-1]=r;

}

}

}

}

}

;以概率p[1…5]={0.20,0.10,0.05,0.25,0.20}和q[0…5]={0.03,0.01,0.01,0.01,0.04,0.1}作为算法的输入,得到如图9-7所示的e[i,j]、w[i,j]和root[i,j]。根据root[i,j]可构造出最优二叉查找树。;算法9.11:最优二叉查找树构造算法CreatOBST

voidCreatOBST(inti,intj,BinaryNode*R){

intk;

if(ij)R=NULL;

文档评论(0)

yzs890305 + 关注
实名认证
内容提供者

计算机二级持证人

该用户很懒,什么也没介绍

领域认证该用户于2024年11月02日上传了计算机二级

1亿VIP精品文档

相关文档