【问题标题】:Move square inside large matrix, find minimum number in overlapping在大矩阵内移动正方形,找到重叠中的最小数
【发布时间】:2013-04-12 10:08:40
【问题描述】:

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

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

我知道一种方法 - 如果有一个数组而不是矩阵和一个窗口而不是正方形,我们可以使用 dequelinear 时间内做到这一点。

提前致谢。

编辑:示例

矩阵:

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

【问题讨论】:

  • 听起来你想执行二维相关。取决于您使用的语言和库,但有一些有效的方法:例如stackoverflow.com/questions/1100100/…
  • @MrE 是的,它类似于相关性,但不是 - 相关性是线性空间过滤器,但这是非线性的。另外我不能使用任何库。
  • 什么是“所有可能的重叠中最小的数”?
  • @ypnos 说了什么 - 那么操作是什么?你能给我们展示一个输入和输出的玩具例子吗?
  • @ypnos 更新了,请看。

标签: algorithm data-structures matrix


【解决方案1】:

可以在O(k * n^2) 使用您的双端队列想法:

如果您的小方块是k x k,则迭代矩阵中从 1 到 k 的第一行元素,并通过预先计算从 1 到 k、从 2 到 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) 中的每一行,因为我们的预计算允许我们将它们减少为基本数组。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-04-18
    • 1970-01-01
    • 2021-10-24
    • 2023-03-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多