段树Kth最大值

时间:2012-07-01 17:53:17

标签: algorithm data-structures segment-tree

您好我在分段树上解决了问题,但是我无法对分段树的查询功能进行一些修改。

实际上我想要的是我的查询函数应该返回索引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。

另外,我是否为此目的选择了正确的数据结构。

非常感谢。

1 个答案:

答案 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次。

分段树可以很好地处理多个查询,其中堆在整体内存和数据上的单个查询方面会更好。