algorithm - 在大矩阵内移动正方形,找到重叠的最小数字

标签 algorithm data-structures matrix

我有一个正方形矩阵和一个较小的正方形,它在矩阵内所有可能的位置移动(不超出矩阵)。我需要在所有这些可能的重叠中找到最小的数字。

问题是两者的大小都可以达到数千。有什么快速的方法吗?

我知道一种方法 - 如果有一个数组而不是矩阵和一个窗口而不是正方形,我们可以使用 deque线性时间内完成。

提前致谢。

编辑:例子

矩阵:

1 3 6 2 5
8 2 3 4 5
3 8 6 1 5
7 4 8 2 1
8 0 9 0 5

对于大小为 3 的正方形,共有 9 次重叠是可能的。对于每个重叠矩阵形式的最小数字是:

1 1 1
2 1 1
0 0 0

最佳答案

用你的双端队列想法在 O(k * n^2) 中是可能的:

如果您的小方 block 是 k x k,请迭代矩阵中从 1 到 k 的第一行元素,并通过预先计算元素的最小值将其视为数组从 1 到 k,从 2 到 k + 1 等矩阵的每一列(此预计算将花费 O(k * n^2))。这就是您的第一行:

*********
1 3 6 2 5
8 2 3 4 5
3 8 6 1 5
*********
7 4 8 2 1
8 0 9 0 5

我提到的预计算将为您提供每一列中的最小值,因此您可以将问题简化为一维数组问题。

然后继续从2到k + 1的那一行元素:

1 3 6 2 5
*********
8 2 3 4 5
3 8 6 1 5
7 4 8 2 1
*********
8 0 9 0 5

将有 O(n) 行,您将能够在 O(n) 中解决每一行,因为我们的预计算允许我们将它们简化为基本数组.

关于algorithm - 在大矩阵内移动正方形,找到重叠的最小数字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15968587/

相关文章:

r - R中的第四角算法

java - 如何实现中值堆

string - 从没有空格和标点符号的字符串中取消连接单词的算法

CSS3//计算一个元素经过matrix3d变换后的 "real pixels"

c++ - LeetCode 15:使用 HashMap 的3Sum

arrays - 如何删除作为较大元素子集的单元格元素? (Matlab)

algorithm - 如何对渐近符号函数集进行操作,即。 Big-O + Big-Omega?

data-structures - 如何最好地表示 3D 欧几里得空间中的网格图?

c++ - 涉及指针和手动实现的矩阵类的问题

r - 没有循环的增强矩阵