【问题标题】:Find minimum coverage of 2D boolean matrix with rectangular True submatrices查找具有矩形真子矩阵的 2D 布尔矩阵的最小覆盖率
【发布时间】:2022-11-02 19:40:43
【问题描述】:

给定布尔矩阵,我需要找到一组子矩阵A = {A1, ..., 一个n}这样矩阵在一个包含矩阵中的所有真值只有他们。子矩阵不必是连续的,即每个子矩阵由两组索引定义{一世1, ..., 一世ķ},{j1, ..., j}. (例如,子矩阵可能类似于 [{1, 2, 5}, {4, 7, 9, 13}],它是这些行和列相交的所有单元格。)子矩阵的总数n应该是最小的。

矩阵的大小可以达到 10^4 x 10^4,所以我需要一个有效的算法。我想这个问题可能没有一个有效的精确算法,因为它让我想起了一些 NP-hard 问题。如果这是真的,那么任何好的和快速的近似都是可以的。我们也可以建议真实值的数量不是很大,即<所有值的1/10,但是为了在prod中没有意外的DOS,不使用这个事实的解决方案更好。

我不需要任何代码,只需要算法的一般概念及其属性的证明,如果它不明显的话。

背景

我们正在为物流应用计算一些昂贵的距离矩阵。此请求中的点通常是相交的,因此我们正在尝试开发一些缓存算法来不计算某些请求的一部分。并将大请求拆分为只有未知子矩阵的较小请求。此外,该算法可能不需要矩阵中的某些距离。一方面,少量大组计算速度更快,另一方面,如果我们包含很多“False”值,并且我们的子矩阵大得不合理,这会减慢计算速度。确切的标准很复杂,“昂贵”的矩阵请求的时间复杂度很难估计。据我所知,对于方阵,它类似于 C*n^2.5 和相当大的 C。因此很难制定一个好的优化标准,但欢迎提出任何想法。

【问题讨论】:

  • 子矩阵不能包含任何错误值?
  • 你不是说假值的百分比吗?
  • 好吧,实际上,老实说,我们可以允许一小部分错误值,但是如何严格定义优化标准并不明显。一般来说,矩阵集 A 应该是最小的子矩阵的大小和子矩阵的数量。我将添加一些有问题的背景。

标签: algorithm matrix optimization time-complexity graph-theory


【解决方案1】:
  • 真实值循环
  • 你能在任何方向增长包含真值的子矩阵吗

(即你可以从

 t

tt
tt  

)

  • 尽可能长时间地保持增长
  • 将 M 中新子矩阵中的所有单元格设置为 false
  • 重复直到 M 中的每个单元格都是假的。

这是一个简单的例子,说明它是如何工作的

上图显示了包含几个真值的大矩阵 M

底部的行显示了前几次迭代,随着 blus submatric 发现更多具有真实值的相邻单元格而增长。在这种情况下,我已经停止了,因为如果不包括假细胞,它就无法继续生长。如果子矩阵中的一些单元格可能是错误的,那么您可以继续进一步。

【讨论】:

  • 这种方法的问题在于,有时您可以有多个发展方向。例如,您可能需要在父亲视角未知的情况下,在 (3,3) 矩阵到 (4, 4)、(3, 5) 或 (5, 3) 之间进行选择。此外时间复杂度非常糟糕。每个增长搜索至少为 2 * size * len(M)。如果所有值都为 True,则会导致 len(M)^4 复杂度。
  • 向任何方向和每一个方向成长。继续增长,直到你不能再增长。
  • 增长搜索很小!在最坏的情况下,它是 SUBMATRIX 的 2 *(宽度 + 长度)(不是你建议的 M)所以第一次搜索只有 4 个单元格。
  • 如果我们搜索连续子矩阵,它可以是 4 个单元格,但是我们会寻找任何子矩阵,因此对于一行中的每 2 个点,我们应该检查整个 2 列。
  • 我认为你应该仔细阅读我的描述。您永远不必搜索整个列(或行),只需搜索与子矩阵相邻的单元格,看看是否可以再增长。
猜你喜欢
  • 1970-01-01
  • 2022-01-22
  • 1970-01-01
  • 2012-04-10
  • 2021-05-25
  • 1970-01-01
  • 1970-01-01
  • 2011-04-17
相关资源
最近更新 更多