0020算法笔记动态规划最优二叉搜索树问题Word文档下载推荐.docx
《0020算法笔记动态规划最优二叉搜索树问题Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《0020算法笔记动态规划最优二叉搜索树问题Word文档下载推荐.docx(18页珍藏版)》请在冰豆网上搜索。
在一个表示S的二叉树T中,设存储元素Xi的结点深
度为Ci;
叶结点(xj,xj+0的结点深度为dj。
nn
厂孕(1+处剳同
注:
在检索过程中,每进行一次比较,就进入下面一层,对于成功的检索,比较的次数就是所在的层数加1。
对于不成功的检索,被检索的关键码属于那个外部结点代表的可能关键码集合,比较次数就等于此外部结点的层数。
对于图的内结点而言,第0层需要比较操作次数为1,第1层需要比较2次,第2层需要3次。
p表示在二叉搜索树T中作一次搜索所需的平均比较次数。
P又称
为二叉搜索树T的平均路长,在一般情况下,不同的二叉搜索树的平均
路长是不同的。
对于有序集S及其存取概率分布(ao,b1,a1,bn,an),
在所有表示有序集S的二叉搜索树中找出一棵具有最小平均路长的二叉搜索树。
设Pi是对ai检索的概率。
设qi是对满足ai<
X<
ai+1,0<
=i<
=n的标
识符X检索的概率,(假定a0=-—^且an+1=+^)。
对于有n个关键码的集合,其关键码有n!
种不同的排列,可构成的不同二叉搜索树有瓏+1"
棵。
(n个结点的不同二叉树,卡塔兰数)。
如何评价这些二叉搜索树,可以用树的搜索效率来衡量。
例如:
标识符集{1,
2,3}={do,if,stop}可能的二分检索树为:
(a)(b)
若P1=0.5,P2=0.1,P3=0.05,q0=0.15,q1=0.1,q2=0.05,q3=0.05
求每棵树的平均比较次数(成本)。
Pa(n)=1Xp1+2p2+3和3+1qo+2Xq1+3Xq2+q3)=1
Pa(n)=1.5O
0.5+2)0.1+30^05+1区05+2>
0.1+3«
0.05+0.05)=1.5
Pb(n)=1
Xp1+2
p3+3
祁2+1
q0+2>
q3+3«
q1+q2)=1
X
0.5+2)0.05+3
。
为+1
0<
15+2>
0.05+30.1+0.05)=1.6
Pc(n)=1
Xp2+2
(p1+
p3)+2
(q0+q1+q2
+q3)=10.1+2
(0.5+0.05)
+2(0.15+0.1+0.05+0.05)=1.9
Pd(n)=1
Xp3+2
莎1+3
q3+2>
q0
+3和1+q2)=1
0.05+2
区5+3
0.1+1
0^5+2
0.15+3
(0.1+0.05)=2.15
Pe(n)=1
p2+3
>
p1+1
q2
+3和0+q1)=1
K1+3
区5+1
0d5+3
(0.15+0.1)=2.85
因此,上例中的最小平均路长为
可以得出结论:
结点在二叉搜索树中的层次越深,需要比较的次数就越多,因此
要构造一棵最小二叉树,一般尽量把搜索概率较高的结点放在较高的层次。
2、最优子结构性质:
假设选择k为树根,则1,2,…,-1和ao,a1,…,on都将位于左
子树L上,其余结点(k+1,…,n和ak,ak+i,…,a)位于右子树R上。
设COST(L)和COST(R)分别是二分检索树T的左子树和右子树的成
若T
本。
则检索树T的成本是:
P(k)+COST(L)+COST(R)+
是最优的,则上式及COST(L)和COST(R)必定都取最小值。
证明:
二叉搜索树T的一棵含有顶点Xi,…,Xj和叶顶点(xi-1,
Xi),••,•(Xj,Xj+1)的子树可以看作是有序集{Xi,•,Xj}关于全集为{Xi-1,
Xj+1}的一棵二叉搜索树(T自身可以看作是有序集)。
根据S的存取分
布概率,在子树的顶点处被搜索到的概率是:
i<
kij{Xi,…,Xj}的存储概率分布为{ai-1,bi,…,
bj,aj},其中,ah,bk分别是下面的条件概率:
瓦=加/%i£
k<
j;
5^=鶴/\片・U幻'
Zo
设Tij是有序集{xi,…,Xj}关于存储概率分布为{ai-1,bi,…,baj}的一
棵最优二叉搜索树,其平均路长为pij,Tij的根顶点存储的元素Xm,其左
子树Tl和右子树Tr的平均路长分别为Pl和Pr。
由于Tl和Tr中顶点深度是它们在Tij中的深度减1,所以得到:
左子樹
(右子树、
{的搜索丿
叫Pij=n(P£
+1丿+⑷脱++1丿
=5+叫卄1刃+'
4心几
由于Ti是关于集合{Xi,•,Xm-1}的一棵二叉搜索树,故Pl>
=Pi,m-1。
若Pl>
Pi,m-1,贝y用Ti,m-1替换Tl可得到平均路长比Tij更小的二叉搜索树。
这与Tij是最优二叉搜索树矛盾。
故Ti是一棵最优二叉搜索树。
同理可证
Tr也是一棵最优二叉搜索树。
因此最优二叉搜索树问题具有最优子结构
性质。
3、递推关系:
根据最优二叉搜索树问题的最优子结构性质可建立计算pij的递归
式如下:
叫jPij=⑰+(殳;
专山41+叫i<
J
t)..1=01V/M打
初始时:
如75
记wi,jpi,j为m(i,j),则m(1,n)二wi,npi,n=pi,n为所求的最优值。
计算m(i,j)
的递归式为:
川(A7)=、耳了+mill斤一1)+ni{k+1,/)},i£
°
i<
j
川亿f-1)=ai=12
4、求解过程:
Ttn+1][n]
1)没有内部节点时,构造T[1][0],T[2][1],T[3][2]
2)构造只有1个内部结点的最优二叉搜索树T[1][1],T[2][2]
T[n][n],可以求得m[i][i]同时可以用一个数组存做根结点元素为:
T[n][n],
(起止下标的差)
T[1][1],T[2][2]
n-1T[1][n]
具体代码如下:
[cpp]viewplaincopy
//3d11-1最优二叉搜索树动态规划
#include"
stdafx.h"
#include<
iostream>
usingnamespacestd;
double**w);
9.
void
Traceback(intn,inti,intj,int
10.
11.
int
main()
12.
{
13.
double
a[]={0.15,0.1,0.05,0.05};
14.
b[]={0.00,0.5,0.1,0.05};
15.
16.
coutvv
"
有序集的概率分布为:
vvendl;
17.
for(int
i=0;
ivN+1;
i++)
18.
19.
a"
vvivv"
="
vva[i]vv"
b"
20.
}
21.
22.
**m=newdouble*[N+2];
23.
int**s
=newint*[N+2];
24.
**w=newdouble*[N+2];
25.
26.
ivN+2;
i++)
27.
28.
m[i]=
newdouble[N+2];
29.
s[i]=
newint[N+2];
30.
w[i]=
31.
32.
33.
OptimalBinarySearchTree(a,b,N,m,s,w);
34.
二叉搜索树最小平均路长为:
--
35.
构造的最优二叉树为:
36.
Traceback(N,1,N,s,0,'
O'
);
37.
38.
39.
40.
deletem[i];
41.
deletes[i];
42.
deletew[i];
43.
44.
delete
[]m;
45.
[]s;
46.
[]w;
47.
return
0;
voidOptimalBinarySearchTree(
8.
<
"
vvb[i]vvendl;
vvm[1][N]vvendl;
**s,intf,charch);
doublea[],doubleb[],intn,double**m,int**s,
50.voidOptimalBinarySearchTree(
doublea[],doubleb[],
double**w)
51.
52.
//初始化构造无内部节点的情况
53.
for(inti=0;
=n;
54.
55.
w[i+1][i]=a[i];
56.
m[i+1][i]=0;
57.
58.
59.
for(intr=0;
r<
n;
叶+)
//r代表起止下标的差
60.
61.
for(inti=1;
=n-r;
i++)//i为起始元素下标
62.
63.
intj=i+r;
//j
为终止元素下标
64.
65.
//构造T[i][j]
填写w[i][j],m[i][j],s[i][j]
66.
//首选i作为根,
其左子树为空,右子树为节点
67.
w[i][j]=w[i][j-1]+a[j]+b[j];
68.
m