概述
背景
假定我们正在设计一个程序,实现英语文本到中文的翻译。对英语文本中出现的每个单词,我们需要查找对应的中文。为了实现这些操作,我们可以创建一个二叉搜索树,将n个英语单词作为关键字,对应的中文作为关联数据。
定义
给定一个n个不同关键字的已排序的序列K=<k1,k2,…,kn>,我们希望用这些关键字构造一颗二叉搜索树。对每个关键字ki,都有一个概率pi表示其搜索频率。有些要搜索的值可能不在K中,因此我们还有n+1个“伪关键字”d0,d1,d2,…dn表示不在K中的值。d0表示所有小于k1的值,dn表示所有大于kn的值,对i=1,2…,n-1,伪关键字di表示所有在ki和ki+1之间的值。对每个伪关键字di,也都有一个概率qi表示对应的搜索频率。
相关公式
基本公式
频率之和为1:
∑
i
=
1
n
p
i
+
∑
i
=
0
n
q
i
=
1
sum_{i=1}^n p_{i} + sum_{i=0}^n q_{i} = 1
∑i=1npi+∑i=0nqi=1 (15.10)
E[T中的搜索代价]:
=
∑
i
=
1
n
(
d
e
p
t
h
T
(
k
i
)
+
1
)
⋅
p
i
+
∑
i
=
0
n
(
d
e
p
t
h
T
(
d
i
)
+
1
)
⋅
q
i
= sum_{i=1}^n(depth_{T}(k_{i})+1)cdot p_{i} + sum_{i=0}^n(depth_{T}(d_{i})+1)cdot q_{i}
=∑i=1n(depthT(ki)+1)⋅pi+∑i=0n(depthT(di)+1)⋅qi
=
1
+
∑
i
=
1
n
d
e
p
t
h
T
(
k
i
)
⋅
p
i
+
∑
i
=
0
n
d
e
p
t
h
T
(
d
i
)
⋅
q
i
= 1 + sum_{i=1}^ndepth_{T}(k_{i})cdot p_{i} + sum_{i=0}^ndepth_{T}(d_{i})cdot q_{i}
=1+∑i=1ndepthT(ki)⋅pi+∑i=0ndepthT(di)⋅qi (15.11)
拓展公式
当我们选取子问题域为:求解包含关键字ki,…,kj的最优二叉搜索树,其中i>=1,j<=n且j>=i-1(当j=i-1时,子树不包含实际关键字,只包含伪关键字di-1)。定义e[ i, j]为在包含关键字ki,…,kj的最优二叉搜索树中进行一次搜索的期望代价。最终,我们希望计算出e[ 1, n]。有如下公式:
对于包含关键字ki,…,kj的子树,所有概率之和为:
w
(
i
,
j
)
=
∑
l
=
i
j
p
l
+
∑
l
=
i
−
1
j
q
l
w(i,j) = sum_{l=i}^jp_{l} + sum_{l=i-1}^jq_{l}
w(i,j)=∑l=ijpl+∑l=i−1jql (15.12)
若kr为包含关键字ki,…,kj的最优二叉搜索树的根节点,我们有如下公式:
e
[
i
,
j
]
=
p
r
+
(
e
[
i
,
r
−
1
]
+
w
(
i
,
r
−
1
)
)
+
(
e
[
r
+
1
,
j
]
+
w
(
r
+
1
,
j
)
)
e[i,j] = p_{r} + (e[i,r-1] + w(i,r-1)) + (e[r+1,j] + w(r+1,j))
e[i,j]=pr+(e[i,r−1]+w(i,r−1))+(e[r+1,j]+w(r+1,j))
注意
w
(
i
,
j
)
=
w
(
i
,
r
−
1
)
+
p
r
+
w
(
r
+
1
,
j
)
w(i,j) = w(i,r-1) + p_{r} + w(r+1,j)
w(i,j)=w(i,r−1)+pr+w(r+1,j)
因此e[i, j]可重写为:
e
[
i
,
j
]
=
e
[
i
,
r
−
1
]
+
e
[
r
+
1
,
j
]
+
w
(
i
,
j
)
e[i,j] = e[i,r-1]+e[r+1,j]+w(i,j)
e[i,j]=e[i,r−1]+e[r+1,j]+w(i,j) (15.13)
递归公式(15.13)假定我们知道哪个节点k应该作为根节点。如果选取期望搜索代价最低者作为根节点,可得最终递归公式:
e
[
i
,
j
]
=
q
i
−
1
e[i,j] = q_{i-1}
e[i,j]=qi−1 ,若 j = i - 1
$= min_{ileq rleq j}left{ e[i,r-1]+e[r+1,j]+w(i,j)right} $ ,若i<=j (15.14)
为了避免重新计算w(i,j),对于 j>=i 的情况,可如下计算:
w
[
i
,
j
]
=
w
[
i
,
j
−
1
]
+
p
j
+
q
j
w[i,j] = w[i,j-1]+p_{j}+q_{j}
w[i,j]=w[i,j−1]+pj+qj (15.15)
相关算法
应用动态规划的算法optimalBST
伪代码
下面的伪代码接受概率列表 p1,…,pn 和 q0,…,qn 及规模 n 作为输入,返回表 e 和 root。
optimalBST(p,q,n)
let e[1..n+1,0..n],w[1..n+1,0..n],and root[1..n,1..n]be new tables
for i=1 to n+1
e[i,i-1] = q[i-1]
w[i,i-1] = q[i-1]
for l=1 to n
for i=1 to n-l+1
j = i+l-1
e[i,j] = MAX_INT
w[i,j] = w[i,j-1]+p[j]+q[j]
for r=i to j
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
最后
以上就是悲凉斑马为你收集整理的15.5 最优二叉搜索树(笔记)背景定义相关公式相关算法的全部内容,希望文章能够帮你解决15.5 最优二叉搜索树(笔记)背景定义相关公式相关算法所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复