范围最小查询基础

时间:2012-08-27 13:17:56

标签: algorithm graph binary-tree

我阅读了关于范围最小查询的维基百科链接,看了几个教程(topcoder和其他链接),但我有一个非常基本的问题:

RMQ的正式定义是: 给定从有序集合(例如数字)中取出的对象数组,范围最小查询(或RMQ)来自询问子数组中最小元素的位置。

我不明白为什么我们不能通过线性搜索解决问题? 在数组A [0 ... n]中,如果我们需要RMQ(i,j)

min = A[i]
index = i
for iter=i; iter <j; iter ++
if A[iter] <= min
min = A[iter]
index = iter;

在循环结束时,我们知道min和min所在的索引。

我肯定在这里遗漏了一些东西......有人能帮我理解为什么我们需要RMQ吗?

2 个答案:

答案 0 :(得分:2)

RMQ旨在解决您描述的问题,但速度比您的方法快。有两种方法 - 静态版本,你进行一些预计算(最复杂的版本,非常复杂的需要线性预计算),然后为每个查询不断回答,动态apporach你有每个查询的log(n)时间。

在静态情况下,您无法更改初始数组,而在动态中,允许其值随时间变化。

请注意,在这两种情况下,您都要回答很多问题。这意味着以恒定或对数时间回答将比线性方法更快,因此在您的想法太慢的情况下将起作用。希望这能解释这个想法。

答案 1 :(得分:1)

<强>速度即可。线性搜索很慢。

我们使用quick sort(或合并排序,...)而不是天真insertion sort来排序大型数据库的原因相同。

假设您拥有庞大的数据库,并且您将查询数百万次RMQ。对每个查询进行线性搜索效率不高,需要数百万次线性搜索,而更高级的算法则需要较少的预处理,然后快速检索所需信息。