0

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

我认为他的方法存在问题:修改后的 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;
}
4

1 回答 1

1

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

于 2014-11-06T15:45:43.387 回答