查询代码意外地修改了数组而不是返回索引

时间:2014-11-06 14:08:58

标签: c data-structures segment-tree

this tutorial中,为什么query()函数会修改最后4行代码中M的内容,而不仅仅是返回节点索引?

我认为他的方法存在问题:修改后的M阵列无法处理未来的RMQ [范围最小查询],因为m[node]存储了最近查询的索引。

这是我正在谈论的代码:

int query(int node, int b, int e, int M[MAXIND], int A[MAXN], int i, int j)
{
    int p1, p2;

    // if the current interval doesn't intersect 
    // the query interval return -1
    if (i > e || j < b)
        return -1;

    // if the current interval is included in 
    // the query interval return M[node]
    if (b >= i && e <= j)
        return M[node];

    // compute the minimum position in the 
    // left and right part of the interval
    p1 = query(2 * node, b, (b + e) / 2, M, A, i, j);
    p2 = query(2 * node + 1, (b + e) / 2 + 1, e, M, A, i, j);

    // return the position where the overall 
    // minimum is
    if (p1 == -1)
        return M[node] = p2;
    if (p2 == -1)
        return M[node] = p1;
    if (A[p1] <= A[p2])
        return M[node] = p1;
    return M[node] = p2;
}

1 个答案:

答案 0 :(得分:1)

这绝对是一个错误。你是对的,它应该只返回索引而不更新数组。