【问题标题】:Range Minimum Query basics范围最小查询基础知识
【发布时间】:2020-08-15 03:21:04
【问题描述】:

我阅读了有关 Range Minimum Queries 的维基百科链接,查看了更多教程(topcoder 和其他链接),但我有一个非常基本的问题:

RMQ 的正式定义是: 给定一个从有序集合(例如数字)中提取的对象数组,一个 Range 最小查询(或 RMQ) from to 询问子数组中最小元素的位置。

我不明白的是,为什么我们不能通过线性搜索来解决问题? 在数组 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;

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

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

【问题讨论】:

    标签: algorithm graph binary-tree rmq


    【解决方案1】:

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

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

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

    【讨论】:

      【解决方案2】:

      速度。线性搜索很慢。

      与我们使用quick sort(或归并排序,...)而不是简单的insertion sort 对大型数据库进行排序的原因相同。

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-10-02
        • 1970-01-01
        • 2015-10-02
        • 1970-01-01
        • 2014-01-04
        • 1970-01-01
        • 2013-10-23
        相关资源
        最近更新 更多