预处理数组以计算切片中的元素(简化为RMQ?)


11

给定自然数的数组,其中为常数,我想用以下形式的查询回答:“在索引和索引之间的数组中出现了多少次 “?a1,,ankkO(1)mij

数组应在线性时间内进行预处理。特别是我想知道范围最小查询是否减少。


如果并且您要查询间隔内的个数,则等效于RMQ 。这样我们就可以使用它了由于SE的限制,我无法回答自己的问题。k=1


您可以减少问题的元素清晰度(线性时间)。也许谈论模型是有条理的?
Aryabhata 2012年

@Aryabhata到底什么是元素区分性问题?现在,我正在阅读:en.wikipedia.org/wiki/Range_Queries
安迪

这比RMQ容易得多。提示:因为k是一个常数,所以预处理可以花费与kn成正比的时间,并且仍然算作线性时间。
伊藤刚(Tsuyoshi Ito)

@Aryabhata:我认为您在说的减少不起作用,因为k在这个问题上是一个常数。
伊藤刚(Tsuyoshi Ito)

以防万一,如果数组是在开始时给出的,而不是在以后更新,则RMQ是一个过大的选择,正如我在前面的评论中所建议的那样。
伊藤刚(Tsuyoshi Ito)

Answers:


4

由于是恒定的,我们可以存储每个元素的计数的范围内0 .. 0 < Ñ0 .. ñÖ Ñ ķ = Ô Ñ 的时间和空间。主要观察结果是,您可以在O n k 时间内创建一个二维数组,然后通过在恒定时间内找出i j索引之间的差异来查询范围。k0..m0m<n0..nO(nk)=O(n)count[pos][elem] = occurences of 'elem' in the indices 0..posO(nk)i,j

前处理

initialise count[pos][elem] to 0 for all elem, pos
for pos=0 to n
  for num=0 to k
      count[pos][num] = (0 if pos==0 else count[pos-1][num])
  count[pos][arr[pos]] ++

询问

(假设i,j都是包含边界)

if i == 0
  return count[j][m]
else
  return count[j][m] - count[i-1][m]

kcountO(logn)O(logn)

对于这个问题的任何问题,我深表歉意。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.