动态规划:最优二叉搜索树

给定一个序列K=<{k_{1},k_{2},...,k_{n}}> 有n个有序且各不相同的键(k_{1}<k_{2}<...<k_{n}), 集合
P=<{p_{1},p_{2},...,p_{n}}>表示在K中成功的搜索的概率;D=<{d_{0},d_{1},d_{2},...,d_{n}}> 为n+1 个不同的哑键,d_{i}表示所有在k_{i}k_{i+1}之间的值,Q=<{q_{0},q_{1},q_{2},...,q_{n}}> 表示不成功的搜索的概率. 创建二叉搜索树, 使得其期望搜索花费最小。

动态规划:最优二叉搜索树_第1张图片

一个例子

动态规划:最优二叉搜索树_第2张图片

最优子结构

如果一棵最优二叉搜索树T的子树T’含有键k_{i},...,k_{j}那么这个子树T’肯定是子问题键k_{i},...,k_{j}和哑

d_{i-1},...,d_{j}的最优解。 (利用反证法证明)

动态规划:最优二叉搜索树_第3张图片

重叠子问题解决思路: 递归

动态规划:最优二叉搜索树_第4张图片

动态规划:最优二叉搜索树_第5张图片

解释为什么要加w(i,r-1)与w(r+1,j)

当一颗子树成为结点的子树时,由于每个结点的深度都增加了1,这颗子树的期望搜索代价的增加值应该为所有概率之和。

动态规划:最优二叉搜索树_第6张图片

e[1,3]=p_{2}+(e[1,1]+w(1,1))+(e[3,3]+w(3,3)) \\=0.2+(e[1,1]+0.3)+(e[3,3]+0.4)=0.2+0.3*2^{\normalsize{\textcircled{\scriptsize{1}}}\normalsize\enspace}+0.4*2^{\normalsize{\textcircled{\scriptsize{1}}}\normalsize\enspace }

{\textcircled{\scriptsize{1}}}\normalsize\enspace这个增加值才能体现该结点在搜索时对应的深度代价

计算最优费用(与计算矩阵李安乘法问题类似)

动态规划:最优二叉搜索树_第7张图片

举例使用递归解结构

动态规划:最优二叉搜索树_第8张图片

你可能感兴趣的:(算法,动态规划,递归)