最优二分搜索树问题
对于一个给定的序列,{b0,a1,b1……an,bn},其中a1,a2……an是实节点,b0,b1,b2……bn是虚节点(就是二分搜索树最终找不到实节点的范围),如何找出并构建一个总耗费最小的二分搜索树?
问题分析
最优二分搜索树的左、右子树也一定是最优二分搜索树。该问题具有最优子结构且子问题重复性,符合动态规划的特性。
故利用动态规划的思想来解此问题。
1.描述最优解结构
目标:
虚节点{b0, b1…… ,bn}和实节点{ a1,a2 ……an }构成树T1n,找出并构建总耗费最小的二分搜索树。
分析:
虚节点{bi-1, bi…… ,bj}和实节点{ ai,ai+1 ……aj }构成以ak为根的二叉树Tij的查找总耗费最小
左子树Ti,k-1由虚节点{bi-1, bi…… ,bk-1}和实节点{ ai,ai+1 ……ak-1 }构成
右子树Tk+1,j由虚节点{bk, bk+1… ,bj}和实节点{ ak+1, ……aj }构成
2.递归地定义最优值(写出状态转移方程)
T[i][j] 由实节点a1…an 和虚节点 b0…bn构成,ak即为根结点
dp[i][j]:T[i][j]的最优查询总耗费,1<=i<=n+1,0<=j<=n,故dp[ ][ ]的长度为n&