/*
最优二叉搜索树:给定一个n个不同关键字的已经排序的序列K=<k1,k2,...,kn>(因此k1<k2<...<kn),希望用这些关键字构造一颗二叉搜索树。
对每个关键字ki,都有一个概率pi表示其搜索频率。有些要搜索的值可能不在K中,因此我们还有n+1个“伪关键字”do,d1,d2,...,dn表示不
在K中的值。d0表示所有小于k1的值,dn表示所有大于kn的值,对i=1,2,...,n-1,伪关键字di表示所有在ki和ki+1之间的值。对于每个伪关
键字di,也都有一个概率pi表示对应的搜索频率。下图显示了n=5个关键字的集合构造的两颗二叉搜索树。每个关键字ki是一个内部结点,
而每个关键字di是一个叶结点。每次搜索要么成功(找到某个关键字ki),要么失败(找到某个伪关键字di),因此有如下公式:
i属于[1,n] pi的和 + i属于[0,n] qi的和 = 1
关键字ki的两个伪关键字为di-1,di
k2
k1 k4
d0 d1 k3 k5
d2 d3 d4 d5
动态规划分析:
S1:最优二叉搜索树的结构
二叉搜索树的任意子树,必须包含连续关键字ki,...,kj, 1<=i<=j<=n,而其叶节点必然是伪关键字di-1,...,dj。
最优子结构:如果一颗最优二叉搜索树T有一颗包含关键字ki,...,kj的子树T',那么T'必然是包含关键字ki,...,kj和伪关键字di-1,...,dj的
子问题的最优解。
剪切-粘贴法证明:如果存在子树T'',使得T''的期望搜索代价比T'的期望搜索代价要小,那么将T'从T中删除,将T''粘贴到该位置,就得到一颗
期望搜索代价比T的期望搜索代价更小的树,这与T是最优二叉搜索树矛盾,所以T'是子问题的最优解,即最优二叉搜索树有
最优子结构
最优子结构---->可以用子问题的最优解构造原问题的最优解,给定关键字序列ki,...,kj,设其中某个关键字为kr(i<=r<=j),是这些关键字的最
优子树的根节点。那么kr的左子树就包含关键字ki,...,kr-1(和伪关键字di-1,...,dr-1),而右子树包含关键字kr+1,...,kj
(和伪关键字dr,...,dj)。只要我们检查所有可能的根节点kr(i<=r<=j),并对每种情况分别求解包含ki,...,kr-1及kr+1,...,
kj的最优二叉搜索树,即可保证找到原问题的最优解
易错点:注意空子树。假设对于包含关键字ki,...,kj的子问题,我们选定ki为根节点,其实有一个伪关键字di-1,若kj为根节点,那