如何在矩阵区域中找到最小或最大元素?

时间:2013-01-09 21:04:33

标签: algorithm

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

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

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

非常直接的解决方案可能是使用最有效的RMQ解决方案(Segment Tree)然后按行或列方式应用它。

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

但我仍然认为我们可以做得更好。

3 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分:2)

这取决于“最有效的方式”是什么意思。可以最大限度地缩短查询时间本身,或预处理时间或内存要求。

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

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

Sparse Table algorithm in 2D

只需准备一张包含所有两个幂长度和两个幂高度矩形的表格,并使用其中四个矩形来处理任何范围最小查询。结果是这些矩形中的每一个都至少有四个最小值。查询时间为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 :(得分:0)

伪代码:

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并且&gt;到&lt;。你不能比O(n)做得更好,即检查每个可能的元素。假设您的算法比O(n)快。然后它不会检查所有元素。要获得算法的失败案例,请取其未检查的其中一个元素,并将其替换为(max + 1),然后重新运行该算法。