ImageVerifierCode 换一换
格式:DOCX , 页数:6 ,大小:18.94KB ,
资源ID:4369290      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/4369290.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(动态规划 最优二叉搜索树.docx)为本站会员(b****6)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

动态规划 最优二叉搜索树.docx

1、动态规划 最优二叉搜索树摘 要动态规划算法通常用于求解具有某种最优性质的问题。在这类问题中,可能会有许多可行解,每个解都对应一个值,要求找到具有最优值的解。其基本思想是将待求解问题分解成若干个子问题,先求解子问题,并把所有已解子问题的答案记录到一个表中,而不考虑这些子问题的答案以后是否被用到。用动态规划算法来求解最优二叉搜索树问题,可以描述为对于有序集S及S的存取概率分布(a0,b1,a1,, bn,an),在所有表示有序集S的二叉搜索树中找出一棵开销最小的二叉搜索树。动态规划算法的有效性依赖于问题本身具有最优子结构性质和子问题重叠性质。最典型的就是路由器中的路由搜索引擎查找一条指定的路由最坏

2、情况下最多只用查找31次。该文给出了用动态规划算法构造最优二叉搜索树的详细步骤,并用C+语言具体实现了该算法,用一定的空间换取时间,提高了解决本问题的效率。关键词:动态规划,最优二叉搜索树,最优子结构目 录1 问题描述 12 问题分析 23 算法设计 34 算法实现 45 测试分析 6结 论 7参考文献 81 问题描述给定一个有序序列K=k1k2k3,kn和他们被查询的概率P=p1,p2,p3,pn,要求构造一棵二叉查找树T,使得查询所有元素的总的代价最小。对于一个搜索树,当搜索的元素在树内时,表示搜索成功。当不在树内时,表示搜索失败,用一个“虚叶子节点”来标示搜索失败的情况,因此需要n+1个

3、虚叶子节点d0d1dn。其中d0表示搜索元素小于k1的失败结果,dn表示搜索元素大于kn的失败情况。di(0in)表示搜索节点在ki和k(i+1)之间时的失败情况。对于应di的概率序列是Q=q0,q1,qn。在最有二叉搜索树问题是指已给出一株二叉树的中序遍历(或需要你全排列枚举),以及每个节点搜索概率,搜索到一层花费1,问如何安排这颗二叉树使搜索花费的期望值最小。2 问题分析最优二叉搜索树问题具有最优子结构性质。证明:设Tij是有序集xi,xj关于存取概率分布(ai-1,bi,bj,aj)的一棵最优二叉搜索树,平均路长为pij。Tij的根结点存储元素xk。其左右子树Tl和Tr的平均路长分别为p

4、l和pr。由于Tl是关于集合xi,xk-1的一个二叉搜索树,故plpi,k-1。如果plpi,k-1,那么用Ti,k-1替换Tl可得到平均路长比Tij更小的二叉搜索树。这与Tij是最优二叉搜索树相矛盾。所以,左子树Tl是一棵最优二叉搜索树,同理可证右子树Tr也是一棵最优二叉搜索树,即最优二叉搜索树的子树也是最优二叉搜索树。建立递归关系式若最优二叉搜索树Ti,j的根结点为k,最小平均路长为pi,j,mi,j表示Ti,j的开销,则有mi,j=wi,jpi,j,其中,可建立下列递归关系:Mi,j=bk+(mi,k-1+wi,k-1)+ (mk+1,j+wk+1,j) 而 wi,j=bk+wi,k-1

5、+wk+1,j则mi,j=wi,j+mi,k-1+mk+1,j(1)将k=i+1,i+2,,j分别代入式,选取使mi,j达到最小的K,这样递归关系式改为:mi,j=wi,j+minmi,k-1+mk+1,jmi,i-1=0,1in解递归关系,m1,n就是所求的最优值。将对应于mi,j的断开位置k记录在si,j中(也称为根表,记录子树的根),以便构造最优解。根据记录的最优断开位置si,j,可以容易地构造出最优解。3算法设计寻找最优子结构。一个最优二叉树的子树必定包含连续范围的关键字kikj,1=i=j=n,同时也必须含有连续的虚叶子节点di-1dj。如果一棵最优二叉查找树T有一棵含有关键字kik

6、j的子树T,那么,T也是一棵最优查找树,这通过剪贴思想可以证明。现在开始构造最优子结构:在kikj中,选定一个r,i=r=i时,需要选择合适的kr作为根节点,然后其余节点kiK(r-1)和k(r+1)kj构造左右孩子。这时要考虑左右孩子这些节点成为一个节点的子树后,它的搜索代价的变化:根据ET的计算,得知它们的期望代价增加了“子树中所有概率的总和”w。wi,j= pl / 对每个l=ij+ql /对每个l=i-1j于是当j=i时,ei,j=pr + (ei,r-1+wi,r-1)+(er+1,j+wr+1,j) = ei,r-1 + er+1,j+wi,j;4 算法实现计算最优二叉树的期望代价

7、ei,j= q(i-1) /如果j=i-1min(ei,r-1 + er+1,j+wi,j),如果i=j,其中i=r=j wi,j=q(i-1) 如果j=i-1wi,j=wi,j-1+pj+qj 如果i=j 3.代码实现view plaincopy to clipboardprint?#include using namespace std; #define MAXNUM 100 #define MAX 65536 /p中为有序关键字k1到k5的搜索概率,k1k2k3k4k5 double pMAXNUM = 0.00,0.15,0.10,0.05,0.10,0.20; double qMAX

8、NUM = 0.05,0.10,0.05,0.05,0.05,0.10; void optimal_bst(double eMAXNUM,int rootMAXNUM,double wMAXNUM,int n) int i =0,j=0; /针对左或右孩子为空树情况初始化 for(i = 1;i=n+1;i+) eii-1 = qi-1; wii-1 = qi-1; int l = 0; /计算顺序如下:根据计算式:ei,j = ei,r-1+er+1,j 首先计算节点个数为1的最优二叉树的代价e1,1,e2,2 接着计算节点个数为1的最优二叉树的代价e1,2,e2,3最后计算结点个数为n的最

9、优二叉树的代价e1,n,利用之前保存的较少结点最优二叉树的结果。 for(l = 1;l=n;l+) for(i = 1;i=n-l+1;i+) j = i+l-1; eij = MAX; wij = wij-1 + pj+qj; for(int r = i;r=j;r+) double t = 0; t = eir-1+er+1j + wij; if(teij) eij= t; rootij = r; int main() double eMAXNUMMAXNUM; int rootMAXNUMMAXNUM; double wMAXNUMMAXNUM; optimal_bst(e,root,

10、w,5); for(int i =1;i=6;i+) for(int j = 0;j=5;j+) cout eij ; cout endl; 5测试分析在二叉树中T内搜索一次的期望代价为:(depth(ki)+1)*pi /对每个i=1n,搜索成功情况+(depth(di)+1)*qi /对每个i=0n,搜索失败情况i,j= q(i-1) /如果j=i-1min(ei,r-1 + er+1,j+wi,j),如果i=j,其中i=r=jwi,j = q(i-1) 如果j=i-1 wi,j=wi,j-1+pj+qj 如果i=j结 论 最优二叉搜索树是整个搜索成本最低的二叉搜索树。具体来说就是:给定键

11、值序列 K = ,k1 k2 kn,其中键值ki,被搜索的概率为pi,要求以这些键值构建一颗二叉搜索树T,使得搜索的期望成本最低(搜索成本为检查的节点数)。对于键值ki, 如果其在构造的二叉搜索树里的深度(离开树根的分支数)为depthT(ki),则搜索该键值的成本= depthT(ki) +1(需要加上深度为0的树根节点)。由于每个键值被搜索的概率分别为pi=1,2,3,n。本算法分析与设计课程设计是综合分析和理解动态规划算法,综合运用C、C+或JAVA等程序设计语言,设计的过程也是一个不断摸索的过程。只有对所作题目有了清楚的认识和理解,有了思想上的充分准备,才能在设计过程中“胸有成竹”。所

12、以我们对题目进行了比较详尽的考虑。当实际操作过程中遇到这样那样的困难,就通过查看资料、上网等方式解决。通过这次课程设计,我们对动态规划算法有了更深的认识,同时也更加熟练了C、C+和JAVA程序设计语言的运用,是开发人员必不可少的有力工具。同时,我们学到了如何用算法的思想分析一个给定的问题,最终动手解决问题。在整个过程中,需要不断的调试,更改代码,当中,我们遇到了很多棘手问题。在不断思考、调试后,不仅锻炼了我的实际动手能力,更锻炼了我们发现问题、分析问题的能力。参考文献1孙雄勇. Visual C+ 6.0 实用教程. 北京: 中国铁道出版社,20042谭浩强编著.C+面向对象程序设计.北京:清华大学出版社,20063王晓东编著.计算机算法设计与分析.北京:电子工业出版社,2007.54常友渠.动态规划的探讨与研究M.重庆电力高等专科学报, 2008.9.5龚雄兴,堆与动态规划M,湖北襄樊学院,2003.6张洁,朱莉娟.贪心算法与动态规划的比较M.新乡师范高等专科科学学报, 2005.9.

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1