📜  DAA-最佳成本二元搜索树

📅  最后修改于: 2021-01-12 03:37:35             🧑  作者: Mango


二进制搜索树(BST)是其中键值存储在内部节点中的树。外部节点为空节点。键按字典顺序排序,即,对于每个内部节点,左子树中的所有键都小于节点中的键,而右子树中的所有键都较大。

当我们知道搜索每个键的频率时,很容易计算访问树中每个节点的预期成本。最佳的二叉搜索树是BST,它具有最小的定位每个节点的预期成本

BST中元素的搜索时间为O(n) ,而Balanced-BST中元素的搜索时间为O(log n) 。同样,可以在“最佳成本二元搜索树”中缩短搜索时间,将最常用的数据放置在根中并更靠近根元素,同时将最不常用的数据放置在叶附近和叶中。

这里,提出了最佳二叉搜索树算法。首先,我们从一组提供的n个不同的键1 ,k 2 ,k 3 ,… k n >中构建BST。在这里,我们假设访问密钥K i的概率为p i 。添加了一些伪密钥( d 0 ,d 1 ,d 2 ,… d n ),因为可能会执行一些对于密钥集K中不存在的值的搜索。我们假设,对于每个虚拟密钥d i ,访问的概率为q i

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

从这些表中,可以形成最佳树。