1、1,3.5 最优二叉搜索树 Optimal Binary Search Trees,2,1二叉搜索树 2最优二叉搜索树 3最优二叉搜索树问题描述 4最优子结构性质 5递归计算最优值 6算法,3,是一棵空树或者满足以下的性质: 每个结点作为搜索对象,它的关键字是互不相同的。 对于树上的所有结点,如果它有左子树,那么左子树上所有结点的关键字都小于该结点的关键字。 对于树上的所有结点,如果它有右子树,那么右子树上所有结点的关键字都大于该结点的关键字。,1 二叉搜索树,4,搜索过程:从根结点开始,如果根为空,则搜索不成功;否则使用待搜索值与根结点比较,如果待搜索值等于根结点关键字,则搜索成功返回,如果
2、小于根结点,则向左子树搜索;如果大于根结点,则向右子树搜索。,1 二叉搜索树,5,对于一个给定的关键字集合,可能有若干不同的二分检索树 如对保留字的子集Name: 1 2 3 4 5for if loop repeat while 的两棵二分检索树为,考虑a图和b图中最坏比较次数和平均比较次数,1 二叉搜索树,6,构造不同的二叉搜索树就有不同的性能特征。二叉搜索树a在最坏情况下找一个标识符需要4次比较,而b表示的二分检索树最坏情况下只需3次比较。假设只作成功的检索并且检索每个标识符的概率相同,则两棵二分检索树在平均情况下各需要12/5和11/5次比较。,1 二叉搜索树,7,2、最优二叉搜索树,
3、存在的两个问题 1 在实际中也会遇到不成功检索的情况。 2 在实际中,不同标识符会有不同的检索概率。 对给定的标识符集合,希望给出构造二分搜索树的方法,使得所构造的二分搜索树具有最优的性能。,2 最优二叉搜索树,8,扩充二叉树:当二叉树里出现空的子树时,就增加新的、特殊的结点空树叶。对于原来二叉树里度数为1的分支结点,在它下面增加一个空树叶;对于原来二叉树的树叶,在它下面增加两个空树叶。 扩充二叉树是满二叉树,新增加的空树叶(以下称外部结点)的个数等于原来二叉树的结点(以下称内部结点)个数加1。,在实际中也会遇到不成功检索的情况,2 最优二叉搜索树,9,A,A代表其值处于wim和wul之间的可
4、能关键码集合,2 最优二叉搜索树,10,设 S=x1, x2, , xn 是一个有序集合,且x1, x2, , xn表示有序集合的二叉搜索树利用二叉树的顶点存储有序集中的元素,而且具有性质: 存储于每个顶点中的元素x 大于其左子树中任一个顶点中存储的元素,小于其右子树中任意顶点中存储的元素。二叉树中的叶顶点是形如(xi, xi+1) 的开区间。,在二叉搜索树中搜索一个元素x,(1) 在二叉树的内部顶点处找到: x = xi (2) 在二叉树的叶顶点中确定: x (xi , xi+1),2 最优二叉搜索树,11,在实际中,不同标识符会有不同的检索概率。,设Pi是对ai检索的概率。 设qi是对满足
5、aiXai+1,0i n的标识符X检索的概率, (假定a0=-且an+1=)。,a1,Q(0),E0,P(1),a2,E1,Q(1),P(2),ai,P(i),ai+1,Ei,Q(i),P(i+1),an,P(n),En,Q(n),2 最优二叉搜索树,12,最优二叉搜索树,利用动态规划构造对标识符集合 a1, a2, , an的最优二叉搜索树算法(包括成功检索和不成功检索)。,2 最优二叉搜索树,13,例 标识符集1, 2, 3do, if, stop可能的二分检索树为:,设每个内、外结点检索的概率相同:pi=qi=1/7,求每棵树的平均比较次数(成本)。 若P1=0.5, P2=0.1, P
6、3=0.05,q0=0.15, q1=0.1, q2=0.05, q3=0.05,求每棵树的平均比较次数(成本)。,14,在检索过程中,每进行一次比较,就进入下面一层, 对于成功的检索,比较的次数就是所在的层数加1。对于不成功的检索,被检索的关键码属于那个外部结点代表的可能关键码集合,比较次数就等于此外部结点的层数。,2 最优二叉搜索树,15,例:,P1=0.5, P2=0.1, P3=0.05, q0=0.15, q1=0.1, q2=0.05, q3=0.05,考虑平均搜索次数,也叫做平均路长,Pa(n)=1 p1 + 2 p2+3 p3 + 1q0 +2q1+ 3( q2 + q3 )=
7、1 0.5+ 2 0.1+3 0.05 + 10.05 +20.1+ 3( 0.05 + 0.05 )=1.5,2 最优二叉搜索树,a b c d e,分析,对于图的内结点而言,第0层需要比较操作次数为1,第1层需要比较2次,第2层需要3次 Pb(n)=1 p1 + 2 p3+3 p2 + 1q0 + 3( q2 + q3 )=1 0.5+ 2 0.05 + 3 0.1 + 10.15 +20.05+ 3( 0.05 + 0.05 )=1.6 Pc(n)=1 p2 + 2 (p1 + p3) + 2(q0 +q1 +q2 + q3 )=1 0.1+ 2 (0.5 + 0.05) + 2(0.1
8、5 + 0.1 + 0.05 + 0.05)=1.9 Pd(n)=1 p3 + 2 p1+3 p2 + 1 q3+2 q0 +3 (q1+ q2)=1 0.05 + 2 0.5 + 3 0.1 + 10.05 + 2 0.15 + 3 (0.1 + 0.05)=2.15 Pe(n)=1 p3 + 2 p1+3 p2 + 1 q3+2 q0 +3 (q1 + q2)=1 0.05 + 2 0.5 + 3 0.1 + 10.05 + 2 0.15 + 3 (0.1 + 0.05)=2.15,2 最优二叉搜索树,17,找到元素x = xi的概率为bi;确定x (xi , xi+1)的概率为ai。其中
9、约定x0= , xn+1= + ,有,2 最优二叉搜索树,18,在一个表示S的二叉树T中,设存储元素xi的结点深度为ci;叶结点(xj,xj1)的结点深度为dj 。,表示在二叉搜索树T中作一次搜索所需的平均比较次数。P又称为二叉搜索树T的平均路长,在一般情况下,不同的二叉搜索树的平均路长是不同的。,2 最优二叉搜索树,19,3、最优二叉搜索树问题描述,对于有序集S及其存取概率分布(a0, b1, a1, , bn, an),在所有表示有序集S的二叉搜索树中找出一棵具有最小平均路长的二叉搜索树。结点在二叉搜索树中的层次越深,需要比较的次数就越多,因此要构造一棵最小二叉树,一般尽量把搜索概率较高的
10、结点放在较高的层次。,3 最优二叉搜索树问题,20,4、最优子结构性质,假设选择 k为树根,则 1, 2, , k-1 和a0, a1, , ak-1 都将位于左子树 L 上,其余结点 (k+1, , n 和 ak, ak+1, , an)位于右子树 R 上。,4 最优子结构性质,21,4 最优子结构性质,22,4 最优子结构性质,23,设COST(L) 和COST(R) 分别是二分检索树T的左子树和右子树的成本。 则检索树T的成本是:P(k)+ COST(L) + COST(R) + 若 T 是最优的,则上式及 COST(L) 和COST(R) 必定都取最小值。,4 最优子结构性质,24,最
11、优子结构性质证明,二叉搜索树T 的一棵含有顶点xi , , xj和叶顶点(xi-1 , xi ) , , ( xj , xj+1)的子树可以看作是有序集 xi , , xj 关于全集为 xi-1 , xj1 的一棵二叉搜索树(T 自身可以看作是有序集) 。 根据S 的存取分布概率,在子树的顶点处被搜索到的概率是:,4 最优子结构性质,25,左子树的搜索概率,右子树的搜索概率,设Tij是有序集xi , , xj关于存储概率分布为 ai-1, bi, , bj, aj 的一棵最优二叉搜索树,其平均路长为pij,Tij的根顶点存储的元素xm,其左子树Tl和右子树Tr的平均路长分别为pl和pr。由于T
12、l和Tr中顶点深度是它们在Tij中的深度减1,所以得到,4 最优子结构性质,26,构造最优二叉搜索树时,可以选择先构造其左右子树,使其左右子树最优,然后构造整棵树。,4 最优子结构性质,27,5、递归计算最优值,最优二叉搜索树Tij的平均路长为pij,则所求的最优值为p1,n。由二叉树的花费公式根据最优二叉搜索树问题的最优子结构性质可建立计算pij的递归式如下,初始时,5 递归计算最优值,28,记 wi,j pi,j 为m( i, j ),递归计算最优值,5 递归计算最优值,29,根据该公式,计算树Tij的花费只用到了 Tik-1,Tk+1j, 可得到具体求解过程如下: 1)构造只有1个内部结
13、点的最优二叉搜索树T11,T22, Tnn,可以求得mii 同时可以用一个数组存做根结点元素为:s11=1, s22=2snn=n 2) 构造具有2个内部结点的最优二叉搜索树,30,例,给出标识符集1, 2, 3do, if, stop存取概率 若 P1=0.5, P2=0.1, P3=0.05,q0=0.15, q1=0.1, q2=0.05, q3=0.05 构造一棵最优二叉搜索树,5 递归计算最优值,31,q0=0.15, P1=0.5, q1=0.1, P2=0.1, q2=0.05, P3=0.05, q3=0.05,T12,w12=0.9 m12=0.9+m11+m32=1.65,
14、w12=0.9 m12=0.9+m10+m22=1.15,32,q0=0.15, P1=0.5, q1=0.1, P2=0.1, q2=0.05, P3=0.05, q3=0.05,T12,w12=0.9 m12=0.9+m11+m32=1.65,w12=0.9 m12=0.9+m10+m22=1.15,T23 w23=0. 5,m23=0.5,m23=0.6,33,q0=0.15, P1=0.5, q1=0.1, P2=0.1, q2=0.05, P3=0.05, q3=0.05,T12,w12=0.9 m12=0.9+m11+m32=1.65,w12=0.9 m12=0.9+m10+m22
15、=1.15,T23 w23=0. 35,m23=0.5,m23=0.6,34,T12 m12=1.15,T23 m23=0.5,T13 W13=1,m13=1.5,m13=1.9,m13=2.15,q0=0.15, P1=0.5, q1=0.1, P2=0.1, q2=0.05, P3=0.05, q3=0.05,35,T12 m12=1.15,T23 m23=0.5,2,3,q2,q3,1,q0,q1,T13 W13=1,m13=1.5,2,3,q2,q3,1,q0,q1,m13=1.9,2,3,q2,q3,1,q0,q1,m13=2.15,q0=0.15, P1=0.5, q1=0.1,
16、P2=0.1, q2=0.05, P3=0.05, q3=0.05,36,0,1,2,3,1,2,3,0,0,0,0,4,0 1 2 3,1 2 3 4,W(i, j),0 1 2 3,1 2 3 4,0,0,0,0,0.15,0.1,0.05,0.05,0.75,0.75,1,0.25,0.15,0.25,0.15,2,3,0.9,1.15,1,0.35,1,0. 5,2,1.5,1,m(i, j),s(i, j),q0=0.15, P1=0.5, q1=0.1, P2=0.1, q2=0.05, P3=0.05, q3=0.05,37,具体求解过程,递归出口,没有内部节点时,构造T10T2
17、1,T32,Tn+1n 2) 构造具有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-rnn-1 T1n,5 递归计算最优值,38,void OBST ( int *a, int *b,int n, int *m, int *s, int *w), for( int i=0; i=n; i+) wi+1i=ai;mi+1i=0; /初始化,构造没有内部节点时的情况 for(int r=0; rn; r+)fo
18、r(int i =1; i=n-r; i+)int j= i+r;构造Tij,填写wij,mij,sij ,39,构造Tij,Tij表示用第i到第j个内部节点构造的树,做根的结点可以是第i,i+1,j中任意一个。 1) 首选i作为根,其左子树空,右子树为结点i+1,i+2j构成即Ti+1j。mij=wij+0+mi+1jsij= i 2) 不选i做根,设k为其根,则k= i+1,j,左子树为结点i, i+1,k-1, 右子树为k+1, k+2, ,jt= wij+mik-1+mk+1jif(t mij) mij=t;sij=k; 3)k= k+1, 跳回2,5 递归计算最优值,40,void
19、OptimalBinarySearchTree( int *a, int *b,int n, int *m, int *s, int *w) for( int i=0; i=n; i+)wi+1i=ai;mi+1i=0;for(int r=0; rn; r+)for(int i =1; i= n - r; i+)int j= j + r;wij=wij-1+aj+bj;mij=mi+1j;sij = i;,for(int k = i+1; k=j; k+)int t=mik-1+mk+1j;if (tmij)mij=t;sij=k;mij+=wij; ,初始化 对角线赋值,i为起始元素下标,j
20、为终止元素下标,加第j个结点后,权值w改变,如第i个结点作根的值,取第k个结点作根,5 递归计算最优值,41,6、构造最优解,6 构造最优解,42,7、计算复杂性,43,练习,设n=4,且(1, 2, 3, 4) = (do, if, read, while)。 又设b(1 : 4)=(3, 3, 1, 1)和a(0 : 4)=(2,3,1,1,1) (这些b,a都乘了16。) 写出数组wij,mij,sij及最后的最优二叉搜索树。,44,作业,P84 3-15,45,Exercises,Determine the cost and structure of an optimal binary
21、 search tree for a set of n = 7 keys with the following probabilities: i :01234567 pi 0.04,0.06,0.08,0.02,0.10,0.12,0.14 qi 0.06,0.06,0.06,0.06,0.05,0.05,0.05,0.05,46,动态规划总结,一、动态规划的基本思想: 将问题分解为若干小问题,解子问题,然后从子问题得到原问题的解。,47,二、动态规划特点,将问题分解为子问题,这些子问题往往不相互独立。(如果可以用分治法求解,分解的子问题太多,因此,用分治法时间代价太高,消耗指数时间),48,
22、三、动态规划思路,如果能够保存已解决的子问题的答案,而在需要时再找出已求得的答案,这样就可以避免大量的重复计算,节省时间。 动态规划方法用一个表来记录所有已解的子问题的答案。不管该子问题以后是否被用到,只要它被计算过,就将其结果填入表中。这就是动态规划法的基本思路。具体的动态规划算法多种多样,但它们具有相同的填表格式。,49,四、动态规划问题的特征:,动态规划算法的有效性依赖于问题本身所具有的两个重要性质:最优子结构性质和子问题重叠性质。 1、最优子结构:当问题的最优解包含了其子问题的最优解时,称该问题具有最优子结构性质。 2、重叠子问题:在用递归算法自顶向下解问题时,每次产生的子问题并不总是
23、新问题,有些子问题被反复计算多次。动态规划算法正是利用了这种子问题的重叠性质,对每一个子问题只解一次,而后将其解保存在一个表格中,在以后尽可能多地利用这些子问题的解。,50,五、应用,往往求解具有某种最优性质的问题,此类问题往往具有多个解,我们要找到具有最优值的那个解。,51,六、设计动态规划法的步骤:,1、找出最优解的性质,并刻画其结构特征; 2、递归地定义最优值(写出动态规划方程); 3、以自底向上的方式计算出最优值; 4、根据计算最优值时得到的信息,构造一个最优解。 步骤1-3是动态规划算法的基本步骤。在只需要求出最优值的情形,步骤4可以省略,步骤3中记录的信息也较少;若需要求出问题的一个最优解,则必须执行步骤4,步骤3中记录的信息必须足够多以便构造最优解。,