RMQ问题的预处理代码。它有什么作用?

时间:2011-04-20 02:12:01

标签: algorithm

这取自TopCoder的算法页面 - 关于“RMQ的简单算法”一节 据说是用于计算A阵列上的RMQ的预处理功能。


 void process1(int M[MAXN][MAXN], int A[MAXN], int N)
  {
      int i, j;
      for (i =0; i < N; i++)
          M[i][i] = i;
      for (i = 0; i < N; i++)
          for (j = i + 1; j < N; j++)
              if (A[M[i][j - 1]] < A[j])
                  M[i][j] = M[i][j - 1];
              else
                  M[i][j] = j;
  }

但我不知道生成的M 2D数组如何有助于计算RMQ,我没有得到什么?

1 个答案:

答案 0 :(得分:2)

提示

数组A[]包含您为其计算RMQ的元素序列。数组M[][]包含每个查询类型的答案“范围a..b中的最小元素是什么?”进入M[a][b]

完整答案

这样,您可以通过查看M[][]中的相应元素,在常量时间内查找任何查询的答案。

计算方式如下:

  • 第一个for循环迭代所有元素,并将范围i..i的最小值分配给i。这是因为单元素范围的最小值就是那个元素。
  • 然后,嵌套循环计算所有i..k的其他范围k > i的RMQ答案。这是通过将已经计算的范围从i一次扩展一个元素来完成的。