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

最优二叉搜索树上机报告-read.doc

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

“最优二叉搜索树”上机报告 问题描述和分析 设S={x1,x2,……xn}是有序集,且x1x2…….xn,表示有序集S的二叉搜索树利用二叉树的结点存储有序集中的元素。它具有下述性质:存储于每个结点中的元素x大于其左子树中任一结点所存储的元素,小于其右子树中任一结点所存储的元素。二叉树的叶结点是形如(xi,xi+1)的开区间,在表示S的二叉搜索树中搜索元素x,返回的结果有两种情况: 在二叉搜索树的内结点中找到x=xi 在二叉搜索树的叶结点中确定x∈(xi,xi+1) 设在第(1)中情形中找到元素x=xi的概率为bi;在第(2)种情形中确定x∈(xi,xi+1)的概率为ai。其中约定x0=-∞,xn+1=+∞。显然有 ai≥0, 0≤i≤n; bj≥0, 1≤j≤n, ∑ai+∑bj=1 (a0,b1,a1,…..,bn,an)称为集合S的存取概率分布。 在表示S的二叉搜索树T中,设存储元素xi的结点深度为ci;叶结点(xi,xi+1)的结点深度为dj,则p=∑bi(1+ci)+ ∑ajdj表示在二叉搜索树T中进行一次搜索所需要的平均比较次数,p又成为二叉搜索树T的平均路长。在一般情况下,不同的二叉搜索树的平均路长是不相同的。 最优二叉搜索树问题是对于有序集S及其存取概率分布(a0,b1,a1,…..,bn,an),在所有表示有序集S的二叉搜索树中找到一棵具有最小平均路长的二叉搜索树。 问题的分解 二叉搜索树T的一棵含有结点xi,…..,xj和叶结点(xi-1,xi),…..(xj,xj+1)的子树可以 看作是有序集{xi,…..,xj}关于全集合(xi-1,xi,…..,xj,xj+1)的一棵二叉搜索树,其存取概率为以下的条件概率: b’k=bk/wij, i≤k≤j; a’h=ah/wij, i-1≤h≤j 其中wij=ai-1+bi+……+bj+aj, 1≤i≤j≤n。 问题的分解具有最优子结构性质 证明:设Tij是有序集{xi,…..,xj}关于存取概率(a’i-1,b’i,…..,b’j,a’j)的一棵最优二叉搜索树,其平均路长为pij。Tij的根结点存储元素xm,其左右子树Tl和Tr的平均路长分别为pl和pr。由于Tl和Tr中结点深度为它们在Tij中的结点深度减1,故有wi,jpi,j=wi,j+wi,m-1pl+wm+1pr 由于Tl是关于集合{xi,…..,xm+1}的一棵二叉搜索树,故pl≥pi,m-1,若pl<pi,m-1,则用Ti,m-1替代Tl 可得到平均路长比Tij 更小的二叉搜索树。这与Tij 是最优二叉搜索树矛盾。故Tl 是一棵最优二叉搜索树。同理可证Tr 也是一棵最优二叉搜索树。 因此,最优二叉搜索树问题具有最优子结果性质。 规划方程 最优二叉搜索树Tij 的平均路长为pij,则所求的最优值为p1,n 。由最优二叉搜索树问题的最优子结构性质可建立计算pij 的递归式如下: wi,jpi,j=wi,j+min{wi,k-1pi,k-1+wk+1,jpk+1,j} i≤k≤j 初始时,pi,i-1=0 , 1≤i≤n 记wi,jpi,j 为m(i,j),则m(1,n)= w1,np1,n=p1,n为所求的最优值。 计算m(i,j)的递归式为: m(i,j)=wi,j+min{ m(i,k-1)+ m(k+1,j)} i≤k≤j m(i,i-1)=0 1≤i≤n 据此,可得出解最优二叉搜索树问题的动态规划算法。 算法设计(递归和非递归) 【动态规划】 子问题的求解: 非递归: void obst(float *a,float *b,int n,float **m,int **s,float **w) { for(int i=0;i=n;i++) { w[i+1][i]=a[i]; m[i+1][i]=0; } for(int r=0;rn;r++) for(int i=1;i=n-r;i++) { int j=i+r; w[i][j]=w[i][j-1]+a[j]+b[j]; m[i][j]=m[i+1][j]; s[i][j]=i; for(int k=i+1;k=j;k++) { float t=m[i][k-1]+m[k+1][j]; if(tm[i][j]) { m[i][j]=t; s[i][j]=k; } } m[i][j]+=w[i][j]; } } 递归: double obst(double *a,double *b,int i,int j) { if(m[i][j]=0) return m

文档评论(0)

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

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

1亿VIP精品文档

相关文档