📅  最后修改于: 2021-01-12 03:37:35             🧑  作者: Mango
二进制搜索树(BST)是其中键值存储在内部节点中的树。外部节点为空节点。键按字典顺序排序,即,对于每个内部节点,左子树中的所有键都小于节点中的键,而右子树中的所有键都较大。
当我们知道搜索每个键的频率时,很容易计算访问树中每个节点的预期成本。最佳的二叉搜索树是BST,它具有最小的定位每个节点的预期成本
BST中元素的搜索时间为O(n) ,而Balanced-BST中元素的搜索时间为O(log n) 。同样,可以在“最佳成本二元搜索树”中缩短搜索时间,将最常用的数据放置在根中并更靠近根元素,同时将最不常用的数据放置在叶附近和叶中。
这里,提出了最佳二叉搜索树算法。首先,我们从一组提供的n个不同的键
Optimal-Binary-Search-Tree(p, q, n)
e[1…n + 1, 0…n],
w[1…n + 1, 0…n],
root[1…n + 1, 0…n]
for i = 1 to n + 1 do
e[i, i - 1] := qi - 1
w[i, i - 1] := qi - 1
for l = 1 to n do
for i = 1 to n – l + 1 do
j = i + l – 1 e[i, j] := ∞
w[i, i] := w[i, i -1] + pj + qj
for r = i to j do
t := e[i, r - 1] + e[r + 1, j] + w[i, j]
if t < e[i, j]
e[i, j] := t
root[i, j] := r
return e and root
该算法需要O(n 3 )时间,因为使用了三个嵌套的for循环。这些循环中的每个循环最多具有n个值。
考虑以下树,成本不是2.80,尽管这不是最佳结果。
Node | Depth | Probability | Contribution |
---|---|---|---|
k1 | 1 | 0.15 | 0.30 |
k2 | 0 | 0.10 | 0.10 |
k3 | 2 | 0.05 | 0.15 |
k4 | 1 | 0.10 | 0.20 |
k5 | 2 | 0.20 | 0.60 |
d0 | 2 | 0.05 | 0.15 |
d1 | 2 | 0.10 | 0.30 |
d2 | 3 | 0.05 | 0.20 |
d3 | 3 | 0.05 | 0.20 |
d4 | 3 | 0.05 | 0.20 |
d5 | 3 | 0.10 | 0.40 |
Total | 2.80 |
为了获得最佳解决方案,使用本章讨论的算法,生成了下表。
在下表中,列索引为i ,行索引为j 。
e | 1 | 2 | 3 | 4 | 5 | 6 |
---|---|---|---|---|---|---|
5 | 2.75 | 2.00 | 1.30 | 0.90 | 0.50 | 0.10 |
4 | 1.75 | 1.20 | 0.60 | 0.30 | 0.05 | |
3 | 1.25 | 0.70 | 0.25 | 0.05 | ||
2 | 0.90 | 0.40 | 0.05 | |||
1 | 0.45 | 0.10 | ||||
0 | 0.05 |
w | 1 | 2 | 3 | 4 | 5 | 6 |
---|---|---|---|---|---|---|
5 | 1.00 | 0.80 | 0.60 | 0.50 | 0.35 | 0.10 |
4 | 0.70 | 0.50 | 0.30 | 0.20 | 0.05 | |
3 | 0.55 | 0.35 | 0.15 | 0.05 | ||
2 | 0.45 | 0.25 | 0.05 | |||
1 | 0.30 | 0.10 | ||||
0 | 0.05 |
root | 1 | 2 | 3 | 4 | 5 |
---|---|---|---|---|---|
5 | 2 | 4 | 5 | 5 | 5 |
4 | 2 | 2 | 4 | 4 | |
3 | 2 | 2 | 3 | ||
2 | 1 | 2 | |||
1 | 1 |
从这些表中,可以形成最佳树。