动态规划:最优二分检索树

1. 二分检索树的性能

在这里插入图片描述
能成功检索的关键字是绿色的,即ai,不能成功被检索的关键字是红色的,即Ei,假设他们按从小到大排列。他们被检索的概率分别是P(i)Q(i)

在这里插入图片描述

level(ai)为第i内个节点所在深度,level(Ei)为第i外个节点所在深度。

能使
∑ 1 ≤ i ≤ n P ( i ) ∗ level ⁡ ( a i ) + ∑ 0 ≤ i ≤ n Q ( i ) ∗ ( level ⁡ ( E i ) − 1 ) \sum_{1 \leq i \leq n} \mathrm{P}(\mathrm{i}) * \operatorname{level}\left(a_{i}\right)+\sum_{0 \leq \mathrm{i} \leq \mathrm{n}} \mathrm{Q}(\mathrm{i}) *(\operatorname{level}(E i)-1) 1inP(i)level(ai)+0inQ(i)(level(Ei)1)

取值最小的二分检索树为最优二分检索树。

上图二分检索树的代价为P(2)*1 + P(1)*2 + P(4)*2 + P(3)*3 + P(5)*3 + Q(0)*2 + Q(1)*2 + Q(2)*3 + Q(3)*3 + Q(4)*3 + Q(5)*3

2.多阶段决策

将最优二叉检索树的构造,看作一个多阶段决策过程。第i个阶段要决策怎样构造一个共有i个内节点的二叉检索树。即第一个阶段,找出所有只有1个内节点的检索树,第二个阶段,找出所有有2个节点的检索树,第三阶段,找出所有3个节点的检索树。注意,第i个阶段,依赖于第i-1个阶段,体现在当节点数增加1时,要怎样调整树根,才能保证是最优二叉检索树。也就是说,第i个阶段要遍历所有节点,其左子树和右子树的装配来自于第i-1个阶段已经决策好的最优检索树,找到总成本最小的一种情况

记原始问题为 T 0 n T_{0n} T0n,即要构造 E 0 , a 1 , E 1 , . . . , a n , E n E_0, a_1, E_1, ..., a_n, E_n E0,a1,E1,...,an,En 2 n + 1 2n+1 2n+1个节点的最优二分检索树。

C ( i , j ) C(i, j) C(i,j) T i j ( E i , a i , E i + 1 , . . . , a j , E j ) T_{ij}(E_i, a_i, E_{i+1}, ..., a_j, E_j) Tij(Ei,ai,Ei+1,...,aj,Ej)的检索成本。则原问题 T 0 n T_{0n} T0n的检索成本为 C ( 0 , n ) C(0, n) C(0,n)

那么第 n n n阶段的决策过程,就是确定一个树根 A K A_K AK,使 C ( 0 , n ) = m i n { A k } C(0, n)=min\{A_k\} C(0,n)=min{Ak},他表示以 A k A_k Ak为根,左右子树均来自于第 n − 1 n-1 n1个阶段已经确定的最优二叉检索树的成本。

3.左右子树的成本

a k a_k ak为根,其左右子树的成本分别为 C ( 0 , k − 1 ) C(0, k-1) C(0,k1) C ( k , n ) C(k, n) C(k,n)
在这里插入图片描述
COST ⁡ ( L ) = ∑ 1 ≤ i < k P ( i ) ∗ level ⁡ ( a i ) + ∑ 0 ≤ i < k Q ( i ) ∗ ( level ⁡ ( E i ) − 1 ) COST ⁡ ( R ) = ∑ k < i ≤ n P ( i ) ∗ level ⁡ ( a i ) + ∑ k ≤ i ≤ n Q ( i ) ∗ ( level ⁡ ( E i ) − 1 ) \begin{array}{l} \operatorname{COST}(L)=\sum_{1 \leq i<k} P(i)^{*} \operatorname{level}\left(a_{i}\right)+\sum_{0 \leq i<k} Q(i)^{*}\left(\operatorname{level}\left(E_{i}\right)-1\right) \\ \operatorname{COST}(R)=\sum_{k<i \leq n} P(i) * \operatorname{level}\left(a_{i}\right)+\sum_{k \leq i \leq n} Q(i)^{*}\left(\operatorname{level}\left(E_{i}\right)-1\right) \end{array} COST(L)=1i<kP(i)level(ai)+0i<kQ(i)(level(Ei)1)COST(R)=k<inP(i)level(ai)+kinQ(i)(level(Ei)1)

4. 递推公式

以上只求出了左右子树的成本,其中的 l e v e l ( ) level() level()都是以子树为标准测定的,而要把子树装配到 a k a_k ak上形成原始的二分检索树,需要再加上左右子树所有节点的概率和ak的概率P(k),即所有节点的概率和,1

所以此二叉搜索树的代价为:
C O S T ( T ) = C O S T ( L ) + C O S T ( R ) + ∑ 0 ≤ i ≤ n Q ( i ) + ∑ 1 ≤ i ≤ n ( i ! = k ) P ( i ) + P ( k ) = C O S T ( L ) + C O S T ( R ) + ∑ 0 ≤ i ≤ n Q ( i ) + ∑ 1 ≤ i ≤ n P ( i ) = C O S T ( L ) + C O S T ( R ) + 1 COST(T) = COST(L)+COST(R)+ \sum_{0 \leq i \leq n} {Q(i)}+\sum_{1 \leq i \leq n (i!=k)} {P(i)} + P(k)\\ =COST(L)+COST(R)+ \sum_{0 \leq i \leq n} {Q(i)}+\sum_{1 \leq i \leq n} {P(i)} \\ =COST(L)+COST(R)+1 COST(T)=COST(L)+COST(R)+0inQ(i)+1in(i!=k)P(i)+P(k)=COST(L)+COST(R)+0inQ(i)+1inP(i)=COST(L)+COST(R)+1

所以原问题转化为:

C ( 0 , n ) = m i n 1 ≤ k ≤ n { C ( 0 , k − 1 ) + C ( k , n ) + 1 } C(0, n)=min_{1\leq k \leq n}\{C(0, k-1)+C(k, n)+1\} C(0,n)=min1kn{C(0,k1)+C(k,n)+1}

类比原问题,那么任意 i i i j j j的节点,其最优二叉搜索树的成本为:

C ( i , j ) = m i n i < k ≤ j { C ( i , k − 1 ) + C ( k , j ) + Q ( i ) + ∑ i < r ≤ j [ P ( r ) + Q ( r ) ] } C(i, j)=min_{i< k \leq j}\{C(i, k-1)+C(k, j)+Q(i)+\sum_{i<r\leq j}{[P(r)+Q(r)]} \} C(i,j)=mini<kj{C(i,k1)+C(k,j)+Q(i)+i<rj[P(r)+Q(r)]}

W ( i , j ) = Q ( i ) + ∑ i < r ≤ j [ P ( r ) + Q ( r ) ] W(i, j)=Q(i)+\sum_{i<r\leq j}{[P(r)+Q(r)]} W(i,j)=Q(i)+i<rj[P(r)+Q(r)]

C ( i , j ) = min ⁡ i < k ≤ j { C ( i , k − 1 ) + C ( k , j ) + W ( i , j ) } C(i, j)=\min_{i< k \leq j}\{C(i, k-1)+C(k, j)+W(i, j) \} C(i,j)=i<kjmin{C(i,k1)+C(k,j)+W(i,j)}

至此,递推公式求解完成。

5. 例题

在这里插入图片描述
在这里插入图片描述

初始状态:
W ( i , i ) = Q ( i ) 表 示 初 始 化 未 成 功 检 索 节 点 E i W(i, i)=Q(i)表示初始化未成功检索节点E_i W(i,i)=Q(i)Ei C ( 0 , 0 ) = 0 表 示 无 成 本 C(0, 0)=0表示无成本 C(0,0)=0 R ( 0 , 0 ) = 0 表 示 空 树 R(0, 0)=0表示空树 R(0,0)=0

W ( i , j ) = Q ( i ) + ∑ i < r ≤ j [ P ( r ) + Q ( r ) ] = Q ( i ) + ∑ i < r < j [ P ( r ) + Q ( r ) ] + P ( j ) + Q ( j ) = W ( i , j − 1 ) + P ( j ) + Q ( j ) W(i, j)=Q(i)+\sum_{i<r\leq j}{[P(r)+Q(r)]} \\ =Q(i)+\sum_{i<r< j}{[P(r)+Q(r)]+P(j)+Q(j)} \\ =W(i, j-1)+P(j)+Q(j) W(i,j)=Q(i)+i<rj[P(r)+Q(r)]=Q(i)+i<r<j[P(r)+Q(r)]+P(j)+Q(j)=W(i,j1)+P(j)+Q(j)

先算 W W W

第0阶段

初始化所有未成功检索的节点:

W ( 0 , 0 ) = Q ( 0 ) = 2 W(0, 0)=Q(0)=2 W(0,0)=Q(0)=2 W ( 1 , 1 ) = Q ( 1 ) = 3 W(1, 1)=Q(1)=3 W(1,1)=Q(1)=3 W ( 2 , 2 ) = Q ( 2 ) = 1 W(2, 2)=Q(2)=1 W(2,2)=Q(2)=1 W ( 3 , 3 ) = Q ( 3 ) = 1 W(3, 3)=Q(3)=1 W(3,3)=Q(3)=1 W ( 4 , 4 ) = Q ( 4 ) = 1 W(4, 4)=Q(4)=1 W(4,4)=Q(4)=1

第1阶段

W ( 0 , 1 ) = W ( 0 , 0 ) + P ( 1 ) + Q ( 1 ) = 2 + 3 + 3 = 8 W(0, 1)=W(0, 0)+P(1)+Q(1)=2+3+3=8 W(0,1)=W(0,0)+P(1)+Q(1)=2+3+3=8

W ( 1 , 2 ) = W ( 1 , 1 ) + P ( 2 ) + Q ( 2 ) = 3 + 3 + 1 = 7 W(1, 2)=W(1,1)+P(2)+Q(2)=3+3+1=7 W(1,2)=W(1,1)+P(2)+Q(2)=3+3+1=7

W ( 2 , 3 ) = W ( 2 , 2 ) + P ( 3 ) + Q ( 3 ) = 1 + 1 + 1 = 3 W(2, 3)=W(2,2)+P(3)+Q(3)=1+1+1=3 W(2,3)=W(2,2)+P(3)+Q(3)=1+1+1=3

W ( 3 , 4 ) = W ( 3 , 3 ) + P ( 4 ) + Q ( 4 ) = 1 + 1 + 1 = 3 W(3, 4)=W(3, 3)+P(4)+Q(4)=1+1+1=3 W(3,4)=W(3,3)+P(4)+Q(4)=1+1+1=3

第2阶段

W ( 0 , 2 ) = W ( 0 , 1 ) + P ( 2 ) + Q ( 2 ) = 8 + 3 + 1 = 12 W(0, 2)=W(0, 1)+P(2)+Q(2)=8+3+1=12 W(0,2)=W(0,1)+P(2)+Q(2)=8+3+1=12

W ( 1 , 3 ) = W ( 1 , 2 ) + P ( 3 ) + Q ( 3 ) = 7 + 1 + 1 = 9 W(1, 3)=W(1,2)+P(3)+Q(3)=7+1+1=9 W(1,3)=W(1,2)+P(3)+Q(3)=7+1+1=9

W ( 2 , 4 ) = W ( 2 , 3 ) + P ( 4 ) + Q ( 4 ) = 3 + 1 + 1 = 5 W(2, 4)=W(2,3)+P(4)+Q(4)=3+1+1=5 W(2,4)=W(2,3)+P(4)+Q(4)=3+1+1=5

第3阶段

W ( 0 , 3 ) = W ( 0 , 2 ) + P ( 3 ) + Q ( 3 ) = 12 + 1 + 1 = 14 W(0, 3)=W(0, 2)+P(3)+Q(3)=12+1+1=14 W(0,3)=W(0,2)+P(3)+Q(3)=12+1+1=14

W ( 1 , 4 ) = W ( 1 , 3 ) + P ( 4 ) + Q ( 4 ) = 9 + 1 + 1 = 11 W(1, 4)=W(1,3)+P(4)+Q(4)=9+1+1=11 W(1,4)=W(1,3)+P(4)+Q(4)=9+1+1=11

第4阶段

W ( 0 , 4 ) = W ( 0 , 3 ) + P ( 4 ) + Q ( 4 ) = 14 + 1 + 1 = 16 W(0, 4)=W(0, 3)+P(4)+Q(4)=14+1+1=16 W(0,4)=W(0,3)+P(4)+Q(4)=14+1+1=16

再算 C C C R R R

第0阶段(空树)

C ( 0 , 0 ) = R ( 0 , 0 ) = 0 C(0, 0)=R(0, 0)=0 C(0,0)=R(0,0)=0

C ( 1 , 1 ) = R ( 1 , 1 ) = 0 C(1, 1)=R(1,1)=0 C(1,1)=R(1,1)=0

C ( 2 , 2 ) = R ( 2 , 2 ) = 0 C(2, 2)=R(2,2)=0 C(2,2)=R(2,2)=0

C ( 3 , 3 ) = R ( 3 , 3 ) = 0 C(3, 3)=R(3,3)=0 C(3,3)=R(3,3)=0

C ( 4 , 4 ) = R ( 4 , 4 ) = 0 C(4, 4)=R(4,4)=0 C(4,4)=R(4,4)=0

第1阶段(只有1个节点)

C ( 0 , 1 ) = W ( 0 , 1 ) = 8 , R ( 0 , 1 ) = 1 C(0, 1)=W(0,1)=8, R(0, 1)=1 C(0,1)=W(0,1)=8,R(0,1)=1

C ( 1 , 2 ) = W ( 1 , 2 ) = 7 , R ( 1 , 2 ) = 2 C(1, 2)=W(1,2)=7, R(1, 2)=2 C(1,2)=W(1,2)=7,R(1,2)=2

C ( 2 , 3 ) = W ( 2 , 3 ) = 3 , R ( 2 , 3 ) = 3 C(2, 3)=W(2,3)=3, R(2, 3)=3 C(2,3)=W(2,3)=3,R(2,3)=3

C ( 3 , 4 ) = W ( 3 , 4 ) = 3 , R ( 3 , 4 ) = 4 C(3, 4)=W(3,4)=3, R(3, 4)=4 C(3,4)=W(3,4)=3,R(3,4)=4

第2阶段(2个节点)

C ( 0 , 2 ) = W ( 0 , 2 ) + min ⁡ 0 < k ≤ 2 { C ( 0 , 0 ) + C ( 1 , 2 ) , C ( 0 , 1 ) + C ( 2 , 2 ) } = 12 + min ⁡ { 7 , 8 } = 19 , R ( 0 , 2 ) = 1 C(0,2)=W(0,2)+\min_{0<k\leq{2}}{\{C(0,0)+C(1,2), C(0,1)+C(2,2)\}}=12+\min{\{7,8\}}=19, R(0,2)=1 C(0,2)=W(0,2)+0<k2min{C(0,0)+C(1,2),C(0,1)+C(2,2)}=12+min{7,8}=19,R(0,2)=1

C ( 1 , 3 ) = W ( 1 , 3 ) + min ⁡ 1 < k ≤ 3 { C ( 1 , 1 ) + C ( 2 , 3 ) , C ( 1 , 2 ) + C ( 3 , 3 ) } = 9 + min ⁡ { 3 , 7 } = 12 , R ( 1 , 3 ) = 2 C(1,3)=W(1,3)+\min_{1<k\leq{3}}{\{C(1,1)+C(2,3), C(1,2)+C(3,3)\}}=9+\min{\{3,7\}}=12, R(1, 3)=2 C(1,3)=W(1,3)+1<k3min{C(1,1)+C(2,3),C(1,2)+C(3,3)}=9+min{3,7}=12,R(1,3)=2

C ( 2 , 4 ) = W ( 2 , 4 ) + min ⁡ 2 < k ≤ 4 { C ( 2 , 2 ) + C ( 3 , 4 ) , C ( 2 , 3 ) + C ( 4 , 4 ) } = 5 + min ⁡ { 3 , 4 } = 8 , R ( 2 , 4 ) = 3 C(2,4)=W(2,4)+\min_{2<k\leq{4}}{\{C(2,2)+C(3,4), C(2,3)+C(4,4)\}}=5+\min{\{3,4\}}=8, R(2,4)=3 C(2,4)=W(2,4)+2<k4min{C(2,2)+C(3,4),C(2,3)+C(4,4)}=5+min{3,4}=8,R(2,4)=3

第3阶段(3个节点)

C ( 0 , 3 ) = W ( 0 , 3 ) + min ⁡ 0 < k ≤ 3 { C ( 0 , 0 ) + C ( 1 , 3 ) , C ( 0 , 1 ) + C ( 2 , 3 ) , C ( 0 , 2 ) + C ( 3 , 3 ) } = 14 + min ⁡ { 12 , 11 , 19 } = 25 , R ( 0 , 3 ) = 2 C(0,3)=W(0,3)+\min_{0<k\leq{3}}{\{C(0,0)+C(1,3), C(0,1)+C(2,3),C(0,2)+C(3,3)\}}=14+\min{\{12,11, 19\}}=25, R(0,3)=2 C(0,3)=W(0,3)+0<k3min{C(0,0)+C(1,3),C(0,1)+C(2,3)C(0,2)+C(3,3)}=14+min{12,11,19}=25,R(0,3)=2

C ( 1 , 4 ) = W ( 1 , 4 ) + min ⁡ 1 < k ≤ 4 { C ( 1 , 1 ) + C ( 2 , 4 ) , C ( 1 , 2 ) + C ( 3 , 4 ) , C ( 1 , 3 ) + C ( 4 , 4 ) } = 11 + min ⁡ { 8 , 10 , 12 } = 19 , R ( 1 , 4 ) = 2 C(1,4)=W(1,4)+\min_{1<k\leq{4}}{\{C(1,1)+C(2,4),C(1,2)+C(3,4), C(1,3)+C(4,4)\}}=11+\min{\{8,10,12\}}=19, R(1, 4)=2 C(1,4)=W(1,4)+1<k4min{C(1,1)+C(2,4),C(1,2)+C(3,4),C(1,3)+C(4,4)}=11+min{8,10,12}=19,R(1,4)=2

第4阶段(4个节点)

C ( 0 , 4 ) = W ( 0 , 4 ) + min ⁡ 0 < k ≤ 4 { C ( 0 , 0 ) + C ( 1 , 4 ) , C ( 0 , 1 ) + C ( 2 , 4 ) , C ( 0 , 2 ) + C ( 3 , 4 ) , C ( 0 , 3 ) + C ( 4 , 4 ) } = 16 + min ⁡ { 19 , 16 , 22 , 25 } = 32 , R ( 0 , 4 ) = 2 C(0,4)=W(0,4)+\min_{0<k\leq{4}}{\{C(0,0)+C(1,4), C(0,1)+C(2,4),C(0,2)+C(3,4), C(0,3)+C(4,4)\}}=16+\min{\{19,16,22,25\}}=32, R(0,4)=2 C(0,4)=W(0,4)+0<k4min{C(0,0)+C(1,4),C(0,1)+C(2,4)C(0,2)+C(3,4),C(0,3)+C(4,4)}=16+min{19,16,22,25}=32,R(0,4)=2

树的形态
最终决策为R(0,4)=2,表示最优二叉检索树以a2为根节点,其左子树为T01,右子树为T24。查看C(0,1)对应的决策,发现R(0,1)=1,说明该节点为a1,查看C(2,4)对应的决策,发现R(2,4)=3,说明其右子树以a3为根节点。a3的左子树为T22,右子树为T34,说明a3左子树为未成功检索,右子树为a4

其最终形态:
在这里插入图片描述

  • 43
    点赞
  • 139
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 9
    评论
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

伯明翰谢老二

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值