最优二叉搜索树问题

山椒π 2009-09-16 09:12:45
最优二叉搜索树(Optimal BST,Optimal Binary Search Tree)
二叉搜索树是一颗满足如下条件的树:
1.每个节点包含一个键值
2.每个节点有最多两个孩子
3.对于任意两个节点x和y,它们满足下述搜索性质:
a)如果y在x 的左子树里,则key[y]<=key[x]
b)如果y在x的右子树里,则key[y]>=key[x]

而最优二叉搜索树则整个搜索成本最低的二叉搜索树。具体来说就是:给定键值序列 K = <k1, k2, . . . , kn>,k1 < k2 <· · · < kn,其中键值ki,被搜索的概率为pi,要求以这些键值构建一颗二叉搜索树T,使得搜索的期望成本最低(搜索成本为检查的节点数)。

对于键值ki, 如果其在构造的二叉搜索树里的深度(离开树根的分支数)为depthT(ki),则搜索该键值的成本= depthT(ki) +1(需要加上深度为0的树根节点)。由于每个键值被搜索的概率分别为pi,i=1,2,3…,n。我们有:

E[T的搜索成本] = Si=1, n(depthT(ki) +1) · pi

假定每次搜索都是针对二叉搜索树里面存在的某个节点,请:

1.证明用穷举法构造最优二叉搜索树的时间成本为W(4n/n3/2)。
2.假定我们有6个键值:k1、k2、k3、k4、k5、k6,它们被搜索的概率分别如下:

节点
k1
k2
k3
k4
k5
k6
被搜概率
0.24
0.18
0.09
0.13
0.3
0.06

请使用动态规划算法,编写程序计算w、e和root三张表,打印在屏幕上,并在屏幕上画出最优二叉搜索树。下面是我们的动态规划算法的伪代码实现:

OPTIMAL-BST (p, q, n)
1.for i ←1 to n+1 do
2. e[i, i−1]←0; w[i, i−1]←0
3.for l←1 to n do
4. for i←1 to n−l+1 do
5. j←i+l−1
6. e[i, j]←∞
7. w[i, j]← w[i, j−1] + pj
8. for r←i to j do
9. t←e[i, r−1] + e[r+1, j] + w[i, j]
10. if t < e[i, j] then e[i, j]←t; root[i, j] ←r
11.return e and root

3.证明最优BST的动态规划解法的时间复杂性为W(n3)。
4.如每个键值被访问的概率相等,请改良第2问里面的算法以降低BST构造成本。
5.如果给定的键值序列是完全无序的,请设计一个成本更低的构造最优BST算法。


希望大家能给予具体或者思想理论性的指导,谢谢。
...全文
1336 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
fflyn 2009-10-20
  • 打赏
  • 举报
回复
问题不难
难在 如果数据量在 1000万以上
如果构造平衡2叉树
(大家可以想想为什么不是 红黑树?)
没有昵称阿 2009-10-16
  • 打赏
  • 举报
回复
学习了!
PeacefulBY 2009-10-09
  • 打赏
  • 举报
回复
呵呵突然多了近100分吓我一条,我把更详细的阐述搬到博客去了,可以去看看:)
山椒π 2009-10-09
  • 打赏
  • 举报
回复
不等了,结贴,谢谢了。
山椒π 2009-09-30
  • 打赏
  • 举报
回复
沉了。
jiayucunyan 2009-09-23
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 peacefulby 的回复:]
1、穷举
穷举构造最优二叉搜索树(BST),其实就是这样的一个问题:
给一个拥有n个数的已排序的数组,可以将其构造成多少种不同的BST?
设可以构造成T(n)个,那么枚举每一个元素作为根节点的情况,当第一个元素作为根节点时,只有右子树,是n-1情况时的子问题,共T(n-1)种;当第二个元素作为根节点时,左子树有1个元素,右子树有n-2个元素,根据乘法原理共有T(1)T(n-2)种情况……
以此类推得到:T(n)=T(n-1)+T(1)T(n-2)+T(2)T(n-3)+......+T(n-2)T(1)+T(n-1)
又有T(0)=T(1)=1,解此式得T(n) = (2n)!/(n!(n+1)!)
根据Stirling公式:n!~(2πn)^(1/2)*(n/e)^n
有(2n)!/n!(n+1)!~4^n*π^(-1/2)*n^(1/2)*(n+1)^(-1)~π^(-1/2)*4^n*n^(-3/2)
这样就得到了最后的结论

2、递归
实际上左右子树是互不影响的,所以不需要用乘法原理,加法原理就可以了,这样式子变为:
T(n)=T(n-1)+T(1)+T(n-2)+T(2)+T(n-3)+......+T(n-2)+T(1)+T(n-1)
    =2(T(1)+T(2)+......+T(n-1))
    =3T(n-1)
所以T(n)=3^n,还是指数级的一个算法

3、动态规划
上面得到指数级算法的原因在于,计算了很多重复的子树情况;一棵树如果是最优二叉搜索树,那么要么它是空树,要么它的左、右子树也是最优二叉搜索树。这样就得到了动态规划的解法:

For size = 1到n
    For 所有包含size个元素的子树
        For 该子树的所有节点i
            找出其中一个i,使当它为根节点时,左、右子树的最短搜索时间之和最小。那么该子树的访问时间就是:
            左、右子树的最短搜索时间之和 + 所有节点的访问概率之和(因为所有节点都下降了一层)。


可见,这个算法的时间复杂度是O(n^3)。但是有一个神奇的定理,可以把算法的时间效复杂度降到O(n^2),如下:

设一个子树的节点为i ~ j(当然,这里说的i ~ j都是从小到大排好序的),则当它是最优二叉搜索树时的根节点root(i, j)满足:
root(i, j - 1) <= root(i, j) <= root(i + 1, j)。


这样一来,上面那个算法的第3个For就可以不用循环子树中的所有节点了,只要循环另两个子树的根节点之间的范围就可以了。而这个范围根据实践表明是很小的。所以整体的时间复杂度就相当于两层For循环而已。

[/Quote]

学习了!!
山椒π 2009-09-22
  • 打赏
  • 举报
回复
没权限改动原贴

动态规划算法的伪代码实现:

OPTIMAL-BST (p, q, n)
1.for i ←1 to n+1 do
2. e[i, i−1]←0; w[i, i−1]←0
3.for l←1 to n do
4. for i←1 to n−l+1 do
5. j←i+l−1
6. e[i, j]←∞
7. w[i, j]← w[i, j−1] + pj
8. for r←i to j do
9. t←e[i, r−1] + e[r+1, j] + w[i, j]
10. if t < e[i, j] then e[i, j]←t; root[i, j] ←r
11.return e and root
山椒π 2009-09-22
  • 打赏
  • 举报
回复
不好意思,没有好好写清楚
w(4n/n3/2)就是w(4^n/n^(3/2))
时间成本指的是时间复杂度,题目中主要问的是构造时的,评判标准中是搜索时的。
伪代码是太伪了,呵呵,没有end语句,算杂交吧。主要怪我把原本明了的缩进给弄没了,修改下。

[Quote=引用 5 楼 test4ever 的回复:]
W(4n/n3/2)
这个时间成本是什么意思?时间复杂度?这样写是什么含义?...

穷举法,把遍历所有二叉搜索树(B树),寻找最优解
想了下,穷举构造的方法应该也有很多种,LZ能不能明确下?如果有现成的构造的复杂度,假设为O(p),列举所有可能的穷举方案的复杂度为O(s),最终两个复杂度相乘即可

这个动态规划的伪代码为啥没有end for...看的好辛苦



[/Quote]
山椒π 2009-09-22
  • 打赏
  • 举报
回复
谢谢指导,这几天一直没有来看,2 3问的问题我也在找到了一些参考:
http://imlazy.ycool.com/post.1092472.html
http://blog.csdn.net/ujs_abc/archive/2008/02/07/2086093.aspx
http://blog.csdn.net/sssssjjjj/archive/2008/07/02/2606776.aspx
可惜SSSSSJJJJ的文章中部分图示显示不出来。

我之前一直没考虑到这个问题证明时可以归到一个递归的算法。

这个帖子会晚些时候结贴,大约十一假期结束,幸好之前没有按无解结掉,谢谢了。


[Quote=引用 7 楼 peacefulby 的回复:]
1、穷举
穷举构造最优二叉搜索树(BST),其实就是这样的一个问题:
给一个拥有n个数的已排序的数组,可以将其构造成多少种不同的BST?
设可以构造成T(n)个,那么枚举每一个元素作为根节点的情况,当第一个元素作为根节点时,只有右子树,是n-1情况时的子问题,共T(n-1)种;当第二个元素作为根节点时,左子树有1个元素,右子树有n-2个元素,根据乘法原理共有T(1)T(n-2)种情况……
以此类推得到:T(n)=T(n-1)+T(1)T(n-2)+T(2)T(n-3)+......+T(n-2)T(1)+T(n-1)
又有T(0)=T(1)=1,解此式得T(n) = (2n)!/(n!(n+1)!)
根据Stirling公式:n!~(2πn)^(1/2)*(n/e)^n
有(2n)!/n!(n+1)!~4^n*π^(-1/2)*n^(1/2)*(n+1)^(-1)~π^(-1/2)*4^n*n^(-3/2)
这样就得到了最后的结论

2、递归
实际上左右子树是互不影响的,所以不需要用乘法原理,加法原理就可以了,这样式子变为:
T(n)=T(n-1)+T(1)+T(n-2)+T(2)+T(n-3)+......+T(n-2)+T(1)+T(n-1)
    =2(T(1)+T(2)+......+T(n-1))
    =3T(n-1)
所以T(n)=3^n,还是指数级的一个算法

3、动态规划
上面得到指数级算法的原因在于,计算了很多重复的子树情况;一棵树如果是最优二叉搜索树,那么要么它是空树,要么它的左、右子树也是最优二叉搜索树。这样就得到了动态规划的解法:

For size = 1到n
    For 所有包含size个元素的子树
        For 该子树的所有节点i
            找出其中一个i,使当它为根节点时,左、右子树的最短搜索时间之和最小。那么该子树的访问时间就是:
            左、右子树的最短搜索时间之和 + 所有节点的访问概率之和(因为所有节点都下降了一层)。


可见,这个算法的时间复杂度是O(n^3)。但是有一个神奇的定理,可以把算法的时间效复杂度降到O(n^2),如下:

设一个子树的节点为i ~ j(当然,这里说的i ~ j都是从小到大排好序的),则当它是最优二叉搜索树时的根节点root(i, j)满足:
root(i, j - 1) <= root(i, j) <= root(i + 1, j)。


这样一来,上面那个算法的第3个For就可以不用循环子树中的所有节点了,只要循环另两个子树的根节点之间的范围就可以了。而这个范围根据实践表明是很小的。所以整体的时间复杂度就相当于两层For循环而已。

[/Quote]
PeacefulBY 2009-09-21
  • 打赏
  • 举报
回复
1、穷举
穷举构造最优二叉搜索树(BST),其实就是这样的一个问题:
给一个拥有n个数的已排序的数组,可以将其构造成多少种不同的BST?
设可以构造成T(n)个,那么枚举每一个元素作为根节点的情况,当第一个元素作为根节点时,只有右子树,是n-1情况时的子问题,共T(n-1)种;当第二个元素作为根节点时,左子树有1个元素,右子树有n-2个元素,根据乘法原理共有T(1)T(n-2)种情况……
以此类推得到:T(n)=T(n-1)+T(1)T(n-2)+T(2)T(n-3)+......+T(n-2)T(1)+T(n-1)
又有T(0)=T(1)=1,解此式得T(n) = (2n)!/(n!(n+1)!)
根据Stirling公式:n!~(2πn)^(1/2)*(n/e)^n
有(2n)!/n!(n+1)!~4^n*π^(-1/2)*n^(1/2)*(n+1)^(-1)~π^(-1/2)*4^n*n^(-3/2)
这样就得到了最后的结论

2、递归
实际上左右子树是互不影响的,所以不需要用乘法原理,加法原理就可以了,这样式子变为:
T(n)=T(n-1)+T(1)+T(n-2)+T(2)+T(n-3)+......+T(n-2)+T(1)+T(n-1)
=2(T(1)+T(2)+......+T(n-1))
=3T(n-1)
所以T(n)=3^n,还是指数级的一个算法

3、动态规划
上面得到指数级算法的原因在于,计算了很多重复的子树情况;一棵树如果是最优二叉搜索树,那么要么它是空树,要么它的左、右子树也是最优二叉搜索树。这样就得到了动态规划的解法:

For size = 1到n
For 所有包含size个元素的子树
For 该子树的所有节点i
找出其中一个i,使当它为根节点时,左、右子树的最短搜索时间之和最小。那么该子树的访问时间就是:
左、右子树的最短搜索时间之和 + 所有节点的访问概率之和(因为所有节点都下降了一层)。


可见,这个算法的时间复杂度是O(n^3)。但是有一个神奇的定理,可以把算法的时间效复杂度降到O(n^2),如下:

设一个子树的节点为i ~ j(当然,这里说的i ~ j都是从小到大排好序的),则当它是最优二叉搜索树时的根节点root(i, j)满足:
root(i, j - 1) <= root(i, j) <= root(i + 1, j)。


这样一来,上面那个算法的第3个For就可以不用循环子树中的所有节点了,只要循环另两个子树的根节点之间的范围就可以了。而这个范围根据实践表明是很小的。所以整体的时间复杂度就相当于两层For循环而已。
test4ever 2009-09-20
  • 打赏
  • 举报
回复
W(4n/n3/2)
这个时间成本是什么意思?时间复杂度?这样写是什么含义?...

穷举法,把遍历所有二叉搜索树(B树),寻找最优解
想了下,穷举构造的方法应该也有很多种,LZ能不能明确下?如果有现成的构造的复杂度,假设为O(p),列举所有可能的穷举方案的复杂度为O(s),最终两个复杂度相乘即可

这个动态规划的伪代码为啥没有end for...看的好辛苦


sytstarac 2009-09-20
  • 打赏
  • 举报
回复
一直不理解期望值的妙处,只能帮顶了。
陽洸膂珵 2009-09-20
  • 打赏
  • 举报
回复
学习!
山椒π 2009-09-18
  • 打赏
  • 举报
回复
继续请教
hua_zhixing_ 2009-09-18
  • 打赏
  • 举报
回复
兄台是干嘛的呀?这么复杂的问题都接触到了。感觉远比红黑树和动态规划还复杂,是不是还要加上哈夫曼树啊?
估计我没看懂题,如果有解决方案,分享下啦!!!!!!!!!!!!
huaxuejianzi 2009-09-16
  • 打赏
  • 举报
回复
算法导论,动态规划。

33,008

社区成员

发帖
与我相关
我的任务
社区描述
数据结构与算法相关内容讨论专区
社区管理员
  • 数据结构与算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧