百度空间 | 百度首页 
 
查看文章
 
DP归纳(改写自OIBH)最优二叉搜索树问题(BST)
2008年11月12日 星期三 下午 02:47

最优二叉搜索树问题是指已给出一株二叉树的中序遍历(或需要你全排列枚举),以及每个结点搜索概率,搜索到一层花费1,问如何安排这棵二叉树使搜索花费的期望值最小

这类问题的花费通常定义为结点权值乘以结点所在深度

p0*level(x0)+p1*(level(x1))+…pn-1*(level(xn-1)) 这里level(xi)表示数据项xi在树中对应节点的层数(深度)

它的动态模型与合并石子相当类似

F[I,J]=MIN( F[I,K-1]+F[K+1,J]+SUM[I,J] )

初值F[I,I]=A[I] F[I,J]=∞(I<J) F[I,J]=0 (I>J)

SUM[I,J]=A[I]+A[I+1]+....+A[J-1]+A[J]..

表示中序遍历从I到J,以K为根结点的最优值,可以理解为当你决定将F[I,K-1],F[K+1,J]两棵子树用K作根结点连起来时,子树的点都"多了一层",因而花费要加上SUM[I,J]

我们考虑这个问题的一个实例。我们有5个数据项,按字典序排列(A,B,C,D,E)其各自的搜索概率为(0.25,0.05,0.2,0.4,0.1)。这个例子的最优值是f(1,5)=1.9),其对应的最优二叉搜索树如图所示。

var a,s:array[0..5] of real;
    i,j,k:longint;
    f:array[0..5,0..5] of real;
begin
fillchar(f,sizeof(f),$7f);
s[0]:=0;
for i:=1 to 5 do
    begin
    read(a[i]);
    s[i]:=s[i-1]+a[i];
    f[i,i]:=a[i] ;
    end;
for i:=0 to 5 do
for j:=0 to 5 do
if i>j then
f[i,j]:=0;
for i:=5-1 downto 1 do
for j:=i+1 to 5 do
for k:=i to j do
if f[i,k-1]+f[k+1,j]+s[j]-s[i-1]<f[i,j] then
f[i,j]:= f[i,k-1]+f[k+1,j]+s[j]-s[i-1];

writeln(f[1,5]:0:1);
end.


类别:dp归纳 | 浏览() | 评论 (0)
 
最近读者:
 
网友评论:
发表评论:
姓 名:
网址或邮箱: (选填)
内 容:
验证码: 请点击后输入四位验证码,字母不区分大小写
      

     

©2009 Baidu