1、在一个表示S的二叉树T中,设存储元素Xi的结点深度为Ci;叶结点(xj, xj+0的结点深度为dj。n n厂孕(1+处剳同注:在检索过程中,每进行一次比较,就进入下面一层,对于成功的检索,比较的次数 就是所在的层数加1。对于不成功的检索,被检索的关键码属于那个外部结点代表的可能关 键码集合,比较次数就等于此外部结点的层数。对于图的内结点而言,第 0层需要比较操 作次数为1,第1层需要比较2次,第2层需要3次。p表示在二叉搜索树T中作一次搜索所需的平均比较次数。 P又称为二叉搜索树T的平均路长,在一般情况下,不同的二叉搜索树的平均路长是不同的。对于有序集 S及其存取概率分布(ao,b1,a1,
2、bn,an),在所有表示有序集S的二叉搜索树中找出一棵具有最小平均路长的二 叉搜索树。设Pi是对ai检索的概率。设qi是对满足aiXai+1,0=i0.1+ 3 0.05 + 0.05 ) =1.5P b(n) = 1Xp1 + 2p3+3祁2 + 1q0 +2 q3 + 3 q1 + q2 ) =1X0.5+ 2 )0.05 + 3。为+ 100.05+ 3 0.1 + 0.05 ) =1.6P c(n) = 1Xp2 + 2(p1 +p3) + 2(q0 +q1 +q2+ q3 ) =1 0.1+ 2(0.5 + 0.05)+ 2 (0.15 + 0.1 + 0.05 + 0.05) =1
3、.9P d(n) = 1Xp3 + 2莎1+3q3+2 q0+3 和1+ q2) =10.05 + 2区5 + 30.1 + 105 + 20.15 + 3(0.1 + 0.05) =2.15P e(n) = 1p2+3p1 + 1q2+3 和0 + q1) =1K1+ 3区5 + 10d5 + 3(0.15 + 0.1) =2.85因此,上例中的最小平均路长为可以得出结论:结点在二叉搜索树中的层次越深,需要比较的次数就越多,因此要构造一棵最小二叉树,一般尽量把搜索概率较高的结点放在较高的层次 。2、最优子结构性质:假设选择k为树根,则1,2,-1和ao, a1,on都将位于左子树L上,其余结
4、点(k+1,n和ak, ak+i,a)位于右子树 R上。设COST(L)和COST(R)分别是二分检索树T的左子树和右子树的成若T本。则检索树 T的成本是:P(k)+ COST(L) + COST(R) +是最优的,则上式及 COST(L)和COST(R)必定都取最小值。证明:二叉搜索树T的一棵含有顶点Xi ,,Xj和叶顶点(xi-1 ,Xi ) , ,( Xj , Xj+1)的子树可以看作是有序集 Xi , , Xj关于全集为 Xi-1 ,Xj+1 的一棵二叉搜索树(T自身可以看作是有序集)。根据S的存取分布概率,在子树的顶点处被搜索到的概率是:ikij Xi,,Xj的存储概率分布为ai-1
5、, bi,bj, aj ,其中,ah, bk分别是下面的条件概率:瓦=加/% ik= Pi,m-1。若Pl Pi,m-1,贝y用Ti,m-1替换Tl可得到平均路长比Tij更小的二叉搜索树。这与Tij是最优二叉搜索树矛盾。故Ti是一棵最优二叉搜索树。同理可证Tr也是一棵最优二叉搜索树。因此最优二叉搜索树问题具有最优子结构性质。3、递推关系:根据最优二叉搜索树问题的最优子结构性质可建立计算 pij的递归式如下:叫jPij=+(殳;专山41+叫i Jt). . 1=0 1V/M 打初始时:如7 5记 wi,j pi,j 为 m(i,j),则 m(1,n)二w i,n pi,n= pi,n 为所求的最
6、优值。计算 m(i,j)的递归式为:川(A7)=、耳了 + mill 斤一 1) + nik +1, /), i ij川亿 f -1)= a i = 124、求解过程:,Ttn +1n1)没有内部节点时,构造 T10,T21,T322)构造只有1个内部结点的最优二叉搜索树 T11,T22Tnn,可以求得mii同时可以用一个数组存做根结点元素为:Tnn,(起止下标的差)T11, T22n-1 T1 n具体代码如下:cpp view plain copy/3d11-1 最优二叉搜索树 动态规划#include stdafx.h#include using names pace std;double
7、 *w);9.voidTraceback( int n, int i, int j, int10.11.intmain()12.13.doublea = 0.15,0.1,0.05,0.05;14.b = 0.00,0.5,0.1,0.05;15.16.coutvv有序集的概率分布为:vvendl;17.for ( inti=0; ivN+1; i+)18.19.a vvivv = vvaivv ,b20.21.22.*m = new double *N+2;23.int *s= new int *N+2;24.*w = new double *N+2;25.26.ivN+2;i+)27.28
8、.mi=new double N+2;29.si=new int N+2;30.wi=31.32.33.Op timalBinarySearchTree(a,b,N,m,s,w);34.二叉搜索树最小平均路长为:-35.构造的最优二叉树为:36.Traceback(N,1,N,s,0, O);37.38.39.40.delete mi;41.delete si;42.delete wi;43.44.deletem;45.s;46.w;47.return0;void OptimalBinarySearchTree(8. vvbivvendl;vvm1Nvvendl;*s, int f, char
9、 ch);double a, double b, int n, double *m, int *s,50. void OptimalBinarySearchTree(double a, double b,double *w)51.52./初始化构造无内部节点的情况53.for ( int i=0;=n;54.55.wi+1i = ai;56.mi+1i = 0;57.58.59.for ( int r=0; rn;叶+)/r代表起止下标的差60.61.for (int i=1;=n-r; i+) /i 为起始元素下标62.63.int j = i+r; /j为终止元素下标64.65./ 构造 Tij填写 wij,mij,sij66./首选i作为根,其左子树为空,右子树为节点67.wij=wij-1+aj+bj;68.m
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1