问题是动态编程;构造最优二叉搜索树(OBST)。我理解一般的动态编程和特别是这个问题的概念,但我不理解这个问题的递归形式。
我知道我们正在为这些节点的增加子集构建最佳二叉搜索树,并在我们继续进行时将答案保存在表中以避免重新计算。当你在a_ {k}根树时,我也得到了这一点,所有来自a_ {1}到a_ {k-1}的成功节点以及它们对应的虚构不成功节点(即树的叶子)都在左子树,然后右子树中的子树是a_ {k + 1}到a_ {n}。
这是我不理解的等式的递归形式:
c(i,j)= min(i< k< = j){c(i,k-1)+ c(k,j)+ p(k)+ w(i,k-1) )+ w(k + j)}
其中w(i,j)= q(i)+从i + 1到j的总和(q(l)+ p(l))。
所以在c(i,j)中,从左到右,我们有左子树的成本+右子树的成本+成功搜索root + w(i,k-1)+ w(k +)的概率j)的
我的困惑是c(i,k-1)与w(i,k-1)的区别。
文本是Horowitz,Sahni和Rajasekeran的计算机算法,但我也读过OBST上的CLRS并在网上搜索,我所遇到的任何内容都没有很好地解释这些部分之间的差异。
答案 0 :(得分:8)
c(i,j)表示搜索包含密钥ki,...,kj的最佳二叉搜索树的预期成本。 w(i,j)表示包含密钥ki,...,kj的子树的概率和。对于公式:
c(i, j) = min (i < k <= j) {c(i, k-1) + c(k, j) + p(k) + w(i, k-1) + w(k,j)}
如果我们选择密钥k作为根,则c(i,k-1)+ w(i,k-1)重新表示左子树的成本。
c(k,j)+ w(k,j)表示右子树的成本。
p(k)表示根k的成本。
请注意:如果我们选择键k作为根,则左子树包含键ki,...,k(k-1),右子树包含kyes k(k + 1),...,kj。但我们不能简单地说:
c(i,j)=min (i < k <= j) {c(i, k-1) + c(k, j) + p(k)}
因为当我们为根选择密钥k时,生成的子树的深度加1.因此c(i,k-1)+ w(i,k-1)将是左边的正确成本子树!
答案 1 :(得分:2)
这是计算特定深度节点的频率*深度的一种微妙方法。
每次将节点评估为根时,在总结其左(或右)子树的同时,添加频率总和以增加所有子节点的深度。
例如,假设节点'A','B'和'C',其中'A'是根,'B'是'A'的子节点而'C'是'B'的子节点。 (没有合适的孩子可以简化事情。)
以自下而上的方式,将叶子'C'作为根:
cost is Pr(C) = freqC*1 (no children)
以'B'作为root:
cost = Pr(B) + Cost[C,C] + sum of children freq
= freqB*1 + freqC*1 + freqC*1
= freqB*1 + freqC*2
where Pr(B) = freqB*1
Cost[C,C] = freqC*1
sum of children freq = freqC*1
最后,以'A'为根:
cost = Pr(A) + Cost[C,B] + sum of children freq
= freqA*1 + freqB*1 + freqC*2 + freqB*1 + freqC*1
= freqA*1 + freqB*2 + freqC*3
where Pr(A) = freqA*1
Cost[C,B] = freqB*1 + freqC*2
sum of children freq = freqB*1 + freqC*1