有关查询段树的说明

时间:2015-01-18 06:42:50

标签: algorithm segment-tree

我是learning segment trees(关于范围最小查询的示例)并且在查询用于查询分段树的算法部分背后的原因时遇到一些问题。

我理解段树的构造部分没有问题,我无法理解为什么在这个函数中:

int RMQUtil(int *st, int ss, int se, int qs, int qe, int index)
{
    // If segment of this node is a part of given range, then return the min of the segment
    if (qs <= ss && qe >= se)
        return st[index];    // this is the part I am struggling with

    // If segment of this node is outside the given range
    if (se < qs || ss > qe)
        return INT_MAX;

    // If a part of this segment overlaps with the given range
    int mid = getMid(ss, se);
    return minVal(RMQUtil(st, ss, mid, qs, qe, 2*index+1), RMQUtil(st, mid+1, se, qs, qe, 2*index+2));
}
  

如果此节点的片段是给定范围的一部分,则返回min   该部分。

2 个答案:

答案 0 :(得分:0)

如果此节点的片段是给定范围的一部分,那么您已经知道子片段[ss,se]的答案(它是st [index]),您无需深入了解。

答案 1 :(得分:0)

在查询中,您希望找到[qs,qe]范围内的最小数字。

现在,就分段树而言,这可以表示为首先找到间隔的中间,即中间=(qs + qe)/ 2

并且逻辑是范围[qs,qe]中的最小值等于在[qs,mid]和[mid + 1,qe]范围内找到最小值的最小值。

这是用以下行代码写的:

int mid = getMid(ss, se);
    return minVal(RMQUtil(st, ss, mid, qs, qe, 2*index+1), RMQUtil(st, mid+1, se, qs, qe, 2*index+2));