###笔记
二叉搜索树满足如下性质:假设 x x x是二叉搜索树中的一个结点。如果 l l l是 x x x的左子树的一个结点,那么 l . k e y ≤ x . k e y l.key ≤ x.key l.key≤x.key。如果 r r r是 x x x的右子树的一个结点,那么 r . k e y ≥ x . k e y r.key ≥ x.key r.key≥x.key。
也就是说,二叉搜索树中的任意一个结点,它的左子树中的所有结点都不大于它,它的右子树中的所有结点都不小于它。下图给出了一个二叉搜索树的例子。

最优二叉搜索树(Optimal Binary Search Tree)问题描述如下。给定一个 n n n个不同关键字的已排序的序列 K [ 1.. n ] = < k 1 , k 2 , … , k n > K[1..n]= <k_1, k_2, …, k_n> K[1..n]=<k1,k2,…,kn>(因此 k 1 < k 2 < … < k n k_1 < k_2 < … < k_n k1<k2<…<kn),我们希望用这些关键字构造一个二叉搜索树。对每个关键字 k i k_i ki,都有一个概率 p i p_i pi表示其搜索概率。搜索过程中有可能遇到不在 K [ 1.. n ] K[1..n] K[1..n]中的元素,因此我们还有 n + 1 n+1 n+1个元素的“伪关键字”序列 D [ 0.. n ] = < d 0 , d 1 , d 2 , … , d n > D[0..n] = <d_0, d_1, d_2, …, d_n> D[0..n]=<d0,d1,d2,…,dn>,表示搜索过程中可能遇到的所有不在 K [ 1.. n ] K[1..n] K[1..n]中的元素。 d 0 d_0 d0表示所有小于 k 1 k_1 k1的元素; d n d_n dn表示所有大于 k n k_n kn的元素;对 i = 1 , 2 , … , n − 1 i = 1, 2, …, n-1 i=1,2,…,n−1, d i d_i di表示所有在 k i k_i ki到 k i + 1 k_{i+1} ki+1之间的元素。对每个伪关键字 d i d_i di,也有一个概率 q i q_i qi表示对应的搜索概率。在二叉搜索树中,伪关键字 d i d_i di必然出现在叶结点上,关键字 k i k_i k

本文探讨了如何构建期望搜索代价最小的二叉搜索树,即最优二叉搜索树,通过动态规划方法解决该问题,并提供了算法实现及优化策略。

4万+

被折叠的 条评论
为什么被折叠?



