- 问题
- K(1...n) 为有序关键字序列(值有序非概率有序),对于任何一个位置 i 关键字查找的概率为Pi, 某些搜索字不存在于这些关键字之中,Qj为位于位置 j 与 j+1 之间的概率(搜索字未找到且大于位置为 j 的关键字) ;Q0为小于第一个关键字的概率,求如何组织一棵二叉查找树,使得整颗树访问数最小?
- 自顶向下的递归方法
- 设 f(i,j) 为 K(i...j)关键字i 到 j 的最优二叉查找树;w(i,j)为关键字i到j组成树的所有结点概率总和(不考虑深度);对于(i,j)之间任何一个位置为k(为根结点)的关键字,则得到公式:
- f(i,j) = min( f(i,k-1) + w(i,k-1) 「由于左子树所有结点的深度都是加了1」 + f(k+1,j) + w(k+1,j) + w(k)) = min( f(i,k-1) + f(k+1,j) +w(i,j))
- w(i,j) = sum(Pi + ... + Pj) + sum(Qi-1 + Qi + ...+ Qj) = w(i,k-1) + Pk + w(k+1,j)
- 设 f(i,j) 为 K(i...j)关键字i 到 j 的最优二叉查找树;w(i,j)为关键字i到j组成树的所有结点概率总和(不考虑深度);对于(i,j)之间任何一个位置为k(为根结点)的关键字,则得到公式:
- 自底向上的动态规划
- 存储f(i,j),w(i,j)
- 根据公式1,对于第一个关键字f(1,1) = f(1,0) + f(2,1) + w(1,1); 因为k只能等于1;
- 根据公式2, 对于第一个关键字w(1,1) = w(1,0) + P1 + w(2,1); 也是因为k只能等于1
- 所以f(1,0) = Q0 , f(2,1) = Q1; W(1,0) = Q0 ; w(2,1) = Q1; 从位置1到位置0 并没有任何实际的意义;这里纯粹为了好循环计算。同理从位置2到位置1也没有实际的意义。也可以认为关键字2到关键字1只有搜索不到且大于关键字1的概率Q1
- 存储f(i,j),w(i,j)
- 代码
- 运行结果
算法导论2 动态规划 最优二叉查找树
最新推荐文章于 2023-12-09 23:49:09 发布