【问题标题】:How to find minimum or maximum element in a matrix region?如何在矩阵区域中找到最小或最大元素?
【发布时间】:2013-01-10 22:59:02
【问题描述】:

对于具有整数值的 NxM 矩阵,找到区域 (x1,y1) (x2,y2) 的最小元素的最有效方法是什么,其中 0

我们可以假设我们将多次查询不同的区域。

我想知道我们是否可以将范围最小查询方法扩展到这个问题。 http://community.topcoder.com/tc?module=Static&d1=tutorials&d2=lowestCommonAncestor

非常简单的解决方案可以使用 RMQ 最有效的解决方案 (Segment Tree),然后逐行或逐列地应用它。

最坏情况下的复杂度为 min(N,M)*log(max(N,M))

但我仍然相信我们可以做得更好。

【问题讨论】:

    标签: algorithm


    【解决方案1】:

    这取决于您所说的“最有效的方式”是什么意思。可以最大限度地减少查询时间本身、预处理时间或内存需求。

    如果只应该最小化查询时间,“最有效的方法”是预先计算所有可能的区域。然后通过返回一些预先计算的值来处理每个查询。查询时间为 O(1)。内存和预处理时间都很大:O((NM)2)。

    更实用的是使用 OP 中提到的页面中的Sparse Table algorithm。该算法准备一个包含所有二次幂长度区间的表,并使用一对这些区间来处理任何范围最小查询。查询时间为 O(1)。内存和预处理时间为 O(N log N)。并且该算法可以很容易地扩展到二维情况。

    只需准备一个包含所有 2 次幂长度和 2 次幂高度矩形的表格,并使用其中四个矩形来处理任何范围最小查询。结果是每个矩形至少有四个最小值。查询时间为 O(1)。内存和预处理时间为 O(NM*log(N)*log(M))。

    这篇论文:"Two-Dimensional Range Minimum Queries" by Amihood Amir, Johannes Fischer, and Moshe Lewenstein 建议如何将此算法的内存需求和预处理时间减少到几乎 O(MN)。

    这篇论文:"Data Structures for Range Minimum Queries in Multidimensional Arrays" by Hao Yuan and Mikhail J. Atallah 给出了不同的算法,查询时间为 O(1),内存和预处理时间为 O(NM)。

    【讨论】:

      【解决方案2】:

      鉴于没有关于矩阵内容或存储方式的其他信息,除了扫描给定区域中的每个条目之外,不可能提出任何建议。那是 O((x2-x1) * (y2-y1))。您的问题太模糊,无法说明其他任何内容。

      如果您对矩阵有其他了解,例如,如果您知道元素可能以某种方式排序,您可能会做得更好(在概率上,在平均情况下)。

      【讨论】:

        【解决方案3】:

        伪代码:

        function getMax(M, x1, x2, y1, y2)
            max = M[x1,y1]
            for x = x1 to x2 do
                for y = y1 to y2 do
                    if M[x,y] > max then max = M[x, y]
            return max
        

        这是输入大小中的O(n),只能合理解释为矩阵区域(x2 - x1) * (y2 - y1)的大小。如果您想要最小值,请将 max 更改为 min 并将 > 更改为

        【讨论】:

        • 感谢您的陈述,但如果它是一个数字数组并要求一个范围内的最小元素,我们可以做得很好。 community.topcoder.com/…
        • @cirik 我不想阅读它,在我们回答它时它不是你问题的一部分。但在你的坚持下,我查看了 RMQ 部分。这一切都是关于预处理数组以获得辅助索引以使后续查询更快。这种预处理索引是一种权衡,是否值得取决于您希望在进行更改之前查询数组/矩阵的次数。如果您从一开始就考虑到这种预处理并且您没有在问题中提及它,那么那就是我的意思是您的问题含糊不清。
        猜你喜欢
        • 2014-04-08
        • 1970-01-01
        • 2016-07-12
        • 2023-01-11
        • 2020-07-23
        • 1970-01-01
        • 2013-11-20
        • 2015-12-20
        • 1970-01-01
        相关资源
        最近更新 更多