【问题标题】:Algorithm - Finding all maxima of k*k sets in n*n 2D Matrix算法 - 在 n*n 2D 矩阵中查找 k*k 集的所有最大值
【发布时间】:2018-03-30 06:56:15
【问题描述】:

我有一个N*N 2D 矩阵。我想找到每个集合 k*k 子网格的所有最大值。高效的算法应该是什么。例如,

N = 4, k = 2

0 1 3 1
5 2 1 4
2 3 0 7

输出:3, 4, 5

3 来自

1 3
2 1

4 来自

3 1
1 4

5 来自

5 2
2 3

一些子集没有被计算在内,因为它们有未设置的位,在 k*k 范围内为 0。例如,

1 4
0 7

【问题讨论】:

  • 我假设您的第一个子网格中的 4 应该是 1?
  • @NicoSchertler 谢谢,你是对的。已更新。
  • 为什么简单的蛮力算法不适合你?在每个可能的 N*N 切片上迭代矩阵。如果它没有零,则找到它的最大值并附加到最​​大值列表中。
  • 你检查过对应的一维问题吗(滑动窗口最大值/移动最大值)。这个想法是向/从二叉树推送/弹出元素,以允许您快速进行最大查询。类似的方法应该适用于 2D 案例。
  • @Prune,它可以用蛮力解决,但我想在 O(N^2) 中解决它,因为 k,N 可以超过 10000。如果存在,我正在寻找一个有效的解决方案.

标签: algorithm multidimensional-array 2d


【解决方案1】:

如果你能保证没有元素是负数,那么你的问题确实可以在O(N2) 时间内解决。诀窍是使用sliding window minimum/maximum algorithm

首先,对输入矩阵的每一行运行滑动窗口最小值和最大值算法,得到两个N × (N - k + 1) 矩阵。例如:

Minimum matrix:
  0 1 1
  2 1 1
  2 0 0

Maximum matrix:
  1 3 3
  5 2 4
  3 3 7

接下来,分别在两个矩阵的每一列上运行滑动窗口最小值和最大值算法,得到两个 (N - k + 1)2 矩阵。

Minimum matrix:
  0 1 1
  2 0 0

Maximum matrix:
  5 3 4
  5 3 7

现在同时扫描两个矩阵,如果最小矩阵元素不为0,则从最大矩阵中输出对应元素。因此我们输出 3、4、5。

【讨论】:

  • 你可以把它改成在线算法,减少内存占用(你需要O(N^2))。在从第一步计算最小/最大表的列时使用滑动窗口,您可以将其更改为O(NK)。假设N >> K.
猜你喜欢
  • 2013-06-23
  • 1970-01-01
  • 2018-09-06
  • 2023-02-10
  • 2014-04-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多