您好我在分段树上解决了问题,但是我无法对分段树的查询功能进行一些修改。
实际上我想要的是我的查询函数应该返回索引Qa和Qb之间的(int)(TotalArrayLength / 3)最大元素。
我写的查询函数返回index [1-based] a_begin和a_end之间的最大元素。
但我想在index [1-based] a_begin和a_end之间返回(int)(TotalArrayLength / 3)最大元素。
int query(int Nodenumber,int t_begin,int t_end,int a_begin,int a_end)
{
if (t_begin>=a_begin && t_end<=a_end)
return Tree[Nodenumber];
else
{
int mid=((t_begin+t_end)/2);
int res = -1;
if (mid>=a_begin && t_begin<=a_end)
res = max(res,query(2*Nodenumber,t_begin,mid,a_begin,a_end));
if (t_end>=a_begin && mid+1<=a_end)
res = max(res,query(2*Nodenumber+1,mid+1,t_end,a_begin,a_end));
return res;
}
}
注意要进行查询,我将查询函数称为查询(1,0,N-1,QA,QB)。
我还实现了following伪代码来编写上面的查询函数,
那么我应该如何修改find(int)(TotalArrayLength / 3)th index [1-based] a_begin和a_end之间的最大元素。
基本上,我要解决的问题是:
最初,数组包含0个或更多元素。随机地将一些数据插入到数组的末尾,并且在任何时候都要进行查询,返回到目前为止在Array构建中返回TotalArraySize /第3个Max Elements。
另外,我是否为此目的选择了正确的数据结构。
非常感谢。
答案 0 :(得分:0)
我的第一个是:
您需要使用K大小的排序列表作为每个query()调用的返回值。如果查询完全位于中点的左侧或右侧,则返回该结果。如果查询跨越中间点,则在返回时合并每个子项的结果。一旦你回到root,你就会在结果排序列表中返回第k个元素。
方法签名(在Java中)将是:
List<Integer> query(int Nodenumber,int t_begin,int t_end,int a_begin,int a_end)
最大堆数据结构可以完成相同的工作。只需从索引之间的项目构建最大堆,然后弹出头部k次。
分段树可以很好地处理多个查询,其中堆在整体内存和数据上的单个查询方面会更好。