静态最优查找与次优查找树

问题描述
给出nnn个元素的权值w[i]w[i]w[i],问如何构造查找树使得查找效率最高?

静态最优查找树

将n个元素的权值有序排列,设置optimal(i,j)optimal(i, j)optimal(i,j)表示区间[i,j][i, j][i,j]之间的元素构造的最小PH值的子树。
易知有关系:
optimal(i,j)=∑k=ijw[i]+minr=ij[optimal(i,r−1)+optimal(r+1,j)]optimal(i, j) = \sum_{k = i}^j w[i] + min_{r= i}^{j}[optimal(i,r -1) + optimal(r + 1, j)]optimal(i,j)=k=ijw[i]+minr=ij[optimal(i,r1)+optimal(r+1,j)]

这里的∑k=ijw[i]\sum_{k = i}^j w[i]k=ijw[i]将解题角度进行转换,在搜索区间[i,j][i, j][i,j]时必然其中每一个元素的权值都被加上一次,而随着往更小长度的搜索被加上的元素也不断的变少,以此从层次的角度而不是元素的深度来进行遍历操作。
为了避免暴力搜索的指数级的复杂度,可以设置二维dp数组,预处理权值的前缀和,根据区间[i,j][i, j][i,j]之间的距离从小到大进行遍历更新,从而完成最后的更新。
时间复杂度为O(n3)O(n^3)O(n3),空间复杂度为O(n2)O(n^2)O(n2)

次优查找树

为了避免最优查找树令人不满意的时间复杂度,我们近似地构造一个最优的查找树。
我们在区间[l,r][l,r][l,r]通过如下方法找根节点:如果有ΔPi=mini=lr∣∑j=li−1w[j]−∑j=i+1rw[j]∣\Delta Pi = min_{i=l}^r\mid\sum_{j=l}^{i-1}w[j] -\sum_{j=i+1}^rw[j]\midΔPi=mini=lrj=li1w[j]j=i+1rw[j]最小,那么就取节点i为根节点。据此可不断往后构造该次优查找树。
构造查找树的时间复杂度为O(n2)O(n^2)O(n2)
对于每一个节点iii,最坏可能会被搜索n−in - ini次?
其查找的复杂度最坏是O(nlogn)O(nlogn)O(nlogn),此时元素等概率,查找树退化成二分查找。

具体查找效率对比未知,但是可以肯定的是,当n在1e3以上的数量级时,最优查找树的构造是需要花费大量时间的,同时辅助空间的需要也在不断提升。此时使用次优查找树可以在查找效率不损失太多的前提下大幅缩短构造查找树的复杂度,因而实际使用中通常使用次优查找树。

在最优查找树中,dp状态的设置与“层次遍历”的手法是值得学习的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值