0020算法笔记——【动态规划】最优二叉搜索树问题.doc_第1页
0020算法笔记——【动态规划】最优二叉搜索树问题.doc_第2页
0020算法笔记——【动态规划】最优二叉搜索树问题.doc_第3页
0020算法笔记——【动态规划】最优二叉搜索树问题.doc_第4页
0020算法笔记——【动态规划】最优二叉搜索树问题.doc_第5页
已阅读5页,还剩8页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

.0020算法笔记【动态规划】最优二叉搜索树问题 1、问题描速: 设 S=x1, x2, , xn 是一个有序集合,且x1, x2, , xn表示有序集合的二叉搜索树利用二叉树的顶点存储有序集中的元素,而且具有性质:存储于每个顶点中的元素x 大于其左子树中任一个顶点中存储的元素,小于其右子树中任意顶点中存储的元素。二叉树中的叶顶点是形如(xi, xi+1) 的开区间。在表示S的二叉搜索树中搜索一个元素x,返回的结果有两种情形: (1) 在二叉树的内部顶点处找到: x = xi (2) 在二叉树的叶顶点中确定: x (xi, xi+1) 设在情形(1)中找到元素x = xi的概率为bi;在情形(2)中确定x (xi, xi+1)的概率为ai。其中约定x0= , xn+1= + ,有 集合a0,b1,a1,bn,an称为集合S的存取概率分布。 最优二叉搜索树:在一个表示S的二叉树T中,设存储元素xi的结点深度为ci;叶结点(xj,xj1)的结点深度为dj。 注:在检索过程中,每进行一次比较,就进入下面一层,对于成功的检索,比较的次数就是所在的层数加1。对于不成功的检索,被检索的关键码属于那个外部结点代表的可能关键码集合,比较次数就等于此外部结点的层数。对于图的内结点而言,第0层需要比较操作次数为1,第1层需要比较2次,第2层需要3次。 p表示在二叉搜索树T中作一次搜索所需的平均比较次数。P又称为二叉搜索树T的平均路长,在一般情况下,不同的二叉搜索树的平均路长是不同的。对于有序集S及其存取概率分布(a0,b1,a1,bn,an),在所有表示有序集S的二叉搜索树中找出一棵具有最小平均路长的二叉搜索树。 设Pi是对ai检索的概率。设qi是对满足aiXai+1,0=i=Pi,m-1。若PlPi,m-1,则用Ti,m-1替换Tl可得到平均路长比Tij更小的二叉搜索树。这与Tij是最优二叉搜索树矛盾。故Tl是一棵最优二叉搜索树。同理可证Tr也是一棵最优二叉搜索树。因此最优二叉搜索树问题具有最优子结构性质。 3、递推关系: 根据最优二叉搜索树问题的最优子结构性质可建立计算pij的递归式如下: 初始时: 记 wi,jpi,j为m(i,j) ,则m(1,n)=w1,np1,n=p1,n为所求的最优值。计算m(i,j)的递归式为: 4、求解过程: 1)没有内部节点时,构造T10,T21,T32,Tn+1n 2)构造只有1个内部结点的最优二叉搜索树T11,T22, Tnn,可以求得mii 同时可以用一个数组存做根结点元素为:s11=1, s22=2snn=n 3)构造具有2个、3个、n个内部结点的最优二叉搜索树。 r ( 起止下标的差) 0 T11, T22 , , Tnn, 1 T12, T23, ,Tn-1n, 2 T13, T24, ,Tn-2n, r T1r+1, T2r+2, ,Tii+r,Tn-rn n-1 T1n 具体代码如下: cppview plaincopy1. /3d11-1最优二叉搜索树动态规划2. #includestdafx.h3. #include4. usingnamespacestd;5. 6. constintN=3;7. 8. voidOptimalBinarySearchTree(doublea,doubleb,intn,double*m,int*s,double*w);9. voidTraceback(intn,inti,intj,int*s,intf,charch);10. 11. intmain()12. 13. doublea=0.15,0.1,0.05,0.05;14. doubleb=0.00,0.5,0.1,0.05;15. 16. cout有序集的概率分布为:endl;17. for(inti=0;iN+1;i+)18. 19. coutai=ai,bi=biendl;20. 21. 22. double*m=newdouble*N+2;23. int*s=newint*N+2;24. double*w=newdouble*N+2;25. 26. for(inti=0;iN+2;i+)27. 28. mi=newdoubleN+2;29. si=newintN+2;30. wi=newdoubleN+2;31. 32. 33. OptimalBinarySearchTree(a,b,N,m,s,w);34. cout二叉搜索树最小平均路长为:m1Nendl;35. cout构造的最优二叉树为:endl;36. Traceback(N,1,N,s,0,0);37. 38. for(inti=0;iN+2;i+)39. 40. deletemi;41. deletesi;42. deletewi;43. 44. deletem;45. deletes;46. deletew;47. return0;48. 49. 50. voidOptimalBinarySearchTree(doublea,doubleb,intn,double*m,int*s,double*w)51. 52. /初始化构造无内部节点的情况53. for(inti=0;i=n;i+)54. 55. wi+1i=ai;56. mi+1i=0;57. 58. 59. for(intr=0;rn;r+)/r代表起止下标的差60. 61. for(inti=1;i=n-r;i+)/i为起始元素下标62. 63. intj=i+r;/j为终止元素下标64. 65. /构造Tij填写wij,mij,sij66. /首选i作为根,其左子树为空,右子树为节点67. wij=wij-1+aj+bj;68. mij=mi+1j;69. sij=i;70. 71. /不选i作为根,设k为其根,则k=i+1,j72. /左子树为节点:i,i+1k-1,右子树为节点:k+1,k+2,j73. for(intk=i+1;k=j;k+)74. 75. doublet=mik-1+mk+1j;76. 77. if(t0)92. 93. if(f=0)94. 95. /根96. coutRoot:k(i:j):(i,j)endl;97. 98. else99. 100. /子树101. coutchoff:k(i:j):(i,j)=i&t=n)106. 107. /回溯左子树108. Traceback(n,i,t,s,k,L);109. 110. t=k+1;111. if(t=j)112. 113. /回溯右子树114. Traceback(n,t,j,s,k,R);115. 116. 117. 4、构造最优解: 算法OptimalBinarySearchTree中用sij保存最优子树T(i,j)的根节点中的元素。当sin=k时,xk为所求二叉搜索树根节点元素。其左子树为T(1,k-1)。因此,i=s1k-1表示T(1,k-1)的根节点元素为xi。依次类推,容易由s记录的信息在O(n)时间内构造出所求的最优二叉搜索树。 5、复杂度分析与优化: 算法中用到3个数组m,s和w,故所需空间复杂度为O(n2)。算法的主要计算量在于计算。对于固定的r,它需要的计算时间O(j-i+1)=O(r+1)。因此算法所耗费的总时间为:。事实上,由动态规划加速原理之四边形不等式可以得到:而此状态转移方程的时间复杂度为O(n2)。由此,对算法改进后的代码如下:cppview plaincopy1. /3d11-1最优二叉搜索树动态规划加速原理四边形不等式2. #includestdafx.h3. #include4. usingnamespacestd;5. 6. constintN=3;7. 8. voidOptimalBinarySearchTree(doublea,doubleb,intn,double*m,int*s,double*w);9. voidTraceback(intn,inti,intj,int*s,intf,charch);10. 11. intmain()12. 13. doublea=0.15,0.1,0.05,0.05;14. doubleb=0.00,0.5,0.1,0.05;15. 16. cout有序集的概率分布为:endl;17. for(inti=0;iN+1;i+)18. 19. coutai=ai,bi=biendl;20. 21. 22. double*m=newdouble*N+2;23. int*s=newint*N+2;24. double*w=newdouble*N+2;25. 26. for(inti=0;iN+2;i+)27. 28. mi=newdoubleN+2;29. si=newintN+2;30. wi=newdoubleN+2;31. 32. 33. OptimalBinarySearchTree(a,b,N,m,s,w);34. cout二叉搜索树最小平均路长为:m1Nendl;35. cout构造的最优二叉树为:endl;36. Traceback(N,1,N,s,0,0);37. 38. for(inti=0;iN+2;i+)39. 40. deletemi;41. deletesi;42. deletewi;43. 44. deletem;45. deletes;46. deletew;47. return0;48. 49. 50. voidOptimalBinarySearchTree(doublea,doubleb,intn,double*m,int*s,double*w)51. 52. /初始化构造无内部节点的情况53. for(inti=0;i=n;i+)54. 55. wi+1i=ai;56. mi+1i=0;57. si+1i=0;58. 59. 60. for(intr=0;rn;r+)/r代表起止下标的差61. 62. for(inti=1;ii?sij-1:i;66. intj1=si+1ji?si+1j:j;67. 68. /构造Tij填写wij,mij,sij69. /首选i作为根,其左子树为空,右子树为节点70. wij=wij-1+aj+bj;71. mij=mii1-1+mi1+1j;72. sij=i1;73. 74. /不选i作为根,设k为其根,则k=i+1,j75. /左子树为节点:i,i+1k-1,右子树为节点:k+1,k+2,j76. for(intk=i1+1;k=j1;k+)77. 78. doublet=mik-1+mk+1j;79. 80. if(t0)95. 96. if(f=0)97. 98.

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论