【发布时间】:2016-05-10 12:04:00
【问题描述】:
我有一个包含数值的矩阵(最大大小为 100 x 100),需要在那里找到最有效(最小单元数)的一组 连接 单元格,总和为请求的值。该矩阵也可以具有负单元(矩阵的内壁),该算法应该能够四处走动。在查找连接的单元格时,我不需要考虑对角线单元格(仅上、下、左、右)。
例如我们有以下矩阵:
1 4 4
1 1 2
4 -1 1
如果我们正在寻找总和为的单元格集:
- 9 正确的结果是:4(0x2), 4(0x1), 1(0x0 or 1x1)
- 3 正确的结果是:2(1x2), 1(1x1 or 2x2)
- 5 正确的结果是:4(0x1), 1(0x0 or 1x1)
当矩阵变得相对较大(如 50x50)时,递归会非常缓慢地找到这些连接单元格的最有效方法是什么?或者这些数据的矩阵表示不是这项任务的最佳方式?
谢谢
【问题讨论】:
-
矩阵中的值有多大?您正在寻找的结果有多大?
-
这看起来像是一个更难的Subset sum 问题,这意味着如果不对数据进行一些额外的假设,您将遇到(性能)问题。我的第一种方法是:获取所有唯一值;循环这些,计算所有connected_components并使用一些子集和算法(非常非正式的描述;假设:n_unique
-
@Sorin 值相对较小。大多数情况下,单元格值最多为 4,很少会达到 16,而且我认为我们要寻找的结果永远不会大于 20。
-
在示例 A、C、D、E 和 F 中,-1 项将矩阵分隔为多个位置的连通分量。如果您不允许选择负数(即它们仅表示您无法选择的方格),那么您可以轻松发现这些组件并独立解决每个组件,从而节省大量成本时间。