数据结构之次优查找树的递推算法、查找数组中某个元素,使该元素左右两边的元素的和最接近。

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接: https://blog.csdn.net/qq_36880027/article/details/100099963

参考书籍:严蔚敏《数据结构》223页

在此仅对书上的递推过程做一个直观的呈现。

次优二叉查找树类似于折半查找法,第一次寻得使数组左右趋于平衡的节点作为根节点--->再分别寻找左右两边的根节点……就构成了一个递归过程。

i 0 1 2 3 4 5 6 7 8 9
key   A B C D E F G H I
w 0 1 1 2 5 3 4 4 3 5
sw 0 1 2 4 9 12 16 20 23 28
dw   27 25 22 15 7 0 8 15 23

如图,w为key的权值,sw为权值的累加,如D的权值累加sw(4) = w(4)+w(3)+w(2)+w(1)=sw(3)+w(4)=1+1+2+5=4+5=12;

dw的推导过程较难理解。假设D左(ABC)右(EFGHI)两边的权值和最接近,那么就有所有权值的和 - ABC权值和的两倍 - D的权值达到最小,即dw(D) = 所有权值的和 - ABC权值和的两倍 - D的权值, 可得:dw(4) = sw(9) - sw(3)*2 - w(4)。稍微变换一下,得到 dw(4) = sw(9) - sw(3) - sw(3) - w(4) = sw(9) - sw(3) - [ sw(3) + w(4) ] = sw(9) - sw(3) - sw(4)。

更一般地,令4为任意j,1为low,9为high,则有:dw(j) = sw(high) + sw(low-1) - sw(j) - sw(j-1)

sw(high) + sw(low-1)是定值,令dw = sw(high) + sw(low-1),dw = 28 + 0 = 28,那么可分别求得:

dw(1) =dw - sw(1) - sw(0) = 28 - 1 - 0 = 27

dw(2) = dw - sw(2) - sw(1) = 28 - 2 - 1 = 25

dw(3) = dw - sw(3) - sw(2) = 28 - 4 - 2 = 22

……

最终结果如上表所示。其中F的值最小,那么此二叉树的根节点便为F。以上是第一轮。接下来又要分别求F左右两边的根节点。此处仅以左边为例。

i 0 1 2 3 4 5
key   A B C D E
w 0 1 1 2 5 3
sw 0 1 2 4 9 12
dw   11 9 6 1 9

根据上面推导出来的公式:dw(j) = sw(high) + sw(low-1) - sw(j) - sw(j-1),其中dw = sw(high) + sw(low-1)。

此表中,high = 5,low = 1,dw = sw(high) + sw(low-1) = 12。特别注意此处是sw(low-1)

dw(1) =dw - sw(1) - sw(0) = 12 - 1 - 0 = 11

dw(2) = dw - sw(2) - sw(1) = 12 - 2 - 1 = 9

dw(3) = dw - sw(3) - sw(2) = 12 - 4 - 2 = 6

……

结果如上图所示,得到F的左节点为D。

以此类推,即可不断求得次优二叉查找树。推导过程如果出现负数,取绝对值。

猜你喜欢

转载自blog.csdn.net/qq_36880027/article/details/100099963