最优二叉搜索树(Optimal Binary Search Tree)
- 前言
如果有序数组或有序表中的各个元素查找概率相等,那么采用二叉搜索树(BST)进行折半查找,性能最优。如果有序表中各个记录的查找概率不相等,情况又如何呢?
先看一个具体例子。已知有序表keys, 同时给出各个元素的查询频率,注意到各个元素的查询频率不相同。要求在此条件下,构造出最优搜索二叉查找树。
keys[] = {10, 12, 20},
freq[] = {34, 8, 50}
如果各个元素概率相等,在此基础上,构造二叉搜索树,结果为一颗平衡搜索树。
12
/ \
10 20
考虑各个元素的查找概率和二叉树的不同形式,可以构造五颗不同的二叉搜索树,最优二叉搜索树则是带权路径最小的的和:
P a t h W e i g h t = Σ ( w e i g h t [ i ] ∗ h e i g h t [ i ] ) ( 0 < = i < n ) Path\ Weight=Σ(weight[i]*height[i]) (0<=i<n) Path Weight=Σ(weight[i]∗height[i])(0<=i<n)
10 12 20 10 20
\ / \ / \ /
12 10 20 12 20 10
\ / / \
20 10 12 12
I II III IV V
分别对5种形式的二叉搜索树的带权路径和进行计算,采用列表的形式储存计算结果,则得到下述列表形式,
| 二叉树编号 | 带权路径和 | 备注 |
|---|---|---|
| I | =>34+8*2+50*3=200 | |
| II | =>8+34*2+50*2=176 | |
| III | =>50+8*2+34*3=168 | |
| IV | =>34+50*2+8*3=158 | |
| V | =>50+34*2+8*3=142 | 最优二叉搜索树 |
可以得到结论,等概率的二叉搜索树的带权路径和为176,并不是最优二叉搜索树,本例子中的最优二叉搜索树为第V种形式。还可以看出,最优二叉搜索树并不一定是深度最小的树,第V种二叉树的深度为3,第II种的普通的二叉搜索树的深度为2,即第V种树的深度比第II中多1,但是其带权路径和保持最小。另外还有一个结论,从本例中并不能明显看出,根节点权值不一定是最大权值节点。
上述两点声明和表述主要是说明,构造最小最优二叉搜索树不能简单采用贪心算法,贪心算法通常把最大权值放在根结点,并且设法降低树的高度,贪心算法并不能保证得到最优二叉搜索树。
- 问题求解
按照惯例,依照《算法导论》中的CRCC方法,采用动态规划方法对最优二叉搜索树问题进行求解。首先需要表征最优问题解的基本结构。
- 表征最优问题解的结构(Characterize the structure of the optimal solution)
考察最优二叉搜索树的任意一颗子树,子树包含某个连续元素:
k i . . . . k j , 1 ≤ i ≤ j ≤ n k_i....k_j, \ 1≤i≤j≤n ki

文章探讨了在元素查找概率不均等的情况下,如何构造最优二叉搜索树。通过一个具体例子展示了不同形式的二叉搜索树的带权路径和,并指出最优二叉搜索树并不一定是深度最小的树。文章使用动态规划方法,定义了状态转移方程并给出了递归的终止条件,进而计算出最小带权路径和。最后,提供了C代码实现来计算最优解。
最低0.47元/天 解锁文章
1261

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



